/[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 878 by jonathan, Fri May 9 16:32:31 2003 UTC revision 1302 by jonathan, Wed Jun 25 09:39:33 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, \
# Line 28  from Thuban.Model.classification import Line 29  from Thuban.Model.classification import
29    
30  from Thuban.Model.color import Color  from Thuban.Model.color import Color
31    
32  from Thuban.Model.layer import Layer, \  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 NonModalDialog  from dialogs import NonModalNonParentDialog
38    
39  ID_CLASS_TABLE = 40011  ID_CLASS_TABLE = 40011
40    
# Line 670  EB_LAYER_TITLE = 0 Line 671  EB_LAYER_TITLE = 0
671  EB_SELECT_FIELD = 1  EB_SELECT_FIELD = 1
672  EB_GEN_CLASS = 2  EB_GEN_CLASS = 2
673    
674  class Classifier(NonModalDialog):  class Classifier(NonModalNonParentDialog):
675    
676      type2string = {None:             _("None"),      type2string = {None:             _("None"),
677                     FIELDTYPE_STRING: _("Text"),                     FIELDTYPE_STRING: _("Text"),
678                     FIELDTYPE_INT:    _("Integer"),                     FIELDTYPE_INT:    _("Integer"),
679                     FIELDTYPE_DOUBLE: _("Decimal")}                     FIELDTYPE_DOUBLE: _("Decimal")}
680    
681      def __init__(self, parent, name, layer, group = None):      def __init__(self, parent, name, map, layer, group = None):
682          NonModalDialog.__init__(self, parent, name, "")          NonModalNonParentDialog.__init__(self, parent, name, "")
683    
684          self.__SetTitle(layer.Title())          self.__SetTitle(layer.Title())
685    
686          self.layer = layer          self.layer = layer
687            self.map = map
688    
689          self.originalClass = self.layer.GetClassification()          self.map.Subscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)
690          field = self.originalClass.GetField()          self.layer.Subscribe(LAYER_SHAPESTORE_REPLACED,
691          fieldType = self.originalClass.GetFieldType()                               self.layer_shapestore_replaced)
692    
693          self.genDlg = None          self.genDlg = None
694    
# Line 697  class Classifier(NonModalDialog): Line 699  class Classifier(NonModalDialog):
699          panel = wxPanel(self, -1)          panel = wxPanel(self, -1)
700    
701          text_title = wxTextCtrl(panel, ID_PROPERTY_TITLE, layer.Title())          text_title = wxTextCtrl(panel, ID_PROPERTY_TITLE, layer.Title())
702          #          self.fieldTypeText = wxStaticText(panel, -1, "")
         # make field choice box  
         #  
         self.fields = wxChoice(panel, ID_PROPERTY_SELECT,)  
   
         self.num_cols = layer.table.NumColumns()  
         # just assume the first field in case one hasn't been  
         # specified in the file.  
         self.__cur_field = 0  
   
         self.fields.Append("<None>")  
703    
704          if self.originalClass.GetFieldType() is None:          if layer.HasClassification():
705              self.fields.SetClientData(0, copy.deepcopy(self.originalClass))              self.originalClass = self.layer.GetClassification()
706          else:              field = self.originalClass.GetField()
707              self.fields.SetClientData(0, None)              fieldType = self.originalClass.GetFieldType()
708    
709          for i in range(self.num_cols):              table = layer.ShapeStore().Table()
710              name = layer.table.Column(i).name              #
711              self.fields.Append(name)              # make field choice box
712                #
713              if name == field:              self.fields = wxChoice(panel, ID_PROPERTY_SELECT,)
                 self.__cur_field = i + 1  
                 self.fields.SetClientData(i + 1,  
                                           copy.deepcopy(self.originalClass))  
             else:  
                 self.fields.SetClientData(i + 1, None)  
