/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/classifier.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/classifier.py

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

revision 2386 by jan, Thu Oct 7 14:43:45 2004 UTC revision 2597 by bh, Thu Apr 7 19:46:29 2005 UTC
# Line 1  Line 1 
1  # Copyright (c) 2003-2004 by Intevation GmbH  # Copyright (c) 2003-2005 by Intevation GmbH
2  # Authors:  # Authors:
3  # Jan-Oliver Wagner <[email protected]> (2003-2004)  # Jan-Oliver Wagner <[email protected]> (2003-2004)
4  # Martin Schulze <[email protected]> (2004)  # Martin Schulze <[email protected]> (2004)
# Line 35  from Thuban.Model.classification import Line 35  from Thuban.Model.classification import
35    
36  from Thuban.Model.color import Transparent  from Thuban.Model.color import Transparent
37    
38  from Thuban.Model.layer import Layer, RasterLayer  from Thuban.Model.layer import Layer
39  from Thuban.Model.data import SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT  from Thuban.Model.data import SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT
40    
41  from Thuban.UI.classgen import ClassGenDialog  from Thuban.UI.classgen import ClassGenDialog
42  from Thuban.UI.colordialog import ColorDialog  from Thuban.UI.colordialog import ColorDialog
43    
44  from dialogs import NonModalNonParentDialog  from Thuban.UI.layerproperties import LayerProperties
45  from messages import MAP_REPLACED  from messages import MAP_REPLACED
46    
 ID_CLASS_TABLE = 40011  
   
47    
48  # table columns  # table columns
49  COL_VISIBLE = 0  COL_VISIBLE = 0
# Line 75  class ClassGrid(wxGrid): Line 73  class ClassGrid(wxGrid):
73          clazz -- the working classification that this grid should          clazz -- the working classification that this grid should
74                   use for display.                   use for display.
75          """          """
76            wxGrid.__init__(self, parent, -1, style = 0)
         wxGrid.__init__(self, parent, ID_CLASS_TABLE, style = 0)  
