/[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 1058 by frank, Tue May 27 11:30:29 2003 UTC revision 1433 by jonathan, Wed Jul 16 13:24:25 2003 UTC
# Line 20  from wxPython.grid import * Line 20  from wxPython.grid import *
20  from Thuban import _  from Thuban import _
21  from Thuban.UI.common import Color2wxColour, wxColour2Color  from Thuban.UI.common import Color2wxColour, wxColour2Color
22    
23    from Thuban.Model.messages import MAP_LAYERS_REMOVED, LAYER_SHAPESTORE_REPLACED
24  from Thuban.Model.range import Range  from Thuban.Model.range import Range
25  from Thuban.Model.classification import \  from Thuban.Model.classification import \
26      Classification, ClassGroupDefault, \      Classification, ClassGroupDefault, \
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
34    
35  from Thuban.UI.classgen import ClassGenDialog, ClassGenerator  from Thuban.UI.classgen import ClassGenDialog
36    
37  from dialogs import NonModalNonParentDialog  from dialogs import NonModalNonParentDialog
38    
# Line 83  class ClassGrid(wxGrid): Line 84  class ClassGrid(wxGrid):
84          #print "GetCellAttr ", row, col          #print "GetCellAttr ", row, col
85          #wxGrid.GetCellAttr(self, row, col)          #wxGrid.GetCellAttr(self, row, col)
86    
87      def CreateTable(self, clazz, shapeType, group = None):      def CreateTable(self, clazz, fieldType, shapeType, group = None):
88    
89          assert isinstance(clazz, Classification)          assert isinstance(clazz, Classification)
90    
# Line 103  class ClassGrid(wxGrid): Line 104  class ClassGrid(wxGrid):
104          self.SetSelectionMode(wxGrid.wxGridSelectRows)          self.SetSelectionMode(wxGrid.wxGridSelectRows)
105          self.ClearSelection()          self.ClearSelection()
106    
107          table.Reset(clazz, shapeType, group)          table.Reset(clazz, fieldType, shapeType, group)
108    
109      def GetCurrentSelection(self):      def GetCurrentSelection(self):
110          """Return the currently highlighted rows as an increasing list          """Return the currently highlighted rows as an increasing list
# Line 257  class ClassTable(wxPyGridTableBase): Line 258  class ClassTable(wxPyGridTableBase):
258    
259    
260      def __init__(self, view = None):      def __init__(self, view = None):
     #def __init__(self, clazz, shapeType, view = None):  
261          """Constructor.          """Constructor.
262    
263          shapeType -- the type of shape that the layer uses          shapeType -- the type of shape that the layer uses
# Line 274  class ClassTable(wxPyGridTableBase): Line 274  class ClassTable(wxPyGridTableBase):
274    
275          self.SetView(view)          self.SetView(view)
276    
277      def Reset(self, clazz, shapeType, group = None):      def Reset(self, clazz, fieldType, shapeType, group = None):
278          """Reset the table with the given data.          """Reset the table with the given data.
279    
280          This is necessary because wxWindows does not allow a grid's          This is necessary because wxWindows does not allow a grid's
# Line 292  class ClassTable(wxPyGridTableBase): Line 292  class ClassTable(wxPyGridTableBase):
292    
293          self.GetView().BeginBatch()          self.GetView().BeginBatch()
294    
295          self.fieldType = clazz.GetFieldType()          self.fieldType = fieldType
296          self.shapeType = shapeType          self.shapeType = shapeType
297    
298          self.SetClassification(clazz, group)          self.SetClassification(clazz, group)
# Line 677  class Classifier(NonModalNonParentDialog Line 677  class Classifier(NonModalNonParentDialog
677                     FIELDTYPE_INT:    _("Integer"),                     FIELDTYPE_INT:    _("Integer"),
678                     FIELDTYPE_DOUBLE: _("Decimal")}                     FIELDTYPE_DOUBLE: _("Decimal")}
679    
680      def __init__(self, parent, name, layer, group = None):      def __init__(self, parent, name, map, layer, group = None):
681          NonModalNonParentDialog.__init__(self, parent, name, "")          NonModalNonParentDialog.__init__(self, parent, name, "")
682    
683          self.__SetTitle(layer.Title())          self.__SetTitle(layer.Title())
684    
685          self.layer = layer          self.layer = layer
686            self.map = map
687    
688            self.map.Subscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)
689            self.layer.Subscribe(LAYER_SHAPESTORE_REPLACED,
690                                 self.layer_shapestore_replaced)
691    
692          self.genDlg = None          self.genDlg = None
693    
# Line 698  class Classifier(NonModalNonParentDialog Line 702  class Classifier(NonModalNonParentDialog
702    
703          if layer.HasClassification():          if layer.HasClassification():
704              self.originalClass = self.layer.GetClassification()              self.originalClass = self.layer.GetClassification()
705              field = self.originalClass.GetField()              self.originalClassField = self.layer.GetClassificationField()
706              fieldType = self.originalClass.GetFieldType()              field = self.originalClassField
707                fieldType = self.layer.GetFieldType(field)
708    
709                table = layer.ShapeStore().Table()
710              #              #
711              # make field choice box              # make field choice box
712              #              #
713              self.fields = wxChoice(panel, ID_PROPERTY_SELECT,)              self.fields = wxChoice(panel, ID_PROPERTY_SELECT,)
714    
715              self.num_cols = layer.table.NumColumns()              self.num_cols = table.NumColumns()
716              # just assume the first field in case one hasn't been              # just assume the first field in case one hasn't been
717              # specified in the file.              # specified in the file.
718              self.__cur_field = 0              self.__cur_field = 0
719    
720              self.fields.Append("<None>")              self.fields.Append("<None>")
721    
722              if self.originalClass.GetFieldType() is None:              if fieldType is None:
723                  self.fields.SetClientData(0, copy.deepcopy(self.originalClass))                  self.fields.SetClientData(0, copy.deepcopy(self.originalClass))
724              else:              else:
725                  self.fields.SetClientData(0, None)                  self.fields.SetClientData(0, None)
726    
727              for i in range(self.num_cols):              for i in range(self.num_cols):
728                  name = layer.table.Column(i).name                  name = table.Column(i).name
729                  self.fields.Append(name)                  self.fields.Append(name)
730    
731                  if name == field:                  if name == field:
732                      self.__cur_field = i + 1                      self.__cur_field = i + 1
733                      self.fields.SetClientData(i + 1,                      self.fields.SetClientData(i + 1,
734                                              copy.deepcopy(self.originalClass))                                                copy.deepcopy(self.originalClass))
735                  else:                  else:
736                      self.fields.SetClientData(i + 1, None)                      self.fields.SetClientData(i + 1, None)
737    
# Line 752  class Classifier(NonModalNonParentDialog Line 758  class Classifier(NonModalNonParentDialog
758          button_try = wxButton(self, ID_PROPERTY_TRY, _("Try"))          button_try = wxButton(self, ID_PROPERTY_TRY, _("Try"))
759          button_revert = wxButton(self, ID_PROPERTY_REVERT, _("Revert"))          button_revert = wxButton(self, ID_PROPERTY_REVERT, _("Revert"))
760          button_ok = wxButton(self, wxID_OK, _("OK"))          button_ok = wxButton(self, wxID_OK, _("OK"))
         button_ok.SetDefault()  
