/[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 653 by jonathan, Fri Apr 11 14:28:29 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]>
# Line 12  The main window Line 12  The main window
12    
13  __version__ = "$Revision$"  __version__ = "$Revision$"
14    
15    __ThubanVersion__ = "0.2" #"$THUBAN_0_2$"
16    #__BuildDate__ = "$Date$"
17    
18  import os  import os
19    
20  from wxPython.wx import *  from wxPython.wx import *
# Line 27  import view Line 30  import view
30  import tree  import tree
31  import proj4dialog  import proj4dialog
32  import tableview, identifyview  import tableview, identifyview
33  import classifier  from Thuban.UI.classifier import Classifier
34    import legend
35  from menu import Menu  from menu import Menu
36    
37  from context import Context  from context import Context
38  from command import registry, Command, ToolCommand  from command import registry, Command, ToolCommand
39  from messages import SELECTED_SHAPE, VIEW_POSITION  from messages import LAYER_SELECTED, SHAPES_SELECTED, VIEW_POSITION, DOCKABLE_DOCKED, DOCKABLE_UNDOCKED, DOCKABLE_CLOSED
40    
41    from Thuban.UI.dock import DockableWindow, DockFrame, DockPanel
42    
43    import resource
44    
45    
46  # the directory where the toolbar icons are stored  # the directory where the toolbar icons are stored
47  bitmapdir = os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Bitmaps")  bitmapdir = os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Bitmaps")
48  bitmapext = ".xpm"  bitmapext = ".xpm"
49    
50    ID_WINDOW_LEGEND = 4001
51    ID_WINDOW_CANVAS = 4002
52    
53    
54  class MainWindow(wxFrame):  class MainWindow(DockFrame):
55    
56        # 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                             }
69    
70      def __init__(self, parent, ID, title, application, interactor,      def __init__(self, parent, ID, title, application, interactor,
71                   initial_message = None, size = wxSize(-1, -1)):                   initial_message = None, size = wxSize(-1, -1)):
72          wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, size)          DockFrame.__init__(self, parent, ID, title, wxDefaultPosition, size)
73            #wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, size)
74    
75          self.application = application          self.application = application
         self.interactor = interactor  