77    
78          self.classifier = classifier          self.classifier = classifier
79    
# Line 161  class ClassGrid(wxGrid): Line 158  class ClassGrid(wxGrid):
158              group = self.GetTable().GetClassGroup(sel[0])              group = self.GetTable().GetClassGroup(sel[0])
159              if isinstance(group, ClassGroupDefault):              if isinstance(group, ClassGroupDefault):
160                  wxMessageDialog(self,                  wxMessageDialog(self,
161                                  "The Default group cannot be removed.",                                  _("The Default group cannot be removed."),
162                                  style = wxOK | wxICON_EXCLAMATION).ShowModal()                                  style = wxOK | wxICON_EXCLAMATION).ShowModal()
163                  return                  return
164                    
# Line 684  EB_LAYER_TITLE = 0 Line 681  EB_LAYER_TITLE = 0
681  EB_SELECT_FIELD = 1  EB_SELECT_FIELD = 1
682  EB_GEN_CLASS = 2  EB_GEN_CLASS = 2
683    
684  class Classifier(NonModalNonParentDialog):  class Classifier(LayerProperties):
685    
686      type2string = {None:             _("None"),      type2string = {None:             _("None"),
687                     FIELDTYPE_STRING: _("Text"),                     FIELDTYPE_STRING: _("Text"),
# Line 697  class Classifier(NonModalNonParentDialog Line 694  class Classifier(NonModalNonParentDialog
694          group in the classification table.          group in the classification table.
695          """          """
696    
697          NonModalNonParentDialog.__init__(self, parent, name, "")          LayerProperties.__init__(self, parent, name, layer)
   
         self.__SetTitle(layer.Title())  
698    
         self.parent.Subscribe(MAP_REPLACED, self.map_replaced)  
         self.layer = layer  
         self.map = parent.Map()  
   
         self.map.Subscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)  
699          self.layer.Subscribe(LAYER_SHAPESTORE_REPLACED,          self.layer.Subscribe(LAYER_SHAPESTORE_REPLACED,
700                               self.layer_shapestore_replaced)                               self.layer_shapestore_replaced)
701    
702          self.genDlg = None          self.genDlg = None
703            self.group = group
704    
705          ############################          LayerProperties.dialog_layout(self)
706          # Create the controls  
707          #      def dialog_layout(self, panel, panelBox):
708    
709          panel = wxPanel(self, -1)          if self.layer.HasClassification():
710    
711          text_title = wxTextCtrl(panel, ID_PROPERTY_TITLE, layer.Title())              self.fieldTypeText = wxStaticText(panel, -1, "")
         self.fieldTypeText = wxStaticText(panel, -1, "")  
712    
         if layer.HasClassification():  
713              self.originalClass = self.layer.GetClassification()              self.originalClass = self.layer.GetClassification()
714              self.originalClassField = self.layer.GetClassificationColumn()              self.originalClassField = self.layer.GetClassificationColumn()
715              field = self.originalClassField              field = self.originalClassField
716              fieldType = self.layer.GetFieldType(field)              fieldType = self.layer.GetFieldType(field)
717    
718              table = layer.ShapeStore().Table()              table = self.layer.ShapeStore().Table()
719              #              #
720              # make field choice box              # make field choice box
721              #              #
# Line 773  class Classifier(NonModalNonParentDialog Line 762  class Classifier(NonModalNonParentDialog
762              # calling __SelectField after creating the classGrid fills in the              # calling __SelectField after creating the classGrid fills in the
763              # grid with the correct information              # grid with the correct information
764              self.fields.SetSelection(self.__cur_field)              self.fields.SetSelection(self.__cur_field)
765              self.__SelectField(self.__cur_field, group = group)              self.__SelectField(self.__cur_field, group = self.group)
   
         button_try = wxButton(self, ID_PROPERTY_TRY, _("Try"))  
         button_revert = wxButton(self, ID_PROPERTY_REVERT, _("Revert"))  
         button_ok = wxButton(self, wxID_OK, _("OK"))  
         button_close = wxButton(self, wxID_CANCEL, _("Close"))  
         button_ok.SetDefault()  
766    
         ############################  
         # Layout the controls  
         #  
   
         topBox = wxBoxSizer(wxVERTICAL)  
         panelBox = wxBoxSizer(wxVERTICAL)  
   
         sizer = wxBoxSizer(wxHORIZONTAL)  
         sizer.Add(wxStaticText(panel, -1, _("Title: ")),  
             0, wxALIGN_LEFT | wxALL | wxALIGN_CENTER_VERTICAL, 4)  
         sizer.Add(text_title, 1, wxGROW, 0)  
   
         panelBox.Add(sizer, 0, wxGROW, 4)  
   
         if isinstance(layer, RasterLayer):  
             type = "Image"  
         else:  
             type = layer.ShapeType()  
   
         panelBox.Add(wxStaticText(panel, -1, _("Type: %s") % type),  
             0, wxALIGN_LEFT | wxALL, 4)  
   
         if layer.HasClassification():  
767    
768              classBox = wxStaticBoxSizer(              classBox = wxStaticBoxSizer(
769                          wxStaticBox(panel, -1, _("Classification")), wxVERTICAL)                          wxStaticBox(panel, -1, _("Classification")), wxVERTICAL)
# Line 827  class Classifier(NonModalNonParentDialog Line 787  class Classifier(NonModalNonParentDialog
787              controlButtonBox.Add(button_moveup, 0, wxGROW|wxALL, 4)              controlButtonBox.Add(button_moveup, 0, wxGROW|wxALL, 4)
788              controlButtonBox.Add(button_movedown, 0, wxGROW|wxALL, 4)              controlButtonBox.Add(button_movedown, 0, wxGROW|wxALL, 4)
789              controlButtonBox.Add(button_edit, 0, wxGROW|wxALL, 4)              controlButtonBox.Add(button_edit, 0, wxGROW|wxALL, 4)
790              controlButtonBox.Add(60, 20, 0, wxGROW|wxALL|wxALIGN_BOTTOM, 4)              controlButtonBox.Add( (60, 20), 0, wxGROW|wxALL|wxALIGN_BOTTOM, 4)
791              controlButtonBox.Add(button_remove, 0,              controlButtonBox.Add(button_remove, 0,
792                                   wxGROW|wxALL|wxALIGN_BOTTOM, 4)                                   wxGROW|wxALL|wxALIGN_BOTTOM, 4)
793    
# Line 838  class Classifier(NonModalNonParentDialog Line 798  class Classifier(NonModalNonParentDialog
798              panelBox.Add(classBox, 1, wxGROW, 0)              panelBox.Add(classBox, 1, wxGROW, 0)
799    
800    
         buttonBox = wxBoxSizer(wxHORIZONTAL)  
         buttonBox.Add(button_try, 0, wxRIGHT|wxEXPAND, 10)  
         buttonBox.Add(button_revert, 0, wxRIGHT|wxEXPAND, 10)  
         buttonBox.Add(button_ok, 0, wxRIGHT|wxEXPAND, 10)  
         buttonBox.Add(button_close, 0, wxRIGHT|wxEXPAND, 10)  
   
         panel.SetAutoLayout(True)  
         panel.SetSizer(panelBox)  
         panelBox.Fit(panel)  
         panelBox.SetSizeHints(panel)  
   
         topBox.Add(panel, 1, wxGROW | wxALL, 4)  
         topBox.Add(buttonBox, 0, wxALIGN_RIGHT|wxBOTTOM|wxTOP, 10)  
   
         self.SetAutoLayout(True)  
         self.SetSizer(topBox)  
         topBox.Fit(self)  
         topBox.SetSizeHints(self)  
         self.Layout()  
   
         ###########  
   
801          EVT_CHOICE(self, ID_PROPERTY_SELECT, self._OnFieldSelect)          EVT_CHOICE(self, ID_PROPERTY_SELECT, self._OnFieldSelect)
         EVT_TEXT(self, ID_PROPERTY_TITLE, self._OnTitleChanged)  
         EVT_BUTTON(self, wxID_OK, self._OnOK)  
         EVT_BUTTON(self, ID_PROPERTY_TRY, self._OnTry)  
         EVT_BUTTON(self, wxID_CANCEL, self._OnCloseBtn)  
         EVT_BUTTON(self, ID_PROPERTY_REVERT, self._OnRevert)  
   
802          EVT_BUTTON(self, ID_PROPERTY_ADD, self._OnAdd)          EVT_BUTTON(self, ID_PROPERTY_ADD, self._OnAdd)
803          EVT_BUTTON(self, ID_PROPERTY_EDITSYM, self._OnEditSymbol)          EVT_BUTTON(self, ID_PROPERTY_EDITSYM, self._OnEditSymbol)
804          EVT_BUTTON(self, ID_PROPERTY_REMOVE, self._OnRemove)          EVT_BUTTON(self, ID_PROPERTY_REMOVE, self._OnRemove)
# Line 874  class Classifier(NonModalNonParentDialog Line 806  class Classifier(NonModalNonParentDialog
806          EVT_BUTTON(self, ID_PROPERTY_MOVEUP, self._OnMoveUp)          EVT_BUTTON(self, ID_PROPERTY_MOVEUP, self._OnMoveUp)
807          EVT_BUTTON(self, ID_PROPERTY_MOVEDOWN, self._OnMoveDown)          EVT_BUTTON(self, ID_PROPERTY_MOVEDOWN, self._OnMoveDown)
808    
         ######################  
   
         text_title.SetFocus()  
         self.haveApplied = False  
   
809      def unsubscribe_messages(self):      def unsubscribe_messages(self):
810          """Unsubscribe from all messages."""          """Unsubscribe from all messages."""
811          self.parent.Unsubscribe(MAP_REPLACED, self.map_replaced)          LayerProperties.unsubscribe_messages(self)
         self.map.Unsubscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)  