761          button_close = wxButton(self, wxID_CANCEL, _("Close"))          button_close = wxButton(self, wxID_CANCEL, _("Close"))
762            button_ok.SetDefault()
763    
764          ############################          ############################
765          # Layout the controls          # Layout the controls
# Line 853  class Classifier(NonModalNonParentDialog Line 859  class Classifier(NonModalNonParentDialog
859          text_title.SetFocus()          text_title.SetFocus()
860          self.haveApplied = False          self.haveApplied = False
861    
862        def unsubscribe_messages(self):
863            self.map.Unsubscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)
864            self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,
865                                   self.layer_shapestore_replaced)
866    
867        def map_layers_removed(self, map):
868            if self.layer not in self.map.Layers():
869                self.Close()
870    
871        def layer_shapestore_replaced(self, *args):
872            self.Close()
873    
874      def EditSymbol(self, row):      def EditSymbol(self, row):
875          table = self.classGrid.GetTable()          table = self.classGrid.GetTable()
876          prop = table.GetValueAsCustom(row, COL_SYMBOL, None)          prop = table.GetValueAsCustom(row, COL_SYMBOL, None)
877    
878          # get a new ClassGroupProperties object and copy the          # get a new ClassGroupProperties object and copy the
879          # values over to our current object          # values over to our current object
880          propDlg = SelectPropertiesDialog(NULL, prop, self.layer.ShapeType())          propDlg = SelectPropertiesDialog(self, prop, self.layer.ShapeType())
881    
882          self.Enable(False)          self.Enable(False)
883          if propDlg.ShowModal() == wxID_OK:          if propDlg.ShowModal() == wxID_OK:
# Line 878  class Classifier(NonModalNonParentDialog Line 896  class Classifier(NonModalNonParentDialog
896  #       numRows = self.classGrid.GetNumberRows()  #       numRows = self.classGrid.GetNumberRows()
897  #       assert numRows > 0  # there should always be a default row  #       assert numRows > 0  # there should always be a default row
898    
 #       clazz = Classification()  
