/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/tableview.py
ViewVC logotype

Contents of /branches/WIP-pyshapelib-bramz/Thuban/UI/tableview.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 173 - (show annotations)
Wed May 15 13:29:34 2002 UTC (22 years, 9 months ago) by bh
Original Path: trunk/thuban/Thuban/UI/tableview.py
File MIME type: text/x-python
File size: 5269 byte(s)
	* Thuban/UI/tableview.py (TableGrid.__init__): Do not call
	AutoSizeColumns because it will cause a traversal of the entire
	table which for large .dbf files will take a very long time.

1 # Copyright (c) 2001, 2002 by Intevation GmbH
2 # Authors:
3 # Bernhard Herzog <[email protected]>
4 #
5 # This program is free software under the GPL (>=v2)
6 # Read the file COPYING coming with Thuban for details.
7
8 __version__ = "$Revision$"
9
10 from wxPython.wx import *
11 from wxPython.grid import *
12
13 from Thuban.Lib.connector import Publisher
14 from Thuban.Model.table import FIELDTYPE_INT, FIELDTYPE_DOUBLE, \
15 FIELDTYPE_STRING
16 import view
17 from dialogs import NonModalDialog
18 from messages import SELECTED_SHAPE
19
20 wx_value_type_map = {FIELDTYPE_INT: wxGRID_VALUE_NUMBER,
21 FIELDTYPE_DOUBLE: wxGRID_VALUE_FLOAT,
22 FIELDTYPE_STRING: wxGRID_VALUE_STRING}
23
24 ROW_SELECTED = "ROW_SELECTED"
25
26
27 class DataTable(wxPyGridTableBase):
28
29 """Wrapper around a Thuban table object suitable for a wxGrid"""
30
31 def __init__(self, table = None):
32 wxPyGridTableBase.__init__(self)
33 self.num_cols = 0
34 self.num_rows = 0
35 self.columns = []
36 self.table = None
37 self.SetTable(table)
38
39 def SetTable(self, table):
40 self.table = table
41 self.num_cols = table.field_count()
42 self.num_rows = table.record_count()
43
44 self.columns = []
45 for i in range(self.num_cols):
46 type, name, len, decc = table.field_info(i)
47 self.columns.append((name, wx_value_type_map[type], len, decc))
48
49 #
50 # required methods for the wxPyGridTableBase interface
51 #
52
53 def GetNumberRows(self):
54 return self.num_rows
55
56 def GetNumberCols(self):
57 return self.num_cols
58
59 def IsEmptyCell(self, row, col):
60 return 0
61
62 # Get/Set values in the table. The Python version of these
63 # methods can handle any data-type, (as long as the Editor and
64 # Renderer understands the type too,) not just strings as in the
65 # C++ version.
66 def GetValue(self, row, col):
67 record = self.table.read_record(row)
68 return record[self.columns[col][0]]
69
70 def SetValue(self, row, col, value):
71 pass
72
73 #
74 # Some optional methods
75 #
76
77 # Called when the grid needs to display labels
78 def GetColLabelValue(self, col):
79 return self.columns[col][0]
80
81 # Called to determine the kind of editor/renderer to use by
82 # default, doesn't necessarily have to be the same type used
83 # nativly by the editor/renderer if they know how to convert.
84 def GetTypeName(self, row, col):
85 return self.columns[col][1]
86
87 # Called to determine how the data can be fetched and stored by the
88 # editor and renderer. This allows you to enforce some type-safety
89 # in the grid.
90 def CanGetValueAs(self, row, col, typeName):
91 # perhaps we should allow conversion int->double?
92 return self.GetTypeName(row, col) == typeName
93
94 def CanSetValueAs(self, row, col, typeName):
95 return self.CanGetValueAs(row, col, typeName)
96
97
98 class TableGrid(wxGrid, Publisher):
99
100 """A grid view for a Thuban table"""
101
102 def __init__(self, parent, table = None):
103 wxGrid.__init__(self, parent, -1)
104
105 self.table = DataTable(table)
106
107 # The second parameter means that the grid is to take ownership
108 # of the table and will destroy it when done. Otherwise you
109 # would need to keep a reference to it and call its Destroy
110 # method later.
111 self.SetTable(self.table, true)
112
113 #self.SetMargins(0,0)
114
115 # AutoSizeColumns would allow us to make the grid have optimal
116 # column widths automatically but it would cause a traversal of
117 # the entire table which for large .dbf files can take a very
118 # long time.
119 #self.AutoSizeColumns(false)
120
121 self.SetSelectionMode(wxGrid.wxGridSelectRows)
122
123 EVT_GRID_RANGE_SELECT(self, self.OnRangeSelect)
124 EVT_GRID_SELECT_CELL(self, self.OnSelectCell)
125
126 def SetTableObject(self, table):
127 self.table.SetTable(table)
128
129 def OnRangeSelect(self, event):
130 if event.Selecting():
131 self.issue(ROW_SELECTED, event.GetTopLeftCoords().GetRow())
132
133 def OnSelectCell(self, event):
134 self.issue(ROW_SELECTED, event.GetRow())
135
136 def select_shape(self, layer, shape):
137 if layer is not None and layer.table is self.table.table \
138 and shape is not None:
139 self.SelectRow(shape)
140 self.SetGridCursor(shape, 0)
141 self.MakeCellVisible(shape, 0)
142
143
144 class TableFrame(NonModalDialog):
145
146 """Frame that displays a Thuban table in a grid view"""
147
148 def __init__(self, parent, interactor, name, title, layer = None,
149 table = None):
150 NonModalDialog.__init__(self, parent, interactor, name, title)
151 self.layer = layer
152 self.table = table
153 self.grid = TableGrid(self, table)
154 self.grid.Subscribe(ROW_SELECTED, self.row_selected)
155 self.interactor.Subscribe(SELECTED_SHAPE, self.select_shape)
156
157 def OnClose(self, event):
158 self.interactor.Unsubscribe(SELECTED_SHAPE, self.select_shape)
159 NonModalDialog.OnClose(self, event)
160
161 def select_shape(self, layer, shape):
162 self.grid.select_shape(layer, shape)
163
164 def row_selected(self, row):
165 if self.layer is not None:
166 self.interactor.SelectLayerAndShape(self.layer, row)

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26