/[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 1302 by jonathan, Wed Jun 25 09:39:33 2003 UTC revision 1464 by bh, Fri Jul 18 18:20:40 2003 UTC
# Line 27  from Thuban.Model.classification import Line 27  from Thuban.Model.classification import
27      ClassGroupSingleton, ClassGroupRange, ClassGroupMap, \      ClassGroupSingleton, ClassGroupRange, ClassGroupMap, \
28      ClassGroupProperties      ClassGroupProperties
29    
30  from Thuban.Model.color import Color  from Thuban.Model.color import Transparent
31    
32  from Thuban.Model.layer import Layer, RasterLayer, \  from Thuban.Model.layer import Layer, RasterLayer, \
33      SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT      SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT
# Line 35  from Thuban.Model.layer import Layer, Ra Line 35  from Thuban.Model.layer import Layer, Ra
35  from Thuban.UI.classgen import ClassGenDialog  from Thuban.UI.classgen import ClassGenDialog
36    
37  from dialogs import NonModalNonParentDialog  from dialogs import NonModalNonParentDialog
38    from messages import MAP_REPLACED
39    
40  ID_CLASS_TABLE = 40011  ID_CLASS_TABLE = 40011
41    
# Line 84  class ClassGrid(wxGrid): Line 85  class ClassGrid(wxGrid):
85          #print "GetCellAttr ", row, col          #print "GetCellAttr ", row, col
86          #wxGrid.GetCellAttr(self, row, col)          #wxGrid.GetCellAttr(self, row, col)
87    
88      def CreateTable(self, clazz, shapeType, group = None):      def CreateTable(self, clazz, fieldType, shapeType, group = None):
89    
90          assert isinstance(clazz, Classification)          assert isinstance(clazz, Classification)
91    
# Line 104  class ClassGrid(wxGrid): Line 105  class ClassGrid(wxGrid):
105          self.SetSelectionMode(wxGrid.wxGridSelectRows)          self.SetSelectionMode(wxGrid.wxGridSelectRows)
106          self.ClearSelection()          self.ClearSelection()
107    
108          table.Reset(clazz, shapeType, group)          table.Reset(clazz, fieldType, shapeType, group)
109    
110      def GetCurrentSelection(self):      def GetCurrentSelection(self):
111          """Return the currently highlighted rows as an increasing list          """Return the currently highlighted rows as an increasing list
# Line 258  class ClassTable(wxPyGridTableBase): Line 259  class ClassTable(wxPyGridTableBase):
259    
260    
261      def __init__(self, view = None):      def __init__(self, view = None):
     #def __init__(self, clazz, shapeType, view = None):  
262          """Constructor.          """Constructor.
263    
264          shapeType -- the type of shape that the layer uses          shapeType -- the type of shape that the layer uses
# Line 275  class ClassTable(wxPyGridTableBase): Line 275  class ClassTable(wxPyGridTableBase):
275    
276          self.SetView(view)          self.SetView(view)
277    
278      def Reset(self, clazz, shapeType, group = None):      def Reset(self, clazz, fieldType, shapeType, group = None):
279          """Reset the table with the given data.          """Reset the table with the given data.
280    
281          This is necessary because wxWindows does not allow a grid's          This is necessary because wxWindows does not allow a grid's
# Line 293  class ClassTable(wxPyGridTableBase): Line 293  class ClassTable(wxPyGridTableBase):
293    
294          self.GetView().BeginBatch()          self.GetView().BeginBatch()
295    
296          self.fieldType = clazz.GetFieldType()          self.fieldType = fieldType
297          self.shapeType = shapeType          self.shapeType = shapeType
298    
299          self.SetClassification(clazz, group)          self.SetClassification(clazz, group)
# Line 683  class Classifier(NonModalNonParentDialog Line 683  class Classifier(NonModalNonParentDialog
683    
684          self.__SetTitle(layer.Title())          self.__SetTitle(layer.Title())
685    
686            self.parent.Subscribe(MAP_REPLACED, self.map_replaced)
687          self.layer = layer          self.layer = layer
688          self.map = map          self.map = map
689    
# Line 703  class Classifier(NonModalNonParentDialog Line 704  class Classifier(NonModalNonParentDialog
704    
705          if layer.HasClassification():          if layer.HasClassification():
706              self.originalClass = self.layer.GetClassification()              self.originalClass = self.layer.GetClassification()
707              field = self.originalClass.GetField()              self.originalClassField = self.layer.GetClassificationColumn()
708              fieldType = self.originalClass.GetFieldType()              field = self.originalClassField
709                fieldType = self.layer.GetFieldType(field)
710    
711              table = layer.ShapeStore().Table()              table = layer.ShapeStore().Table()
712              #              #
# Line 719  class Classifier(NonModalNonParentDialog Line 721  class Classifier(NonModalNonParentDialog
721    
722              self.fields.Append("<None>")              self.fields.Append("<None>")
723    
724              if self.originalClass.GetFieldType() is None:              if fieldType is None:
725                  self.fields.SetClientData(0, copy.deepcopy(self.originalClass))                  self.fields.SetClientData(0, copy.deepcopy(self.originalClass))
726              else:              else:
727                  self.fields.SetClientData(0, None)                  self.fields.SetClientData(0, None)
# Line 731  class Classifier(NonModalNonParentDialog Line 733  class Classifier(NonModalNonParentDialog
733                  if name == field:                  if name == field:
734                      self.__cur_field = i + 1                      self.__cur_field = i + 1
735                      self.fields.SetClientData(i + 1,                      self.fields.SetClientData(i + 1,
736                                              copy.deepcopy(self.originalClass))                                                copy.deepcopy(self.originalClass))
737                  else:                  else:
738                      self.fields.SetClientData(i + 1, None)                      self.fields.SetClientData(i + 1, None)
739    
# Line 758  class Classifier(NonModalNonParentDialog Line 760  class Classifier(NonModalNonParentDialog
760          button_try = wxButton(self, ID_PROPERTY_TRY, _("Try"))          button_try = wxButton(self, ID_PROPERTY_TRY, _("Try"))
761          button_revert = wxButton(self, ID_PROPERTY_REVERT, _("Revert"))          button_revert = wxButton(self, ID_PROPERTY_REVERT, _("Revert"))
762          button_ok = wxButton(self, wxID_OK, _("OK"))          button_ok = wxButton(self, wxID_OK, _("OK"))
         button_ok.SetDefault()  
763          button_close = wxButton(self, wxID_CANCEL, _("Close"))          button_close = wxButton(self, wxID_CANCEL, _("Close"))
764            button_ok.SetDefault()
765    
766          ############################          ############################
767          # Layout the controls          # Layout the controls
# Line 860  class Classifier(NonModalNonParentDialog Line 862  class Classifier(NonModalNonParentDialog
862          self.haveApplied = False          self.haveApplied = False
863    
864      def unsubscribe_messages(self):      def unsubscribe_messages(self):
865            self.parent.Unsubscribe(MAP_REPLACED, self.map_replaced)
866          self.map.Unsubscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)          self.map.Unsubscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)
867          self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,          self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,
868                                 self.layer_shapestore_replaced)                                 self.layer_shapestore_replaced)
# Line 869  class Classifier(NonModalNonParentDialog Line 872  class Classifier(NonModalNonParentDialog
872              self.Close()              self.Close()
873    
874      def layer_shapestore_replaced(self, *args):      def layer_shapestore_replaced(self, *args):
875            """Subscribed to the map's LAYER_SHAPESTORE_REPLACED message.
876    
877            Close self.
878            """
879            self.Close()
880    
881        def map_replaced(self, *args):
882            """Subscribed to the mainwindow's MAP_REPLACED message. Close self."""
883          self.Close()          self.Close()
884    
885      def EditSymbol(self, row):      def EditSymbol(self, row):
# Line 891  class Classifier(NonModalNonParentDialog Line 902  class Classifier(NonModalNonParentDialog
902          self.fields.SetClientData(self.__cur_field, clazz)          self.fields.SetClientData(self.__cur_field, clazz)
903          self.classGrid.GetTable().SetClassification(clazz)          self.classGrid.GetTable().SetClassification(clazz)
904    
905      def __BuildClassification(self, fieldIndex, copyClass = False):      def __BuildClassification(self, fieldIndex, copyClass=False, force=False):
906    
907  #       numRows = self.classGrid.GetNumberRows()  #       numRows = self.classGrid.GetNumberRows()
908  #       assert numRows > 0  # there should always be a default row  #       assert numRows > 0  # there should always be a default row
909    
 #       clazz = Classification()  