76    
77          self.CreateStatusBar()          self.CreateStatusBar()
78          if initial_message:          if initial_message:
# Line 65  class MainWindow(wxFrame): Line 90  class MainWindow(wxFrame):
90          # call Realize to make sure that the tools appear.          # call Realize to make sure that the tools appear.
91          toolbar.Realize()          toolbar.Realize()
92    
93    
94          # Create the map canvas          # Create the map canvas
95          canvas = view.MapCanvas(self, -1, interactor)          canvas = view.MapCanvas(self, -1)
96          canvas.Subscribe(VIEW_POSITION, self.view_position_changed)          canvas.Subscribe(VIEW_POSITION, self.view_position_changed)
97            canvas.Subscribe(SHAPES_SELECTED, self.identify_view_on_demand)
98          self.canvas = canvas          self.canvas = canvas
99    
100            self.SetMainWindow(self.canvas)
101    
102            self.SetAutoLayout(True)
103    
104          self.init_dialogs()          self.init_dialogs()
105    
106          interactor.Subscribe(SELECTED_SHAPE, self.identify_view_on_demand)          EVT_CLOSE(self, self._OnClose)
107    
108        def Subscribe(self, channel, *args):
109            """Subscribe a function to a message channel.
110    
111            If channel is one of the delegated messages call the appropriate
112            object's Subscribe method. Otherwise do nothing.
113            """
114            if channel in self.delegated_messages:
115                object = getattr(self, self.delegated_messages[channel])
116                object.Subscribe(channel, *args)
117            else:
118                print "Trying to subscribe to unsupported channel %s" % channel
119    
120        def Unsubscribe(self, channel, *args):
121            """Unsubscribe a function from a message channel.
122    
123            If channel is one of the delegated messages call the appropriate
124            object's Unsubscribe method. Otherwise do nothing.
125            """
126            if channel in self.delegated_messages:
127                object = getattr(self, self.delegated_messages[channel])
128                object.Unsubscribe(channel, *args)
129    
130        def __getattr__(self, attr):
131            """If attr is one of the delegated methods return that method
132    
133          EVT_CLOSE(self, self.OnClose)          Otherwise raise AttributeError.
134            """
135            if attr in self.delegated_methods:
136                return getattr(getattr(self, self.delegated_methods[attr]), attr)
137            raise AttributeError(attr)
138    
139      def init_ids(self):      def init_ids(self):
140          """Initialize the ids"""          """Initialize the ids"""
# Line 185  class MainWindow(wxFrame): Line 245  class MainWindow(wxFrame):
245              command = registry.Command(name)              command = registry.Command(name)
246              if command is not None:              if command is not None:
247                  ID = self.get_id(name)                  ID = self.get_id(name)
248                  filename = os.path.join(bitmapdir, command.Icon()) + bitmapext                  bitmap = resource.GetBitmapResource(command.Icon(),
249                  bitmap = wxBitmap(filename, wxBITMAP_TYPE_XPM)                                                      wxBITMAP_TYPE_XPM)
250                  toolbar.AddTool(ID, bitmap,                  toolbar.AddTool(ID, bitmap,
251                                  shortHelpString = command.HelpText(),                                  shortHelpString = command.HelpText(),
252                                  isToggle = command.IsCheckCommand())                                  isToggle = command.IsCheckCommand())
# Line 299  class MainWindow(wxFrame): Line 359  class MainWindow(wxFrame):
359      def prepare_new_session(self):      def prepare_new_session(self):
360          for d in self.dialogs.values():          for d in self.dialogs.values():
361              if not isinstance(d, tree.SessionTreeView):              if not isinstance(d, tree.SessionTreeView):
362                  d.Shutdown()                  d.Close()
363    
364      def NewSession(self):      def NewSession(self):
365          self.save_modified_session()          self.save_modified_session()
# Line 329  class MainWindow(wxFrame): Line 389  class MainWindow(wxFrame):
389          dlg.Destroy()          dlg.Destroy()
390    
391      def Exit(self):      def Exit(self):
392          self.Close(false)          self.Close(False)
393    
394      def OnClose(self, event):      def _OnClose(self, event):
395          result = self.save_modified_session(can_veto = event.CanVeto())          result = self.save_modified_session(can_veto = event.CanVeto())
396          if result == wxID_CANCEL:          if result == wxID_CANCEL:
397              event.Veto()              event.Veto()
# Line 340  class MainWindow(wxFrame): Line 400  class MainWindow(wxFrame):
400              # wx's destroy event, but that isn't implemented for wxGTK              # wx's destroy event, but that isn't implemented for wxGTK
401              # yet.              # yet.
402              self.canvas.Unsubscribe(VIEW_POSITION, self.view_position_changed)              self.canvas.Unsubscribe(VIEW_POSITION, self.view_position_changed)
403                DockFrame._OnClose(self, event)
404              self.Destroy()              self.Destroy()
405    
406      def SetMap(self, map):      def SetMap(self, map):
407          self.canvas.SetMap(map)          self.canvas.SetMap(map)
408            self.__SetTitle(map.Title())
409            #self.legendPanel.SetMap(map)
410    
411      def Map(self):      def Map(self):
412          """Return the map displayed by this mainwindow"""          """Return the map displayed by this mainwindow"""
413    
414            # sanity check
415            #assert(self.canvas.Map() is self.legendPanel.GetMap())
416    
417          return self.canvas.Map()          return self.canvas.Map()
418    
419      def ShowSessionTree(self):      def ToggleSessionTree(self):
420            """If the session tree is shown close it otherwise create a new tree"""
421          name = "session_tree"          name = "session_tree"
422          dialog = self.get_open_dialog(name)          dialog = self.get_open_dialog(name)
423          if dialog is None:          if dialog is None:
424              dialog = tree.SessionTreeView(self, self.application, name)              dialog = tree.SessionTreeView(self, self.application, name)
425              self.add_dialog(name, dialog)              self.add_dialog(name, dialog)
426              dialog.Show(true)              dialog.Show(True)
427          else:          else:
428              # FIXME: bring dialog to front here              dialog.Close()
429              pass  
430        def SessionTreeShown(self):
431            """Return true iff the session tree is currently shown"""
432            return self.get_open_dialog("session_tree") is not None
433    
434      def About(self):      def About(self):
435          self.RunMessageBox(_("About"),          self.RunMessageBox(_("About"),
436                             _("Thuban is a program for\n"                             _("Thuban v%s\n"
437                                #"Build Date: %s\n"
438                                "\n"
439                                "Thuban is a program for\n"
440                              "exploring geographic data.\n"                              "exploring geographic data.\n"
441                              "Copyright (C) 2001-2003 Intevation GmbH.\n"                              "Copyright (C) 2001-2003 Intevation GmbH.\n"
442                              "Thuban is licensed under the GPL"),                              "Thuban is licensed under the GNU GPL"
443                               % __ThubanVersion__), #__BuildDate__)),
444                             wxOK | wxICON_INFORMATION)                             wxOK | wxICON_INFORMATION)
445    
446      def AddLayer(self):      def AddLayer(self):
# Line 385  class MainWindow(wxFrame): Line 460  class MainWindow(wxFrame):
460                                     _("Can't open the file '%s'.") % filename)                                     _("Can't open the file '%s'.") % filename)
461              else:              else:
462                  if not has_layers:                  if not has_layers:
463                      # if we're adding a layer to an empty map, for the                      # if we're adding a layer to an empty map, fit the
464                      # new map to the window                      # new map to the window
465                      self.canvas.FitMapToWindow()                      self.canvas.FitMapToWindow()
466          dlg.Destroy()          dlg.Destroy()
# Line 398  class MainWindow(wxFrame): Line 473  class MainWindow(wxFrame):
473      def CanRemoveLayer(self):      def CanRemoveLayer(self):
474          """Return true if the currently selected layer can be deleted.          """Return true if the currently selected layer can be deleted.
475    
476          If no layer is selected return false.          If no layer is selected return False.
477    
478          The return value of this method determines whether the remove          The return value of this method determines whether the remove
479          layer command is sensitive in menu.          layer command is sensitive in menu.
# Line 406  class MainWindow(wxFrame): Line 481  class MainWindow(wxFrame):
481          layer = self.current_layer()          layer = self.current_layer()
482          if layer is not None:          if layer is not None:
483              return self.canvas.Map().CanRemoveLayer(layer)              return self.canvas.Map().CanRemoveLayer(layer)
484          return 0          return False
485    
486      def RaiseLayer(self):      def RaiseLayer(self):
487          layer = self.current_layer()          layer = self.current_layer()
# Line 423  class MainWindow(wxFrame): Line 498  class MainWindow(wxFrame):
498    
499          If no layer is selected, return None          If no layer is selected, return None
500          """          """
501          return self.interactor.SelectedLayer()          return self.canvas.SelectedLayer()
502    
503      def has_selected_layer(self):      def has_selected_layer(self):
504          """Return true if a layer is currently selected"""          """Return true if a layer is currently selected"""
505          return self.interactor.HasSelectedLayer()          return self.canvas.HasSelectedLayer()
506    
507      def choose_color(self):      def choose_color(self):
508          """Run the color selection dialog and return the selected color.          """Run the color selection dialog and return the selected color.
# Line 445  class MainWindow(wxFrame): Line 520  class MainWindow(wxFrame):
520          dlg.Destroy()          dlg.Destroy()
521          return color          return color
522    
     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)  
   
