/[thuban]/trunk/thuban/Thuban/UI/classifier.py
ViewVC logotype

Diff of /trunk/thuban/Thuban/UI/classifier.py

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

revision 496 by jonathan, Mon Mar 10 10:54:50 2003 UTC revision 610 by jonathan, Fri Apr 4 13:56:59 2003 UTC
# Line 27  from Thuban.Model.color import Color Line 27  from Thuban.Model.color import Color
27    
28  from Thuban.Model.layer import Layer, SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT  from Thuban.Model.layer import Layer, SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT
29    
30    from Thuban.UI.classgen import ClassGenDialog, ClassGenerator
31    
32  from dialogs import NonModalDialog  from dialogs import NonModalDialog
33    
34  # widget id's  # widget id's
# Line 36  ID_CLASS_TABLE = 40011 Line 38  ID_CLASS_TABLE = 40011
38  ID_CLASSIFY_OK = 4001  ID_CLASSIFY_OK = 4001
39  ID_CLASSIFY_CANCEL = 4002  ID_CLASSIFY_CANCEL = 4002
40  ID_CLASSIFY_ADD = 4003  ID_CLASSIFY_ADD = 4003
41  ID_CLASSIFY_GENRANGE = 4004  ID_CLASSIFY_GENCLASS = 4004
42  ID_CLASSIFY_REMOVE = 4005  ID_CLASSIFY_REMOVE = 4005
43  ID_CLASSIFY_MOVEUP = 4006  ID_CLASSIFY_MOVEUP = 4006
44  ID_CLASSIFY_MOVEDOWN = 4007  ID_CLASSIFY_MOVEDOWN = 4007
45  ID_CLASSIFY_APPLY = 4008  ID_CLASSIFY_APPLY = 4008
46    ID_CLASSIFY_EDITPROPS = 4009
47    
48  # table columns  # table columns
49  COL_SYMBOL = 0  COL_SYMBOL = 0
# Line 59  FIELD_NAME = 2 Line 62  FIELD_NAME = 2
62  import weakref  import weakref
63  class ClassGrid(wxGrid):  class ClassGrid(wxGrid):
64    
65      def __init__(self, parent):  
66        def __init__(self, parent, classifier):
67          """Constructor.          """Constructor.
68    
69          parent -- the parent window          parent -- the parent window
# Line 70  class ClassGrid(wxGrid): Line 74  class ClassGrid(wxGrid):
74    
75          #wxGrid.__init__(self, parent, ID_CLASS_TABLE, size = (340, 160))          #wxGrid.__init__(self, parent, ID_CLASS_TABLE, size = (340, 160))
76          wxGrid.__init__(self, parent, ID_CLASS_TABLE)          wxGrid.__init__(self, parent, ID_CLASS_TABLE)
77          #self.SetTable(ClassTable(fieldData, layer.ShapeType(), self), true)          #self.SetTable(ClassTable(fieldData, layer.ShapeType(), self), True)
78    
79            self.classifier = classifier
80    
81            self.currentSelection = []
82    
83          EVT_GRID_CELL_LEFT_DCLICK(self, self._OnCellDClick)          EVT_GRID_CELL_LEFT_DCLICK(self, self._OnCellDClick)
84          EVT_GRID_RANGE_SELECT(self, self._OnSelectedRange)          EVT_GRID_RANGE_SELECT(self, self._OnSelectedRange)
85          EVT_GRID_SELECT_CELL(self, self._OnSelectedCell)          EVT_GRID_SELECT_CELL(self, self._OnSelectedCell)
86            EVT_GRID_COL_SIZE(self, self._OnCellResize)
87            EVT_GRID_ROW_SIZE(self, self._OnCellResize)
88    
89          self.currentSelection = []          #print "123123123: ", ('Show' in dir(self))
90    
91      def CreateTable(self, clazz, shapeType):      #def Show(self):
92            #print "SHOW!"
93    
94          assert(isinstance(clazz, Classification))      #def Refresh(self):
95            #self.Show()
96        #def Update(self):
97            #self.Show()
98    
99        def CreateTable(self, clazz, shapeType, group = None):
100    
101            assert isinstance(clazz, Classification)
102    
         self.shapeType = shapeType  
103          table = self.GetTable()          table = self.GetTable()
104          if table is None:          if table is None:
105              self.SetTable(ClassTable(clazz, self.shapeType, self), true)              w = self.GetDefaultColSize() * 3 + self.GetDefaultRowLabelSize()
106          else:              h = self.GetDefaultRowSize() * 4 + self.GetDefaultColLabelSize()
107              table.Reset(clazz, self.shapeType)              self.SetDimensions(-1, -1, w, h)
108                self.SetSizeHints(w, h, -1, -1)
109                table = ClassTable(self)
110                self.SetTable(table, True)
111    
112    
113          self.SetSelectionMode(wxGrid.wxGridSelectRows)          self.SetSelectionMode(wxGrid.wxGridSelectRows)
114          self.ClearSelection()          self.ClearSelection()
115    
116            #print "8------------------"
117            table.Reset(clazz, shapeType, group)
118            #print "9------------------"
119    
120    #   def Show(self, show = True):
121    #       print "SHOW!"
122    #       wxGrid.Show(self, show)
123    
124    #       sel = self.GetCurrentSelection()
125    
126    #       print "( 1"
127    #       if len(sel) == 1:
128    #           print "( 2"
129    #           self.MakeCellVisible(sel[0], 0)
130    
131      def GetCurrentSelection(self):      def GetCurrentSelection(self):
132          """Return the currently highlighted rows as an increasing list          """Return the currently highlighted rows as an increasing list
133             of row numbers."""             of row numbers."""
134            #print "@@ ", self.currentSelection
135          sel = copy.copy(self.currentSelection)          sel = copy.copy(self.currentSelection)
136          sel.sort()          sel.sort()
137          return sel          return sel
138    
139        def GetSelectedRows(self):
140            return self.GetCurrentSelection()
141    
142      def SetCellRenderer(self, row, col):      def SetCellRenderer(self, row, col):
143          raise ValueError(_("Must not allow setting of renderer in ClassGrid!"))          raise ValueError(_("Must not allow setting of renderer in ClassGrid!"))
144    
# Line 165  class ClassGrid(wxGrid): Line 205  class ClassGrid(wxGrid):
205                  r = self.GetNumberRows() - 1                  r = self.GetNumberRows() - 1
206              self.SelectRow(r)              self.SelectRow(r)
207                    
208    
209        def SelectGroup(self, group, makeVisible = True):
210            if group is None: return
211    
212            assert isinstance(group, ClassGroup)
213    
214            table = self.GetTable()
215    
216            assert table is not None
217    
218    
219            #print "-- ", group
220            for i in range(table.GetNumberRows()):
221                g = table.GetClassGroup(i)
222                #print "1", g
223                if g is group:
224                    #print "2"
225                    self.SelectRow(i)
226                    if makeVisible:
227                        #print "3"
228                        self.MakeCellVisible(i, 0)
229                    break
230    
231            
232    
233  #  #
234  # XXX: This isn't working, and there is no way to deselect rows wxPython!  # XXX: This isn't working, and there is no way to deselect rows wxPython!
235  #  #
# Line 182  class ClassGrid(wxGrid): Line 247  class ClassGrid(wxGrid):
247          r = event.GetRow()          r = event.GetRow()
248          c = event.GetCol()          c = event.GetCol()
249          if c == COL_SYMBOL:          if c == COL_SYMBOL:
250              prop = self.GetTable().GetValueAsCustom(r, c, None)              self.classifier.EditGroupProperties(r)
             #prop = group.GetProperties()  
