/[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 796 by jonathan, Wed Apr 30 17:01:18 2003 UTC revision 1037 by bh, Mon May 26 17:30:43 2003 UTC
# Line 2  Line 2 
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 18  __ThubanVersion__ = "0.2" #"$THUBAN_0_2$ Line 19  __ThubanVersion__ = "0.2" #"$THUBAN_0_2$
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    from wxPython.lib.dialogs import wxMultipleChoiceDialog
25    
26  import Thuban  import Thuban
27    import Thuban.version
28    
29  from Thuban import _  from Thuban import _
30  from Thuban.Model.session import create_empty_session  from Thuban.Model.session import create_empty_session
31  from Thuban.Model.layer import Layer  from Thuban.Model.layer import Layer, RasterLayer
32  from Thuban.Model.color import Color  from Thuban.Model.color import Color
33  from Thuban.Model.proj import Projection  from Thuban.Model.proj import Projection
34    
# Line 39  from command import registry, Command, T Line 45  from command import registry, Command, T
45  from messages import LAYER_SELECTED, SHAPES_SELECTED, VIEW_POSITION  from messages import LAYER_SELECTED, SHAPES_SELECTED, VIEW_POSITION
46    
47  from Thuban.UI.dock import DockFrame  from Thuban.UI.dock import DockFrame
48    from Thuban.UI.join import JoinDialog
49    
50  import resource  import resource
51    
# Line 60  class MainWindow(DockFrame): Line 67  class MainWindow(DockFrame):
67      # implemented in the __getattr__ method.      # implemented in the __getattr__ method.
68      delegated_methods = {"SelectLayer": "canvas",      delegated_methods = {"SelectLayer": "canvas",
69                           "SelectShapes": "canvas",                           "SelectShapes": "canvas",
70                             "SelectedShapes": "canvas",
71                           }                           }
72    
73      def __init__(self, parent, ID, title, application, interactor,      def __init__(self, parent, ID, title, application, interactor,
# Line 98  class MainWindow(DockFrame): Line 106  class MainWindow(DockFrame):
106    
107          self.init_dialogs()          self.init_dialogs()
108    
109          EVT_CLOSE(self, self._OnClose)          EVT_CLOSE(self, self.OnClose)
110    
111      def Subscribe(self, channel, *args):      def Subscribe(self, channel, *args):
112          """Subscribe a function to a message channel.          """Subscribe a function to a message channel.
# Line 357  class MainWindow(DockFrame): Line 365  class MainWindow(DockFrame):
365                  d.Close()                  d.Close()
366    
367      def NewSession(self):      def NewSession(self):
368          self.save_modified_session()          if self.save_modified_session() != wxID_CANCEL:
369          self.prepare_new_session()              self.prepare_new_session()
370          self.application.SetSession(create_empty_session())              self.application.SetSession(create_empty_session())
371    
372      def OpenSession(self):      def OpenSession(self):
373          self.save_modified_session()          if self.save_modified_session() != wxID_CANCEL:
374          dlg = wxFileDialog(self, _("Open Session"), ".", "", "*.thuban", wxOPEN)              dlg = wxFileDialog(self, _("Open Session"), ".", "",
375          if dlg.ShowModal() == wxID_OK:                                 "Thuban Session File (*.thuban)|*.thuban",
376              self.prepare_new_session()                                 wxOPEN)
377              self.application.OpenSession(dlg.GetPath())              if dlg.ShowModal() == wxID_OK:
378          dlg.Destroy()                  self.prepare_new_session()
379                    self.application.OpenSession(dlg.GetPath())
380                dlg.Destroy()
381    
382      def SaveSession(self):      def SaveSession(self):
383          if self.application.session.filename == None:          if self.application.session.filename == None:
# Line 377  class MainWindow(DockFrame): Line 387  class MainWindow(DockFrame):
387    
388      def SaveSessionAs(self):      def SaveSessionAs(self):
389          dlg = wxFileDialog(self, _("Save Session As"), ".", "",          dlg = wxFileDialog(self, _("Save Session As"), ".", "",
390                             "*.thuban", wxSAVE|wxOVERWRITE_PROMPT)                             "Thuban Session File (*.thuban)|*.thuban",
391                               wxSAVE|wxOVERWRITE_PROMPT)
392          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
393              self.application.session.SetFilename(dlg.GetPath())              self.application.session.SetFilename(dlg.GetPath())
394              self.application.SaveSession()              self.application.SaveSession()
# Line 386  class MainWindow(DockFrame): Line 397  class MainWindow(DockFrame):
397      def Exit(self):      def Exit(self):
398          self.Close(False)          self.Close(False)
399    
400      def _OnClose(self, event):      def OnClose(self, event):
401          result = self.save_modified_session(can_veto = event.CanVeto())          result = self.save_modified_session(can_veto = event.CanVeto())
402          if result == wxID_CANCEL:          if result == wxID_CANCEL:
403              event.Veto()              event.Veto()
# Line 395  class MainWindow(DockFrame): Line 406  class MainWindow(DockFrame):
406              # wx's destroy event, but that isn't implemented for wxGTK              # wx's destroy event, but that isn't implemented for wxGTK
407              # yet.              # yet.
408              self.canvas.Unsubscribe(VIEW_POSITION, self.view_position_changed)              self.canvas.Unsubscribe(VIEW_POSITION, self.view_position_changed)
409              DockFrame._OnClose(self, event)              DockFrame.OnClose(self, event)
410              self.Destroy()              self.Destroy()
411    
412      def SetMap(self, map):      def SetMap(self, map):
# Line 428  class MainWindow(DockFrame): Line 439  class MainWindow(DockFrame):
439    
440      def About(self):      def About(self):
441          self.RunMessageBox(_("About"),          self.RunMessageBox(_("About"),
442                             _("Thuban v%s\n"                             _("Thuban %s\n"
443                              #"Build Date: %s\n"                              #"Build Date: %s\n"
444                              "\n"                              "using:\n"
445                                "  %s\n"
446                                "  %s\n\n"
447                              "Thuban is a program for\n"                              "Thuban is a program for\n"
448                              "exploring geographic data.\n"                              "exploring geographic data.\n"
449                              "Copyright (C) 2001-2003 Intevation GmbH.\n"                              "Copyright (C) 2001-2003 Intevation GmbH.\n"
450                              "Thuban is licensed under the GNU GPL"                              "Thuban is licensed under the GNU GPL"
451                             % __ThubanVersion__), #__BuildDate__)),                              % (Thuban.version.longversion,
452                                   "wxPython %s" % wxPython_version,
453                                   "Python %d.%d.%d" % sys.version_info[:3]
454                                  )),
455    #                           % __ThubanVersion__), #__BuildDate__)),
456                             wxOK | wxICON_INFORMATION)                             wxOK | wxICON_INFORMATION)
457    
458      def AddLayer(self):      def AddLayer(self):
# Line 444  class MainWindow(DockFrame): Line 461  class MainWindow(DockFrame):
461          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
462              filename = dlg.GetPath()              filename = dlg.GetPath()
463              title = os.path.splitext(os.path.basename(filename))[0]              title = os.path.splitext(os.path.basename(filename))[0]
             store = self.application.Session().OpenShapefile(filename)  
             layer = Layer(title, store)  
464              map = self.canvas.Map()              map = self.canvas.Map()
465              has_layers = map.HasLayers()              has_layers = map.HasLayers()
466              try:              try:
467                  map.AddLayer(layer)                  store = self.application.Session().OpenShapefile(filename)
468              except IOError:              except IOError:
469                  # the layer couldn't be opened                  # the layer couldn't be opened
470                  self.RunMessageBox(_("Add Layer"),                  self.RunMessageBox(_("Add Layer"),
471                                     _("Can't open the file '%s'.") % filename)                                     _("Can't open the file '%s'.") % filename)
472              else:              else:
473                    layer = Layer(title, store)
474                    map.AddLayer(layer)
475                    if not has_layers:
476                        # if we're adding a layer to an empty map, fit the
477                        # new map to the window
478                        self.canvas.FitMapToWindow()
479            dlg.Destroy()
480    
481        def AddRasterLayer(self):
482            dlg = wxFileDialog(self, _("Select an image file"), ".", "", "*.*",
483                               wxOPEN)
484            if dlg.ShowModal() == wxID_OK:
485                filename = dlg.GetPath()
486                title = os.path.splitext(os.path.basename(filename))[0]
487                map = self.canvas.Map()
488                has_layers = map.HasLayers()
489                try:
490                    layer = RasterLayer(title, filename)
491                except IOError:
492                    # the layer couldn't be opened
493                    self.RunMessageBox(_("Add Image Layer"),
494                                       _("Can't open the file '%s'.") % filename)
495                else:
496                    map.AddLayer(layer)
497                  if not has_layers:                  if not has_layers:
498                      # if we're adding a layer to an empty map, fit the                      # if we're adding a layer to an empty map, fit the
499                      # new map to the window                      # new map to the window
# Line 500  class MainWindow(DockFrame): Line 539  class MainWindow(DockFrame):
539          """Return true if a layer is currently selected"""          """Return true if a layer is currently selected"""
540          return self.canvas.HasSelectedLayer()          return self.canvas.HasSelectedLayer()
541    
542      def choose_color(self):      def has_selected_shapes(self):
543          """Run the color selection dialog and return the selected color.          """Return true if a shape is currently selected"""
544            return self.canvas.HasSelectedShapes()
         If the user cancels, return None.  
         """  
         dlg = wxColourDialog(self)  
         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  
545    
546      def HideLayer(self):      def HideLayer(self):
547          layer = self.current_layer()          layer = self.current_layer()
# Line 534  class MainWindow(DockFrame): Line 561  class MainWindow(DockFrame):
561              dialog = self.get_open_dialog(name)              dialog = self.get_open_dialog(name)
562              if dialog is None:              if dialog is None:
563                  dialog = tableview.LayerTableFrame(self, name,                  dialog = tableview.LayerTableFrame(self, name,
564                                                 _("Table: %s") % layer.Title(),                                           _("Layer Table: %s") % layer.Title(),
565                                                     layer, table)                                           layer, table)
566                  self.add_dialog(name, dialog)                  self.add_dialog(name, dialog)
567                  dialog.Show(true)                  dialog.Show(True)
568              else:              else:
569                  # FIXME: bring dialog to front here                  # FIXME: bring dialog to front here
570                  pass                  pass
# Line 591  class MainWindow(DockFrame): Line 618  class MainWindow(DockFrame):
618              dialog.Show()              dialog.Show()
619          dialog.Raise()          dialog.Raise()
620    
621        def LayerJoinTable(self):
622            print "LayerJoinTable: Not implemented."
623    
624        def LayerUnjoinTable(self):
625            print "LayerUnjoinTable: Not implemented."
626    
627      def ShowLegend(self):      def ShowLegend(self):
628          if not self.LegendShown():          if not self.LegendShown():
# Line 615  class MainWindow(DockFrame): Line 647  class MainWindow(DockFrame):
647          dialog = self.FindRegisteredDock("legend")          dialog = self.FindRegisteredDock("legend")
648          return dialog is not None and dialog.IsShown()          return dialog is not None and dialog.IsShown()
649    
650        def TableOpen(self):
651            dlg = wxFileDialog(self, _("Open Table"), ".", "",
652                               _("DBF Files (*.dbf)") + "|*.dbf|" +
653                               #_("CSV Files (*.csv)") + "|*.csv|" +
654                               _("All Files (*.*)") + "|*.*",
655                               wxOPEN)
656            if dlg.ShowModal() == wxID_OK:
657                self.application.session.OpenTableFile(dlg.GetPath())
658    
659            dlg.Destroy()
660    
661        def TableClose(self):
662            print "TableClose: not implemented"
663    
664        def TableShow(self):
665            """Offer a multi-selection dialog for tables to be displayed
666            
667            The windows for the selected tables are opened or brought to
668            the front.
669            """
670            tables = self.application.session.Tables()
671            table_list = []
672            for table in tables:
673                table_list.append(table.Title())
674    
675            dlg = wxMultipleChoiceDialog(self, _("Pick the table to show:"),
676                                         _("Show Table"), table_list,
677                                         size = (400,300), style = wxRESIZE_BORDER)
678            if (dlg.ShowModal() == wxID_OK):
679                for i in dlg.GetValue():
680                    # XXX: First check whether the dialog is already open
681                    # and if so, bring it to the front.
682                    # XXX: if the table belongs to a layer, open a
683                    # LayerTableFrame instead of QueryTableFrame
684                    print "tables[i]:", tables[i]
685                    dialog = tableview.QueryTableFrame(self, table_list[i],
686                                                  _("Table: %s") % table_list[i],
687                                                  tables[i])
688                    self.add_dialog(table_list[i], dialog)
689                    dialog.Show(True)
690    
691            # XXX: just some analyis code, remove it when the above XXX is
692            # resolved.
693            for d in self.dialogs.values():
694                if isinstance(d, tableview.LayerTableFrame):
695                    print "LayerTable:", d.GetTitle()
696                elif isinstance(d, tableview.QueryTableFrame):
697                    print "QueryTable:", d.GetTitle()
698                else:
699                    print "Other:", d.GetTitle()
700    
701        def TableHide(self):
702            print "TableHide: not implemented"
703    
704        def TableJoin(self):
705            dlg = JoinDialog(self, _("Join Tables"), self.application.session)
706            dlg.ShowModal()
707    
708      def ZoomInTool(self):      def ZoomInTool(self):
709          self.canvas.ZoomInTool()          self.canvas.ZoomInTool()
710    
# Line 634  class MainWindow(DockFrame): Line 724  class MainWindow(DockFrame):
724      def FullExtent(self):      def FullExtent(self):
725          self.canvas.FitMapToWindow()          self.canvas.FitMapToWindow()
726    
727        def FullLayerExtent(self):
728            self.canvas.FitLayerToWindow(self.current_layer())
729    
730        def FullSelectionExtent(self):
731            self.canvas.FitSelectedToWindow()
732    
733        def ExportMap(self):
734            self.canvas.Export()
735    
736      def PrintMap(self):      def PrintMap(self):
737          self.canvas.Print()          self.canvas.Print()
738    
# Line 715  def _has_selected_layer(context): Line 814  def _has_selected_layer(context):
814      """Return true if a layer is selected in the context"""      """Return true if a layer is selected in the context"""
815      return context.mainwindow.has_selected_layer()      return context.mainwindow.has_selected_layer()
816    
817    def _has_selected_shapes(context):
818        """Return true if a layer is selected in the context"""
819        return context.mainwindow.has_selected_shapes()
820    
821  def _can_remove_layer(context):  def _can_remove_layer(context):
822      return context.mainwindow.CanRemoveLayer()      return context.mainwindow.CanRemoveLayer()
823    
# Line 740  def _has_legend_shown(context): Line 843  def _has_legend_shown(context):
843    
844  # File menu  # File menu
845  _method_command("new_session", _("&New Session"), "NewSession")  _method_command("new_session", _("&New Session"), "NewSession")
846  _method_command("open_session", _("&Open Session"), "OpenSession")  _method_command("open_session", _("&Open Session..."), "OpenSession")
847  _method_command("save_session", _("&Save Session"), "SaveSession")  _method_command("save_session", _("&Save Session"), "SaveSession")
848  _method_command("save_session_as", _("Save Session &As"), "SaveSessionAs")  _method_command("save_session_as", _("Save Session &As..."), "SaveSessionAs")
849  _method_command("toggle_session_tree", _("Session &Tree"), "ToggleSessionTree",  _method_command("toggle_session_tree", _("Session &Tree"), "ToggleSessionTree",
850                  checked = _has_tree_window_shown)                  checked = _has_tree_window_shown)
851  _method_command("toggle_legend", _("Legend"), "ToggleLegend",  _method_command("toggle_legend", _("Legend"), "ToggleLegend",
# Line 750  _method_command("toggle_legend", _("Lege Line 853  _method_command("toggle_legend", _("Lege
853  _method_command("exit", _("E&xit"), "Exit")  _method_command("exit", _("E&xit"), "Exit")
854    
855  # Help menu  # Help menu
856  _method_command("help_about", _("&About"), "About")  _method_command("help_about", _("&About..."), "About")
857    
858    
859  # Map menu  # Map menu
860  _method_command("map_projection", _("Pro&jection"), "MapProjection")  _method_command("map_projection", _("Pro&jection..."), "MapProjection")
861    
862  _tool_command("map_zoom_in_tool", _("&Zoom in"), "ZoomInTool", "ZoomInTool",  _tool_command("map_zoom_in_tool", _("&Zoom in"), "ZoomInTool", "ZoomInTool",
863                helptext = _("Switch to map-mode 'zoom-in'"), icon = "zoom_in",                helptext = _("Switch to map-mode 'zoom-in'"), icon = "zoom_in",
# Line 775  _tool_command("map_label_tool", _("&Labe Line 878  _tool_command("map_label_tool", _("&Labe
878  _method_command("map_full_extent", _("&Full extent"), "FullExtent",  _method_command("map_full_extent", _("&Full extent"), "FullExtent",
879                 helptext = _("Full Extent"), icon = "fullextent",                 helptext = _("Full Extent"), icon = "fullextent",
880                sensitive = _has_visible_map)                sensitive = _has_visible_map)
881    _method_command("layer_full_extent", _("&Full layer extent"), "FullLayerExtent",
882                   helptext = _("Full Layer Extent"), icon = "fulllayerextent",
883                  sensitive = _has_selected_layer)
884    _method_command("selected_full_extent", _("&Full selection extent"), "FullSelectionExtent",
885                   helptext = _("Full Selection Extent"), icon = "fullselextent",
886                  sensitive = _has_selected_shapes)
887    _method_command("map_export", _("E&xport"), "ExportMap",
888                        helptext = _("Export the map to file"))
889  _method_command("map_print", _("Prin&t"), "PrintMap",  _method_command("map_print", _("Prin&t"), "PrintMap",
890                  helptext = _("Print the map"))                  helptext = _("Print the map"))
891  _method_command("map_rename", _("&Rename"), "RenameMap",  _method_command("map_rename", _("&Rename..."), "RenameMap",
892                  helptext = _("Rename the map"))                  helptext = _("Rename the map"))
893  _method_command("layer_add", _("&Add Layer"), "AddLayer",  _method_command("layer_add", _("&Add Layer..."), "AddLayer",
894                  helptext = _("Add a new layer to active map"))                  helptext = _("Add a new layer to active map"))
895    _method_command("rasterlayer_add", _("&Add Image Layer..."), "AddRasterLayer",
896                    helptext = _("Add a new image layer to active map"))
897  _method_command("layer_remove", _("&Remove Layer"), "RemoveLayer",  _method_command("layer_remove", _("&Remove Layer"), "RemoveLayer",
898                  helptext = _("Remove selected layer(s)"),                  helptext = _("Remove selected layer(s)"),
899                  sensitive = _can_remove_layer)                  sensitive = _can_remove_layer)
900    
901  # Layer menu  # Layer menu
902  _method_command("layer_projection", _("Pro&jection"), "LayerProjection",  _method_command("layer_projection", _("Pro&jection..."), "LayerProjection",
903                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
904  _method_command("layer_raise", _("&Raise"), "RaiseLayer",  _method_command("layer_raise", _("&Raise"), "RaiseLayer",
905                  helptext = _("Raise selected layer(s)"),                  helptext = _("Raise selected layer(s)"),
# Line 803  _method_command("layer_hide", _("&Hide") Line 916  _method_command("layer_hide", _("&Hide")
916  _method_command("layer_show_table", _("Show Ta&ble"), "LayerShowTable",  _method_command("layer_show_table", _("Show Ta&ble"), "LayerShowTable",
917                  helptext = _("Show the selected layer's table"),                  helptext = _("Show the selected layer's table"),
918                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
919  _method_command("layer_properties", _("Properties"), "LayerEditProperties",  _method_command("layer_properties", _("&Properties..."), "LayerEditProperties",
920                    sensitive = _has_selected_layer)
921    _method_command("layer_jointable", _("&Join Table..."), "LayerJoinTable",
922                    sensitive = _has_selected_layer)
923    _method_command("layer_unjointable", _("&Unjoin Table..."), "LayerUnjoinTable",
924                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
925    
926  # the menu structure  # Table menu
927  main_menu = Menu("<main>", "<main>",  _method_command("table_open", _("&Open..."), "TableOpen")
928                   [Menu("file", _("&File"),  _method_command("table_close", _("&Close"), "TableClose")
929                         ["new_session", "open_session", None,  _method_command("table_show", _("&Show"), "TableShow")
930                          "save_session", "save_session_as", None,  _method_command("table_hide", _("&Hide"), "TableHide")
931                          "toggle_session_tree", None,  _method_command("table_join", _("&Join..."), "TableJoin")
932                          "exit"]),  
933                    Menu("map", _("&Map"),  #  Export only under Windows ...
934                         ["layer_add", "layer_remove", "map_rename",  map_menu = ["layer_add", "rasterlayer_add", "layer_remove", "map_rename",
935                          None,                          None,
936                          "map_projection",                          "map_projection",
937                          None,                          None,
938                          "map_zoom_in_tool", "map_zoom_out_tool",                          "map_zoom_in_tool", "map_zoom_out_tool",
939                          "map_pan_tool", "map_identify_tool", "map_label_tool",                          "map_pan_tool",
940                            "map_full_extent",
941                            "layer_full_extent",
942                            "selected_full_extent",
943                          None,                          None,
944                          "map_full_extent",                          "map_identify_tool", "map_label_tool",
945                          None,                          None,
946                          "toggle_legend",                          "toggle_legend",
947                          None,                          None]
948                          "map_print"]),  if wxPlatform == '__WXMSW__':
949        map_menu.append("map_export")
950    map_menu.append("map_print")
951    
952    # the menu structure
953    main_menu = Menu("<main>", "<main>",
954                     [Menu("file", _("&File"),
955                           ["new_session", "open_session", None,
956                            "save_session", "save_session_as", None,
957                            "toggle_session_tree", None,
958                            "exit"]),
959                      Menu("map", _("&Map"), map_menu),
960                    Menu("layer", _("&Layer"),                    Menu("layer", _("&Layer"),
961                          ["layer_raise", "layer_lower",                          ["layer_raise", "layer_lower",
962                          None,                          None,
963                          "layer_show", "layer_hide",                          "layer_show", "layer_hide",
964                          None,                          None,
965                          "layer_show_table",                          "layer_projection",
966                          None,                          None,
967                          "layer_properties",                          "layer_show_table",
968                            "layer_jointable",
969                            "layer_unjointable",
970                          None,                          None,
971                          "layer_projection"]),                          "layer_properties"]),
972                      Menu("table", _("&Table"),
973                           ["table_open", "table_close",
974                           None,
975                           "table_show", "table_hide",
976                           None,
977                           "table_join"]),
978                    Menu("help", _("&Help"),                    Menu("help", _("&Help"),
979                         ["help_about"])])                         ["help_about"])])
980    
# Line 843  main_menu = Menu("<main>", "<main>", Line 982  main_menu = Menu("<main>", "<main>",
982    
983  main_toolbar = Menu("<toolbar>", "<toolbar>",  main_toolbar = Menu("<toolbar>", "<toolbar>",
984                      ["map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",                      ["map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",
985                       "map_full_extent", None,                       "map_full_extent",
986                         "layer_full_extent",
987                         "selected_full_extent",
988                         None,
989                       "map_identify_tool", "map_label_tool"])                       "map_identify_tool", "map_label_tool"])

Legend:
Removed from v.796  
changed lines
  Added in v.1037

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26