/[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 278 - (show annotations)
Mon Aug 26 12:50:23 2002 UTC (22 years, 6 months ago) by bh
Original Path: trunk/thuban/Thuban/UI/tableview.py
File MIME type: text/x-python
File size: 6491 byte(s)
* Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
layer table specific code from TableGrid into LayerTableGrid
(TableFrame, LayerTableFrame): Split the layer table specific code
from TableFrame into LayerTableFrame

* Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
LayerTableFrame

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
137 class LayerTableGrid(TableGrid):
138
139 """Table grid for the layer tables.
140
141 The LayerTableGrid is basically the same as a TableGrid but it's
142 selection is usually coupled to the selected object in the map.
143 """
144
145 def select_shape(self, layer, shape):
146 """Select the row corresponding to the specified shape and layer
147
148 If layer is not the layer the table is associated with do
149 nothing. If shape or layer is None also do nothing.
150 """
151 print "LayerTableGrid.select_shape", layer, shape
152 if layer is not None and layer.table is self.table.table \
153 and shape is not None:
154 self.SelectRow(shape)
155 self.SetGridCursor(shape, 0)
156 self.MakeCellVisible(shape, 0)
157
158
159 class TableFrame(NonModalDialog):
160
161 """Frame that displays a Thuban table in a grid view"""
162
163 def __init__(self, parent, interactor, name, title, table):
164 NonModalDialog.__init__(self, parent, interactor, name, title)
165 self.table = table
166 self.grid = self.make_grid(self.table)
167
168 def make_grid(self, table):
169 """Return the table grid to use in the frame.
170
171 The default implementation returns a TableGrid instance.
172 Override in derived classes to use different grid classes.
173 """
174 return TableGrid(self, table)
175
176
177 class LayerTableFrame(TableFrame):
178
179 """Frame that displays a layer table in a grid view
180
181 A LayerTableFrame is TableFrame whose selection is connected to the
182 selected object in a map.
183 """
184
185 def __init__(self, parent, interactor, name, title, layer, table):
186 TableFrame.__init__(self, parent, interactor, name, title, table)
187 self.layer = layer
188 self.grid.Subscribe(ROW_SELECTED, self.row_selected)
189 self.interactor.Subscribe(SELECTED_SHAPE, self.select_shape)
190
191 def make_grid(self, table):
192 """Override the derived method to return a LayerTableGrid.
193 """
194 return LayerTableGrid(self, table)
195
196 def OnClose(self, event):
197 self.interactor.Unsubscribe(SELECTED_SHAPE, self.select_shape)
198 TableFrame.OnClose(self, event)
199
200 def select_shape(self, layer, shape):
201 self.grid.select_shape(layer, shape)
202
203 def row_selected(self, row):
204 if self.layer is not None:
205 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