/[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 1142 by bh, Tue Jun 10 09:41:57 2003 UTC revision 1527 by jonathan, Wed Jul 30 15:43:28 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 316  class ClassTable(wxPyGridTableBase): Line 316  class ClassTable(wxPyGridTableBase):
316          self.GetView().FitInside()          self.GetView().FitInside()
317    
318      def GetClassification(self):      def GetClassification(self):
319            """Return the current classification."""
320          return self.clazz          return self.clazz
321    
322      def SetClassification(self, clazz, group = None):      def SetClassification(self, clazz, group = None):
323            """Fill in the table with the given classification.
324            Select the given group if group is not None.
325            """
326    
327          self.GetView().BeginBatch()          self.GetView().BeginBatch()
328    
# Line 339  class ClassTable(wxPyGridTableBase): Line 343  class ClassTable(wxPyGridTableBase):
343    
344          self.__Modified()          self.__Modified()
345    
   
346          self.GetView().EndBatch()          self.GetView().EndBatch()
347          self.GetView().FitInside()          self.GetView().FitInside()
348    
349      def __NotifyRowChanges(self, curRows, newRows):      def __NotifyRowChanges(self, curRows, newRows):
350            """Make sure table updates correctly if the number of
351            rows changes.
352            """
353          #          #
354          # silly message processing for updates to the number of          # silly message processing for updates to the number of
355          # rows and columns          # rows and columns
# Line 362  class ClassTable(wxPyGridTableBase): Line 368  class ClassTable(wxPyGridTableBase):
368              self.GetView().ProcessTableMessage(msg)              self.GetView().ProcessTableMessage(msg)
369              self.GetView().FitInside()              self.GetView().FitInside()
370    
   
371      def __SetRow(self, row, group):      def __SetRow(self, row, group):
372          """Set a row's data to that of the group.          """Set a row's data to that of the group.
373    
# Line 594  class ClassTable(wxPyGridTableBase): Line 599  class ClassTable(wxPyGridTableBase):
599              return self.clazz.GetGroup(row - 1)              return self.clazz.GetGroup(row - 1)
600    
601      def SetClassGroup(self, row, group):      def SetClassGroup(self, row, group):
602            """Set the given row to properties of group."""
603          self.__SetRow(row, group)          self.__SetRow(row, group)
604          self.GetView().Refresh()          self.GetView().Refresh()
605    
# Line 679  class Classifier(NonModalNonParentDialog Line 685  class Classifier(NonModalNonParentDialog
685                     FIELDTYPE_DOUBLE: _("Decimal")}                     FIELDTYPE_DOUBLE: _("Decimal")}
686    
687      def __init__(self, parent, name, map, layer, group = None):      def __init__(self, parent, name, map, layer, group = None):
688            """Create a Properties/Classification dialog for a layer.
689            The layer is part of map. If group is not None, select that
690            group in the classification table.
691            """
692    
693          NonModalNonParentDialog.__init__(self, parent, name, "")          NonModalNonParentDialog.__init__(self, parent, name, "")
694    
695          self.__SetTitle(layer.Title())          self.__SetTitle(layer.Title())
696    
697            self.parent.Subscribe(MAP_REPLACED, self.map_replaced)
698          self.layer = layer          self.layer = layer
699          self.map = map          self.map = map
700    
# Line 703  class Classifier(NonModalNonParentDialog Line 715  class Classifier(NonModalNonParentDialog
715    
716          if layer.HasClassification():          if layer.HasClassification():
717              self.originalClass = self.layer.GetClassification()              self.originalClass = self.layer.GetClassification()
718              field = self.originalClass.GetField()              self.originalClassField = self.layer.GetClassificationColumn()
719              fieldType = self.originalClass.GetFieldType()              field = self.originalClassField
720                fieldType = self.layer.GetFieldType(field)
721    
722                table = layer.ShapeStore().Table()
723              #              #
724              # make field choice box              # make field choice box
725              #              #
726              self.fields = wxChoice(panel, ID_PROPERTY_SELECT,)              self.fields = wxChoice(panel, ID_PROPERTY_SELECT,)
727    
728              self.num_cols = layer.table.NumColumns()              self.num_cols = table.NumColumns()
729              # just assume the first field in case one hasn't been              # just assume the first field in case one hasn't been
730              # specified in the file.              # specified in the file.
731              self.__cur_field = 0              self.__cur_field = 0
732    
733              self.fields.Append("<None>")              self.fields.Append("<None>")
734    
735              if self.originalClass.GetFieldType() is None:              if fieldType is None:
736                  self.fields.SetClientData(0, copy.deepcopy(self.originalClass))                  self.fields.SetClientData(0, copy.deepcopy(self.originalClass))
737              else:              else:
738                  self.fields.SetClientData(0, None)                  self.fields.SetClientData(0, None)
739    
740              for i in range(self.num_cols):              for i in range(self.num_cols):
741                  name = layer.table.Column(i).name                  name = table.Column(i).name
742                  self.fields.Append(name)                  self.fields.Append(name)
743    
744                  if name == field:                  if name == field:
745                      self.__cur_field = i + 1                      self.__cur_field = i + 1
746                      self.fields.SetClientData(i + 1,                      self.fields.SetClientData(i + 1,
747                                              copy.deepcopy(self.originalClass))                                                copy.deepcopy(self.originalClass))
748                  else:                  else:
749                      self.fields.SetClientData(i + 1, None)                      self.fields.SetClientData(i + 1, None)
750    
# Line 757  class Classifier(NonModalNonParentDialog Line 771  class Classifier(NonModalNonParentDialog
771          button_try = wxButton(self, ID_PROPERTY_TRY, _("Try"))          button_try = wxButton(self, ID_PROPERTY_TRY, _("Try"))
772          button_revert = wxButton(self, ID_PROPERTY_REVERT, _("Revert"))          button_revert = wxButton(self, ID_PROPERTY_REVERT, _("Revert"))
773          button_ok = wxButton(self, wxID_OK, _("OK"))          button_ok = wxButton(self, wxID_OK, _("OK"))
         button_ok.SetDefault()  