251    
             # get a new ClassGroupProperties object and copy the  
             # values over to our current object  
             propDlg = SelectPropertiesDialog(NULL, prop, self.shapeType)  
             if propDlg.ShowModal() == wxID_OK:  
                 new_prop = propDlg.GetClassGroupProperties()  
                 #prop.SetProperties(new_prop)  
                 self.GetTable().SetValueAsCustom(r, c, None, new_prop)  
             propDlg.Destroy()  
252    
253      #      #
254      # _OnSelectedRange() and _OnSelectedCell() were borrowed      # _OnSelectedRange() and _OnSelectedCell() were borrowed
# Line 204  class ClassGrid(wxGrid): Line 260  class ClassGrid(wxGrid):
260          if event.Selecting():          if event.Selecting():
261              for index in range( event.GetTopRow(), event.GetBottomRow()+1):              for index in range( event.GetTopRow(), event.GetBottomRow()+1):
262                  if index not in self.currentSelection:                  if index not in self.currentSelection:
263                        #print "    ", index
264                      self.currentSelection.append( index )                      self.currentSelection.append( index )
265          else:          else:
266              for index in range( event.GetTopRow(), event.GetBottomRow()+1):              for index in range( event.GetTopRow(), event.GetBottomRow()+1):
267                  while index in self.currentSelection:                  while index in self.currentSelection:
268                        #print "    ", index
269                      self.currentSelection.remove( index )                      self.currentSelection.remove( index )
270          #self.ConfigureForSelection()          #self.ConfigureForSelection()
271    
272            #print self.GetCurrentSelection()
273          event.Skip()          event.Skip()
274    
275      def _OnSelectedCell( self, event ):      def _OnSelectedCell( self, event ):
276          """Internal update to the selection tracking list"""          """Internal update to the selection tracking list"""
277            #print "selecting cell: ", event.GetRow()
278          self.currentSelection = [ event.GetRow() ]          self.currentSelection = [ event.GetRow() ]
279          #self.ConfigureForSelection()          #self.ConfigureForSelection()
280          event.Skip()          event.Skip()
281    
282        def _OnCellResize(self, event):
283            self.FitInside()
284    
285  class ClassTable(wxPyGridTableBase):  class ClassTable(wxPyGridTableBase):
286      """Represents the underlying data structure for the grid."""      """Represents the underlying data structure for the grid."""
287    
# Line 226  class ClassTable(wxPyGridTableBase): Line 289  class ClassTable(wxPyGridTableBase):
289    
290      __col_labels = [_("Symbol"), _("Value"), _("Label")]      __col_labels = [_("Symbol"), _("Value"), _("Label")]
291    
292      def __init__(self, clazz, shapeType, view = None):  
293        def __init__(self, view = None):
294        #def __init__(self, clazz, shapeType, view = None):
295          """Constructor.          """Constructor.
296    
297          shapeType -- the type of shape that the layer uses          shapeType -- the type of shape that the layer uses
# Line 239  class ClassTable(wxPyGridTableBase): Line 304  class ClassTable(wxPyGridTableBase):
304          self.SetView(view)          self.SetView(view)
305          self.tdata = []          self.tdata = []
306    
307          self.Reset(clazz, shapeType)          #self.Reset(clazz, shapeType)
308    
309      def Reset(self, clazz, shapeType):      def Reset(self, clazz, shapeType, group = None):
310          """Reset the table with the given data.          """Reset the table with the given data.
311    
312          This is necessary because wxWindows does not allow a grid's          This is necessary because wxWindows does not allow a grid's
# Line 255  class ClassTable(wxPyGridTableBase): Line 320  class ClassTable(wxPyGridTableBase):
320          shapeType -- the type of shape that the layer uses          shapeType -- the type of shape that the layer uses
321          """          """
322    
323          assert(isinstance(clazz, Classification))          assert isinstance(clazz, Classification)
324    
325          self.GetView().BeginBatch()          self.GetView().BeginBatch()
326    
327          self.fieldType = clazz.GetFieldType()          self.fieldType = clazz.GetFieldType()
328          self.shapeType = shapeType          self.shapeType = shapeType
329    
330          old_len = len(self.tdata)          self.SetClassification(clazz, group)
331            self.__Modified(-1)
332            #print "11------------------"
333    
334            self.GetView().EndBatch()
335            self.GetView().FitInside()
336    
337        def SetClassification(self, clazz, group = None):
338    
339            self.GetView().BeginBatch()
340    
341            old_len = self.GetNumberRows()
342          self.tdata = []          self.tdata = []
343    
344            #print "9------------------"
345          #          #
346          # copy the data out of the classification and into our          # copy the data out of the classification and into our
347          # array          # array
348          #          #
349          for p in clazz:          row = -1
350              np = copy.deepcopy(p)          for g in clazz:
351              self.__SetRow(-1, np)              ng = copy.deepcopy(g)
352                self.__SetRow(None, ng)
353                if g is group:
354                    row = self.GetNumberRows() - 1
355                    #print "selecting row..."
356    
357            #print "10------------------"
358    
359          self.__Modified(-1)          self.__NotifyRowChanges(old_len, self.GetNumberRows())
360    
361          self.__NotifyRowChanges(old_len, len(self.tdata))          if row > -1:
362                self.GetView().ClearSelection()
363                self.GetView().SelectRow(row)
364                self.GetView().MakeCellVisible(row, 0)
365    
         view = self.GetView()  
         w = view.GetDefaultColSize() * 3 + view.GetDefaultRowLabelSize()  
         h = view.GetDefaultRowSize() * 4 + view.GetDefaultColLabelSize()  
         view.SetDimensions(-1, -1, w, h)  
         view.SetSizeHints(w, h, -1, -1)  
               