910          if fieldIndex == 0:          if fieldIndex == 0:
911              fieldName = None              fieldName = None
912              fieldType = None              fieldType = None
# Line 904  class Classifier(NonModalNonParentDialog Line 914  class Classifier(NonModalNonParentDialog
914              fieldName = self.fields.GetString(fieldIndex)              fieldName = self.fields.GetString(fieldIndex)
915              fieldType = self.layer.GetFieldType(fieldName)              fieldType = self.layer.GetFieldType(fieldName)
916    
917          clazz = self.classGrid.GetTable().GetClassification()          clazz = self.fields.GetClientData(fieldIndex)
918            if clazz is None or self.classGrid.GetTable().IsModified() or force:
919          if copyClass:              clazz = self.classGrid.GetTable().GetClassification()
920              clazz = copy.deepcopy(clazz)              if copyClass:
921                    clazz = copy.deepcopy(clazz)
         clazz.SetField(fieldName)  
         clazz.SetFieldType(fieldType)  
   
   
 #       table = self.classGrid.GetTable()  
 #       clazz.SetDefaultGroup(table.GetClassGroup(0))  
   
 #       for i in range(1, numRows):  
 #           clazz.AppendGroup(table.GetClassGroup(i))  
922    
923          return clazz          return clazz, fieldName
924    
925      def __SetGridTable(self, fieldIndex, group = None):      def __SetGridTable(self, fieldIndex, group = None):
926    
# Line 932  class Classifier(NonModalNonParentDialog Line 933  class Classifier(NonModalNonParentDialog
933                      self.layer.GetClassification().                      self.layer.GetClassification().
934                                 GetDefaultGroup().GetProperties()))                                 GetDefaultGroup().GetProperties()))
935    
936              fieldName = self.fields.GetString(fieldIndex)          fieldName = self.fields.GetString(fieldIndex)
937              fieldType = self.layer.GetFieldType(fieldName)          fieldType = self.layer.GetFieldType(fieldName)
             clazz.SetFieldType(fieldType)  