812          self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,          self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,
813                                 self.layer_shapestore_replaced)                                 self.layer_shapestore_replaced)
814    
     def map_layers_removed(self, map):  
         """Subscribed to MAP_LAYERS_REMOVED. If this layer was removed,  
         Close self.  
         """  
         if self.layer not in self.map.Layers():  
             self.Close()  
   
815      def layer_shapestore_replaced(self, *args):      def layer_shapestore_replaced(self, *args):
816          """Subscribed to the map's LAYER_SHAPESTORE_REPLACED message.          """Subscribed to the map's LAYER_SHAPESTORE_REPLACED message.
   
817          Close self.          Close self.
818          """          """
819          self.Close()          self.Close()
820    
     def map_replaced(self, *args):  
         """Subscribed to the mainwindow's MAP_REPLACED message. Close self."""  
         self.Close()  
   
821      def EditSymbol(self, row):      def EditSymbol(self, row):
822          """Open up a dialog where the user can select the properties          """Open up a dialog where the user can select the properties
823          for a group.          for a group.
# Line 1025  class Classifier(NonModalNonParentDialog Line 939  class Classifier(NonModalNonParentDialog
939          self.__SelectField(index, self.__cur_field)          self.__SelectField(index, self.__cur_field)
940          self.__cur_field = index          self.__cur_field = index
941    
942      def _OnTry(self, event):      def OnTry(self, event):
943          """Put the data from the table into a new Classification and hand          """Put the data from the table into a new Classification and hand
944             it to the layer.             it to the layer.
945          """          """
# Line 1045  class Classifier(NonModalNonParentDialog Line 959  class Classifier(NonModalNonParentDialog
959    
960          self.haveApplied = True          self.haveApplied = True
961    
962      def _OnOK(self, event):      def OnOK(self, event):
963          self._OnTry(event)          self.OnTry(event)
         self.Close()  
   
     def OnClose(self, event):  
         self.unsubscribe_messages()  
         NonModalNonParentDialog.OnClose(self, event)  
   
     def _OnCloseBtn(self, event):  
         """Close is similar to Cancel except that any changes that were  
         made and applied remain applied, but the currently displayed  
         classification is discarded.  
         """  
   
