/[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 977 by frank, Thu May 22 11:39:51 2003 UTC revision 1539 by bh, Fri Aug 1 14:27:57 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  from Thuban.Model.data import 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 NonModalDialog  from dialogs import NonModalNonParentDialog
38    from messages import MAP_REPLACED
39    
40  ID_CLASS_TABLE = 40011  ID_CLASS_TABLE = 40011
41    
# Line 83  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 103  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 257  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 274  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 292  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 315  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 338  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 361  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 593  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 670  EB_LAYER_TITLE = 0 Line 677  EB_LAYER_TITLE = 0
677  EB_SELECT_FIELD = 1  EB_SELECT_FIELD = 1
678  EB_GEN_CLASS = 2  EB_GEN_CLASS = 2
679    
680  class Classifier(NonModalDialog):  class Classifier(NonModalNonParentDialog):
681    
682      type2string = {None:             _("None"),      type2string = {None:             _("None"),
683                     FIELDTYPE_STRING: _("Text"),                     FIELDTYPE_STRING: _("Text"),
684                     FIELDTYPE_INT:    _("Integer"),                     FIELDTYPE_INT:    _("Integer"),
685                     FIELDTYPE_DOUBLE: _("Decimal")}                     FIELDTYPE_DOUBLE: _("Decimal")}
686    
687      def __init__(self, parent, name, layer, group = None):      def __init__(self, parent, name, map, layer, group = None):
688          NonModalDialog.__init__(self, parent, name, "")          """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, "")
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
700    
701            self.map.Subscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)
702            self.layer.Subscribe(LAYER_SHAPESTORE_REPLACED,
703                                 self.layer_shapestore_replaced)
704    
705          self.genDlg = None          self.genDlg = None
706    
# Line 698  class Classifier(NonModalDialog): Line 715  class Classifier(NonModalDialog):
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 752  class Classifier(NonModalDialog): Line 771  class Classifier(NonModalDialog):
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 853  class Classifier(NonModalDialog): Line 872  class Classifier(NonModalDialog):
872          text_title.SetFocus()          text_title.SetFocus()
873          self.haveApplied = False          self.haveApplied = False
874    
875        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)
879            self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,
880                                   self.layer_shapestore_replaced)
881    
882        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():
887                self.Close()
888    
889        def layer_shapestore_replaced(self, *args):
890            """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()
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 869  class Classifier(NonModalDialog): Line 916  class Classifier(NonModalDialog):
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 886  class Classifier(NonModalDialog): Line 940  class Classifier(NonModalDialog):
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 914  class Classifier(NonModalDialog): Line 963  class Classifier(NonModalDialog):
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 938  class Classifier(NonModalDialog): Line 990  class Classifier(NonModalDialog):
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 977  class Classifier(NonModalDialog): Line 1031  class Classifier(NonModalDialog):
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 989  class Classifier(NonModalDialog): Line 1043  class Classifier(NonModalDialog):
1043          self.Close()          self.Close()
1044    
1045      def OnClose(self, event):      def OnClose(self, event):
1046          NonModalDialog.OnClose(self, event)          self.unsubscribe_messages()
1047            NonModalNonParentDialog.OnClose(self, event)
1048    
1049      def _OnCloseBtn(self, event):      def _OnCloseBtn(self, event):
1050          """Close is similar to Cancel except that any changes that were          """Close is similar to Cancel except that any changes that were
# Line 1002  class Classifier(NonModalDialog): Line 1057  class Classifier(NonModalDialog):
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 1013  class Classifier(NonModalDialog): Line 1069  class Classifier(NonModalDialog):
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 1043  class Classifier(NonModalDialog): Line 1105  class Classifier(NonModalDialog):
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 1058  class Classifier(NonModalDialog): Line 1121  class Classifier(NonModalDialog):
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 1096  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 1175  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 1201  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 1219  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 1229  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 1237  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 1268  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 1285  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 1293  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 1316  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 1346  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 1390  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.977  
changed lines
  Added in v.1539

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26