899          if fieldIndex == 0:          if fieldIndex == 0:
900              fieldName = None              fieldName = None
901              fieldType = None              fieldType = None
# Line 891  class Classifier(NonModalNonParentDialog Line 908  class Classifier(NonModalNonParentDialog
908          if copyClass:          if copyClass:
909              clazz = copy.deepcopy(clazz)              clazz = copy.deepcopy(clazz)
910    
         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))  
   
911          return clazz          return clazz
912    
913      def __SetGridTable(self, fieldIndex, group = None):      def __SetGridTable(self, fieldIndex, group = None):
# Line 914  class Classifier(NonModalNonParentDialog Line 921  class Classifier(NonModalNonParentDialog
921                      self.layer.GetClassification().                      self.layer.GetClassification().
922                                 GetDefaultGroup().GetProperties()))                                 GetDefaultGroup().GetProperties()))
923    
924              fieldName = self.fields.GetString(fieldIndex)          fieldName = self.fields.GetString(fieldIndex)
925              fieldType = self.layer.GetFieldType(fieldName)          fieldType = self.layer.GetFieldType(fieldName)
             clazz.SetFieldType(fieldType)  
926                                    
927          self.classGrid.CreateTable(clazz, self.layer.ShapeType(), group)          self.classGrid.CreateTable(clazz, fieldType,
928                                       self.layer.ShapeType(), group)
929    
930      def __SetFieldTypeText(self, fieldIndex):      def __SetFieldTypeText(self, fieldIndex):
931          fieldName = self.fields.GetString(fieldIndex)          fieldName = self.fields.GetString(fieldIndex)
# Line 943  class Classifier(NonModalNonParentDialog Line 950  class Classifier(NonModalNonParentDialog
950    
951          self.__SetGridTable(newIndex, group)          self.__SetGridTable(newIndex, group)
952    
953          self.__EnableButtons(EB_SELECT_FIELD, newIndex != 0)          self.__EnableButtons(EB_SELECT_FIELD)
954    
955          self.__SetFieldTypeText(newIndex)          self.__SetFieldTypeText(newIndex)
956    
# Line 980  class Classifier(NonModalNonParentDialog Line 987  class Classifier(NonModalNonParentDialog
987              if clazz is None or self.classGrid.GetTable().IsModified():              if clazz is None or self.classGrid.GetTable().IsModified():
988                  clazz = self.__BuildClassification(self.__cur_field, True)                  clazz = self.__BuildClassification(self.__cur_field, True)
989    
990                self.layer.SetClassificationField(
991                    self.fields.GetString(self.__cur_field))
992              self.layer.SetClassification(clazz)              self.layer.SetClassification(clazz)
993    
994          self.haveApplied = True          self.haveApplied = True
# Line 989  class Classifier(NonModalNonParentDialog Line 998  class Classifier(NonModalNonParentDialog
998          self.Close()          self.Close()
999    
1000      def OnClose(self, event):      def OnClose(self, event):
1001            self.unsubscribe_messages()
1002          NonModalNonParentDialog.OnClose(self, event)          NonModalNonParentDialog.OnClose(self, event)
1003    
1004      def _OnCloseBtn(self, event):      def _OnCloseBtn(self, event):
# Line 1002  class Classifier(NonModalNonParentDialog Line 1012  class Classifier(NonModalNonParentDialog
1012      def _OnRevert(self, event):      def _OnRevert(self, event):
1013          """The layer's current classification stays the same."""          """The layer's current classification stays the same."""
1014          if self.haveApplied:          if self.haveApplied:
1015                self.layer.SetClassificationField(self.originalClassField)
1016              self.layer.SetClassification(self.originalClass)              self.layer.SetClassification(self.originalClass)
1017    
1018          #self.Close()          #self.Close()
# Line 1019  class Classifier(NonModalNonParentDialog Line 1030  class Classifier(NonModalNonParentDialog
1030    
1031          EVT_CLOSE(self.genDlg, self._OnGenDialogClose)          EVT_CLOSE(self.genDlg, self._OnGenDialogClose)
1032    
1033          self.__EnableButtons(EB_GEN_CLASS, False)          self.__EnableButtons(EB_GEN_CLASS)
1034    
1035          self.genDlg.Show()          self.genDlg.Show()
1036    
1037      def _OnGenDialogClose(self, event):      def _OnGenDialogClose(self, event):
1038          self.genDlg.Destroy()          self.genDlg.Destroy()
1039          self.__EnableButtons(EB_GEN_CLASS, True)          self.genDlg = None
1040            self.__EnableButtons(EB_GEN_CLASS)
1041    
1042      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
1043          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
# Line 1063  class Classifier(NonModalNonParentDialog Line 1075  class Classifier(NonModalNonParentDialog
1075          self.layer.SetTitle(obj.GetValue())          self.layer.SetTitle(obj.GetValue())
1076          self.__SetTitle(self.layer.Title())          self.__SetTitle(self.layer.Title())
1077    
1078          self.__EnableButtons(EB_LAYER_TITLE, self.layer.Title() != "")          self.__EnableButtons(EB_LAYER_TITLE)
1079    
1080        def __EnableButtons(self, case):
1081    
1082      def __EnableButtons(self, case, enable):          list = {wxID_OK                 : True,
1083                    wxID_CANCEL             : True,
1084                    ID_PROPERTY_ADD         : True,
1085                    ID_PROPERTY_MOVEUP      : True,
1086                    ID_PROPERTY_MOVEDOWN    : True,
1087                    ID_PROPERTY_REMOVE      : True,
1088                    ID_PROPERTY_SELECT      : True,
1089                    ID_PROPERTY_FIELDTEXT   : True,
1090                    ID_PROPERTY_GENCLASS    : True,
1091                    ID_PROPERTY_EDITSYM     : True}
1092    
1093          if case == EB_LAYER_TITLE:            if case == EB_LAYER_TITLE:  
1094              list = (wxID_OK,              if self.layer.Title() == "":
1095                      wxID_CANCEL)                  list[wxID_OK] = False
1096                    list[wxID_CANCEL] = False
1097    
1098          elif case == EB_SELECT_FIELD:          elif case == EB_SELECT_FIELD:
1099              list = (ID_PROPERTY_GENCLASS,              if self.fields.GetSelection() == 0:
1100                      ID_PROPERTY_ADD,                  list[ID_PROPERTY_GENCLASS] = False
1101                      ID_PROPERTY_MOVEUP,                  list[ID_PROPERTY_ADD] = False
1102                      ID_PROPERTY_MOVEDOWN,                  list[ID_PROPERTY_MOVEUP] = False
1103                      ID_PROPERTY_EDITSYM,                  list[ID_PROPERTY_MOVEDOWN] = False
1104                      ID_PROPERTY_REMOVE)                  list[ID_PROPERTY_REMOVE] = False
1105    
1106          elif case == EB_GEN_CLASS:          elif case == EB_GEN_CLASS:
1107              list = (ID_PROPERTY_SELECT,              if self.genDlg is not None:
1108                      ID_PROPERTY_FIELDTEXT,                  list[ID_PROPERTY_SELECT] = False
1109                      ID_PROPERTY_GENCLASS,                  list[ID_PROPERTY_FIELDTEXT] = False
1110                      ID_PROPERTY_EDITSYM)                  list[ID_PROPERTY_GENCLASS] = False
1111    
1112          for id in list:          for id, enable in list.items():
1113              self.FindWindowById(id).Enable(enable)              win = self.FindWindowById(id)
1114                if win:
1115                    win.Enable(enable)
1116    
1117  ID_SELPROP_SPINCTRL = 4002  ID_SELPROP_SPINCTRL = 4002
1118  ID_SELPROP_PREVIEW = 4003  ID_SELPROP_PREVIEW = 4003
# Line 1175  class SelectPropertiesDialog(wxDialog): Line 1201  class SelectPropertiesDialog(wxDialog):
1201          #          #
1202          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
1203          button_ok = wxButton(self, wxID_OK, _("OK"))          button_ok = wxButton(self, wxID_OK, _("OK"))
         button_ok.SetDefault()  