714    
715                self.num_cols = table.NumColumns()
716                # just assume the first field in case one hasn't been
717                # specified in the file.
718                self.__cur_field = 0
719    
720          self.fieldTypeText = wxStaticText(panel, -1, "")              self.fields.Append("<None>")
721    
722          button_gen = wxButton(panel, ID_PROPERTY_GENCLASS, _("Generate Class"))              if self.originalClass.GetFieldType() is None:
723                    self.fields.SetClientData(0, copy.deepcopy(self.originalClass))
724                else:
725                    self.fields.SetClientData(0, None)
726    
727          button_add = wxButton(panel, ID_PROPERTY_ADD, _("Add"))              for i in range(self.num_cols):
728          button_moveup = wxButton(panel, ID_PROPERTY_MOVEUP, _("Move Up"))                  name = table.Column(i).name
729          button_movedown = wxButton(panel, ID_PROPERTY_MOVEDOWN, _("Move Down"))                  self.fields.Append(name)
730          button_edit = wxButton(panel, ID_PROPERTY_EDITSYM, _("Edit Symbol"))  
731          button_remove = wxButton(panel, ID_PROPERTY_REMOVE, _("Remove"))                  if name == field:
732                        self.__cur_field = i + 1
733                        self.fields.SetClientData(i + 1,
734                                                copy.deepcopy(self.originalClass))
735                    else:
736                        self.fields.SetClientData(i + 1, None)
737    
738                button_gen = wxButton(panel, ID_PROPERTY_GENCLASS,
739                    _("Generate Class"))
740                button_add = wxButton(panel, ID_PROPERTY_ADD,
741                    _("Add"))
742                button_moveup = wxButton(panel, ID_PROPERTY_MOVEUP,
743                    _("Move Up"))
744                button_movedown = wxButton(panel, ID_PROPERTY_MOVEDOWN,
745                    _("Move Down"))
746                button_edit = wxButton(panel, ID_PROPERTY_EDITSYM,
747                    _("Edit Symbol"))
748                button_remove = wxButton(panel, ID_PROPERTY_REMOVE,
749                    _("Remove"))
750    
751                self.classGrid = ClassGrid(panel, self)
752    
753                # calling __SelectField after creating the classGrid fills in the
754                # grid with the correct information
755                self.fields.SetSelection(self.__cur_field)
756                self.__SelectField(self.__cur_field, group = group)
757    
758          button_try = wxButton(panel, ID_PROPERTY_TRY, _("Try"))          button_try = wxButton(self, ID_PROPERTY_TRY, _("Try"))
759          button_revert = wxButton(panel, ID_PROPERTY_REVERT, _("Revert"))          button_revert = wxButton(self, ID_PROPERTY_REVERT, _("Revert"))
760          button_ok = wxButton(panel, wxID_OK, _("OK"))          button_ok = wxButton(self, wxID_OK, _("OK"))
761          button_ok.SetDefault()          button_ok.SetDefault()
762          button_close = wxButton(panel, wxID_CANCEL, _("Close"))          button_close = wxButton(self, wxID_CANCEL, _("Close"))
   
         self.classGrid = ClassGrid(panel, self)  
   
         # calling __SelectField after creating the classGrid fills in the  
         # grid with the correct information  
         self.fields.SetSelection(self.__cur_field)  
         self.__SelectField(self.__cur_field, group = group)  
763    
764          ############################          ############################
765          # Layout the controls          # Layout the controls
# Line 764  class Classifier(NonModalDialog): Line 775  class Classifier(NonModalDialog):
775    
776          panelBox.Add(sizer, 0, wxGROW, 4)          panelBox.Add(sizer, 0, wxGROW, 4)
777    
778          panelBox.Add(wxStaticText(panel, -1,          if isinstance(layer, RasterLayer):
779                                  _("Type: %s") % layer.ShapeType()),              type = "Image"
780            else:
781                type = layer.ShapeType()
782    
783            panelBox.Add(wxStaticText(panel, -1, _("Type: %s") % type),
784              0, wxALIGN_LEFT | wxALL, 4)              0, wxALIGN_LEFT | wxALL, 4)
785    
786          classBox = wxStaticBoxSizer(          if layer.HasClassification():
                     wxStaticBox(panel, -1, _("Classification")), wxVERTICAL)  