938                                    
939          self.classGrid.CreateTable(clazz, self.layer.ShapeType(), group)          self.classGrid.CreateTable(clazz, fieldType,
940                                       self.layer.ShapeType(), group)
941    
942      def __SetFieldTypeText(self, fieldIndex):      def __SetFieldTypeText(self, fieldIndex):
943          fieldName = self.fields.GetString(fieldIndex)          fieldName = self.fields.GetString(fieldIndex)
# Line 956  class Classifier(NonModalNonParentDialog Line 957  class Classifier(NonModalNonParentDialog
957          assert oldIndex >= -1          assert oldIndex >= -1
958    
959          if oldIndex != -1:          if oldIndex != -1:
960              clazz = self.__BuildClassification(oldIndex)              clazz, name = self.__BuildClassification(oldIndex, force = True)
961              self.fields.SetClientData(oldIndex, clazz)              self.fields.SetClientData(oldIndex, clazz)
962    
963          self.__SetGridTable(newIndex, group)          self.__SetGridTable(newIndex, group)
964    
965          self.__EnableButtons(EB_SELECT_FIELD, newIndex != 0)          self.__EnableButtons(EB_SELECT_FIELD)
966    
967          self.__SetFieldTypeText(newIndex)          self.__SetFieldTypeText(newIndex)
968    
# Line 995  class Classifier(NonModalNonParentDialog Line 996  class Classifier(NonModalNonParentDialog
996              # to begin with or it has been modified              # to begin with or it has been modified
997              #              #
998              self.classGrid.SaveEditControlValue()              self.classGrid.SaveEditControlValue()
999              if clazz is None or self.classGrid.GetTable().IsModified():              clazz, name = self.__BuildClassification(self.__cur_field, True)
                 clazz = self.__BuildClassification(self.__cur_field, True)  
