/[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 1070 by bh, Tue May 27 15:09:31 2003 UTC revision 1287 by jonathan, Mon Jun 23 10:47:11 2003 UTC
# Line 13  The main window Line 13  The main window
13    
14  __version__ = "$Revision$"  __version__ = "$Revision$"
15    
16  __ThubanVersion__ = "0.2" #"$THUBAN_0_2$"  __ThubanVersion__ = "0.8" #"$THUBAN_0_2$"
17  #__BuildDate__ = "$Date$"  #__BuildDate__ = "$Date$"
18    
19  import os  import os
20    import copy
21    
22  from wxPython.wx import *  from wxPython.wx import *
23  from wxPython.wx import __version__ as wxPython_version  from wxPython.wx import __version__ as wxPython_version
24    
 from wxPython.lib.dialogs import wxMultipleChoiceDialog  
   
25  import Thuban  import Thuban
26  import Thuban.version  import Thuban.version
27    
# Line 30  from Thuban import _ Line 29  from Thuban import _
29  from Thuban.Model.session import create_empty_session  from Thuban.Model.session import create_empty_session
30  from Thuban.Model.layer import Layer, RasterLayer  from Thuban.Model.layer import Layer, RasterLayer
31    
32    # XXX: replace this by
33    # from wxPython.lib.dialogs import wxMultipleChoiceDialog
34    # when Thuban does not support wxPython 2.4.0 any more.
35    from Thuban.UI.multiplechoicedialog import wxMultipleChoiceDialog
36    
37  import view  import view
38  import tree  import tree
39  import tableview, identifyview  import tableview, identifyview
# Line 45  from Thuban.UI.dock import DockFrame Line 49  from Thuban.UI.dock import DockFrame
49  from Thuban.UI.join import JoinDialog  from Thuban.UI.join import JoinDialog
50    
51  import resource  import resource
52    import Thuban.Model.resource
53    
54  import projdialog  import projdialog
55    
   
   
56  class MainWindow(DockFrame):  class MainWindow(DockFrame):
57    
58      # Some messages that can be subscribed/unsubscribed directly through      # Some messages that can be subscribed/unsubscribed directly through
# Line 64  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                             "SelectedLayer": "canvas",
71                           "SelectedShapes": "canvas",                           "SelectedShapes": "canvas",
72                           }                           }
73    
# Line 103  class MainWindow(DockFrame): Line 107  class MainWindow(DockFrame):
107    
108          self.init_dialogs()          self.init_dialogs()
109    
110            self.ShowLegend()
111    
112          EVT_CLOSE(self, self.OnClose)          EVT_CLOSE(self, self.OnClose)
113    
114      def Subscribe(self, channel, *args):      def Subscribe(self, channel, *args):
# Line 439  class MainWindow(DockFrame): Line 445  class MainWindow(DockFrame):
445    
446      def About(self):      def About(self):
447          self.RunMessageBox(_("About"),          self.RunMessageBox(_("About"),
448                             _("Thuban %s\n"                             _("Thuban %s\n\n"
449                              #"Build Date: %s\n"                              #"Build Date: %s\n"
450                              "using:\n"                              "Currently using:\n"
451                              "  %s\n"                              "  %s\n"
452                              "  %s\n\n"                              "  %s\n\n"
453                              "Thuban is a program for\n"                              "Thuban is a program for\n"
# Line 547  class MainWindow(DockFrame): Line 553  class MainWindow(DockFrame):
553          layer = self.current_layer()          layer = self.current_layer()
554          if layer is not None:          if layer is not None:
555              layer.SetVisible(0)              layer.SetVisible(0)
556            
557      def ShowLayer(self):      def ShowLayer(self):
558          layer = self.current_layer()          layer = self.current_layer()
559          if layer is not None:          if layer is not None:
560              layer.SetVisible(1)              layer.SetVisible(1)
561    
562        def DuplicateLayer(self):
563            """Ceate a new layer above the selected layer with the same shapestore
564            """
565            layer = self.current_layer()
566            if layer is not None and hasattr(layer, "ShapeStore"):
567                new_layer = Layer(_("Copy of `%s'") % layer.Title(),
568                                  layer.ShapeStore(),
569                                  projection = layer.GetProjection())
570                new_classification = copy.deepcopy(layer.GetClassification())
571                new_layer.SetClassification(new_classification)
572                self.Map().AddLayer(new_layer)
573    
574        def CanDuplicateLayer(self):
575            """Return whether the DuplicateLayer method can create a duplicate"""
576            layer = self.current_layer()
577            return layer is not None and hasattr(layer, "ShapeStore")
578    
579      def LayerShowTable(self):      def LayerShowTable(self):
580          layer = self.current_layer()          layer = self.current_layer()
581          if layer is not None:          if layer is not None:
582              table = layer.table              table = layer.ShapeStore().Table()
583              name = "table_view" + str(id(table))              name = "table_view" + str(id(table))
584              dialog = self.get_open_dialog(name)              dialog = self.get_open_dialog(name)
585              if dialog is None:              if dialog is None:
# Line 613  class MainWindow(DockFrame): Line 636  class MainWindow(DockFrame):
636          dialog = self.get_open_dialog(name)          dialog = self.get_open_dialog(name)
637    
638          if dialog is None:          if dialog is None:
639              dialog = Classifier(self, name, layer, group)              dialog = Classifier(self, name, self.Map(), layer, group)
640              self.add_dialog(name, dialog)              self.add_dialog(name, dialog)
641              dialog.Show()              dialog.Show()
642          dialog.Raise()          dialog.Raise()
643    
644      def LayerJoinTable(self):      def LayerJoinTable(self):
645          print "LayerJoinTable: Not implemented."          layer = self.canvas.SelectedLayer()
646            if layer is not None:
647                dlg = JoinDialog(self, _("Join Layer with Table"),
648                                 self.application.session,
649                                 layer = layer)
650                dlg.ShowModal()
651    
652      def LayerUnjoinTable(self):      def LayerUnjoinTable(self):
653          print "LayerUnjoinTable: Not implemented."          layer = self.canvas.SelectedLayer()
654            if layer is not None:
655                orig_store = layer.ShapeStore().OrigShapeStore()
656                if orig_store:
657                    layer.SetShapeStore(orig_store)
658    
659      def ShowLegend(self):      def ShowLegend(self):
660          if not self.LegendShown():          if not self.LegendShown():
# Line 642  class MainWindow(DockFrame): Line 674  class MainWindow(DockFrame):
674          else:          else:
675              dialog.Show(not dialog.IsShown())              dialog.Show(not dialog.IsShown())
676    
677            self.canvas.FitMapToWindow()
678    
679      def LegendShown(self):      def LegendShown(self):
680          """Return true iff the legend is currently open"""          """Return true iff the legend is currently open"""
681          dialog = self.FindRegisteredDock("legend")          dialog = self.FindRegisteredDock("legend")
# Line 668  class MainWindow(DockFrame): Line 702  class MainWindow(DockFrame):
702      def TableClose(self):      def TableClose(self):
703          tables = self.application.session.UnreferencedTables()          tables = self.application.session.UnreferencedTables()
704    
705            lst = [(t.Title(), t) for t in tables]
706            lst.sort()
707            titles = [i[0] for i in lst]
708          dlg = wxMultipleChoiceDialog(self, _("Pick the tables to close:"),          dlg = wxMultipleChoiceDialog(self, _("Pick the tables to close:"),
709                                       _("Close Table"),                                       _("Close Table"), titles,
710                                       [t.Title() for t in tables],                                       size = (400, 300),
711                                       size = (400, 300), style=wxRESIZE_BORDER)                                       style = wxDEFAULT_DIALOG_STYLE |
712                                                 wxRESIZE_BORDER)
713          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
714              for i in dlg.GetValue():              for i in dlg.GetValue():
715                  self.application.session.RemoveTable(tables[i])                  self.application.session.RemoveTable(lst[i][1])
716    
717    
718      def TableShow(self):      def TableShow(self):
# Line 685  class MainWindow(DockFrame): Line 723  class MainWindow(DockFrame):
723          """          """
724          tables = self.application.session.Tables()          tables = self.application.session.Tables()
725    
726            lst = [(t.Title(), t) for t in tables]
727            lst.sort()
728            titles = [i[0] for i in lst]
729          dlg = wxMultipleChoiceDialog(self, _("Pick the table to show:"),          dlg = wxMultipleChoiceDialog(self, _("Pick the table to show:"),
730                                       _("Show Table"),                                       _("Show Table"), titles,
731                                       [t.Title() for t in tables],                                       size = (400,300),
732                                       size = (400,300), style = wxRESIZE_BORDER)                                       style = wxDEFAULT_DIALOG_STYLE |
733                                                 wxRESIZE_BORDER)
734          if (dlg.ShowModal() == wxID_OK):          if (dlg.ShowModal() == wxID_OK):
735              for i in dlg.GetValue():              for i in dlg.GetValue():
736                  # XXX: if the table belongs to a layer, open a                  # XXX: if the table belongs to a layer, open a
737                  # LayerTableFrame instead of QueryTableFrame                  # LayerTableFrame instead of QueryTableFrame
738                  self.ShowTableView(tables[i])                  self.ShowTableView(lst[i][1])
739    
740      def TableJoin(self):      def TableJoin(self):
741          dlg = JoinDialog(self, _("Join Tables"), self.application.session)          dlg = JoinDialog(self, _("Join Tables"), self.application.session)
# Line 711  class MainWindow(DockFrame): Line 753  class MainWindow(DockFrame):
753              dialog.Show(True)              dialog.Show(True)
754          # FIXME: else bring dialog to front          # FIXME: else bring dialog to front
755    
756        def TableRename(self):
757            """Let the user rename a table"""
758    
759            # First, let the user select a table
760            tables = self.application.session.Tables()
761            lst = [(t.Title(), t) for t in tables]
762            lst.sort()
763            titles = [i[0] for i in lst]
764            dlg = wxMultipleChoiceDialog(self, _("Pick the table to rename:"),
765                                         _("Rename Table"), titles,
766                                         size = (400,300),
767                                         style = wxDEFAULT_DIALOG_STYLE |
768                                                 wxRESIZE_BORDER)
769            if (dlg.ShowModal() == wxID_OK):
770                to_rename = [lst[i][1] for i in dlg.GetValue()]
771                dlg.Destroy()
772            else:
773                to_rename = []
774    
775            # Second, let the user rename the layers
776            for table in to_rename:
777                dlg = wxTextEntryDialog(self, "Table Title: ", "Rename Table",
778                                        table.Title())
779                try:
780                    if dlg.ShowModal() == wxID_OK:
781                        title = dlg.GetValue()
782                        if title != "":
783                            table.SetTitle(title)
784    
785                            # Make sure the session is marked as modified.
786                            # FIXME: This should be handled automatically,
787                            # but that requires more changes to the tables
788                            # than I have time for currently.
789                            self.application.session.changed()
790                finally:
791                    dlg.Destroy()
792    
793    
794      def ZoomInTool(self):      def ZoomInTool(self):
795          self.canvas.ZoomInTool()          self.canvas.ZoomInTool()
796    
# Line 753  class MainWindow(DockFrame): Line 833  class MainWindow(DockFrame):
833    
834          dlg.Destroy()          dlg.Destroy()
835    
836        def RenameLayer(self):
837            """Let the user rename the currently selected layer"""
838            layer = self.current_layer()
839            if layer is not None:
840                dlg = wxTextEntryDialog(self, "Layer Title: ", "Rename Layer",
841                                        layer.Title())
842                try:
843                    if dlg.ShowModal() == wxID_OK:
844                        title = dlg.GetValue()
845                        if title != "":
846                            layer.SetTitle(title)
847                finally:
848                    dlg.Destroy()
849    
850      def identify_view_on_demand(self, layer, shapes):      def identify_view_on_demand(self, layer, shapes):
851          """Subscribed to the canvas' SHAPES_SELECTED message          """Subscribed to the canvas' SHAPES_SELECTED message
852    
# Line 846  def _has_legend_shown(context): Line 940  def _has_legend_shown(context):
940      """Return true if the legend window is shown"""      """Return true if the legend window is shown"""
941      return context.mainwindow.LegendShown()      return context.mainwindow.LegendShown()
942    
943    def _has_gdal_support(context):
944        """Return True if the GDAL is available"""
945        return Thuban.Model.resource.has_gdal_support()
946    
947  # File menu  # File menu
948  _method_command("new_session", _("&New Session"), "NewSession")  _method_command("new_session", _("&New Session"), "NewSession",
949  _method_command("open_session", _("&Open Session..."), "OpenSession")                  helptext = _("Start a new session"))
950  _method_command("save_session", _("&Save Session"), "SaveSession")  _method_command("open_session", _("&Open Session..."), "OpenSession",
951  _method_command("save_session_as", _("Save Session &As..."), "SaveSessionAs")                  helptext = _("Open a session file"))
952    _method_command("save_session", _("&Save Session"), "SaveSession",
953                    helptext =_("Save this session to the file it was opened from"))
954    _method_command("save_session_as", _("Save Session &As..."), "SaveSessionAs",
955                    helptext = _("Save this session to a new file"))
956  _method_command("toggle_session_tree", _("Session &Tree"), "ToggleSessionTree",  _method_command("toggle_session_tree", _("Session &Tree"), "ToggleSessionTree",
957                  checked = _has_tree_window_shown)                  checked = _has_tree_window_shown,
958                    helptext = _("Toggle on/off the session tree analysis window"))
959  _method_command("toggle_legend", _("Legend"), "ToggleLegend",  _method_command("toggle_legend", _("Legend"), "ToggleLegend",
960                  checked = _has_legend_shown)                  checked = _has_legend_shown,
961  _method_command("exit", _("E&xit"), "Exit")                  helptext = _("Toggle Legend on/off"))
962    _method_command("exit", _("E&xit"), "Exit",
963                    helptext = _("Finish working with Thuban"))
964    
965  # Help menu  # Help menu
966  _method_command("help_about", _("&About..."), "About")  _method_command("help_about", _("&About..."), "About",
967                    helptext = _("Info about Thuban authors, version and modules"))
968    
969    
970  # Map menu  # Map menu
971  _method_command("map_projection", _("Pro&jection..."), "MapProjection")  _method_command("map_projection", _("Pro&jection..."), "MapProjection",
972                    helptext = _("Set or change the map projection"))
973    
974  _tool_command("map_zoom_in_tool", _("&Zoom in"), "ZoomInTool", "ZoomInTool",  _tool_command("map_zoom_in_tool", _("&Zoom in"), "ZoomInTool", "ZoomInTool",
975                helptext = _("Switch to map-mode 'zoom-in'"), icon = "zoom_in",                helptext = _("Switch to map-mode 'zoom-in'"), icon = "zoom_in",
# Line 882  _tool_command("map_label_tool", _("&Labe Line 988  _tool_command("map_label_tool", _("&Labe
988                helptext = _("Add/Remove labels"), icon = "label",                helptext = _("Add/Remove labels"), icon = "label",
989                sensitive = _has_visible_map)                sensitive = _has_visible_map)
990  _method_command("map_full_extent", _("&Full extent"), "FullExtent",  _method_command("map_full_extent", _("&Full extent"), "FullExtent",
991                 helptext = _("Full Extent"), icon = "fullextent",                 helptext = _("Zoom to the full map extent"), icon = "fullextent",
992                sensitive = _has_visible_map)                sensitive = _has_visible_map)
993  _method_command("layer_full_extent", _("&Full layer extent"), "FullLayerExtent",  _method_command("layer_full_extent", _("&Full layer extent"), "FullLayerExtent",
994                 helptext = _("Full Layer Extent"), icon = "fulllayerextent",                  helptext = _("Zoom to the full layer extent"),
995                sensitive = _has_selected_layer)                  icon = "fulllayerextent", sensitive = _has_selected_layer)
996  _method_command("selected_full_extent", _("&Full selection extent"), "FullSelectionExtent",  _method_command("selected_full_extent", _("&Full selection extent"),
997                 helptext = _("Full Selection Extent"), icon = "fullselextent",                  "FullSelectionExtent",
998                sensitive = _has_selected_shapes)                  helptext = _("Zoom to the full selection extent"),
999                    icon = "fullselextent", sensitive = _has_selected_shapes)
1000  _method_command("map_export", _("E&xport"), "ExportMap",  _method_command("map_export", _("E&xport"), "ExportMap",
1001                      helptext = _("Export the map to file"))                  helptext = _("Export the map to file"))
1002  _method_command("map_print", _("Prin&t"), "PrintMap",  _method_command("map_print", _("Prin&t"), "PrintMap",
1003                  helptext = _("Print the map"))                  helptext = _("Print the map"))
1004  _method_command("map_rename", _("&Rename..."), "RenameMap",  _method_command("map_rename", _("&Rename..."), "RenameMap",
1005                  helptext = _("Rename the map"))                  helptext = _("Rename the map"))
1006  _method_command("layer_add", _("&Add Layer..."), "AddLayer",  _method_command("layer_add", _("&Add Layer..."), "AddLayer",
1007                  helptext = _("Add a new layer to active map"))                  helptext = _("Add a new layer to the map"))
1008  _method_command("rasterlayer_add", _("&Add Image Layer..."), "AddRasterLayer",  _method_command("rasterlayer_add", _("&Add Image Layer..."), "AddRasterLayer",
1009                  helptext = _("Add a new image layer to active map"))                  helptext = _("Add a new image layer to the map"),
1010                    sensitive = _has_gdal_support)
1011  _method_command("layer_remove", _("&Remove Layer"), "RemoveLayer",  _method_command("layer_remove", _("&Remove Layer"), "RemoveLayer",
1012                  helptext = _("Remove selected layer(s)"),                  helptext = _("Remove selected layer"),
1013                  sensitive = _can_remove_layer)                  sensitive = _can_remove_layer)
1014    
1015  # Layer menu  # Layer menu
1016  _method_command("layer_projection", _("Pro&jection..."), "LayerProjection",  _method_command("layer_projection", _("Pro&jection..."), "LayerProjection",
1017                    sensitive = _has_selected_layer,
1018                    helptext = _("Specify projection for selected layer"))
1019    _method_command("layer_duplicate", _("&Duplicate"), "DuplicateLayer",
1020                    helptext = _("Duplicate selected layer"),
1021              sensitive = lambda context: context.mainwindow.CanDuplicateLayer())
1022    _method_command("layer_rename", _("Re&name ..."), "RenameLayer",
1023                    helptext = _("Rename selected layer"),
1024                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
1025  _method_command("layer_raise", _("&Raise"), "RaiseLayer",  _method_command("layer_raise", _("&Raise"), "RaiseLayer",
1026                  helptext = _("Raise selected layer(s)"),                  helptext = _("Raise selected layer"),
1027                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
1028  _method_command("layer_lower", _("&Lower"), "LowerLayer",  _method_command("layer_lower", _("&Lower"), "LowerLayer",
1029                  helptext = _("Lower selected layer(s)"),                  helptext = _("Lower selected layer"),
1030                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
1031  _method_command("layer_show", _("&Show"), "ShowLayer",  _method_command("layer_show", _("&Show"), "ShowLayer",
1032                  helptext = _("Make selected layer(s) visible"),                  helptext = _("Make selected layer visible"),
1033                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
1034  _method_command("layer_hide", _("&Hide"), "HideLayer",  _method_command("layer_hide", _("&Hide"), "HideLayer",
1035                  helptext = _("Make selected layer(s) unvisible"),                  helptext = _("Make selected layer unvisible"),
1036                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
1037  _method_command("layer_show_table", _("Show Ta&ble"), "LayerShowTable",  _method_command("layer_show_table", _("Show Ta&ble"), "LayerShowTable",
1038                  helptext = _("Show the selected layer's table"),                  helptext = _("Show the selected layer's table"),
1039                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
1040  _method_command("layer_properties", _("&Properties..."), "LayerEditProperties",  _method_command("layer_properties", _("&Properties..."), "LayerEditProperties",
1041                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer,
1042                    helptext = _("Edit the properties of the selected layer"))
1043  _method_command("layer_jointable", _("&Join Table..."), "LayerJoinTable",  _method_command("layer_jointable", _("&Join Table..."), "LayerJoinTable",
1044                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer,
1045                    helptext = _("Join and attach a table to the selected layer"))
1046    
1047    def _can_unjoin(context):
1048        """Return whether the Layer/Unjoin command can be executed.
1049    
1050        This is the case if a layer is selected and that layer has a
1051        shapestore that has an original shapestore.
1052        """
1053        layer = context.mainwindow.SelectedLayer()
1054        if layer is None:
1055            return 0
1056        getstore = getattr(layer, "ShapeStore", None)
1057        if getstore is not None:
1058            return getstore().OrigShapeStore() is not None
1059        else:
1060            return 0
1061  _method_command("layer_unjointable", _("&Unjoin Table..."), "LayerUnjoinTable",  _method_command("layer_unjointable", _("&Unjoin Table..."), "LayerUnjoinTable",
1062                  sensitive = _has_selected_layer)                  sensitive = _can_unjoin,
1063                    helptext = _("Undo the last join operation"))
1064    
1065    
1066    def _has_tables(context):
1067        return bool(context.session.Tables())
1068    
1069  # Table menu  # Table menu
1070  _method_command("table_open", _("&Open..."), "TableOpen")  _method_command("table_open", _("&Open..."), "TableOpen",
1071  _method_command("table_close", _("&Close"), "TableClose",                  helptext = _("Open a DBF-table from a file"))
1072         sensitive = lambda context: bool(context.session.UnreferencedTables()))  _method_command("table_close", _("&Close..."), "TableClose",
1073  _method_command("table_show", _("&Show"), "TableShow")         sensitive = lambda context: bool(context.session.UnreferencedTables()),
1074  _method_command("table_join", _("&Join..."), "TableJoin")                  helptext = _("Close one or more tables from a list"))
1075    _method_command("table_rename", _("&Rename..."), "TableRename",
1076                    sensitive = _has_tables,
1077                    helptext = _("Rename one or more tables"))
1078    _method_command("table_show", _("&Show..."), "TableShow",
1079                    sensitive = _has_tables,
1080                    helptext = _("Show one or more tables in a dialog"))
1081    _method_command("table_join", _("&Join..."), "TableJoin",
1082                    sensitive = _has_tables,
1083                    helptext = _("Join two tables creating a new one"))
1084    
1085  #  Export only under Windows ...  #  Export only under Windows ...
1086  map_menu = ["layer_add", "rasterlayer_add", "layer_remove", "map_rename",  map_menu = ["layer_add", "rasterlayer_add", "layer_remove",
1087                          None,                          None,
1088                            "map_rename",
1089                          "map_projection",                          "map_projection",
1090                          None,                          None,
1091                          "map_zoom_in_tool", "map_zoom_out_tool",                          "map_zoom_in_tool", "map_zoom_out_tool",
# Line 964  main_menu = Menu("<main>", "<main>", Line 1111  main_menu = Menu("<main>", "<main>",
1111                          "exit"]),                          "exit"]),
1112                    Menu("map", _("&Map"), map_menu),                    Menu("map", _("&Map"), map_menu),
1113                    Menu("layer", _("&Layer"),                    Menu("layer", _("&Layer"),
1114                          ["layer_raise", "layer_lower",                         ["layer_rename", "layer_duplicate",
1115                            None,
1116                            "layer_raise", "layer_lower",
1117                          None,                          None,
1118                          "layer_show", "layer_hide",                          "layer_show", "layer_hide",
1119                          None,                          None,
# Line 976  main_menu = Menu("<main>", "<main>", Line 1125  main_menu = Menu("<main>", "<main>",
1125                          None,                          None,
1126                          "layer_properties"]),                          "layer_properties"]),
1127                    Menu("table", _("&Table"),                    Menu("table", _("&Table"),
1128                         ["table_open", "table_close",                         ["table_open", "table_close", "table_rename",
1129                         None,                         None,
1130                         "table_show",                         "table_show",
1131                         None,                         None,

Legend:
Removed from v.1070  
changed lines
  Added in v.1287

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26