366          self.GetView().EndBatch()          self.GetView().EndBatch()
367            self.GetView().FitInside()
368    
369      def __NotifyRowChanges(self, curRows, newRows):      def __NotifyRowChanges(self, curRows, newRows):
370          #          #
# Line 297  class ClassTable(wxPyGridTableBase): Line 376  class ClassTable(wxPyGridTableBase):
376                          wxGRIDTABLE_NOTIFY_ROWS_APPENDED,                          wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
377                          newRows - curRows)    # how many                          newRows - curRows)    # how many
378              self.GetView().ProcessTableMessage(msg)              self.GetView().ProcessTableMessage(msg)
379                self.GetView().FitInside()
380          elif newRows < curRows:          elif newRows < curRows:
381              msg = wxGridTableMessage(self,              msg = wxGridTableMessage(self,
382                          wxGRIDTABLE_NOTIFY_ROWS_DELETED,                          wxGRIDTABLE_NOTIFY_ROWS_DELETED,
383                          curRows - newRows,    # position                          curRows,              # position
384                          curRows - newRows)    # how many                          curRows - newRows)    # how many
385              self.GetView().ProcessTableMessage(msg)              self.GetView().ProcessTableMessage(msg)
386                self.GetView().FitInside()
387    
388      def __SetRow(self, row, group):      def __SetRow(self, row, group):
389          """Set a row's data to that of the group.          """Set a row's data to that of the group.
390    
391          The table is considered modified after this operation.          The table is considered modified after this operation.
392    
393          row -- if row is -1 or greater than the current number of rows          row -- if row is < 0 'group' is inserted at the top of the table
394                 then group is appended to the end.                 if row is >= GetNumberRows() or None 'group' is append to
395                        the end of the table.
396                   otherwise 'group' replaces row 'row'
397          """          """
398    
399          # either append or replace          # either append or replace
400          if row == -1 or row >= self.GetNumberRows():          if row is None or row >= self.GetNumberRows():
401              self.tdata.append(group)              self.tdata.append(group)
402            elif row < 0:
403                self.tdata.insert(0, group)
404          else:          else:
405              self.tdata[row] = group              self.tdata[row] = group
406    
# Line 334  class ClassTable(wxPyGridTableBase): Line 419  class ClassTable(wxPyGridTableBase):
419          if isinstance(group, ClassGroupRange):     return _("Range")          if isinstance(group, ClassGroupRange):     return _("Range")
420          if isinstance(group, ClassGroupMap):       return _("Map")          if isinstance(group, ClassGroupMap):       return _("Map")
421    
422          assert(False) # shouldn't get here          assert False # shouldn't get here
423          return _("")          return _("")
424    
425      def GetNumberRows(self):      def GetNumberRows(self):
# Line 379  class ClassTable(wxPyGridTableBase): Line 464  class ClassTable(wxPyGridTableBase):
464              return group.GetLabel()              return group.GetLabel()
465    
466          # col must be COL_VALUE          # col must be COL_VALUE
467          assert(col == COL_VALUE)          assert col == COL_VALUE
468    
469          if isinstance(group, ClassGroupDefault):          if isinstance(group, ClassGroupDefault):
470              return _("DEFAULT")              return _("DEFAULT")
# Line 388  class ClassTable(wxPyGridTableBase): Line 473  class ClassTable(wxPyGridTableBase):
473          elif isinstance(group, ClassGroupRange):          elif isinstance(group, ClassGroupRange):
474              return _("%s - %s") % (group.GetMin(), group.GetMax())              return _("%s - %s") % (group.GetMin(), group.GetMax())
475    
476          assert(False) # shouldn't get here          assert False  # shouldn't get here
477          return None          return None
478    
479      def __ParseInput(self, value):      def __ParseInput(self, value):
# Line 428  class ClassTable(wxPyGridTableBase): Line 513  class ClassTable(wxPyGridTableBase):
513    
514                  return (conv(Str2Num(value[:i])), conv(Str2Num(value[i+1:])))                  return (conv(Str2Num(value[:i])), conv(Str2Num(value[i+1:])))
515    
516          assert(False) # shouldn't get here          assert False  # shouldn't get here
517          return (0,)          return (0,)
518                            
519    
# Line 444  class ClassTable(wxPyGridTableBase): Line 529  class ClassTable(wxPyGridTableBase):
529          typeName -- unused, but needed to overload wxPyGridTableBase          typeName -- unused, but needed to overload wxPyGridTableBase
530          """          """
531    
532          assert(col >= 0 and col < self.GetNumberCols())          assert col >= 0 and col < self.GetNumberCols()
533          assert(row >= 0 and row < self.GetNumberRows())          assert row >= 0 and row < self.GetNumberRows()
534    
535          group = self.tdata[row]          group = self.tdata[row]
536    
# Line 490  class ClassTable(wxPyGridTableBase): Line 575  class ClassTable(wxPyGridTableBase):
575                              changed = True                              changed = True
576                          ngroup.SetRange(dataInfo[0], dataInfo[1])                          ngroup.SetRange(dataInfo[0], dataInfo[1])
577                      else:                      else:
578                          assert(False)                          assert False
579                          pass                          pass
580    
581                      if changed:                      if changed:
582                          ngroup.SetLabel(group.GetLabel())                          ngroup.SetLabel(group.GetLabel())
583                          self.SetClassGroup(row, ngroup)                          self.SetClassGroup(row, ngroup)
584          else:          else:
585              assert(False) # shouldn't be here              assert False # shouldn't be here
586              pass              pass
587    
588          if mod:          if mod:
# Line 552  class ClassTable(wxPyGridTableBase): Line 637  class ClassTable(wxPyGridTableBase):
637          The table is considered modified if any rows are removed.          The table is considered modified if any rows are removed.
638          """          """
639    
640          assert(pos >= 0)          assert pos >= 0
641          old_len = len(self.tdata)          old_len = len(self.tdata)
642          for row in range(pos, pos - numRows, -1):          for row in range(pos, pos - numRows, -1):
643              group = self.GetClassGroup(row)              group = self.GetClassGroup(row)
# Line 572  class ClassTable(wxPyGridTableBase): Line 657  class ClassTable(wxPyGridTableBase):
657          old_len = len(self.tdata)          old_len = len(self.tdata)
658          for i in range(numRows):          for i in range(numRows):
659              np = ClassGroupSingleton()              np = ClassGroupSingleton()
660              self.__SetRow(-1, np)              self.__SetRow(None, np)
661    
662          if self.IsModified():          if self.IsModified():
663              self.__NotifyRowChanges(old_len, len(self.tdata))              self.__NotifyRowChanges(old_len, len(self.tdata))
664    
665    
666  class Classifier(NonModalDialog):  class Classifier(NonModalDialog):
667        
668      def __init__(self, parent, interactor, name, layer):      def __init__(self, parent, name, layer, group = None):
669          NonModalDialog.__init__(self, parent, interactor, name,          NonModalDialog.__init__(self, parent, name,
670                                  _("Classifier: %s") % layer.Title())                                  _("Classifier: %s") % layer.Title())
671    
672            panel = wxPanel(self, -1, size=(100, 100))
673    
674          self.layer = layer          self.layer = layer
675    
676          self.originalClass = self.layer.GetClassification()          self.originalClass = self.layer.GetClassification()
# Line 591  class Classifier(NonModalDialog): Line 678  class Classifier(NonModalDialog):
678          fieldType = self.originalClass.GetFieldType()          fieldType = self.originalClass.GetFieldType()
679    
680          topBox = wxBoxSizer(wxVERTICAL)          topBox = wxBoxSizer(wxVERTICAL)
681            panelBox = wxBoxSizer(wxVERTICAL)
682    
683          #topBox.Add(wxStaticText(self, -1, _("Layer: %s") % layer.Title()),          #panelBox.Add(wxStaticText(panel, -1, _("Layer: %s") % layer.Title()),
684              #0, wxALIGN_LEFT | wxALL, 4)              #0, wxALIGN_LEFT | wxALL, 4)
685          topBox.Add(wxStaticText(self, -1,          panelBox.Add(wxStaticText(panel, -1,
686                                  _("Layer Type: %s") % layer.ShapeType()),                                  _("Layer Type: %s") % layer.ShapeType()),
687              0, wxALIGN_LEFT | wxALL, 4)              0, wxALIGN_LEFT | wxALL, 4)
688    
# Line 602  class Classifier(NonModalDialog): Line 690  class Classifier(NonModalDialog):
690          #          #
691          # make field combo box          # make field combo box
692          #          #
693          self.fields = wxComboBox(self, ID_PROPERTY_SELECT, "",          self.fields = wxComboBox(panel, ID_PROPERTY_SELECT, "",
694                                       style = wxCB_READONLY)                                       style = wxCB_READONLY)
695    
696          self.num_cols = layer.table.field_count()          self.num_cols = layer.table.field_count()
# Line 624  class Classifier(NonModalDialog): Line 712  class Classifier(NonModalDialog):
712                  self.fields.SetClientData(i + 1, None)                  self.fields.SetClientData(i + 1, None)
713    
714    
715          #          ###########
         #  
         #  
   
         self.fieldTypeText = wxStaticText(self, -1, "")  
         self.__SetFieldTypeText(self.__cur_field)  
716    
717          topBox.Add(self.fieldTypeText, 0, wxALIGN_LEFT | wxALL, 4)          self.fieldTypeText = wxStaticText(panel, -1, "")
718          #self.fieldTypeText.SetLabel("asdfadsfs")          panelBox.Add(self.fieldTypeText, 0,
719                         wxGROW | wxALIGN_LEFT | wxALL | wxADJUST_MINSIZE, 4)
720    
721          propertyBox = wxBoxSizer(wxHORIZONTAL)          propertyBox = wxBoxSizer(wxHORIZONTAL)
722          propertyBox.Add(wxStaticText(self, -1, _("Field: ")),          propertyBox.Add(wxStaticText(panel, -1, _("Field: ")),
723              0, wxALIGN_CENTER | wxALL, 4)              0, wxALIGN_LEFT | wxALL, 4)
724          propertyBox.Add(self.fields, 1, wxGROW|wxALL, 4)          propertyBox.Add(self.fields, 1, wxGROW|wxALL, 4)
725          EVT_COMBOBOX(self, ID_PROPERTY_SELECT, self._OnFieldSelect)          EVT_COMBOBOX(self, ID_PROPERTY_SELECT, self._OnFieldSelect)
726    
727          topBox.Add(propertyBox, 0, wxGROW, 4)          panelBox.Add(propertyBox, 0, wxGROW, 4)
728    
729    
730          #          #
731          # Classification data table          # Control Box
732          #          #
   