964          self.Close()          self.Close()
965    
966      def _OnRevert(self, event):      def OnRevert(self, event):
967          """The layer's current classification stays the same."""          """The layer's current classification stays the same."""
968          if self.haveApplied:          if self.haveApplied and self.layer.HasClassification():
969              self.layer.SetClassificationColumn(self.originalClassField)              self.layer.SetClassificationColumn(self.originalClassField)
970              self.layer.SetClassification(self.originalClass)              self.layer.SetClassification(self.originalClass)
971    
# Line 1502  class ClassRenderer(wxPyGridCellRenderer Line 1404  class ClassRenderer(wxPyGridCellRenderer
1404          dc.DestroyClippingRegion()          dc.DestroyClippingRegion()
1405    
1406    
1407  class ClassGroupPropertiesCtrl(wxWindow, wxControl):  class ClassGroupPropertiesCtrl(wxControl):
1408      """A custom window and control that draw a preview of group properties      """A custom window and control that draw a preview of group properties
1409      and can open a dialog to modify the properties if the user double-clicks      and can open a dialog to modify the properties if the user double-clicks
1410      it.      it.
# Line 1510  class ClassGroupPropertiesCtrl(wxWindow, Line 1412  class ClassGroupPropertiesCtrl(wxWindow,
1412    
1413      def __init__(self, parent, id, props, shapeType,      def __init__(self, parent, id, props, shapeType,
1414                   size = wxDefaultSize, style = 0):                   size = wxDefaultSize, style = 0):
1415            wxControl.__init__(self, parent, id, size = size, style = style)
         wxWindow.__init__(self, parent, id, size = size, style = style)  
1416    
1417          self.parent = parent          self.parent = parent
1418    
# Line 1575  class ClassGroupPropertiesCtrl(wxWindow, Line 1476  class ClassGroupPropertiesCtrl(wxWindow,
1476      def _OnLeftDClick(self, event):      def _OnLeftDClick(self, event):
1477          self.DoEdit()          self.DoEdit()
1478    
 from Thuban.UI.mainwindow import layer_properties_dialogs  
 layer_properties_dialogs.add(Layer, Classifier)  
 layer_properties_dialogs.add(RasterLayer, Classifier)  

Legend:
Removed from v.2386  
changed lines
  Added in v.2597

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26