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

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

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

revision 487 by jonathan, Fri Mar 7 18:21:03 2003 UTC revision 1001 by frank, Thu May 22 19:40:27 2003 UTC
# Line 1  Line 1 
1  # Copyright (C) 2001, 2002 by Intevation GmbH  # Copyright (C) 2001, 2002, 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Jan-Oliver Wagner <[email protected]>  # Jan-Oliver Wagner <[email protected]>
4  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
5    # Frank Koormann <[email protected]>
6  #  #
7  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
8  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
# Line 12  The main window Line 13  The main window
13    
14  __version__ = "$Revision$"  __version__ = "$Revision$"
15    
16    __ThubanVersion__ = "0.2" #"$THUBAN_0_2$"
17    #__BuildDate__ = "$Date$"
18    
19  import os  import os
20    
21  from wxPython.wx import *  from wxPython.wx import *
22    from wxPython.wx import __version__ as wxPython_version
23    
24  import Thuban  import Thuban
25    import Thuban.version
26    
27  from Thuban import _  from Thuban import _
28  from Thuban.Model.session import create_empty_session  from Thuban.Model.session import create_empty_session
29  from Thuban.Model.layer import Layer  from Thuban.Model.layer import Layer, RasterLayer
30  from Thuban.Model.color import Color  from Thuban.Model.color import Color
31  from Thuban.Model.proj import Projection  from Thuban.Model.proj import Projection
32    
# Line 27  import view Line 34  import view
34  import tree  import tree
35  import proj4dialog  import proj4dialog
36  import tableview, identifyview  import tableview, identifyview
37  import classifier  from Thuban.UI.classifier import Classifier
38    import legend
39  from menu import Menu  from menu import Menu
40    
41  from context import Context  from context import Context
42  from command import registry, Command, ToolCommand  from command import registry, Command, ToolCommand
43  from messages import SELECTED_SHAPE, VIEW_POSITION  from messages import LAYER_SELECTED, SHAPES_SELECTED, VIEW_POSITION
44    
45    from Thuban.UI.dock import DockFrame
46    from Thuban.UI.join import JoinDialog
47    
48    import resource
49    
50    import projdialog
51    
52    
 # the directory where the toolbar icons are stored  
 bitmapdir = os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Bitmaps")  
 bitmapext = ".xpm"  
53    
54    class MainWindow(DockFrame):
55    
56  class MainWindow(wxFrame):      # Some messages that can be subscribed/unsubscribed directly through
57        # the MapCanvas come in fact from other objects. This is a map to
58        # map those messages to the names of the instance variables they
59        # actually come from. This delegation is implemented in the
60        # Subscribe and unsubscribed methods
61        delegated_messages = {LAYER_SELECTED: "canvas",
62                              SHAPES_SELECTED: "canvas"}
63    
64        # Methods delegated to some instance variables. The delegation is
65        # implemented in the __getattr__ method.
66        delegated_methods = {"SelectLayer": "canvas",
67                             "SelectShapes": "canvas",
68                             "SelectedShapes": "canvas",
69                             }
70    
71      def __init__(self, parent, ID, title, application, interactor,      def __init__(self, parent, ID, title, application, interactor,
72                   initial_message = None, size = wxSize(-1, -1)):                   initial_message = None, size = wxSize(-1, -1)):
73          wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, size)          DockFrame.__init__(self, parent, ID, title, wxDefaultPosition, size)
74            #wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, size)
75    
76          self.application = application          self.application = application
         self.interactor = interactor  