733          controlBox = wxBoxSizer(wxHORIZONTAL)          controlBox = wxBoxSizer(wxHORIZONTAL)
734    
         self.classGrid = ClassGrid(self)  
         self.__SetGridTable(self.__cur_field)  
   
         controlBox.Add(self.classGrid, 1, wxGROW, 0)  
   
         controlButtonBox = wxBoxSizer(wxVERTICAL)  
735    
736            ###########
737          #          #
738          # Control buttons:          # Control buttons:
739          #          #
740          self.controlButtons = []          self.controlButtons = []
741    
742          button = wxButton(self, ID_CLASSIFY_ADD, _("Add"))          controlButtonBox = wxBoxSizer(wxVERTICAL)
743    
744            button = wxButton(panel, ID_CLASSIFY_ADD, _("Add"))
745            controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
746            self.controlButtons.append(button)
747    
748            button = wxButton(panel, ID_CLASSIFY_EDITPROPS, _("Edit Properties"))
749          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
750          self.controlButtons.append(button)          self.controlButtons.append(button)
751    
752          #button = wxButton(self, ID_CLASSIFY_GENRANGE, _("Generate Ranges"))          button = wxButton(panel, ID_CLASSIFY_GENCLASS, _("Generate Class"))
753          #controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
754          #self.controlButtons.append(button)          self.controlButtons.append(button)
755    
756          button = wxButton(self, ID_CLASSIFY_MOVEUP, _("Move Up"))          button = wxButton(panel, ID_CLASSIFY_MOVEUP, _("Move Up"))
757          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
758          self.controlButtons.append(button)          self.controlButtons.append(button)
759    
760          button = wxButton(self, ID_CLASSIFY_MOVEDOWN, _("Move Down"))          button = wxButton(panel, ID_CLASSIFY_MOVEDOWN, _("Move Down"))
761          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
762          self.controlButtons.append(button)          self.controlButtons.append(button)
763    
764          controlButtonBox.Add(60, 20, 0, wxGROW | wxALL | wxALIGN_BOTTOM, 4)          controlButtonBox.Add(60, 20, 0, wxGROW | wxALL | wxALIGN_BOTTOM, 4)
765    
766          button = wxButton(self, ID_CLASSIFY_REMOVE, _("Remove"))          button = wxButton(panel, ID_CLASSIFY_REMOVE, _("Remove"))
767          controlButtonBox.Add(button, 0, wxGROW | wxALL | wxALIGN_BOTTOM, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL | wxALIGN_BOTTOM, 4)
768          self.controlButtons.append(button)          self.controlButtons.append(button)
769    
770    
771            ###########
772            #
773            # Classification data table
774            #
775    
776            self.classGrid = ClassGrid(panel, self)
777            #self.__SetGridTable(self.__cur_field, group)
778            #self.fields.SetSelection(self.__cur_field)
779    
780            # calling __SelectField after creating the classGrid fills in the
781            # grid with the correct information
782            #print "2------------------"
783            self.__SelectField(self.__cur_field, group = group)
784    
785            #self.classGrid.SelectGroup(group)
786    
787            controlBox.Add(self.classGrid, 1, wxGROW, 0)
788    
789    
790    
791          controlBox.Add(controlButtonBox, 0, wxGROW, 10)          controlBox.Add(controlButtonBox, 0, wxGROW, 10)
792          topBox.Add(controlBox, 1, wxGROW, 10)          panelBox.Add(controlBox, 1, wxGROW, 10)
793    
794          EVT_BUTTON(self, ID_CLASSIFY_ADD, self._OnAdd)          EVT_BUTTON(self, ID_CLASSIFY_ADD, self._OnAdd)
795            EVT_BUTTON(self, ID_CLASSIFY_EDITPROPS, self._OnEditGroupProperties)
796          EVT_BUTTON(self, ID_CLASSIFY_REMOVE, self._OnRemove)          EVT_BUTTON(self, ID_CLASSIFY_REMOVE, self._OnRemove)
797          EVT_BUTTON(self, ID_CLASSIFY_GENRANGE, self._OnGenRange)          EVT_BUTTON(self, ID_CLASSIFY_GENCLASS, self._OnGenClass)
798          EVT_BUTTON(self, ID_CLASSIFY_MOVEUP, self._OnMoveUp)          EVT_BUTTON(self, ID_CLASSIFY_MOVEUP, self._OnMoveUp)
799          EVT_BUTTON(self, ID_CLASSIFY_MOVEDOWN, self._OnMoveDown)          EVT_BUTTON(self, ID_CLASSIFY_MOVEDOWN, self._OnMoveDown)
800    
801            ###########
802    
803          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
804          buttonBox.Add(wxButton(self, ID_CLASSIFY_OK, _("OK")),          buttonBox.Add(wxButton(panel, ID_CLASSIFY_OK, _("OK")),
805                        0, wxALL, 4)                        0, wxALL, 4)
806          buttonBox.Add(60, 20, 0, wxALL, 4)          buttonBox.Add(60, 20, 0, wxALL, 4)
807          buttonBox.Add(wxButton(self, ID_CLASSIFY_APPLY, _("Apply")),          buttonBox.Add(wxButton(panel, ID_CLASSIFY_APPLY, _("Apply")),
808                        0, wxALL, 4)                        0, wxALL, 4)
809          buttonBox.Add(60, 20, 0, wxALL, 4)          buttonBox.Add(60, 20, 0, wxALL, 4)
810          buttonBox.Add(wxButton(self, ID_CLASSIFY_CANCEL, _("Cancel")),          buttonBox.Add(wxButton(panel, ID_CLASSIFY_CANCEL, _("Cancel")),
811                        0, wxALL, 4)                        0, wxALL, 4)
812          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 10)          panelBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 0)
813    
814          EVT_BUTTON(self, ID_CLASSIFY_OK, self._OnOK)          EVT_BUTTON(self, ID_CLASSIFY_OK, self._OnOK)
815          EVT_BUTTON(self, ID_CLASSIFY_APPLY, self._OnApply)          EVT_BUTTON(self, ID_CLASSIFY_APPLY, self._OnApply)
816          EVT_BUTTON(self, ID_CLASSIFY_CANCEL, self._OnCancel)          EVT_BUTTON(self, ID_CLASSIFY_CANCEL, self._OnCancel)
817    
818          self.fields.SetSelection(self.__cur_field)          ###########
         self.__SelectField(self.__cur_field)  