787    
788                classBox = wxStaticBoxSizer(
789                            wxStaticBox(panel, -1, _("Classification")), wxVERTICAL)
790    
         sizer = wxBoxSizer(wxHORIZONTAL)  
         sizer.Add(wxStaticText(panel, ID_PROPERTY_FIELDTEXT, _("Field: ")),  
             0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 4)  
         sizer.Add(self.fields, 1, wxGROW | wxALL, 4)  
   
         classBox.Add(sizer, 0, wxGROW, 4)  
   
         classBox.Add(self.fieldTypeText, 0,  
                      wxGROW | wxALIGN_LEFT | wxALL | wxADJUST_MINSIZE, 4)  
   
         controlBox = wxBoxSizer(wxHORIZONTAL)  
         controlButtonBox = wxBoxSizer(wxVERTICAL)  
   
         controlButtonBox.Add(button_gen, 0, wxGROW|wxALL, 4)  
         controlButtonBox.Add(button_add, 0, wxGROW|wxALL, 4)  
         controlButtonBox.Add(button_moveup, 0, wxGROW|wxALL, 4)  
         controlButtonBox.Add(button_movedown, 0, wxGROW|wxALL, 4)  
         controlButtonBox.Add(button_edit, 0, wxGROW|wxALL, 4)  
         controlButtonBox.Add(60, 20, 0, wxGROW|wxALL|wxALIGN_BOTTOM, 4)  
         controlButtonBox.Add(button_remove, 0, wxGROW|wxALL|wxALIGN_BOTTOM, 4)  
791    
792          controlBox.Add(self.classGrid, 1, wxGROW, 0)              sizer = wxBoxSizer(wxHORIZONTAL)
793          controlBox.Add(controlButtonBox, 0, wxGROW, 10)              sizer.Add(wxStaticText(panel, ID_PROPERTY_FIELDTEXT, _("Field: ")),
794                    0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 4)
795                sizer.Add(self.fields, 1, wxGROW | wxALL, 4)
796    
797                classBox.Add(sizer, 0, wxGROW, 4)
798    
799                classBox.Add(self.fieldTypeText, 0,
800                            wxGROW | wxALIGN_LEFT | wxALL | wxADJUST_MINSIZE, 4)
801    
802          classBox.Add(controlBox, 1, wxGROW, 10)              controlBox = wxBoxSizer(wxHORIZONTAL)
803          panelBox.Add(classBox, 1, wxGROW, 0)              controlButtonBox = wxBoxSizer(wxVERTICAL)
804    
805                controlButtonBox.Add(button_gen, 0, wxGROW|wxALL, 4)
806                controlButtonBox.Add(button_add, 0, wxGROW|wxALL, 4)
807                controlButtonBox.Add(button_moveup, 0, wxGROW|wxALL, 4)
808                controlButtonBox.Add(button_movedown, 0, wxGROW|wxALL, 4)
809                controlButtonBox.Add(button_edit, 0, wxGROW|wxALL, 4)
810                controlButtonBox.Add(60, 20, 0, wxGROW|wxALL|wxALIGN_BOTTOM, 4)
811                controlButtonBox.Add(button_remove, 0,
812                                     wxGROW|wxALL|wxALIGN_BOTTOM, 4)
813    
814                controlBox.Add(self.classGrid, 1, wxGROW, 0)
815                controlBox.Add(controlButtonBox, 0, wxGROW, 10)
816    
817                classBox.Add(controlBox, 1, wxGROW, 10)
818                panelBox.Add(classBox, 1, wxGROW, 0)
819    
820    
821          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
822          buttonBox.Add(button_try, 0, wxALL, 4)          buttonBox.Add(button_try, 0, wxRIGHT|wxEXPAND, 10)
823          buttonBox.Add(60, 20, 0, wxALL, 4)          buttonBox.Add(button_revert, 0, wxRIGHT|wxEXPAND, 10)
824          buttonBox.Add(button_revert, 0, wxALL, 4)          buttonBox.Add(button_ok, 0, wxRIGHT|wxEXPAND, 10)
825          buttonBox.Add(60, 20, 0, wxALL, 4)          buttonBox.Add(button_close, 0, wxRIGHT|wxEXPAND, 10)
         buttonBox.Add(button_ok, 0, wxALL, 4)  
         buttonBox.Add(60, 20, 0, wxALL, 4)  
         buttonBox.Add(button_close, 0, wxALL, 4)  
         panelBox.Add(buttonBox, 0,  
             wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 0)  