77    
78          self.CreateStatusBar()          self.CreateStatusBar()
79          if initial_message:          if initial_message:
# Line 65  class MainWindow(wxFrame): Line 91  class MainWindow(wxFrame):
91          # call Realize to make sure that the tools appear.          # call Realize to make sure that the tools appear.
92          toolbar.Realize()          toolbar.Realize()
93    
94    
95          # Create the map canvas          # Create the map canvas
96          canvas = view.MapCanvas(self, -1, interactor)          canvas = view.MapCanvas(self, -1)
97          canvas.Subscribe(VIEW_POSITION, self.view_position_changed)          canvas.Subscribe(VIEW_POSITION, self.view_position_changed)
98            canvas.Subscribe(SHAPES_SELECTED, self.identify_view_on_demand)
99          self.canvas = canvas          self.canvas = canvas
100    
101          self.init_dialogs()          self.SetMainWindow(self.canvas)
102    
103            self.SetAutoLayout(True)
104    
105          interactor.Subscribe(SELECTED_SHAPE, self.identify_view_on_demand)          self.init_dialogs()
106    
107          EVT_CLOSE(self, self.OnClose)          EVT_CLOSE(self, self.OnClose)
108    
109        def Subscribe(self, channel, *args):
110            """Subscribe a function to a message channel.
111    
112            If channel is one of the delegated messages call the appropriate
113            object's Subscribe method. Otherwise do nothing.
114            """
115            if channel in self.delegated_messages:
116                object = getattr(self, self.delegated_messages[channel])
117                object.Subscribe(channel, *args)
118            else:
119                print "Trying to subscribe to unsupported channel %s" % channel
120    
121        def Unsubscribe(self, channel, *args):
122            """Unsubscribe a function from a message channel.
123    
124            If channel is one of the delegated messages call the appropriate
125            object's Unsubscribe method. Otherwise do nothing.
126            """
127            if channel in self.delegated_messages:
128                object = getattr(self, self.delegated_messages[channel])
129                object.Unsubscribe(channel, *args)
130    
131        def __getattr__(self, attr):
132            """If attr is one of the delegated methods return that method
133    
134            Otherwise raise AttributeError.
135            """
136            if attr in self.delegated_methods:
137                return getattr(getattr(self, self.delegated_methods[attr]), attr)
138            raise AttributeError(attr)
139    
140      def init_ids(self):      def init_ids(self):
141          """Initialize the ids"""          """Initialize the ids"""
142          self.current_id = 6000          self.current_id = 6000
# Line 185  class MainWindow(wxFrame): Line 246  class MainWindow(wxFrame):
246              command = registry.Command(name)              command = registry.Command(name)
247              if command is not None:              if command is not None:
248                  ID = self.get_id(name)                  ID = self.get_id(name)
249                  filename = os.path.join(bitmapdir, command.Icon()) + bitmapext                  bitmap = resource.GetBitmapResource(command.Icon(),
250                  bitmap = wxBitmap(filename, wxBITMAP_TYPE_XPM)                                                      wxBITMAP_TYPE_XPM)
251                  toolbar.AddTool(ID, bitmap,                  toolbar.AddTool(ID, bitmap,
252                                  shortHelpString = command.HelpText(),                                  shortHelpString = command.HelpText(),
253                                  isToggle = command.IsCheckCommand())                                  isToggle = command.IsCheckCommand())
# Line 299  class MainWindow(wxFrame): Line 360  class MainWindow(wxFrame):
360      def prepare_new_session(self):      def prepare_new_session(self):
361          for d in self.dialogs.values():          for d in self.dialogs.values():
362              if not isinstance(d, tree.SessionTreeView):              if not isinstance(d, tree.SessionTreeView):
363                  d.Shutdown()                  d.Close()
364    
365      def NewSession(self):      def NewSession(self):
366          self.save_modified_session()          if self.save_modified_session() != wxID_CANCEL:
367          self.prepare_new_session()              self.prepare_new_session()
368          self.application.SetSession(create_empty_session())              self.application.SetSession(create_empty_session())
369    
370      def OpenSession(self):      def OpenSession(self):
371          self.save_modified_session()          if self.save_modified_session() != wxID_CANCEL:
372          dlg = wxFileDialog(self, _("Open Session"), ".", "", "*.thuban", wxOPEN)              dlg = wxFileDialog(self, _("Open Session"), ".", "",
373          if dlg.ShowModal() == wxID_OK:                                 "Thuban Session File (*.thuban)|*.thuban",
374              self.prepare_new_session()                                 wxOPEN)
375              self.application.OpenSession(dlg.GetPath())              if dlg.ShowModal() == wxID_OK:
376          dlg.Destroy()                  self.prepare_new_session()
377                    self.application.OpenSession(dlg.GetPath())
378                dlg.Destroy()
379    
380      def SaveSession(self):      def SaveSession(self):
381          if self.application.session.filename == None:          if self.application.session.filename == None:
# Line 322  class MainWindow(wxFrame): Line 385  class MainWindow(wxFrame):
385    
386      def SaveSessionAs(self):      def SaveSessionAs(self):
387          dlg = wxFileDialog(self, _("Save Session As"), ".", "",          dlg = wxFileDialog(self, _("Save Session As"), ".", "",
388                             "*.thuban", wxOPEN)                             "Thuban Session File (*.thuban)|*.thuban",
389                               wxSAVE|wxOVERWRITE_PROMPT)
390          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
391              self.application.session.SetFilename(dlg.GetPath())              self.application.session.SetFilename(dlg.GetPath())
392              self.application.SaveSession()              self.application.SaveSession()
393          dlg.Destroy()          dlg.Destroy()
394    
395      def Exit(self):      def Exit(self):
396          self.Close(false)          self.Close(False)
397    
398      def OnClose(self, event):      def OnClose(self, event):
399          result = self.save_modified_session(can_veto = event.CanVeto())          result = self.save_modified_session(can_veto = event.CanVeto())
# Line 340  class MainWindow(wxFrame): Line 404  class MainWindow(wxFrame):
404              # wx's destroy event, but that isn't implemented for wxGTK              # wx's destroy event, but that isn't implemented for wxGTK
405              # yet.              # yet.
406              self.canvas.Unsubscribe(VIEW_POSITION, self.view_position_changed)              self.canvas.Unsubscribe(VIEW_POSITION, self.view_position_changed)
407                DockFrame.OnClose(self, event)
408              self.Destroy()              self.Destroy()
409    
410      def SetMap(self, map):      def SetMap(self, map):
411          self.canvas.SetMap(map)          self.canvas.SetMap(map)
412            self.__SetTitle(map.Title())
413    
414            dialog = self.FindRegisteredDock("legend")
415            if dialog is not None:
416                dialog.GetPanel().SetMap(self.Map())
417    
418      def Map(self):      def Map(self):
419          """Return the map displayed by this mainwindow"""          """Return the map displayed by this mainwindow"""
420    
421          return self.canvas.Map()          return self.canvas.Map()
422    
423      def ShowSessionTree(self):      def ToggleSessionTree(self):
424            """If the session tree is shown close it otherwise create a new tree"""
425          name = "session_tree"          name = "session_tree"
426          dialog = self.get_open_dialog(name)          dialog = self.get_open_dialog(name)
427          if dialog is None:          if dialog is None:
428              dialog = tree.SessionTreeView(self, self.application, name)              dialog = tree.SessionTreeView(self, self.application, name)
429              self.add_dialog(name, dialog)              self.add_dialog(name, dialog)
430              dialog.Show(true)              dialog.Show(True)
431          else:          else:
432              # FIXME: bring dialog to front here              dialog.Close()
433              pass  
434        def SessionTreeShown(self):
435            """Return true iff the session tree is currently shown"""
436            return self.get_open_dialog("session_tree") is not None
437    
438      def About(self):      def About(self):
439          self.RunMessageBox(_("About"),          self.RunMessageBox(_("About"),
440                             _("Thuban is a program for\n"                             _("Thuban %s\n"
441                                #"Build Date: %s\n"
442                                "using:\n"
443                                "  %s\n"
444                                "  %s\n\n"
445                                "Thuban is a program for\n"
446                              "exploring geographic data.\n"                              "exploring geographic data.\n"
447                              "Copyright (C) 2001-2003 Intevation GmbH.\n"                              "Copyright (C) 2001-2003 Intevation GmbH.\n"
448                              "Thuban is licensed under the GPL"),                              "Thuban is licensed under the GNU GPL"
449                                % (Thuban.version.longversion,
450                                   "wxPython %s" % wxPython_version,
451                                   "Python %d.%d.%d" % sys.version_info[:3]
452                                  )),
453    #                           % __ThubanVersion__), #__BuildDate__)),
454                             wxOK | wxICON_INFORMATION)                             wxOK | wxICON_INFORMATION)
455    
456      def AddLayer(self):      def AddLayer(self):
# Line 374  class MainWindow(wxFrame): Line 459  class MainWindow(wxFrame):
459          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
460              filename = dlg.GetPath()              filename = dlg.GetPath()
461              title = os.path.splitext(os.path.basename(filename))[0]              title = os.path.splitext(os.path.basename(filename))[0]
             layer = Layer(title, filename)  