819    
820          self.SetAutoLayout(true)  
821            panel.SetAutoLayout(True)
822            panel.SetSizer(panelBox)
823            panelBox.SetSizeHints(panel)
824    
825            topBox.Add(panel, 1, wxGROW, 0)
826            panelBox.SetSizeHints(self)
827            self.SetAutoLayout(True)
828          self.SetSizer(topBox)          self.SetSizer(topBox)
         topBox.Fit(self)  
         topBox.SetSizeHints(self)  
829    
830            #print "1------------------"
831            #self.Fit()
832            ######################
833    
834            self.haveApplied = False
835    
836        def EditGroupProperties(self, row):
837            table = self.classGrid.GetTable()
838            prop = table.GetValueAsCustom(row, COL_SYMBOL, None)
839    
840            # get a new ClassGroupProperties object and copy the
841            # values over to our current object
842            propDlg = SelectPropertiesDialog(NULL, prop, self.layer.ShapeType())
843            if propDlg.ShowModal() == wxID_OK:
844                new_prop = propDlg.GetClassGroupProperties()
845                table.SetValueAsCustom(row, COL_SYMBOL, None, new_prop)
846            propDlg.Destroy()
847            
848    
849      def __BuildClassification(self, fieldIndex):      def __BuildClassification(self, fieldIndex):
850    
851          numRows = self.classGrid.GetNumberRows()          numRows = self.classGrid.GetNumberRows()
852          assert(numRows > 0) # there should always be a default row          assert numRows > 0  # there should always be a default row
853    
854          clazz = Classification()          clazz = Classification()
855          if fieldIndex == 0:          if fieldIndex == 0:
# Line 740  class Classifier(NonModalDialog): Line 871  class Classifier(NonModalDialog):
871    
872          return clazz          return clazz
873    
874      def __SetGridTable(self, fieldIndex):      def __SetGridTable(self, fieldIndex, group = None):
875    
876          clazz = self.fields.GetClientData(fieldIndex)          clazz = self.fields.GetClientData(fieldIndex)
877    
# Line 755  class Classifier(NonModalDialog): Line 886  class Classifier(NonModalDialog):
886              fieldType = self.layer.GetFieldType(fieldName)              fieldType = self.layer.GetFieldType(fieldName)
887              clazz.SetFieldType(fieldType)              clazz.SetFieldType(fieldType)
888                                    
889          self.classGrid.CreateTable(clazz, self.layer.ShapeType())          #print "6------------------"
890            self.classGrid.CreateTable(clazz, self.layer.ShapeType(), group)
891            #print "7------------------"
892    
893    
894    
895      type2string = {None:             "None",      type2string = {None:             _("None"),
896                     FIELDTYPE_STRING: "Text",                     FIELDTYPE_STRING: _("Text"),
897                     FIELDTYPE_INT:    "Integer",                     FIELDTYPE_INT:    _("Integer"),
898                     FIELDTYPE_DOUBLE: "Decimal"}                     FIELDTYPE_DOUBLE: _("Decimal")}
899    
900      def __SetFieldTypeText(self, fieldIndex):      def __SetFieldTypeText(self, fieldIndex):
901          fieldName = self.fields.GetString(fieldIndex)          fieldName = self.fields.GetString(fieldIndex)
902          fieldType = self.layer.GetFieldType(fieldName)          fieldType = self.layer.GetFieldType(fieldName)
903    
904          assert(Classifier.type2string.has_key(fieldType))          assert Classifier.type2string.has_key(fieldType)
905    
906          text = Classifier.type2string[fieldType]          text = Classifier.type2string[fieldType]
907    
908          self.fieldTypeText.SetLabel(_("Field Type: %s") % text)          self.fieldTypeText.SetLabel(_("Field Type: %s") % text)
909    
910      def __SelectField(self, fieldIndex):      def __SelectField(self, newIndex, oldIndex = -1, group = None):
911          clazz = self.__BuildClassification(fieldIndex)  
912          self.fields.SetClientData(fieldIndex, clazz)          #print "3------------------"
913    
914          self.__cur_field = self.fields.GetSelection()          assert oldIndex >= -1
         self.__SetGridTable(fieldIndex)  