1204          buttonBox.Add(button_ok, 0, wxRIGHT|wxEXPAND, 10)          buttonBox.Add(button_ok, 0, wxRIGHT|wxEXPAND, 10)
1205          buttonBox.Add(wxButton(self, wxID_CANCEL, _("Cancel")),          buttonBox.Add(wxButton(self, wxID_CANCEL, _("Cancel")),
1206                        0, wxRIGHT|wxEXPAND, 10)                        0, wxRIGHT|wxEXPAND, 10)
1207          topBox.Add(buttonBox, 0, wxALIGN_RIGHT|wxBOTTOM|wxTOP, 10)          topBox.Add(buttonBox, 0, wxALIGN_RIGHT|wxBOTTOM|wxTOP, 10)
1208    
1209            button_ok.SetDefault()
1210                                                                                                                                                                    
1211          #EVT_BUTTON(self, wxID_OK, self._OnOK)          #EVT_BUTTON(self, wxID_OK, self._OnOK)
1212          #EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)          #EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)
# Line 1201  class SelectPropertiesDialog(wxDialog): Line 1228  class SelectPropertiesDialog(wxDialog):
1228    
1229      def __GetColor(self, cur):      def __GetColor(self, cur):
1230          dialog = wxColourDialog(self)          dialog = wxColourDialog(self)
1231          if cur is not Color.Transparent:          if cur is not Transparent:
1232              dialog.GetColourData().SetColour(Color2wxColour(cur))              dialog.GetColourData().SetColour(Color2wxColour(cur))
1233    
1234          ret = None          ret = None
# Line 1219  class SelectPropertiesDialog(wxDialog): Line 1246  class SelectPropertiesDialog(wxDialog):
1246          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1247    
1248      def _OnChangeLineColorTrans(self, event):      def _OnChangeLineColorTrans(self, event):
1249          self.prop.SetLineColor(Color.Transparent)          self.prop.SetLineColor(Transparent)
1250          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1251                    
1252      def _OnChangeFillColor(self, event):      def _OnChangeFillColor(self, event):
# Line 1229  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 _OnChangeFillColorTrans(self, event):      def _OnChangeFillColorTrans(self, event):
1259          self.prop.SetFill(Color.Transparent)          self.prop.SetFill(Transparent)
1260          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1261    
1262      def GetClassGroupProperties(self):      def GetClassGroupProperties(self):
# Line 1285  class ClassDataPreviewer: Line 1312  class ClassDataPreviewer:
1312              h = rect.GetHeight()              h = rect.GetHeight()
1313    
1314          stroke = prop.GetLineColor()          stroke = prop.GetLineColor()
1315          if stroke is Color.Transparent:          if stroke is Transparent:
1316              pen = wxTRANSPARENT_PEN              pen = wxTRANSPARENT_PEN
1317          else:          else:
1318              pen = wxPen(Color2wxColour(stroke),              pen = wxPen(Color2wxColour(stroke),
# Line 1293  class ClassDataPreviewer: Line 1320  class ClassDataPreviewer:
1320                          wxSOLID)                          wxSOLID)
1321    
1322          stroke = prop.GetFill()          stroke = prop.GetFill()
1323          if stroke is Color.Transparent:          if stroke is Transparent:
1324              brush = wxTRANSPARENT_BRUSH              brush = wxTRANSPARENT_BRUSH
1325          else:          else:
1326              brush = wxBrush(Color2wxColour(stroke), wxSOLID)              brush = wxBrush(Color2wxColour(stroke), wxSOLID)
# Line 1352  class ClassGroupPropertiesCtrl(wxWindow, Line 1379  class ClassGroupPropertiesCtrl(wxWindow,
1379    
1380          wxWindow.__init__(self, parent, id, size = size, style = style)          wxWindow.__init__(self, parent, id, size = size, style = style)
1381    
1382            self.parent = parent
1383    
1384          self.SetProperties(props)          self.SetProperties(props)
1385          self.SetShapeType(shapeType)          self.SetShapeType(shapeType)
1386          self.AllowEdit(True)          self.AllowEdit(True)
# Line 1395  class ClassGroupPropertiesCtrl(wxWindow, Line 1424  class ClassGroupPropertiesCtrl(wxWindow,
1424      def DoEdit(self):      def DoEdit(self):
1425          if not self.allowEdit: return          if not self.allowEdit: return
1426    
1427          propDlg = SelectPropertiesDialog(NULL,          propDlg = SelectPropertiesDialog(self.parent,
1428                                           self.GetProperties(),                                           self.GetProperties(),
1429                                           self.GetShapeType())                                           self.GetShapeType())
1430    

Legend:
Removed from v.1058  
changed lines
  Added in v.1433

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26