462              map = self.canvas.Map()              map = self.canvas.Map()
463              has_layers = map.HasLayers()              has_layers = map.HasLayers()
464              try:              try:
465                  map.AddLayer(layer)                  store = self.application.Session().OpenShapefile(filename)
466              except IOError:              except IOError:
467                  # the layer couldn't be opened                  # the layer couldn't be opened
468                  self.RunMessageBox(_("Add Layer"),                  self.RunMessageBox(_("Add Layer"),
469                                     _("Can't open the file '%s'.") % filename)                                     _("Can't open the file '%s'.") % filename)
470              else:              else:
471                    layer = Layer(title, store)
472                    map.AddLayer(layer)
473                  if not has_layers:                  if not has_layers:
474                      # if we're adding a layer to an empty map, for the                      # if we're adding a layer to an empty map, fit the
475                        # new map to the window
476                        self.canvas.FitMapToWindow()
477            dlg.Destroy()
478    
479        def AddRasterLayer(self):
480            dlg = wxFileDialog(self, _("Select an image file"), ".", "", "*.*",
481                               wxOPEN)
482            if dlg.ShowModal() == wxID_OK:
483                filename = dlg.GetPath()
484                title = os.path.splitext(os.path.basename(filename))[0]
485                map = self.canvas.Map()
486                has_layers = map.HasLayers()
487                try:
488                    layer = RasterLayer(title, filename)
489                except IOError:
490                    # the layer couldn't be opened
491                    self.RunMessageBox(_("Add Image Layer"),
492                                       _("Can't open the file '%s'.") % filename)
493                else:
494                    map.AddLayer(layer)
495                    if not has_layers:
496                        # if we're adding a layer to an empty map, fit the
497                      # new map to the window                      # new map to the window
498                      self.canvas.FitMapToWindow()                      self.canvas.FitMapToWindow()
499          dlg.Destroy()          dlg.Destroy()
# Line 398  class MainWindow(wxFrame): Line 506  class MainWindow(wxFrame):
506      def CanRemoveLayer(self):      def CanRemoveLayer(self):
507          """Return true if the currently selected layer can be deleted.          """Return true if the currently selected layer can be deleted.
508    
509          If no layer is selected return false.          If no layer is selected return False.
510    
511          The return value of this method determines whether the remove          The return value of this method determines whether the remove
512          layer command is sensitive in menu.          layer command is sensitive in menu.
# Line 406  class MainWindow(wxFrame): Line 514  class MainWindow(wxFrame):
514          layer = self.current_layer()          layer = self.current_layer()
515          if layer is not None:          if layer is not None:
516              return self.canvas.Map().CanRemoveLayer(layer)              return self.canvas.Map().CanRemoveLayer(layer)
517          return 0          return False
518    
519      def RaiseLayer(self):      def RaiseLayer(self):
520          layer = self.current_layer()          layer = self.current_layer()
# Line 423  class MainWindow(wxFrame): Line 531  class MainWindow(wxFrame):
531    
532          If no layer is selected, return None          If no layer is selected, return None
533          """          """
534          return self.interactor.SelectedLayer()          return self.canvas.SelectedLayer()
535    
536      def has_selected_layer(self):      def has_selected_layer(self):
537          """Return true if a layer is currently selected"""          """Return true if a layer is currently selected"""
538          return self.interactor.HasSelectedLayer()          return self.canvas.HasSelectedLayer()
   
     def choose_color(self):  
         """Run the color selection dialog and return the selected color.  
539    
540          If the user cancels, return None.      def has_selected_shapes(self):
541          """          """Return true if a shape is currently selected"""
542          dlg = wxColourDialog(self)          return self.canvas.HasSelectedShapes()
         color = None  
         if dlg.ShowModal() == wxID_OK:  
             data = dlg.GetColourData()  
             wxc = data.GetColour()  
             color = Color(wxc.Red() / 255.0,  
                           wxc.Green() / 255.0,  
                           wxc.Blue() / 255.0)  
         dlg.Destroy()  
         return color  
   
     def LayerFillColor(self):  
         layer = self.current_layer()  
         if layer is not None:  
             color = self.choose_color()  
             if color is not None:  
                 layer.GetClassification().SetDefaultFill(color)  
   
     def LayerTransparentFill(self):  
         layer = self.current_layer()  
         if layer is not None:  
             layer.GetClassification().SetDefaultFill(Color.None)  
   
     def LayerOutlineColor(self):  
         layer = self.current_layer()  
         if layer is not None:  
             color = self.choose_color()  
             if color is not None:  
                 layer.GetClassification().SetDefaultLineColor(color)  
   
     def LayerNoOutline(self):  
         layer = self.current_layer()  
         if layer is not None:  
             layer.GetClassification().SetDefaultLineColor(Color.None)  