915    
916          enabled = fieldIndex != 0          self.fields.SetSelection(newIndex)
917    
918            if oldIndex != -1:
919                clazz = self.__BuildClassification(oldIndex)
920                self.fields.SetClientData(oldIndex, clazz)
921    
922            #print "4------------------"
923            self.__SetGridTable(newIndex, group)
924            #print "5------------------"
925    
926            enabled = newIndex != 0
927    
928          for b in self.controlButtons:          for b in self.controlButtons:
929              b.Enable(enabled)              b.Enable(enabled)
930    
931          self.__SetFieldTypeText(fieldIndex)          self.__SetFieldTypeText(newIndex)
932    
933    
934        def _OnEditGroupProperties(self, event):
935            sel = self.classGrid.GetCurrentSelection()
936    
937            if len(sel) == 1:
938                self.EditGroupProperties(sel[0])
939    
940      def _OnFieldSelect(self, event):      def _OnFieldSelect(self, event):
941          self.__SelectField(self.__cur_field)          index = self.fields.GetSelection()
942            self.__SelectField(index, self.__cur_field)
943            self.__cur_field = index
944    
945      def _OnApply(self, event):      def _OnApply(self, event):
946          """Put the data from the table into a new Classification and hand          """Put the data from the table into a new Classification and hand
# Line 808  class Classifier(NonModalDialog): Line 958  class Classifier(NonModalDialog):
958    
959          self.layer.SetClassification(clazz)          self.layer.SetClassification(clazz)
960    
961            self.haveApplied = True
962    
963      def _OnOK(self, event):      def _OnOK(self, event):
964          self._OnApply(event)          self._OnApply(event)
965          self.OnClose(event)          self.OnClose(event)
966    
967      def _OnCancel(self, event):      def _OnCancel(self, event):
968          """The layer's current classification stays the same."""          """The layer's current classification stays the same."""
969          self.layer.SetClassification(self.originalClass)          if self.haveApplied:
970                self.layer.SetClassification(self.originalClass)
971    
972          self.OnClose(event)          self.OnClose(event)
973    
974      def _OnAdd(self, event):      def _OnAdd(self, event):
# Line 823  class Classifier(NonModalDialog): Line 977  class Classifier(NonModalDialog):
977      def _OnRemove(self, event):      def _OnRemove(self, event):
978          self.classGrid.DeleteSelectedRows()          self.classGrid.DeleteSelectedRows()
979    
980      def _OnGenRange(self, event):      def _OnGenClass(self, event):
981          print "Classifier._OnGenRange()"  
982            genDlg = ClassGenDialog(self,
983                                    self.layer.table,
984                                    self.fields.GetString(self.__cur_field))
985    
986            if genDlg.ShowModal() == wxID_OK:
987                clazz = genDlg.GetClassification()
988                self.fields.SetClientData(self.__cur_field, clazz)
989                self.classGrid.GetTable().SetClassification(clazz)
990            genDlg.Destroy()
991    
992      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
993          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
994    
995            #print "sel: ", sel
996    
997          if len(sel) == 1:          if len(sel) == 1:
998              i = sel[0]              i = sel[0]
999              if i > 1:              if i > 1:
# Line 839  class Classifier(NonModalDialog): Line 1004  class Classifier(NonModalDialog):
1004                  table.SetClassGroup(i, x)                  table.SetClassGroup(i, x)
1005                  self.classGrid.ClearSelection()                  self.classGrid.ClearSelection()
1006                  self.classGrid.SelectRow(i - 1)                  self.classGrid.SelectRow(i - 1)
1007                    self.classGrid.MakeCellVisible(i - 1, 0)
1008    
1009      def _OnMoveDown(self, event):      def _OnMoveDown(self, event):
1010          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
# Line 853  class Classifier(NonModalDialog): Line 1019  class Classifier(NonModalDialog):
1019                  table.SetClassGroup(i + 1, x)                  table.SetClassGroup(i + 1, x)
1020                  self.classGrid.ClearSelection()                  self.classGrid.ClearSelection()
1021                  self.classGrid.SelectRow(i + 1)                  self.classGrid.SelectRow(i + 1)
1022                    self.classGrid.MakeCellVisible(i + 1, 0)
1023    
1024    
1025  ID_SELPROP_OK = 4001  ID_SELPROP_OK = 4001
# Line 868  class SelectPropertiesDialog(wxDialog): Line 1035  class SelectPropertiesDialog(wxDialog):
1035    
1036      def __init__(self, parent, prop, shapeType):      def __init__(self, parent, prop, shapeType):
1037          wxDialog.__init__(self, parent, -1, _("Select Properties"),          wxDialog.__init__(self, parent, -1, _("Select Properties"),
1038                            style = wxRESIZE_BORDER)                            style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
1039    
1040          self.prop = ClassGroupProperties(prop)          self.prop = ClassGroupProperties(prop)
1041    
# Line 880  class SelectPropertiesDialog(wxDialog): Line 1047  class SelectPropertiesDialog(wxDialog):
1047          previewBox = wxBoxSizer(wxVERTICAL)          previewBox = wxBoxSizer(wxVERTICAL)
1048          previewBox.Add(wxStaticText(self, -1, _("Preview:")),          previewBox.Add(wxStaticText(self, -1, _("Preview:")),
1049              0, wxALIGN_LEFT | wxALL, 4)              0, wxALIGN_LEFT | wxALL, 4)
1050          self.previewer = ClassDataPreviewer(None, self.prop, shapeType,          self.previewWin = ClassDataPreviewWindow(None, self.prop, shapeType,
1051                                              self, ID_SELPROP_PREVIEW, (40, 40))                                              self, ID_SELPROP_PREVIEW, (40, 40))
1052          previewBox.Add(self.previewer, 1, wxGROW, 15)          previewBox.Add(self.previewWin, 1, wxGROW, 15)
1053    
1054          itemBox.Add(previewBox, 1, wxALIGN_LEFT | wxALL | wxGROW, 0)          itemBox.Add(previewBox, 1, wxALIGN_LEFT | wxALL | wxGROW, 0)
1055    
# Line 891  class SelectPropertiesDialog(wxDialog): Line 1058  class SelectPropertiesDialog(wxDialog):
1058    
1059          lineColorBox = wxBoxSizer(wxHORIZONTAL)          lineColorBox = wxBoxSizer(wxHORIZONTAL)
1060          lineColorBox.Add(          lineColorBox.Add(
1061              wxButton(self, ID_SELPROP_STROKECLR, "Change Line Color"),              wxButton(self, ID_SELPROP_STROKECLR, _("Change Line Color")),
1062              1, wxALL | wxGROW, 4)              1, wxALL | wxGROW, 4)
1063          EVT_BUTTON(self, ID_SELPROP_STROKECLR, self._OnChangeLineColor)          EVT_BUTTON(self, ID_SELPROP_STROKECLR, self._OnChangeLineColor)
1064    
1065          lineColorBox.Add(          lineColorBox.Add(
1066              wxButton(self, ID_SELPROP_STROKECLRTRANS, "Transparent"),              wxButton(self, ID_SELPROP_STROKECLRTRANS, _("Transparent")),
1067              1, wxALL | wxGROW, 4)              1, wxALL | wxGROW, 4)
1068          EVT_BUTTON(self, ID_SELPROP_STROKECLRTRANS,          EVT_BUTTON(self, ID_SELPROP_STROKECLRTRANS,
1069                     self._OnChangeLineColorTrans)                     self._OnChangeLineColorTrans)
# Line 907  class SelectPropertiesDialog(wxDialog): Line 1074  class SelectPropertiesDialog(wxDialog):
1074          if shapeType != SHAPETYPE_ARC:          if shapeType != SHAPETYPE_ARC:
1075              fillColorBox = wxBoxSizer(wxHORIZONTAL)              fillColorBox = wxBoxSizer(wxHORIZONTAL)
1076              fillColorBox.Add(              fillColorBox.Add(
1077                  wxButton(self, ID_SELPROP_FILLCLR, "Change Fill Color"),                  wxButton(self, ID_SELPROP_FILLCLR, _("Change Fill Color")),
1078                  1, wxALL | wxGROW, 4)                  1, wxALL | wxGROW, 4)
1079              EVT_BUTTON(self, ID_SELPROP_FILLCLR, self._OnChangeFillColor)              EVT_BUTTON(self, ID_SELPROP_FILLCLR, self._OnChangeFillColor)
1080              fillColorBox.Add(              fillColorBox.Add(
1081                  wxButton(self, ID_SELPROP_FILLCLRTRANS, "Transparent"),                  wxButton(self, ID_SELPROP_FILLCLRTRANS, _("Transparent")),
1082                  1, wxALL | wxGROW, 4)                  1, wxALL | wxGROW, 4)
1083              EVT_BUTTON(self, ID_SELPROP_FILLCLRTRANS,              EVT_BUTTON(self, ID_SELPROP_FILLCLRTRANS,
1084                         self._OnChangeFillColorTrans)                         self._OnChangeFillColorTrans)
# Line 947  class SelectPropertiesDialog(wxDialog): Line 1114  class SelectPropertiesDialog(wxDialog):
1114          EVT_BUTTON(self, ID_SELPROP_OK, self._OnOK)          EVT_BUTTON(self, ID_SELPROP_OK, self._OnOK)
1115          EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)          EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)
1116                                                                                                                                                                    
1117          self.SetAutoLayout(true)          self.SetAutoLayout(True)
1118          self.SetSizer(topBox)          self.SetSizer(topBox)
1119          topBox.Fit(self)          topBox.Fit(self)
1120          topBox.SetSizeHints(self)          topBox.SetSizeHints(self)
# Line 960  class SelectPropertiesDialog(wxDialog): Line 1127  class SelectPropertiesDialog(wxDialog):
1127    
1128      def _OnSpin(self, event):      def _OnSpin(self, event):
1129          self.prop.SetLineWidth(self.spinCtrl.GetValue())          self.prop.SetLineWidth(self.spinCtrl.GetValue())
1130          self.previewer.Refresh()          self.previewWin.Refresh()
1131    
1132      def __GetColor(self, cur):      def __GetColor(self, cur):
1133          dialog = wxColourDialog(self)          dialog = wxColourDialog(self)
1134          dialog.GetColourData().SetColour(Color2wxColour(cur))          if cur is not Color.Transparent:
1135                dialog.GetColourData().SetColour(Color2wxColour(cur))
1136    
1137          ret = None          ret = None
1138          if dialog.ShowModal() == wxID_OK:          if dialog.ShowModal() == wxID_OK:
1139              ret = wxColour2Color(dialog.GetColourData().GetColour())              ret = wxColour2Color(dialog.GetColourData().GetColour())
# Line 977  class SelectPropertiesDialog(wxDialog): Line 1146  class SelectPropertiesDialog(wxDialog):
1146          clr = self.__GetColor(self.prop.GetLineColor())          clr = self.__GetColor(self.prop.GetLineColor())
1147          if clr is not None:          if clr is not None:
1148              self.prop.SetLineColor(clr)              self.prop.SetLineColor(clr)
1149          self.previewer.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1150    
1151      def _OnChangeLineColorTrans(self, event):      def _OnChangeLineColorTrans(self, event):
1152          self.prop.SetLineColor(Color.None)          self.prop.SetLineColor(Color.Transparent)
1153          self.previewer.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1154                    
1155      def _OnChangeFillColor(self, event):      def _OnChangeFillColor(self, event):
1156          clr = self.__GetColor(self.prop.GetFill())          clr = self.__GetColor(self.prop.GetFill())
1157          if clr is not None:          if clr is not None:
1158              self.prop.SetFill(clr)              self.prop.SetFill(clr)
1159          self.previewer.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1160    
1161      def _OnChangeFillColorTrans(self, event):      def _OnChangeFillColorTrans(self, event):
1162          self.prop.SetFill(Color.None)          self.prop.SetFill(Color.Transparent)
1163          self.previewer.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1164    
1165      def GetClassGroupProperties(self):      def GetClassGroupProperties(self):
1166          return self.prop          return self.prop
1167    
1168    
1169  class ClassDataPreviewer(wxWindow):  class ClassDataPreviewWindow(wxWindow):
1170    
1171      def __init__(self, rect, prop, shapeType,      def __init__(self, rect, prop, shapeType,
1172                         parent = None, id = -1, size = wxDefaultSize):                         parent = None, id = -1, size = wxDefaultSize):
1173          if parent is not None:          if parent is not None:
1174              wxWindow.__init__(self, parent, id, size=size)              wxWindow.__init__(self, parent, id, (0, 0), size)
1175              EVT_PAINT(self, self._OnPaint)              EVT_PAINT(self, self._OnPaint)
1176    
1177          self.rect = rect          self.rect = rect
1178    
1179          self.prop = prop          self.prop = prop
1180          self.shapeType = shapeType          self.shapeType = shapeType
1181            self.previewer = ClassDataPreviewer()
1182    
1183      def _OnPaint(self, event):      def _OnPaint(self, event):
1184          dc = wxPaintDC(self)          dc = wxPaintDC(self)
# Line 1015  class ClassDataPreviewer(wxWindow): Line 1186  class ClassDataPreviewer(wxWindow):
1186          # XXX: this doesn't seem to be having an effect:          # XXX: this doesn't seem to be having an effect:
1187          dc.DestroyClippingRegion()          dc.DestroyClippingRegion()
1188    
1189          self.Draw(dc, None)          if self.rect is None:
1190                w, h = self.GetSize()
1191                rect = wxRect(0, 0, w, h)
1192            else:
1193                rect = self.rect
1194    
1195            self.previewer.Draw(dc, rect, self.prop, self.shapeType)
1196    
1197      def Draw(self, dc, rect, prop = None, shapeType = None):  class ClassDataPreviewer:
1198    
1199          if prop is None: prop = self.prop      def Draw(self, dc, rect, prop, shapeType):
1200          if shapeType is None: shapeType = self.shapeType  
1201            assert dc is not None
1202            assert isinstance(prop, ClassGroupProperties)
1203    
1204          if rect is None:          if rect is None:
1205              x = y = 0              x = 0
1206              w, h = self.GetClientSizeTuple()              y = 0
1207                w, h = dc.GetSize()
1208          else:          else:
1209              x = rect.GetX()              x = rect.GetX()
1210              y = rect.GetY()              y = rect.GetY()
# Line 1032  class ClassDataPreviewer(wxWindow): Line 1212  class ClassDataPreviewer(wxWindow):
1212              h = rect.GetHeight()              h = rect.GetHeight()
1213    
1214          stroke = prop.GetLineColor()          stroke = prop.GetLineColor()
1215          if stroke is Color.None:          if stroke is Color.Transparent:
1216              pen = wxTRANSPARENT_PEN              pen = wxTRANSPARENT_PEN
1217          else:          else:
1218              pen = wxPen(Color2wxColour(stroke),              pen = wxPen(Color2wxColour(stroke),
# Line 1040  class ClassDataPreviewer(wxWindow): Line 1220  class ClassDataPreviewer(wxWindow):
1220                          wxSOLID)                          wxSOLID)
1221    
1222          stroke = prop.GetFill()          stroke = prop.GetFill()
1223          if stroke is Color.None:          if stroke is Color.Transparent:
1224              brush = wxTRANSPARENT_BRUSH              brush = wxTRANSPARENT_BRUSH
1225          else:          else:
1226              brush = wxBrush(Color2wxColour(stroke), wxSOLID)              brush = wxBrush(Color2wxColour(stroke), wxSOLID)
# Line 1054  class ClassDataPreviewer(wxWindow): Line 1234  class ClassDataPreviewer(wxWindow):
1234                             wxPoint(x + w/2, y + h/4*3),                             wxPoint(x + w/2, y + h/4*3),
1235                             wxPoint(x + w, y)])                             wxPoint(x + w, y)])
1236    
1237          elif shapeType == SHAPETYPE_POINT or \          elif shapeType == SHAPETYPE_POINT:
              shapeType == SHAPETYPE_POLYGON:  