774          button_close = wxButton(self, wxID_CANCEL, _("Close"))          button_close = wxButton(self, wxID_CANCEL, _("Close"))
775            button_ok.SetDefault()
776    
777          ############################          ############################
778          # Layout the controls          # Layout the controls
# Line 859  class Classifier(NonModalNonParentDialog Line 873  class Classifier(NonModalNonParentDialog
873          self.haveApplied = False          self.haveApplied = False
874    
875      def unsubscribe_messages(self):      def unsubscribe_messages(self):
876            """Unsubscribe from all messages."""
877            self.parent.Unsubscribe(MAP_REPLACED, self.map_replaced)
878          self.map.Unsubscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)          self.map.Unsubscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)
879          self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,          self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,
880                                 self.layer_shapestore_replaced)                                 self.layer_shapestore_replaced)
881    
882      def map_layers_removed(self, map):      def map_layers_removed(self, map):
883            """Subscribed to MAP_LAYERS_REMOVED. If this layer was removed,
884            Close self.
885            """
886          if self.layer not in self.map.Layers():          if self.layer not in self.map.Layers():
             self.unsubscribe_messages()  
887              self.Close()              self.Close()
888    
889      def layer_shapestore_replaced(self, *args):      def layer_shapestore_replaced(self, *args):
890          self.unsubscribe_messages()          """Subscribed to the map's LAYER_SHAPESTORE_REPLACED message.
891    
892            Close self.
893            """
894            self.Close()
895    
896        def map_replaced(self, *args):
897            """Subscribed to the mainwindow's MAP_REPLACED message. Close self."""
898          self.Close()          self.Close()
899    
900      def EditSymbol(self, row):      def EditSymbol(self, row):
901            """Open up a dialog where the user can select the properties
902            for a group.
903            """
904          table = self.classGrid.GetTable()          table = self.classGrid.GetTable()
905          prop = table.GetValueAsCustom(row, COL_SYMBOL, None)          prop = table.GetValueAsCustom(row, COL_SYMBOL, None)
906    
907          # get a new ClassGroupProperties object and copy the          # get a new ClassGroupProperties object and copy the
908          # values over to our current object          # values over to our current object
909          propDlg = SelectPropertiesDialog(NULL, prop, self.layer.ShapeType())          propDlg = SelectPropertiesDialog(self, prop, self.layer.ShapeType())
910    
911          self.Enable(False)          self.Enable(False)
912          if propDlg.ShowModal() == wxID_OK:          if propDlg.ShowModal() == wxID_OK:
# Line 888  class Classifier(NonModalNonParentDialog Line 916  class Classifier(NonModalNonParentDialog
916          propDlg.Destroy()          propDlg.Destroy()
917                    
918      def _SetClassification(self, clazz):      def _SetClassification(self, clazz):
919            """Called from the ClassGen dialog when a new classification has
920            been created and should be set in the table.
921            """
922            # FIXME: This could be implemented using a message
923                    
924          self.fields.SetClientData(self.__cur_field, clazz)          self.fields.SetClientData(self.__cur_field, clazz)
925          self.classGrid.GetTable().SetClassification(clazz)          self.classGrid.GetTable().SetClassification(clazz)
926    
927      def __BuildClassification(self, fieldIndex, copyClass = False):      def __BuildClassification(self, fieldIndex, copyClass=False, force=False):
928            """Pack the classification setting into a Classification object.
929            Returns (Classification, fieldName) where fieldName is the selected
930            field in the table that the classification should be used with.
931            """
932    
933  #       numRows = self.classGrid.GetNumberRows()  #       numRows = self.classGrid.GetNumberRows()
934  #       assert numRows > 0  # there should always be a default row  #       assert numRows > 0  # there should always be a default row
935    
 #       clazz = Classification()  