543    
544      def HideLayer(self):      def HideLayer(self):
545          layer = self.current_layer()          layer = self.current_layer()
# Line 486  class MainWindow(wxFrame): Line 558  class MainWindow(wxFrame):
558              name = "table_view" + str(id(table))              name = "table_view" + str(id(table))
559              dialog = self.get_open_dialog(name)              dialog = self.get_open_dialog(name)
560              if dialog is None:              if dialog is None:
561                  dialog = tableview.LayerTableFrame(self, self.interactor, name,                  dialog = tableview.LayerTableFrame(self, name,
562                                                     _("Table: %s") % layer.Title(),                                                 _("Table: %s") % layer.Title(),
563                                                     layer, table)                                                     layer, table)
564                  self.add_dialog(name, dialog)                  self.add_dialog(name, dialog)
565                  dialog.Show(true)                  dialog.Show(true)
# Line 495  class MainWindow(wxFrame): Line 567  class MainWindow(wxFrame):
567                  # FIXME: bring dialog to front here                  # FIXME: bring dialog to front here
568                  pass                  pass
569    
570      def Projection(self):      def MapProjection(self):
571          map = self.canvas.Map()  
572          proj = map.projection          name = "map_projection"
573          if proj is None:          dialog = self.get_open_dialog(name)
             proj4Dlg = proj4dialog.Proj4Dialog(NULL, None, map.BoundingBox())  
         else:  
             proj4Dlg = proj4dialog.Proj4Dialog(NULL, map.projection.params,  
                                                map.BoundingBox())  
         if proj4Dlg.ShowModal() == wxID_OK:  
             params = proj4Dlg.GetParams()  
             if params is not None:  
                 proj = Projection(params)  
             else:  
                 proj = None  
             map.SetProjection(proj)  
         proj4Dlg.Destroy()  