1238    
1239              dc.DrawCircle(x + w/2, y + h/2,              dc.DrawCircle(x + w/2, y + h/2,
1240                            (min(w, h) - prop.GetLineWidth())/2)                            (min(w, h) - prop.GetLineWidth())/2)
1241    
1242            elif shapeType == SHAPETYPE_POLYGON:
1243                dc.DrawRectangle(x, y, w, h)
1244    
1245  class ClassRenderer(wxPyGridCellRenderer):  class ClassRenderer(wxPyGridCellRenderer):
1246    
1247      def __init__(self, shapeType):      def __init__(self, shapeType):
1248          wxPyGridCellRenderer.__init__(self)          wxPyGridCellRenderer.__init__(self)
1249          self.previewer = ClassDataPreviewer(None, None, shapeType)          self.shapeType = shapeType
1250            self.previewer = ClassDataPreviewer()
1251    
1252      def Draw(self, grid, attr, dc, rect, row, col, isSelected):      def Draw(self, grid, attr, dc, rect, row, col, isSelected):
1253          data = grid.GetTable().GetClassGroup(row)          data = grid.GetTable().GetClassGroup(row)
# Line 1077  class ClassRenderer(wxPyGridCellRenderer Line 1260  class ClassRenderer(wxPyGridCellRenderer
1260                           rect.GetWidth(), rect.GetHeight())                           rect.GetWidth(), rect.GetHeight())
1261    
1262          if not isinstance(data, ClassGroupMap):          if not isinstance(data, ClassGroupMap):
1263              self.previewer.Draw(dc, rect, data.GetProperties())              self.previewer.Draw(dc, rect, data.GetProperties(), self.shapeType)
1264    
1265          if isSelected:          if isSelected:
1266              dc.SetPen(wxPen(wxColour(0 * 255, 0 * 255, 0 * 255),              dc.SetPen(wxPen(wxColour(0 * 255, 0 * 255, 0 * 255),

Legend:
Removed from v.496  
changed lines
  Added in v.610

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26