1000    
1001                self.layer.SetClassificationColumn(name)
1002              self.layer.SetClassification(clazz)              self.layer.SetClassification(clazz)
1003    
1004          self.haveApplied = True          self.haveApplied = True
# Line 1021  class Classifier(NonModalNonParentDialog Line 1022  class Classifier(NonModalNonParentDialog
1022      def _OnRevert(self, event):      def _OnRevert(self, event):
1023          """The layer's current classification stays the same."""          """The layer's current classification stays the same."""
1024          if self.haveApplied:          if self.haveApplied:
1025                self.layer.SetClassificationColumn(self.originalClassField)
1026              self.layer.SetClassification(self.originalClass)              self.layer.SetClassification(self.originalClass)
1027    
1028          #self.Close()          #self.Close()
# Line 1038  class Classifier(NonModalNonParentDialog Line 1040  class Classifier(NonModalNonParentDialog
1040    
1041          EVT_CLOSE(self.genDlg, self._OnGenDialogClose)          EVT_CLOSE(self.genDlg, self._OnGenDialogClose)
1042    
1043          self.__EnableButtons(EB_GEN_CLASS, False)          self.__EnableButtons(EB_GEN_CLASS)
1044    
1045          self.genDlg.Show()          self.genDlg.Show()
1046    
1047      def _OnGenDialogClose(self, event):      def _OnGenDialogClose(self, event):
1048          self.genDlg.Destroy()          self.genDlg.Destroy()
1049          self.__EnableButtons(EB_GEN_CLASS, True)          self.genDlg = None
1050            self.__EnableButtons(EB_GEN_CLASS)
1051    
1052      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
1053          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
# Line 1082  class Classifier(NonModalNonParentDialog Line 1085  class Classifier(NonModalNonParentDialog
1085          self.layer.SetTitle(obj.GetValue())          self.layer.SetTitle(obj.GetValue())
1086          self.__SetTitle(self.layer.Title())          self.__SetTitle(self.layer.Title())
1087    
1088          self.__EnableButtons(EB_LAYER_TITLE, self.layer.Title() != "")          self.__EnableButtons(EB_LAYER_TITLE)
1089    
1090      def __EnableButtons(self, case, enable):      def __EnableButtons(self, case):
1091    
1092            list = {wxID_OK                 : True,
1093                    wxID_CANCEL             : True,
1094                    ID_PROPERTY_ADD         : True,
1095                    ID_PROPERTY_MOVEUP      : True,
1096                    ID_PROPERTY_MOVEDOWN    : True,
1097                    ID_PROPERTY_REMOVE      : True,
1098                    ID_PROPERTY_SELECT      : True,
1099                    ID_PROPERTY_FIELDTEXT   : True,
1100                    ID_PROPERTY_GENCLASS    : True,
1101                    ID_PROPERTY_EDITSYM     : True}
1102    
1103          if case == EB_LAYER_TITLE:            if case == EB_LAYER_TITLE:  
1104              list = (wxID_OK,              if self.layer.Title() == "":
1105                      wxID_CANCEL)                  list[wxID_OK] = False
1106                    list[wxID_CANCEL] = False
1107    
1108          elif case == EB_SELECT_FIELD:          elif case == EB_SELECT_FIELD:
1109              list = (ID_PROPERTY_GENCLASS,              if self.fields.GetSelection() == 0:
1110                      ID_PROPERTY_ADD,                  list[ID_PROPERTY_GENCLASS] = False
1111                      ID_PROPERTY_MOVEUP,                  list[ID_PROPERTY_ADD] = False
1112                      ID_PROPERTY_MOVEDOWN,                  list[ID_PROPERTY_MOVEUP] = False
1113                      ID_PROPERTY_EDITSYM,                  list[ID_PROPERTY_MOVEDOWN] = False
1114                      ID_PROPERTY_REMOVE)                  list[ID_PROPERTY_REMOVE] = False
1115    
1116          elif case == EB_GEN_CLASS:          elif case == EB_GEN_CLASS:
1117              list = (ID_PROPERTY_SELECT,              if self.genDlg is not None:
1118                      ID_PROPERTY_FIELDTEXT,                  list[ID_PROPERTY_SELECT] = False
1119                      ID_PROPERTY_GENCLASS,                  list[ID_PROPERTY_FIELDTEXT] = False
1120                      ID_PROPERTY_EDITSYM)                  list[ID_PROPERTY_GENCLASS] = False
1121    
1122          for id in list:          for id, enable in list.items():
1123              self.FindWindowById(id).Enable(enable)              win = self.FindWindowById(id)
1124                if win:
1125                    win.Enable(enable)
1126    
1127  ID_SELPROP_SPINCTRL = 4002  ID_SELPROP_SPINCTRL = 4002
1128  ID_SELPROP_PREVIEW = 4003  ID_SELPROP_PREVIEW = 4003
# Line 1194  class SelectPropertiesDialog(wxDialog): Line 1211  class SelectPropertiesDialog(wxDialog):
1211          #          #
1212          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
1213          button_ok = wxButton(self, wxID_OK, _("OK"))          button_ok = wxButton(self, wxID_OK, _("OK"))
         button_ok.SetDefault()  