523      def HideLayer(self):      def HideLayer(self):
524          layer = self.current_layer()          layer = self.current_layer()
525          if layer is not None:          if layer is not None:
# Line 486  class MainWindow(wxFrame): Line 537  class MainWindow(wxFrame):
537              name = "table_view" + str(id(table))              name = "table_view" + str(id(table))
538              dialog = self.get_open_dialog(name)              dialog = self.get_open_dialog(name)
539              if dialog is None:              if dialog is None:
540                  dialog = tableview.LayerTableFrame(self, self.interactor, name,                  dialog = tableview.LayerTableFrame(self, name,
541                                                     _("Table: %s") % layer.Title(),                                                 _("Table: %s") % layer.Title(),
542                                                     layer, table)                                                     layer, table)
543                  self.add_dialog(name, dialog)                  self.add_dialog(name, dialog)
544                  dialog.Show(true)                  dialog.Show(true)
# Line 512  class MainWindow(wxFrame): Line 563  class MainWindow(wxFrame):
563              map.SetProjection(proj)              map.SetProjection(proj)
564          proj4Dlg.Destroy()          proj4Dlg.Destroy()
565    
566      def Classify(self):      def LayerEditProperties(self):
567    
568          #          #
569          # 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 572  class MainWindow(wxFrame):
572          #          #
573    
574          layer = self.current_layer()          layer = self.current_layer()
575          name = "classifier" + str(id(layer))          self.OpenLayerProperties(layer)
576    
577        def OpenLayerProperties(self, layer, group = None):
578            name = "layer_properties" + str(id(layer))
579          dialog = self.get_open_dialog(name)          dialog = self.get_open_dialog(name)
580    
581          if dialog is None:          if dialog is None:
582              dialog = classifier.Classifier(self, self.interactor,              dialog = Classifier(self, name, layer, group)
                                            name, self.current_layer())  
