/[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 34 - (show annotations)
Thu Sep 6 15:32:56 2001 UTC (23 years, 6 months ago) by bh
Original Path: trunk/thuban/Thuban/UI/tableview.py
File MIME type: text/x-python
File size: 5028 byte(s)
	* Thuban/UI/tableview.py: Add some doc-strings
	(TableGrid):
	(TableGrid.OnRangeSelect):
	(TableGrid.OnSelectCell):
	(TableFrame.__init__):
	(TableFrame.row_selected):
	Selecting rows in the grid view now updates the selected shapes
	through the TableFrame. To achieve this we derive TableGrid from
	Publisher and introduce the message type ROW_SELECTED which the
	TableFrame subscribes to and which is issued by OnRangeSelect and
	OnSelectCell

	(DataTable.SelectRow): Removed because it's no longer needed in
	the row/shape selection scheme

1 # Copyright (c) 2001 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 it's Destroy
110 # method later.
111 self.SetTable(self.table, true)
112
113 #self.SetMargins(0,0)
114 self.AutoSizeColumns(false)
115
116 self.SetSelectionMode(wxGrid.wxGridSelectRows)
117
118 EVT_GRID_RANGE_SELECT(self, self.OnRangeSelect)
119 EVT_GRID_SELECT_CELL(self, self.OnSelectCell)
120
121 def SetTableObject(self, table):
122 self.table.SetTable(table)
123
124 def OnRangeSelect(self, event):
125 if event.Selecting():
126 self.issue(ROW_SELECTED, event.GetTopLeftCoords().GetRow())
127
128 def OnSelectCell(self, event):
129 self.issue(ROW_SELECTED, event.GetRow())
130
131 def select_shape(self, layer, shape):
132 if layer is not None and layer.table is self.table.table \
133 and shape is not None:
134 self.SelectRow(shape)
135 self.SetGridCursor(shape, 0)
136 self.MakeCellVisible(shape, 0)
137
138
139 class TableFrame(NonModalDialog):
140
141 """Frame that displays a Thuban table in a grid view"""
142
143 def __init__(self, parent, interactor, name, title, layer = None,
144 table = None):
145 NonModalDialog.__init__(self, parent, interactor, name, title)
146 self.layer = layer
147 self.table = table
148 self.grid = TableGrid(self, table)
149 self.grid.Subscribe(ROW_SELECTED, self.row_selected)
150 self.interactor.Subscribe(SELECTED_SHAPE, self.select_shape)
151
152 def OnClose(self, event):
153 self.interactor.Unsubscribe(SELECTED_SHAPE, self.select_shape)
154 NonModalDialog.OnClose(self, event)
155
156 def select_shape(self, layer, shape):
157 self.grid.select_shape(layer, shape)
158
159 def row_selected(self, row):
160 if self.layer is not None:
161 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