1214          buttonBox.Add(button_ok, 0, wxRIGHT|wxEXPAND, 10)          buttonBox.Add(button_ok, 0, wxRIGHT|wxEXPAND, 10)
1215          buttonBox.Add(wxButton(self, wxID_CANCEL, _("Cancel")),          buttonBox.Add(wxButton(self, wxID_CANCEL, _("Cancel")),
1216                        0, wxRIGHT|wxEXPAND, 10)                        0, wxRIGHT|wxEXPAND, 10)
1217          topBox.Add(buttonBox, 0, wxALIGN_RIGHT|wxBOTTOM|wxTOP, 10)          topBox.Add(buttonBox, 0, wxALIGN_RIGHT|wxBOTTOM|wxTOP, 10)
1218    
1219            button_ok.SetDefault()
1220                                                                                                                                                                    
1221          #EVT_BUTTON(self, wxID_OK, self._OnOK)          #EVT_BUTTON(self, wxID_OK, self._OnOK)
1222          #EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)          #EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)
# Line 1220  class SelectPropertiesDialog(wxDialog): Line 1238  class SelectPropertiesDialog(wxDialog):
1238    
1239      def __GetColor(self, cur):      def __GetColor(self, cur):
1240          dialog = wxColourDialog(self)          dialog = wxColourDialog(self)
1241          if cur is not Color.Transparent:          if cur is not Transparent:
1242              dialog.GetColourData().SetColour(Color2wxColour(cur))              dialog.GetColourData().SetColour(Color2wxColour(cur))
1243    
1244          ret = None          ret = None
# Line 1238  class SelectPropertiesDialog(wxDialog): Line 1256  class SelectPropertiesDialog(wxDialog):
1256          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1257    
1258      def _OnChangeLineColorTrans(self, event):      def _OnChangeLineColorTrans(self, event):
1259          self.prop.SetLineColor(Color.Transparent)          self.prop.SetLineColor(Transparent)
1260          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1261                    
1262      def _OnChangeFillColor(self, event):      def _OnChangeFillColor(self, event):
# Line 1248  class SelectPropertiesDialog(wxDialog): Line 1266  class SelectPropertiesDialog(wxDialog):
1266          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1267    
1268      def _OnChangeFillColorTrans(self, event):      def _OnChangeFillColorTrans(self, event):
1269          self.prop.SetFill(Color.Transparent)          self.prop.SetFill(Transparent)
1270          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1271    
1272      def GetClassGroupProperties(self):      def GetClassGroupProperties(self):
# Line 1304  class ClassDataPreviewer: Line 1322  class ClassDataPreviewer:
1322              h = rect.GetHeight()              h = rect.GetHeight()
1323    
1324          stroke = prop.GetLineColor()          stroke = prop.GetLineColor()
1325          if stroke is Color.Transparent:          if stroke is Transparent:
1326              pen = wxTRANSPARENT_PEN              pen = wxTRANSPARENT_PEN
1327          else:          else:
1328              pen = wxPen(Color2wxColour(stroke),              pen = wxPen(Color2wxColour(stroke),
# Line 1312  class ClassDataPreviewer: Line 1330  class ClassDataPreviewer:
1330                          wxSOLID)                          wxSOLID)
1331    
1332          stroke = prop.GetFill()          stroke = prop.GetFill()
1333          if stroke is Color.Transparent:          if stroke is Transparent:
1334              brush = wxTRANSPARENT_BRUSH              brush = wxTRANSPARENT_BRUSH
1335          else:          else:
1336              brush = wxBrush(Color2wxColour(stroke), wxSOLID)              brush = wxBrush(Color2wxColour(stroke), wxSOLID)

Legend:
Removed from v.1302  
changed lines
  Added in v.1464

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26