936          if fieldIndex == 0:          if fieldIndex == 0:
937              fieldName = None              fieldName = None
938              fieldType = None              fieldType = None
# Line 905  class Classifier(NonModalNonParentDialog Line 940  class Classifier(NonModalNonParentDialog
940              fieldName = self.fields.GetString(fieldIndex)              fieldName = self.fields.GetString(fieldIndex)
941              fieldType = self.layer.GetFieldType(fieldName)              fieldType = self.layer.GetFieldType(fieldName)
942    
943          clazz = self.classGrid.GetTable().GetClassification()          clazz = self.fields.GetClientData(fieldIndex)
944            if clazz is None or self.classGrid.GetTable().IsModified() or force:
945          if copyClass:              clazz = self.classGrid.GetTable().GetClassification()
946              clazz = copy.deepcopy(clazz)              if copyClass:
947                    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))  
948    
949          return clazz          return clazz, fieldName
950    
951      def __SetGridTable(self, fieldIndex, group = None):      def __SetGridTable(self, fieldIndex, group = None):
952            """Set the table with the classification associated with the
953            selected field at fieldIndex. Select the specified group
954            if group is not None.
955            """
956    
957          clazz = self.fields.GetClientData(fieldIndex)          clazz = self.fields.GetClientData(fieldIndex)
958    
# Line 933  class Classifier(NonModalNonParentDialog Line 963  class Classifier(NonModalNonParentDialog
963                      self.layer.GetClassification().                      self.layer.GetClassification().
964                                 GetDefaultGroup().GetProperties()))                                 GetDefaultGroup().GetProperties()))
965    
966              fieldName = self.fields.GetString(fieldIndex)          fieldName = self.fields.GetString(fieldIndex)
967              fieldType = self.layer.GetFieldType(fieldName)          fieldType = self.layer.GetFieldType(fieldName)
             clazz.SetFieldType(fieldType)  
968                                    
969          self.classGrid.CreateTable(clazz, self.layer.ShapeType(), group)          self.classGrid.CreateTable(clazz, fieldType,
970                                       self.layer.ShapeType(), group)
971    
972      def __SetFieldTypeText(self, fieldIndex):      def __SetFieldTypeText(self, fieldIndex):
973            """Set the field type string using the data type of the field
974            at fieldIndex.
975            """
976          fieldName = self.fields.GetString(fieldIndex)          fieldName = self.fields.GetString(fieldIndex)
977          fieldType = self.layer.GetFieldType(fieldName)          fieldType = self.layer.GetFieldType(fieldName)
978    
# Line 957  class Classifier(NonModalNonParentDialog Line 990  class Classifier(NonModalNonParentDialog
990          assert oldIndex >= -1          assert oldIndex >= -1
991    
992          if oldIndex != -1:          if oldIndex != -1:
993              clazz = self.__BuildClassification(oldIndex)              clazz, name = self.__BuildClassification(oldIndex, force = True)
994              self.fields.SetClientData(oldIndex, clazz)              self.fields.SetClientData(oldIndex, clazz)
995    
996          self.__SetGridTable(newIndex, group)          self.__SetGridTable(newIndex, group)
997    
998          self.__EnableButtons(EB_SELECT_FIELD, newIndex != 0)          self.__EnableButtons(EB_SELECT_FIELD)
999    
1000          self.__SetFieldTypeText(newIndex)          self.__SetFieldTypeText(newIndex)
1001    
1002      def __SetTitle(self, title):      def __SetTitle(self, title):
1003            """Set the title of the dialog."""
1004          if title != "":          if title != "":
1005              title = ": " + title              title = ": " + title
1006    
1007          self.SetTitle(_("Layer Properties") + title)          self.SetTitle(_("Layer Properties") + title)
1008    
1009      def _OnEditSymbol(self, event):      def _OnEditSymbol(self, event):
1010            """Open up a dialog for the user to select group properties."""
1011          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
1012    
1013          if len(sel) == 1:          if len(sel) == 1:
# Line 996  class Classifier(NonModalNonParentDialog Line 1031  class Classifier(NonModalNonParentDialog
1031              # to begin with or it has been modified              # to begin with or it has been modified
1032              #              #
1033              self.classGrid.SaveEditControlValue()              self.classGrid.SaveEditControlValue()
1034              if clazz is None or self.classGrid.GetTable().IsModified():              clazz, name = self.__BuildClassification(self.__cur_field, True)
                 clazz = self.__BuildClassification(self.__cur_field, True)  