583              self.add_dialog(name, dialog)              self.add_dialog(name, dialog)
584              dialog.Show()              dialog.Show()
585            dialog.Raise()
586    
587    
588        def ShowLegend(self):
589            if not self.LegendShown():
590                self.ToggleLegend()
591    
592        def ToggleLegend(self):
593            """Show the legend if it's not shown otherwise hide it again"""
594            name = "legend"
595            dialog = self.FindRegisteredDock(name)
596    
597            if dialog is None:
598                dialog = self.CreateDock(name, -1, _("Legend"), wxLAYOUT_LEFT)
599                legend.LegendPanel(dialog, None, self)
600                dialog.Dock()
601                dialog.GetPanel().SetMap(self.Map())
602                dialog.Show()
603            else:
604                dialog.Show(not dialog.IsShown())
605    
606        def LegendShown(self):
607            """Return true iff the legend is currently open"""
608            dialog = self.FindRegisteredDock("legend")
609            return dialog is not None and dialog.IsShown()
610    
611      def ZoomInTool(self):      def ZoomInTool(self):
612          self.canvas.ZoomInTool()          self.canvas.ZoomInTool()
# Line 552  class MainWindow(wxFrame): Line 630  class MainWindow(wxFrame):
630      def PrintMap(self):      def PrintMap(self):
631          self.canvas.Print()          self.canvas.Print()
632    
633      def identify_view_on_demand(self, layer, shape):      def RenameMap(self):
634            dlg = wxTextEntryDialog(self, "Map Title: ", "Rename Map",
635                                    self.Map().Title())
636            if dlg.ShowModal() == wxID_OK:
637                title = dlg.GetValue()
638                if title != "":
639                    self.Map().SetTitle(title)
640                    self.__SetTitle(title)
641    
642            dlg.Destroy()
643    
644        def identify_view_on_demand(self, layer, shapes):
645          name = "identify_view"          name = "identify_view"
646          if self.canvas.CurrentTool() == "IdentifyTool":          if self.canvas.CurrentTool() == "IdentifyTool":
647              if not self.dialog_open(name):              if not self.dialog_open(name):
648                  dialog = identifyview.IdentifyView(self, self.interactor, name)                  dialog = identifyview.IdentifyView(self, name)
649                  self.add_dialog(name, dialog)                  self.add_dialog(name, dialog)
650                  dialog.Show(true)                  dialog.Show(True)
651              else:              else:
652                  # FIXME: bring dialog to front?                  # FIXME: bring dialog to front?
653                  pass                  pass
654    
655        def __SetTitle(self, title):
656            self.SetTitle("Thuban - " + title)
657    
658  #  #
659  # Define all the commands available in the main window  # Define all the commands available in the main window
660  #  #
# Line 574  def call_method(context, methodname, *ar Line 666  def call_method(context, methodname, *ar
666      apply(getattr(context.mainwindow, methodname), args)      apply(getattr(context.mainwindow, methodname), args)
667    
668  def _method_command(name, title, method, helptext = "",  def _method_command(name, title, method, helptext = "",
669                      icon = "", sensitive = None):                      icon = "", sensitive = None, checked = None):
670      """Add a command implemented by a method of the mainwindow object"""      """Add a command implemented by a method of the mainwindow object"""
671      registry.Add(Command(name, title, call_method, args=(method,),      registry.Add(Command(name, title, call_method, args=(method,),
672                           helptext = helptext, icon = icon,                           helptext = helptext, icon = icon,
673                           sensitive = sensitive))                           sensitive = sensitive, checked = checked))
674    
675  def make_check_current_tool(toolname):  def make_check_current_tool(toolname):
676      """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 608  def _can_remove_layer(context): Line 700  def _can_remove_layer(context):
700    
701  def _has_tree_window_shown(context):  def _has_tree_window_shown(context):
702      """Return true if the tree window is shown"""      """Return true if the tree window is shown"""
703      return context.mainwindow.get_open_dialog("session_tree") is None      return context.mainwindow.SessionTreeShown()
704    
705  def _has_visible_map(context):  def _has_visible_map(context):
706      """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 713  def _has_visible_map(context):
713                  return 1                  return 1
714      return 0      return 0
715    
716    def _has_legend_shown(context):
717        """Return true if the legend window is shown"""
718        return context.mainwindow.LegendShown()
719    
720    
721  # File menu  # File menu
722  _method_command("new_session", _("&New Session"), "NewSession")  _method_command("new_session", _("&New Session"), "NewSession")
723  _method_command("open_session", _("&Open Session"), "OpenSession")  _method_command("open_session", _("&Open Session"), "OpenSession")
724  _method_command("save_session", _("&Save Session"), "SaveSession")  _method_command("save_session", _("&Save Session"), "SaveSession")
725  _method_command("save_session_as", _("Save Session &As"), "SaveSessionAs")  _method_command("save_session_as", _("Save Session &As"), "SaveSessionAs")
726  _method_command("show_session_tree", _("Show Session &Tree"), "ShowSessionTree",  _method_command("toggle_session_tree", _("Session &Tree"), "ToggleSessionTree",
727                  sensitive = _has_tree_window_shown)                  checked = _has_tree_window_shown)
728    _method_command("toggle_legend", _("Legend"), "ToggleLegend",
729                    checked = _has_legend_shown)
730  _method_command("exit", _("E&xit"), "Exit")  _method_command("exit", _("E&xit"), "Exit")
731    
732  # Help menu  # Help menu
# Line 659  _method_command("map_full_extent", _("&F Line 757  _method_command("map_full_extent", _("&F
757                sensitive = _has_visible_map)                sensitive = _has_visible_map)
758  _method_command("map_print", _("Prin&t"), "PrintMap",  _method_command("map_print", _("Prin&t"), "PrintMap",
759                  helptext = _("Print the map"))                  helptext = _("Print the map"))
760    _method_command("map_rename", _("&Rename"), "RenameMap",
761                    helptext = _("Rename the map"))
762    
763  # Layer menu  # Layer menu
764  _method_command("layer_add", _("&Add Layer"), "AddLayer",  _method_command("layer_add", _("&Add Layer"), "AddLayer",
# Line 666  _method_command("layer_add", _("&Add Lay Line 766  _method_command("layer_add", _("&Add Lay
766  _method_command("layer_remove", _("&Remove Layer"), "RemoveLayer",  _method_command("layer_remove", _("&Remove Layer"), "RemoveLayer",
767                  helptext = _("Remove selected layer(s)"),                  helptext = _("Remove selected layer(s)"),
768                  sensitive = _can_remove_layer)                  sensitive = _can_remove_layer)
 _method_command("layer_fill_color", _("&Fill Color"), "LayerFillColor",  
                 helptext = _("Set the fill color of selected layer(s)"),  
                 sensitive = _has_selected_layer)  
 _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)"),  
                 sensitive = _has_selected_layer)  