574    
575      def Classify(self):          if dialog is None:
576                map = self.canvas.Map()
577                dialog = projdialog.ProjFrame(self, name,
578                         _("Map Projection: %s") % map.Title(), map)
579                self.add_dialog(name, dialog)
580                dialog.Show()
581            dialog.Raise()
582    
583        def LayerProjection(self):
584    
585            layer = self.current_layer()
586    
587            name = "layer_projection" + str(id(layer))
588            dialog = self.get_open_dialog(name)
589    
590            if dialog is None:
591                map = self.canvas.Map()
592                dialog = projdialog.ProjFrame(self, name,
593                         _("Layer Projection: %s") % layer.Title(), layer)
594                self.add_dialog(name, dialog)
595                dialog.Show()
596            dialog.Raise()
597    
598        def LayerEditProperties(self):
599    
600          #          #
601          # the menu option for this should only be available if there          # the menu option for this should only be available if there
# Line 521  class MainWindow(wxFrame): Line 604  class MainWindow(wxFrame):
604          #          #
605    
606          layer = self.current_layer()          layer = self.current_layer()
607          name = "classifier" + str(id(layer))          self.OpenLayerProperties(layer)
608    
609        def OpenLayerProperties(self, layer, group = None):
610            name = "layer_properties" + str(id(layer))
611          dialog = self.get_open_dialog(name)          dialog = self.get_open_dialog(name)
612    
613          if dialog is None:          if dialog is None:
614              dialog = classifier.Classifier(self, self.interactor,              dialog = Classifier(self, name, layer, group)
                                            name, self.current_layer())  