1035    
1036                self.layer.SetClassificationColumn(name)
1037              self.layer.SetClassification(clazz)              self.layer.SetClassification(clazz)
1038    
1039          self.haveApplied = True          self.haveApplied = True
# Line 1008  class Classifier(NonModalNonParentDialog Line 1043  class Classifier(NonModalNonParentDialog
1043          self.Close()          self.Close()
1044    
1045      def OnClose(self, event):      def OnClose(self, event):
1046            self.unsubscribe_messages()
1047          NonModalNonParentDialog.OnClose(self, event)          NonModalNonParentDialog.OnClose(self, event)
1048    
1049      def _OnCloseBtn(self, event):      def _OnCloseBtn(self, event):
# Line 1021  class Classifier(NonModalNonParentDialog Line 1057  class Classifier(NonModalNonParentDialog
1057      def _OnRevert(self, event):      def _OnRevert(self, event):
1058          """The layer's current classification stays the same."""          """The layer's current classification stays the same."""
1059          if self.haveApplied:          if self.haveApplied:
1060                self.layer.SetClassificationColumn(self.originalClassField)
1061              self.layer.SetClassification(self.originalClass)              self.layer.SetClassification(self.originalClass)
1062    
1063          #self.Close()          #self.Close()
# Line 1032  class Classifier(NonModalNonParentDialog Line 1069  class Classifier(NonModalNonParentDialog
1069          self.classGrid.DeleteSelectedRows()          self.classGrid.DeleteSelectedRows()
1070    
1071      def _OnGenClass(self, event):      def _OnGenClass(self, event):
1072            """Open up a dialog for the user to generate classifications."""
1073    
1074          self.genDlg = ClassGenDialog(self, self.layer,          self.genDlg = ClassGenDialog(self, self.layer,
1075                            self.fields.GetString(self.__cur_field))                            self.fields.GetString(self.__cur_field))
1076    
1077          EVT_CLOSE(self.genDlg, self._OnGenDialogClose)          EVT_CLOSE(self.genDlg, self._OnGenDialogClose)
1078    
1079          self.__EnableButtons(EB_GEN_CLASS, False)          self.__EnableButtons(EB_GEN_CLASS)
1080    
1081          self.genDlg.Show()          self.genDlg.Show()
1082    
1083      def _OnGenDialogClose(self, event):      def _OnGenDialogClose(self, event):
1084            """Reenable buttons after the generate classification
1085            dialog is closed.
1086            """
1087          self.genDlg.Destroy()          self.genDlg.Destroy()
1088          self.__EnableButtons(EB_GEN_CLASS, True)          self.genDlg = None
1089            self.__EnableButtons(EB_GEN_CLASS)
1090    
1091      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
1092            """When the user clicks MoveUp, try to move a group up one row."""
1093          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
1094    
1095          if len(sel) == 1:          if len(sel) == 1:
# Line 1062  class Classifier(NonModalNonParentDialog Line 1105  class Classifier(NonModalNonParentDialog
1105                  self.classGrid.MakeCellVisible(i - 1, 0)                  self.classGrid.MakeCellVisible(i - 1, 0)
1106    
1107      def _OnMoveDown(self, event):      def _OnMoveDown(self, event):
1108            """When the user clicks MoveDown, try to move a group down one row."""
1109          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
1110    
1111          if len(sel) == 1:          if len(sel) == 1:
# Line 1077  class Classifier(NonModalNonParentDialog Line 1121  class Classifier(NonModalNonParentDialog
1121                  self.classGrid.MakeCellVisible(i + 1, 0)                  self.classGrid.MakeCellVisible(i + 1, 0)
1122    
1123      def _OnTitleChanged(self, event):      def _OnTitleChanged(self, event):
1124            """Update the dialog title when the user changed the layer name."""
1125          obj = event.GetEventObject()          obj = event.GetEventObject()
1126    
1127          self.layer.SetTitle(obj.GetValue())          self.layer.SetTitle(obj.GetValue())
1128          self.__SetTitle(self.layer.Title())          self.__SetTitle(self.layer.Title())
1129    
1130          self.__EnableButtons(EB_LAYER_TITLE, self.layer.Title() != "")          self.__EnableButtons(EB_LAYER_TITLE)
1131    
1132      def __EnableButtons(self, case, enable):      def __EnableButtons(self, case):
1133            """Helper method that enables/disables the appropriate buttons
1134            based on the case provided. Cases are constants beginning with EB_.
1135            """
1136    
1137            list = {wxID_OK                 : True,
1138                    wxID_CANCEL             : True,
1139                    ID_PROPERTY_ADD         : True,
1140                    ID_PROPERTY_MOVEUP      : True,
1141                    ID_PROPERTY_MOVEDOWN    : True,
1142                    ID_PROPERTY_REMOVE      : True,
1143                    ID_PROPERTY_SELECT      : True,
1144                    ID_PROPERTY_FIELDTEXT   : True,
1145                    ID_PROPERTY_GENCLASS    : True,
1146                    ID_PROPERTY_EDITSYM     : True}
1147    
1148          if case == EB_LAYER_TITLE:            if case == EB_LAYER_TITLE:  
1149              list = (wxID_OK,              if self.layer.Title() == "":
1150                      wxID_CANCEL)                  list[wxID_OK] = False
1151                    list[wxID_CANCEL] = False
1152    
1153          elif case == EB_SELECT_FIELD:          elif case == EB_SELECT_FIELD:
1154              list = (ID_PROPERTY_GENCLASS,              if self.fields.GetSelection() == 0:
1155                      ID_PROPERTY_ADD,                  list[ID_PROPERTY_GENCLASS] = False
1156                      ID_PROPERTY_MOVEUP,                  list[ID_PROPERTY_ADD] = False
1157                      ID_PROPERTY_MOVEDOWN,                  list[ID_PROPERTY_MOVEUP] = False
1158                      ID_PROPERTY_EDITSYM,                  list[ID_PROPERTY_MOVEDOWN] = False
1159                      ID_PROPERTY_REMOVE)                  list[ID_PROPERTY_REMOVE] = False
1160    
1161          elif case == EB_GEN_CLASS:          elif case == EB_GEN_CLASS:
1162              list = (ID_PROPERTY_SELECT,              if self.genDlg is not None:
1163                      ID_PROPERTY_FIELDTEXT,                  list[ID_PROPERTY_SELECT] = False
1164                      ID_PROPERTY_GENCLASS,                  list[ID_PROPERTY_FIELDTEXT] = False
1165                      ID_PROPERTY_EDITSYM)                  list[ID_PROPERTY_GENCLASS] = False
1166    
1167          for id in list:          for id, enable in list.items():
1168              self.FindWindowById(id).Enable(enable)              win = self.FindWindowById(id)
1169                if win:
1170                    win.Enable(enable)
1171    
1172  ID_SELPROP_SPINCTRL = 4002  ID_SELPROP_SPINCTRL = 4002
1173  ID_SELPROP_PREVIEW = 4003  ID_SELPROP_PREVIEW = 4003
# Line 1115  ID_SELPROP_STROKECLRTRANS = 4006 Line 1177  ID_SELPROP_STROKECLRTRANS = 4006
1177  ID_SELPROP_FILLCLRTRANS = 4007  ID_SELPROP_FILLCLRTRANS = 4007
1178    
1179  class SelectPropertiesDialog(wxDialog):  class SelectPropertiesDialog(wxDialog):
1180        """Dialog that allows the user to select group properties."""
1181    
1182      def __init__(self, parent, prop, shapeType):      def __init__(self, parent, prop, shapeType):
1183            """Open the dialog with the initial prop properties and shapeType."""
1184    
1185          wxDialog.__init__(self, parent, -1, _("Select Properties"),          wxDialog.__init__(self, parent, -1, _("Select Properties"),
1186                            style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)                            style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
1187    
# Line 1194  class SelectPropertiesDialog(wxDialog): Line 1259  class SelectPropertiesDialog(wxDialog):
1259          #          #
1260          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
1261          button_ok = wxButton(self, wxID_OK, _("OK"))          button_ok = wxButton(self, wxID_OK, _("OK"))
         button_ok.SetDefault()  
1262          buttonBox.Add(button_ok, 0, wxRIGHT|wxEXPAND, 10)          buttonBox.Add(button_ok, 0, wxRIGHT|wxEXPAND, 10)
1263          buttonBox.Add(wxButton(self, wxID_CANCEL, _("Cancel")),          buttonBox.Add(wxButton(self, wxID_CANCEL, _("Cancel")),
1264                        0, wxRIGHT|wxEXPAND, 10)                        0, wxRIGHT|wxEXPAND, 10)
1265          topBox.Add(buttonBox, 0, wxALIGN_RIGHT|wxBOTTOM|wxTOP, 10)          topBox.Add(buttonBox, 0, wxALIGN_RIGHT|wxBOTTOM|wxTOP, 10)
1266    
1267            button_ok.SetDefault()
1268                                                                                                                                                                    
1269          #EVT_BUTTON(self, wxID_OK, self._OnOK)          #EVT_BUTTON(self, wxID_OK, self._OnOK)
1270          #EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)          #EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)
# Line 1220  class SelectPropertiesDialog(wxDialog): Line 1286  class SelectPropertiesDialog(wxDialog):
1286    
1287      def __GetColor(self, cur):      def __GetColor(self, cur):
1288          dialog = wxColourDialog(self)          dialog = wxColourDialog(self)
1289          if cur is not Color.Transparent:          if cur is not Transparent:
1290              dialog.GetColourData().SetColour(Color2wxColour(cur))              dialog.GetColourData().SetColour(Color2wxColour(cur))
1291    
1292          ret = None          ret = None
# Line 1238  class SelectPropertiesDialog(wxDialog): Line 1304  class SelectPropertiesDialog(wxDialog):
1304          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1305    
1306      def _OnChangeLineColorTrans(self, event):      def _OnChangeLineColorTrans(self, event):
1307          self.prop.SetLineColor(Color.Transparent)          self.prop.SetLineColor(Transparent)
1308          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1309                    
1310      def _OnChangeFillColor(self, event):      def _OnChangeFillColor(self, event):
# Line 1248  class SelectPropertiesDialog(wxDialog): Line 1314  class SelectPropertiesDialog(wxDialog):
1314          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1315    
1316      def _OnChangeFillColorTrans(self, event):      def _OnChangeFillColorTrans(self, event):
1317          self.prop.SetFill(Color.Transparent)          self.prop.SetFill(Transparent)
1318          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer          self.previewWin.Refresh() # XXX: work around, see ClassDataPreviewer
1319    
1320      def GetClassGroupProperties(self):      def GetClassGroupProperties(self):
# Line 1256  class SelectPropertiesDialog(wxDialog): Line 1322  class SelectPropertiesDialog(wxDialog):
1322    
1323    
1324  class ClassDataPreviewWindow(wxWindow):  class ClassDataPreviewWindow(wxWindow):
1325        """A custom window that draws group properties using the correct shape."""
1326    
1327      def __init__(self, rect, prop, shapeType,      def __init__(self, rect, prop, shapeType,
1328                         parent = None, id = -1, size = wxDefaultSize):                         parent = None, id = -1, size = wxDefaultSize):
1329            """Draws the appropriate shape as specified with shapeType using
1330            prop properities.
1331            """
1332          if parent is not None:          if parent is not None:
1333              wxWindow.__init__(self, parent, id, (0, 0), size)              wxWindow.__init__(self, parent, id, (0, 0), size)
1334              EVT_PAINT(self, self._OnPaint)              EVT_PAINT(self, self._OnPaint)
# Line 1287  class ClassDataPreviewWindow(wxWindow): Line 1357  class ClassDataPreviewWindow(wxWindow):
1357          self.previewer.Draw(dc, rect, self.prop, self.shapeType)          self.previewer.Draw(dc, rect, self.prop, self.shapeType)
1358    
1359  class ClassDataPreviewer:  class ClassDataPreviewer:
1360        """Class that actually draws a group property preview."""
1361    
1362      def Draw(self, dc, rect, prop, shapeType):      def Draw(self, dc, rect, prop, shapeType):
1363    
# Line 1304  class ClassDataPreviewer: Line 1375  class ClassDataPreviewer:
1375              h = rect.GetHeight()              h = rect.GetHeight()
1376    
1377          stroke = prop.GetLineColor()          stroke = prop.GetLineColor()
1378          if stroke is Color.Transparent:          if stroke is Transparent:
1379              pen = wxTRANSPARENT_PEN              pen = wxTRANSPARENT_PEN
1380          else:          else:
1381              pen = wxPen(Color2wxColour(stroke),              pen = wxPen(Color2wxColour(stroke),
# Line 1312  class ClassDataPreviewer: Line 1383  class ClassDataPreviewer:
1383                          wxSOLID)                          wxSOLID)
1384    
1385          stroke = prop.GetFill()          stroke = prop.GetFill()
1386          if stroke is Color.Transparent:          if stroke is Transparent:
1387              brush = wxTRANSPARENT_BRUSH              brush = wxTRANSPARENT_BRUSH
1388          else:          else:
1389              brush = wxBrush(Color2wxColour(stroke), wxSOLID)              brush = wxBrush(Color2wxColour(stroke), wxSOLID)
# Line 1335  class ClassDataPreviewer: Line 1406  class ClassDataPreviewer:
1406              dc.DrawRectangle(x, y, w, h)              dc.DrawRectangle(x, y, w, h)
1407    
1408  class ClassRenderer(wxPyGridCellRenderer):  class ClassRenderer(wxPyGridCellRenderer):
1409        """A wrapper class that can be used to draw group properties in a
1410        grid table.
1411        """
1412    
1413      def __init__(self, shapeType):      def __init__(self, shapeType):
1414          wxPyGridCellRenderer.__init__(self)          wxPyGridCellRenderer.__init__(self)
# Line 1365  class ClassRenderer(wxPyGridCellRenderer Line 1439  class ClassRenderer(wxPyGridCellRenderer
1439    
1440    
1441  class ClassGroupPropertiesCtrl(wxWindow, wxControl):  class ClassGroupPropertiesCtrl(wxWindow, wxControl):
1442        """A custom window and control that draw a preview of group properties
1443        and can open a dialog to modify the properties if the user double-clicks
1444        it.
1445        """
1446    
1447      def __init__(self, parent, id, props, shapeType,      def __init__(self, parent, id, props, shapeType,
1448                   size = wxDefaultSize, style = 0):                   size = wxDefaultSize, style = 0):
1449    
1450          wxWindow.__init__(self, parent, id, size = size, style = style)          wxWindow.__init__(self, parent, id, size = size, style = style)
1451    
1452            self.parent = parent
1453    
1454          self.SetProperties(props)          self.SetProperties(props)
1455          self.SetShapeType(shapeType)          self.SetShapeType(shapeType)
1456          self.AllowEdit(True)          self.AllowEdit(True)
# Line 1409  class ClassGroupPropertiesCtrl(wxWindow, Line 1489  class ClassGroupPropertiesCtrl(wxWindow,
1489          self.Refresh()          self.Refresh()
1490    
1491      def AllowEdit(self, allow):      def AllowEdit(self, allow):
1492            """Allow/Disallow double-clicking on the control."""
1493          self.allowEdit = allow          self.allowEdit = allow
1494    
1495      def DoEdit(self):      def DoEdit(self):
1496            """Open the properties selector dialog."""
1497    
1498          if not self.allowEdit: return          if not self.allowEdit: return
1499    
1500          propDlg = SelectPropertiesDialog(NULL,          propDlg = SelectPropertiesDialog(self.parent,
1501                                           self.GetProperties(),                                           self.GetProperties(),
1502                                           self.GetShapeType())                                           self.GetShapeType())
1503    

Legend:
Removed from v.1142  
changed lines
  Added in v.1527

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26