769  _method_command("layer_raise", _("&Raise"), "RaiseLayer",  _method_command("layer_raise", _("&Raise"), "RaiseLayer",
770                  helptext = _("Raise selected layer(s)"),                  helptext = _("Raise selected layer(s)"),
771                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
# Line 694  _method_command("layer_hide", _("&Hide") Line 781  _method_command("layer_hide", _("&Hide")
781  _method_command("layer_show_table", _("Show Ta&ble"), "LayerShowTable",  _method_command("layer_show_table", _("Show Ta&ble"), "LayerShowTable",
782                  helptext = _("Show the selected layer's table"),                  helptext = _("Show the selected layer's table"),
783                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
784    _method_command("layer_properties", _("Properties"), "LayerEditProperties",
 _method_command("layer_classifier", _("Classify"), "Classify",  
785                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
786    
787  # the menu structure  # the menu structure
# Line 703  main_menu = Menu("<main>", "<main>", Line 789  main_menu = Menu("<main>", "<main>",
789                   [Menu("file", _("&File"),                   [Menu("file", _("&File"),
790                         ["new_session", "open_session", None,                         ["new_session", "open_session", None,
791                          "save_session", "save_session_as", None,                          "save_session", "save_session_as", None,
792                          "show_session_tree", None,                          "toggle_session_tree", None,
793                          "exit"]),                          "exit"]),
794                    Menu("map", _("&Map"),                    Menu("map", _("&Map"),
795                         ["layer_add", "layer_remove",                         ["layer_add", "layer_remove",
# Line 715  main_menu = Menu("<main>", "<main>", Line 801  main_menu = Menu("<main>", "<main>",
801                          None,                          None,
802                          "map_full_extent",                          "map_full_extent",
803                          None,                          None,
804                          "map_print"]),                          "toggle_legend",
805                    Menu("layer", _("&Layer"),                          None,
806                         ["layer_fill_color", "layer_transparent_fill",                          "map_print",
                         "layer_outline_color", "layer_no_outline",  
807                          None,                          None,
808                          "layer_raise", "layer_lower",                          "map_rename"]),
809                      Menu("layer", _("&Layer"),
810                            ["layer_raise", "layer_lower",
811                          None,                          None,
812                          "layer_show", "layer_hide",                          "layer_show", "layer_hide",
813                          None,                          None,
814                          "layer_show_table",                          "layer_show_table",
815                          None,                          None,
816                          "layer_classifier"]),                          "layer_properties"]),
817                    Menu("help", _("&Help"),                    Menu("help", _("&Help"),
818                         ["help_about"])])                         ["help_about"])])
819    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26