615              self.add_dialog(name, dialog)              self.add_dialog(name, dialog)
616              dialog.Show()              dialog.Show()
617            dialog.Raise()
618    
619        def LayerJoinTable(self):
620            print "LayerJoinTable"
621    
622        def LayerUnjoinTable(self):
623            print "LayerUnjoinTable"
624    
625        def ShowLegend(self):
626            if not self.LegendShown():
627                self.ToggleLegend()
628    
629        def ToggleLegend(self):
630            """Show the legend if it's not shown otherwise hide it again"""
631            name = "legend"
632            dialog = self.FindRegisteredDock(name)
633    
634            if dialog is None:
635                dialog = self.CreateDock(name, -1, _("Legend"), wxLAYOUT_LEFT)
636                legend.LegendPanel(dialog, None, self)
637                dialog.Dock()
638                dialog.GetPanel().SetMap(self.Map())
639                dialog.Show()
640            else:
641                dialog.Show(not dialog.IsShown())
642    
643        def LegendShown(self):
644            """Return true iff the legend is currently open"""
645            dialog = self.FindRegisteredDock("legend")
646            return dialog is not None and dialog.IsShown()
647    
648        def TableOpen(self):
649            print "TableOpen"
650            dlg = wxFileDialog(self, _("Open Table"), ".", "",
651                               "DBF Files (*.dbf)|*.dbf|" +
652                               "CSV Files (*.csv)|*.csv|" +
653                               "All Files (*.*)|*.*",
654                               wxOPEN)
655            if dlg.ShowModal() == wxID_OK:
656                #self.application.session.OpenTable(dlg.GetPath())
657                pass
658    
659            dlg.Destroy()
660    
661        def TableClose(self):
662            print "TableClose"
663    
664        def TableShow(self):
665            print "TableShow"
666    
667        def TableHide(self):
668            print "TableHide"
669    
670        def TableJoin(self):
671            dlg = JoinDialog(self, _("Join Tables"), self.application.session)
672            dlg.ShowModal()
673    
674      def ZoomInTool(self):      def ZoomInTool(self):
675          self.canvas.ZoomInTool()          self.canvas.ZoomInTool()
# Line 549  class MainWindow(wxFrame): Line 690  class MainWindow(wxFrame):
690      def FullExtent(self):      def FullExtent(self):
691          self.canvas.FitMapToWindow()          self.canvas.FitMapToWindow()
692    
693        def FullLayerExtent(self):
694            self.canvas.FitLayerToWindow(self.current_layer())
695    
696        def FullSelectionExtent(self):
697            self.canvas.FitSelectedToWindow()
698    
699        def ExportMap(self):
700            self.canvas.Export()
701    
702      def PrintMap(self):      def PrintMap(self):
703          self.canvas.Print()          self.canvas.Print()
704    
705      def identify_view_on_demand(self, layer, shape):      def RenameMap(self):
706            dlg = wxTextEntryDialog(self, "Map Title: ", "Rename Map",
707                                    self.Map().Title())
708            if dlg.ShowModal() == wxID_OK:
709                title = dlg.GetValue()
710                if title != "":
711                    self.Map().SetTitle(title)
712                    self.__SetTitle(title)
713    
714            dlg.Destroy()
715    
716        def identify_view_on_demand(self, layer, shapes):
717            """Subscribed to the canvas' SHAPES_SELECTED message
718    
719            If the current tool is the identify tool, at least one shape is
720            selected and the identify dialog is not shown, show the dialog.
721            """
722            # If the selection has become empty we don't need to do
723            # anything. Otherwise it could happen that the dialog was popped
724            # up when the selection became empty, e.g. when a new selection
725            # is opened while the identify tool is active and dialog had
726            # been closed
727            if not shapes:
728                return
729    
730          name = "identify_view"          name = "identify_view"
731          if self.canvas.CurrentTool() == "IdentifyTool":          if self.canvas.CurrentTool() == "IdentifyTool":
732              if not self.dialog_open(name):              if not self.dialog_open(name):
733                  dialog = identifyview.IdentifyView(self, self.interactor, name)                  dialog = identifyview.IdentifyView(self, name)
734                  self.add_dialog(name, dialog)                  self.add_dialog(name, dialog)
735                  dialog.Show(true)                  dialog.Show(True)
736              else:              else:
737                  # FIXME: bring dialog to front?                  # FIXME: bring dialog to front?
738                  pass                  pass
739    
740        def __SetTitle(self, title):
741            self.SetTitle("Thuban - " + title)
742    
743  #  #
744  # Define all the commands available in the main window  # Define all the commands available in the main window
745  #  #
# Line 574  def call_method(context, methodname, *ar Line 751  def call_method(context, methodname, *ar
751      apply(getattr(context.mainwindow, methodname), args)      apply(getattr(context.mainwindow, methodname), args)
752    
753  def _method_command(name, title, method, helptext = "",  def _method_command(name, title, method, helptext = "",
754                      icon = "", sensitive = None):                      icon = "", sensitive = None, checked = None):
755      """Add a command implemented by a method of the mainwindow object"""      """Add a command implemented by a method of the mainwindow object"""
756      registry.Add(Command(name, title, call_method, args=(method,),      registry.Add(Command(name, title, call_method, args=(method,),
757                           helptext = helptext, icon = icon,                           helptext = helptext, icon = icon,
758                           sensitive = sensitive))                           sensitive = sensitive, checked = checked))
759    
760  def make_check_current_tool(toolname):  def make_check_current_tool(toolname):
761      """Return a function that tests if the currently active tool is toolname      """Return a function that tests if the currently active tool is toolname
# Line 603  def _has_selected_layer(context): Line 780  def _has_selected_layer(context):
780      """Return true if a layer is selected in the context"""      """Return true if a layer is selected in the context"""
781      return context.mainwindow.has_selected_layer()      return context.mainwindow.has_selected_layer()
782    
783    def _has_selected_shapes(context):
784        """Return true if a layer is selected in the context"""
785        return context.mainwindow.has_selected_shapes()
786    
787  def _can_remove_layer(context):  def _can_remove_layer(context):
788      return context.mainwindow.CanRemoveLayer()      return context.mainwindow.CanRemoveLayer()
789    
790  def _has_tree_window_shown(context):  def _has_tree_window_shown(context):
791      """Return true if the tree window is shown"""      """Return true if the tree window is shown"""
792      return context.mainwindow.get_open_dialog("session_tree") is None      return context.mainwindow.SessionTreeShown()
793    
794  def _has_visible_map(context):  def _has_visible_map(context):
795      """Return true iff theres a visible map in the mainwindow.      """Return true iff theres a visible map in the mainwindow.
# Line 621  def _has_visible_map(context): Line 802  def _has_visible_map(context):
802                  return 1                  return 1
803      return 0      return 0
804    
805    def _has_legend_shown(context):
806        """Return true if the legend window is shown"""
807        return context.mainwindow.LegendShown()
808    
809    
810  # File menu  # File menu
811  _method_command("new_session", _("&New Session"), "NewSession")  _method_command("new_session", _("&New Session"), "NewSession")
812  _method_command("open_session", _("&Open Session"), "OpenSession")  _method_command("open_session", _("&Open Session..."), "OpenSession")
813  _method_command("save_session", _("&Save Session"), "SaveSession")  _method_command("save_session", _("&Save Session"), "SaveSession")
814  _method_command("save_session_as", _("Save Session &As"), "SaveSessionAs")  _method_command("save_session_as", _("Save Session &As..."), "SaveSessionAs")
815  _method_command("show_session_tree", _("Show Session &Tree"), "ShowSessionTree",  _method_command("toggle_session_tree", _("Session &Tree"), "ToggleSessionTree",
816                  sensitive = _has_tree_window_shown)                  checked = _has_tree_window_shown)
817    _method_command("toggle_legend", _("Legend"), "ToggleLegend",
818                    checked = _has_legend_shown)
819  _method_command("exit", _("E&xit"), "Exit")  _method_command("exit", _("E&xit"), "Exit")
820    
821  # Help menu  # Help menu
822  _method_command("help_about", _("&About"), "About")  _method_command("help_about", _("&About..."), "About")
823    
824    
825  # Map menu  # Map menu
826  _method_command("map_projection", _("Pro&jection"), "Projection")  _method_command("map_projection", _("Pro&jection..."), "MapProjection")
827    
828  _tool_command("map_zoom_in_tool", _("&Zoom in"), "ZoomInTool", "ZoomInTool",  _tool_command("map_zoom_in_tool", _("&Zoom in"), "ZoomInTool", "ZoomInTool",
829                helptext = _("Switch to map-mode 'zoom-in'"), icon = "zoom_in",                helptext = _("Switch to map-mode 'zoom-in'"), icon = "zoom_in",
# Line 657  _tool_command("map_label_tool", _("&Labe Line 844  _tool_command("map_label_tool", _("&Labe
844  _method_command("map_full_extent", _("&Full extent"), "FullExtent",  _method_command("map_full_extent", _("&Full extent"), "FullExtent",
845                 helptext = _("Full Extent"), icon = "fullextent",                 helptext = _("Full Extent"), icon = "fullextent",
846                sensitive = _has_visible_map)                sensitive = _has_visible_map)
847    _method_command("layer_full_extent", _("&Full layer extent"), "FullLayerExtent",
848                   helptext = _("Full Layer Extent"), icon = "fulllayerextent",
849                  sensitive = _has_selected_layer)
850    _method_command("selected_full_extent", _("&Full selection extent"), "FullSelectionExtent",
851                   helptext = _("Full Selection Extent"), icon = "fullselextent",
852                  sensitive = _has_selected_shapes)
853    _method_command("map_export", _("E&xport"), "ExportMap",
854                        helptext = _("Export the map to file"))
855  _method_command("map_print", _("Prin&t"), "PrintMap",  _method_command("map_print", _("Prin&t"), "PrintMap",
856                  helptext = _("Print the map"))                  helptext = _("Print the map"))
857    _method_command("map_rename", _("&Rename..."), "RenameMap",
858  # Layer menu                  helptext = _("Rename the map"))
859  _method_command("layer_add", _("&Add Layer"), "AddLayer",  _method_command("layer_add", _("&Add Layer..."), "AddLayer",
860                  helptext = _("Add a new layer to active map"))                  helptext = _("Add a new layer to active map"))
861    _method_command("rasterlayer_add", _("&Add Image Layer..."), "AddRasterLayer",
862                    helptext = _("Add a new image layer to active map"))
863  _method_command("layer_remove", _("&Remove Layer"), "RemoveLayer",  _method_command("layer_remove", _("&Remove Layer"), "RemoveLayer",
864                  helptext = _("Remove selected layer(s)"),                  helptext = _("Remove selected layer(s)"),
865                  sensitive = _can_remove_layer)                  sensitive = _can_remove_layer)
866  _method_command("layer_fill_color", _("&Fill Color"), "LayerFillColor",  
867                  helptext = _("Set the fill color of selected layer(s)"),  # Layer menu
868                  sensitive = _has_selected_layer)  _method_command("layer_projection", _("Pro&jection..."), "LayerProjection",
 _method_command("layer_transparent_fill", _("&Transparent Fill"),  
                 "LayerTransparentFill",  
                 helptext = _("Do not fill the selected layer(s)"),  
                 sensitive = _has_selected_layer)  
 _method_command("layer_outline_color", _("&Outline Color"), "LayerOutlineColor",  
                 helptext = _("Set the outline color of selected layer(s)"),  
                 sensitive = _has_selected_layer)  
 _method_command("layer_no_outline", _("&No Outline"), "LayerNoOutline",  
                 helptext= _("Do not draw the outline of the selected layer(s)"),  
869                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
870  _method_command("layer_raise", _("&Raise"), "RaiseLayer",  _method_command("layer_raise", _("&Raise"), "RaiseLayer",
871                  helptext = _("Raise selected layer(s)"),                  helptext = _("Raise selected layer(s)"),
# Line 694  _method_command("layer_hide", _("&Hide") Line 882  _method_command("layer_hide", _("&Hide")
882  _method_command("layer_show_table", _("Show Ta&ble"), "LayerShowTable",  _method_command("layer_show_table", _("Show Ta&ble"), "LayerShowTable",
883                  helptext = _("Show the selected layer's table"),                  helptext = _("Show the selected layer's table"),
884                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
885    _method_command("layer_properties", _("&Properties..."), "LayerEditProperties",
886  _method_command("layer_classifier", _("Classify"), "Classify",                  sensitive = _has_selected_layer)
887    _method_command("layer_jointable", _("&Join Table..."), "LayerJoinTable",
888                    sensitive = _has_selected_layer)
889    _method_command("layer_unjointable", _("&Unjoin Table..."), "LayerUnjoinTable",
890                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
891    
892  # the menu structure  # Table menu
893  main_menu = Menu("<main>", "<main>",  _method_command("table_open", _("&Open..."), "TableOpen")
894                   [Menu("file", _("&File"),  _method_command("table_close", _("&Close"), "TableClose")
895                         ["new_session", "open_session", None,  _method_command("table_show", _("&Show"), "TableShow")
896                          "save_session", "save_session_as", None,  _method_command("table_hide", _("&Hide"), "TableHide")
897                          "show_session_tree", None,  _method_command("table_join", _("&Join..."), "TableJoin")
898                          "exit"]),  
899                    Menu("map", _("&Map"),  #  Export only under Windows ...
900                         ["layer_add", "layer_remove",  map_menu = ["layer_add", "rasterlayer_add", "layer_remove", "map_rename",
901                          None,                          None,
902                          "map_projection",                          "map_projection",
903                          None,                          None,
904                          "map_zoom_in_tool", "map_zoom_out_tool",                          "map_zoom_in_tool", "map_zoom_out_tool",
905                          "map_pan_tool", "map_identify_tool", "map_label_tool",                          "map_pan_tool",
906                            "map_full_extent",
907                            "layer_full_extent",
908                            "selected_full_extent",
909                          None,                          None,
910                          "map_full_extent",                          "map_identify_tool", "map_label_tool",
911                          None,                          None,
912                          "map_print"]),                          "toggle_legend",
913                            None]
914    if wxPlatform == '__WXMSW__':
915        map_menu.append("map_export")
916    map_menu.append("map_print")
917    
918    # the menu structure
919    main_menu = Menu("<main>", "<main>",
920                     [Menu("file", _("&File"),
921                           ["new_session", "open_session", None,
922                            "save_session", "save_session_as", None,
923                            "toggle_session_tree", None,
924                            "exit"]),
925                      Menu("map", _("&Map"), map_menu),
926                    Menu("layer", _("&Layer"),                    Menu("layer", _("&Layer"),
927                         ["layer_fill_color", "layer_transparent_fill",                          ["layer_raise", "layer_lower",
                         "layer_outline_color", "layer_no_outline",  
                         None,  
                         "layer_raise", "layer_lower",  
928                          None,                          None,
929                          "layer_show", "layer_hide",                          "layer_show", "layer_hide",
930                          None,                          None,
931                            "layer_projection",
932                            None,
933                          "layer_show_table",                          "layer_show_table",
934                            "layer_jointable",
935                            "layer_unjointable",
936                          None,                          None,
937                          "layer_classifier"]),                          "layer_properties"]),
938                      Menu("table", _("&Table"),
939                           ["table_open", "table_close",
940                           None,
941                           "table_show", "table_hide",
942                           None,
943                           "table_join"]),
944                    Menu("help", _("&Help"),                    Menu("help", _("&Help"),
945                         ["help_about"])])                         ["help_about"])])
946    
# Line 734  main_menu = Menu("<main>", "<main>", Line 948  main_menu = Menu("<main>", "<main>",
948    
949  main_toolbar = Menu("<toolbar>", "<toolbar>",  main_toolbar = Menu("<toolbar>", "<toolbar>",
950                      ["map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",                      ["map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",
951                       "map_full_extent", None,                       "map_full_extent",
952                         "layer_full_extent",
953                         "selected_full_extent",
954                         None,
955                       "map_identify_tool", "map_label_tool"])                       "map_identify_tool", "map_label_tool"])

Legend:
Removed from v.487  
changed lines
  Added in v.1001

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26