826    
827          panel.SetAutoLayout(True)          panel.SetAutoLayout(True)
828          panel.SetSizer(panelBox)          panel.SetSizer(panelBox)
# Line 817  class Classifier(NonModalDialog): Line 830  class Classifier(NonModalDialog):
830          panelBox.SetSizeHints(panel)          panelBox.SetSizeHints(panel)
831    
832          topBox.Add(panel, 1, wxGROW | wxALL, 4)          topBox.Add(panel, 1, wxGROW | wxALL, 4)
833            topBox.Add(buttonBox, 0, wxALIGN_RIGHT|wxBOTTOM|wxTOP, 10)
834    
835          self.SetAutoLayout(True)          self.SetAutoLayout(True)
836          self.SetSizer(topBox)          self.SetSizer(topBox)
# Line 842  class Classifier(NonModalDialog): Line 856  class Classifier(NonModalDialog):
856    
857          ######################          ######################
858    
859          self.fields.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 961  class Classifier(NonModalDialog): Line 987  class Classifier(NonModalDialog):
987             it to the layer.             it to the layer.
988          """          """
989    
990          clazz = self.fields.GetClientData(self.__cur_field)          if self.layer.HasClassification():
991                clazz = self.fields.GetClientData(self.__cur_field)
992    
993          #              #
994          # only build the classification if there wasn't one to              # only build the classification if there wasn't one to
995          # to begin with or it has been modified              # to begin with or it has been modified
996          #              #
997          self.classGrid.SaveEditControlValue()              self.classGrid.SaveEditControlValue()
998          if clazz is None or self.classGrid.GetTable().IsModified():              if clazz is None or self.classGrid.GetTable().IsModified():
999              clazz = self.__BuildClassification(self.__cur_field, True)                  clazz = self.__BuildClassification(self.__cur_field, True)
1000    
1001          self.layer.SetClassification(clazz)              self.layer.SetClassification(clazz)
1002    
1003          self.haveApplied = True          self.haveApplied = True
1004    
# Line 980  class Classifier(NonModalDialog): Line 1007  class Classifier(NonModalDialog):
1007          self.Close()          self.Close()
1008    
1009      def OnClose(self, event):      def OnClose(self, event):
1010          NonModalDialog.OnClose(self, event)          self.unsubscribe_messages()
1011            NonModalNonParentDialog.OnClose(self, event)
1012    
1013      def _OnCloseBtn(self, event):      def _OnCloseBtn(self, event):
1014          """Close is similar to Cancel except that any changes that were          """Close is similar to Cancel except that any changes that were
# Line 1167  class SelectPropertiesDialog(wxDialog): Line 1195  class SelectPropertiesDialog(wxDialog):
1195          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
1196          button_ok = wxButton(self, wxID_OK, _("OK"))          button_ok = wxButton(self, wxID_OK, _("OK"))
1197          button_ok.SetDefault()          button_ok.SetDefault()
1198          buttonBox.Add(button_ok, 0, wxALL, 4)          buttonBox.Add(button_ok, 0, wxRIGHT|wxEXPAND, 10)
1199          buttonBox.Add(wxButton(self, wxID_CANCEL, _("Cancel")),          buttonBox.Add(wxButton(self, wxID_CANCEL, _("Cancel")),
1200                        0, wxALL, 4)                        0, wxRIGHT|wxEXPAND, 10)
1201          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 10)          topBox.Add(buttonBox, 0, wxALIGN_RIGHT|wxBOTTOM|wxTOP, 10)
1202                                                                                                                                                                    
1203          #EVT_BUTTON(self, wxID_OK, self._OnOK)          #EVT_BUTTON(self, wxID_OK, self._OnOK)
1204          #EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)          #EVT_BUTTON(self, ID_SELPROP_CANCEL, self._OnCancel)
# Line 1343  class ClassGroupPropertiesCtrl(wxWindow, Line 1371  class ClassGroupPropertiesCtrl(wxWindow,
1371    
1372          wxWindow.__init__(self, parent, id, size = size, style = style)          wxWindow.__init__(self, parent, id, size = size, style = style)
1373    
1374            self.parent = parent
1375    
1376          self.SetProperties(props)          self.SetProperties(props)
1377          self.SetShapeType(shapeType)          self.SetShapeType(shapeType)
1378          self.AllowEdit(True)          self.AllowEdit(True)
# Line 1386  class ClassGroupPropertiesCtrl(wxWindow, Line 1416  class ClassGroupPropertiesCtrl(wxWindow,
1416      def DoEdit(self):      def DoEdit(self):
1417          if not self.allowEdit: return          if not self.allowEdit: return
1418    
1419          propDlg = SelectPropertiesDialog(NULL,          propDlg = SelectPropertiesDialog(self.parent,
1420                                           self.GetProperties(),                                           self.GetProperties(),
1421                                           self.GetShapeType())                                           self.GetShapeType())
1422    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26