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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 6 by bh, Tue Aug 28 15:41:52 2001 UTC revision 535 by bh, Fri Mar 14 20:42:18 2003 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001 by Intevation GmbH  # Copyright (c) 2001, 2002, 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  #  #
# Line 10  __version__ = "$Revision$" Line 10  __version__ = "$Revision$"
10  from wxPython.wx import *  from wxPython.wx import *
11  from wxPython.grid import *  from wxPython.grid import *
12    
13    from Thuban.Lib.connector import Publisher
14  from Thuban.Model.table import FIELDTYPE_INT, FIELDTYPE_DOUBLE, \  from Thuban.Model.table import FIELDTYPE_INT, FIELDTYPE_DOUBLE, \
15       FIELDTYPE_STRING       FIELDTYPE_STRING
16  import view  import view
17  from messages import SELECTED_SHAPE  from dialogs import NonModalDialog
18    from messages import SHAPES_SELECTED
19    
20  wx_value_type_map = {FIELDTYPE_INT: wxGRID_VALUE_NUMBER,  wx_value_type_map = {FIELDTYPE_INT: wxGRID_VALUE_NUMBER,
21                       FIELDTYPE_DOUBLE: wxGRID_VALUE_FLOAT,                       FIELDTYPE_DOUBLE: wxGRID_VALUE_FLOAT,
22                       FIELDTYPE_STRING: wxGRID_VALUE_STRING}                       FIELDTYPE_STRING: wxGRID_VALUE_STRING}
23    
24    ROW_SELECTED = "ROW_SELECTED"
25    
26    
27  class DataTable(wxPyGridTableBase):  class DataTable(wxPyGridTableBase):
28    
29        """Wrapper around a Thuban table object suitable for a wxGrid"""
30    
31      def __init__(self, table = None):      def __init__(self, table = None):
32          wxPyGridTableBase.__init__(self)          wxPyGridTableBase.__init__(self)
33          self.num_cols = 0          self.num_cols = 0
# Line 88  class DataTable(wxPyGridTableBase): Line 95  class DataTable(wxPyGridTableBase):
95          return self.CanGetValueAs(row, col, typeName)          return self.CanGetValueAs(row, col, typeName)
96    
97    
98      # Thuban stuff  class TableGrid(wxGrid, Publisher):
     def SelectRow(self, row):  
         import main  
         interactor = main.app.interactor  
         return interactor.SelectShape(self.table, row)  
   
   
99    
100        """A grid view for a Thuban table"""
   
 class TableGrid(wxGrid):  
101    
102      def __init__(self, parent, table = None):      def __init__(self, parent, table = None):
103          wxGrid.__init__(self, parent, -1)          wxGrid.__init__(self, parent, -1)
# Line 107  class TableGrid(wxGrid): Line 106  class TableGrid(wxGrid):
106    
107          # The second parameter means that the grid is to take ownership          # The second parameter means that the grid is to take ownership
108          # of the table and will destroy it when done. Otherwise you          # 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          # would need to keep a reference to it and call its Destroy
110          # method later.          # method later.
111          self.SetTable(self.table, true)          self.SetTable(self.table, true)
112    
113          #self.SetMargins(0,0)          #self.SetMargins(0,0)
114          self.AutoSizeColumns(false)  
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)          self.SetSelectionMode(wxGrid.wxGridSelectRows)
122            
123          EVT_GRID_RANGE_SELECT(self, self.OnRangeSelect)          EVT_GRID_RANGE_SELECT(self, self.OnRangeSelect)
124          EVT_GRID_SELECT_CELL(self, self.OnSelectCell)          EVT_GRID_SELECT_CELL(self, self.OnSelectCell)
         import main  
         main.app.interactor.Subscribe(SELECTED_SHAPE, self.select_shape)  
125    
126      def SetTableObject(self, table):      def SetTableObject(self, table):
127          self.table.SetTable(table)          self.table.SetTable(table)
128    
129      def OnRangeSelect(self, event):      def OnRangeSelect(self, event):
130          if event.Selecting():          if event.Selecting():
131              if not self.table.SelectRow(event.GetTopLeftCoords().GetRow()):              self.issue(ROW_SELECTED, event.GetTopLeftCoords().GetRow())
                 event.Skip()  
132    
133      def OnSelectCell(self, event):      def OnSelectCell(self, event):
134          if not self.table.SelectRow(event.GetRow()):          self.issue(ROW_SELECTED, event.GetRow())
135              event.Skip()  
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):      def select_shape(self, layer, shape):
146          if layer is not None and layer.table is self.table.table:          """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            if layer is not None and layer.table is self.table.table \
152               and shape is not None:
153              self.SelectRow(shape)              self.SelectRow(shape)
154              self.SetGridCursor(shape, 0)              self.SetGridCursor(shape, 0)
155              self.MakeCellVisible(shape, 0)              self.MakeCellVisible(shape, 0)
156    
157    
158  class TableFrame(wxFrame):  class TableFrame(NonModalDialog):
159    
160      def __init__(self, parent, table = None):      """Frame that displays a Thuban table in a grid view"""
161          wxFrame.__init__(self, parent, -1, "Thuban Table")  
162          grid = TableGrid(self, table)      def __init__(self, parent, name, title, table):
163            NonModalDialog.__init__(self, parent, name, title)
164            self.table = table
165            self.grid = self.make_grid(self.table)
166    
167        def make_grid(self, table):
168            """Return the table grid to use in the frame.
169    
170            The default implementation returns a TableGrid instance.
171            Override in derived classes to use different grid classes.
172            """
173            return TableGrid(self, table)
174    
175    
176    class LayerTableFrame(TableFrame):
177    
178        """Frame that displays a layer table in a grid view
179    
180        A LayerTableFrame is TableFrame whose selection is connected to the
181        selected object in a map.
182        """
183    
184        def __init__(self, parent, name, title, layer, table):
185            TableFrame.__init__(self, parent, name, title, table)
186            self.layer = layer
187            self.grid.Subscribe(ROW_SELECTED, self.row_selected)
188            self.parent.Subscribe(SHAPES_SELECTED, self.select_shape)
189    
190        def make_grid(self, table):
191            """Override the derived method to return a LayerTableGrid.
192            """
193            return LayerTableGrid(self, table)
194    
195        def OnClose(self, event):
196            self.parent.Unsubscribe(SHAPES_SELECTED, self.select_shape)
197            TableFrame.OnClose(self, event)
198    
199        def select_shape(self, layer, shapes):
200            """Subscribed to the SHAPES_SELECTED message.
201    
202            If shapes contains exactly one shape id, select that shape in
203            the grid. Otherwise deselect all.
204            """
205            if len(shapes):
206                shape = shapes[0]
207            else:
208                shape = None
209            self.grid.select_shape(layer, shape)
210    
211        def row_selected(self, row):
212            if self.layer is not None:
213                self.parent.SelectShapes(self.layer, [row])

Legend:
Removed from v.6  
changed lines
  Added in v.535

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26