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

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

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

revision 2588 by bh, Tue Mar 29 18:05:01 2005 UTC revision 2700 by dpinte, Mon Sep 18 14:27:02 2006 UTC
# Line 14  from Thuban import _ Line 14  from Thuban import _
14    
15  import resource  import resource
16    
17  from wxPython.wx import *  import wx
 import wxPython  
18    
19  from Thuban.Model.layer import BaseLayer  from Thuban.Model.layer import BaseLayer
20  from Thuban.Model.map import Map  from Thuban.Model.map import Map
# Line 58  PROPS_BMP = "layer_properties" Line 57  PROPS_BMP = "layer_properties"
57    
58  class LegendPanel(DockPanel):  class LegendPanel(DockPanel):
59    
60      def __init__(self, parent, map, mainWindow):      def __init__(self, parent, map, mainWindow):
61          DockPanel.__init__(self, parent, -1)          DockPanel.__init__(self, parent, -1)
62    
63          self.mainWindow = mainWindow          self.mainWindow = mainWindow
# Line 66  class LegendPanel(DockPanel): Line 65  class LegendPanel(DockPanel):
65    
66          self.buttons = []          self.buttons = []
67    
68          panelBox = wxBoxSizer(wxVERTICAL)          panelBox = wx.BoxSizer(wx.VERTICAL)
69    
70          self.toolBar = wxToolBar(self, -1)          self.toolBar = wx.ToolBar(self, -1)
71          self.toolBar.SetToolBitmapSize(wxSize(24, 24))          self.toolBar.SetToolBitmapSize(wx.Size(24, 24))
72    
73          bmp = resource.GetBitmapResource(TOP_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(TOP_BMP, wx.BITMAP_TYPE_XPM)
74          self.toolBar.AddTool(ID_LEGEND_TOP, bmp,          self.toolBar.AddTool(ID_LEGEND_TOP, bmp,
75              shortHelpString=_("Top Layer"))              shortHelpString=_("Top Layer"))
76    
77          bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(RAISE_BMP, wx.BITMAP_TYPE_XPM)
78          self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,          self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
79              shortHelpString=_("Raise Layer"))              shortHelpString=_("Raise Layer"))
80    
81          bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(LOWER_BMP, wx.BITMAP_TYPE_XPM)
82          self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,          self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
83              shortHelpString=_("Lower Layer"))              shortHelpString=_("Lower Layer"))
84    
85          bmp = resource.GetBitmapResource(BOTTOM_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(BOTTOM_BMP, wx.BITMAP_TYPE_XPM)
86          self.toolBar.AddTool(ID_LEGEND_BOTTOM, bmp,          self.toolBar.AddTool(ID_LEGEND_BOTTOM, bmp,
87              shortHelpString=_("Bottom Layer"))              shortHelpString=_("Bottom Layer"))
88    
89          bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(SHOW_BMP, wx.BITMAP_TYPE_XPM)
90          self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,          self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
91              shortHelpString=_("Show Layer"))              shortHelpString=_("Show Layer"))
92    
93          bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(HIDE_BMP, wx.BITMAP_TYPE_XPM)
94          self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,          self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
95              shortHelpString=_("Hide Layer"))              shortHelpString=_("Hide Layer"))
96    
97          bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(PROPS_BMP, wx.BITMAP_TYPE_XPM)
98          self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,          self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
99              shortHelpString=_("Edit Layer Properties"))              shortHelpString=_("Edit Layer Properties"))
100    
101          self.toolBar.Realize()          self.toolBar.Realize()
102          panelBox.Add(self.toolBar, 0, wxGROW, 0)          panelBox.Add(self.toolBar, 0, wx.GROW, 0)
103    
104          EVT_TOOL(self, ID_LEGEND_TOP, self._OnMoveTop)          self.Bind(wx.EVT_TOOL, self._OnMoveTop, id=ID_LEGEND_TOP)
105          EVT_TOOL(self, ID_LEGEND_RAISE, self._OnMoveUp)          self.Bind(wx.EVT_TOOL, self._OnMoveUp, id=ID_LEGEND_RAISE)
106          EVT_TOOL(self, ID_LEGEND_LOWER, self._OnMoveDown)          self.Bind(wx.EVT_TOOL, self._OnMoveDown, id=ID_LEGEND_LOWER)
107          EVT_TOOL(self, ID_LEGEND_BOTTOM, self._OnMoveBottom)          self.Bind(wx.EVT_TOOL, self._OnMoveBottom, id=ID_LEGEND_BOTTOM)
108          EVT_TOOL(self, ID_LEGEND_PROPS, self._OnProperties)          self.Bind(wx.EVT_TOOL, self._OnProperties, id=ID_LEGEND_PROPS)
109          EVT_TOOL(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)          self.Bind(wx.EVT_TOOL, self._OnShowLayer, id=ID_LEGEND_SHOWLAYER)
110          EVT_TOOL(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)          self.Bind(wx.EVT_TOOL, self._OnHideLayer, id=ID_LEGEND_HIDELAYER)
111    
112          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
113    
114          panelBox.Add(self.tree, 1, wxGROW, 0)          panelBox.Add(self.tree, 1, wx.GROW, 0)
115    
116          self.scalebarbitmap = ScaleBarBitmap(self, map, mainWindow)          self.scalebarbitmap = ScaleBarBitmap(self, map, mainWindow)
117          panelBox.Add(self.scalebarbitmap, 0, wxGROW, 0)          panelBox.Add(self.scalebarbitmap, 0, wx.GROW, 0)
118    
119          self.SetAutoLayout(True)          self.SetAutoLayout(True)
120          self.SetSizer(panelBox)          self.SetSizer(panelBox)
# Line 128  class LegendPanel(DockPanel): Line 127  class LegendPanel(DockPanel):
127    
128          self.Create()          self.Create()
129    
130          EVT_CLOSE(self, self._OnClose)          self.Bind(wx.EVT_CLOSE, self._OnClose)
131    
132    
133      def GetMap(self):      def GetMap(self):
# Line 160  class LegendPanel(DockPanel): Line 159  class LegendPanel(DockPanel):
159    
160      def _OnMoveTop(self, event):      def _OnMoveTop(self, event):
161          self.tree.MoveCurrentItemTop()          self.tree.MoveCurrentItemTop()
162            
163      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
164          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
165    
166      def _OnMoveDown(self, event):      def _OnMoveDown(self, event):
# Line 176  class LegendPanel(DockPanel): Line 175  class LegendPanel(DockPanel):
175    
176      #def Close(self, force = False):      #def Close(self, force = False):
177          #DockPanel.Close(self, force)          #DockPanel.Close(self, force)
178            
179      def _OnClose(self, event):      def _OnClose(self, event):
180          self.__Close()          self.__Close()
181    
# Line 208  class LegendPanel(DockPanel): Line 207  class LegendPanel(DockPanel):
207      def __Close(self):      def __Close(self):
208          self.tree.Close()          self.tree.Close()
209    
210  class LegendTree(wxTreeCtrl):  class LegendTree(wx.TreeCtrl):
211    
212      def __init__(self, parent, id, map, mainWindow):      def __init__(self, parent, id, map, mainWindow):
213          wxTreeCtrl.__init__(self, parent, id,          wx.TreeCtrl.__init__(self, parent, id,
214                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,                              style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT,
215                              size = (200, 200))                              size = (200, 200))
216    
217          self.mainWindow = mainWindow          self.mainWindow = mainWindow
# Line 240  class LegendTree(wxTreeCtrl): Line 239  class LegendTree(wxTreeCtrl):
239          self.preventExpandCollapse = False          self.preventExpandCollapse = False
240          self.raiseProperties = False          self.raiseProperties = False
241    
242          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)          self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self._OnItemActivated, id=ID_LEGEND_TREE)
243          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)          self.Bind(wx.EVT_TREE_SEL_CHANGED, self._OnSelChanged, id=ID_LEGEND_TREE)
244          EVT_TREE_ITEM_EXPANDING(self, ID_LEGEND_TREE, self.OnItemExpandCollapse)          self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.OnItemExpandCollapse, id=ID_LEGEND_TREE)
245          EVT_TREE_ITEM_COLLAPSING(self, ID_LEGEND_TREE, self.OnItemExpandCollapse)          self.Bind(wx.EVT_TREE_ITEM_COLLAPSING, self.OnItemExpandCollapse, id=ID_LEGEND_TREE)
246          EVT_TREE_ITEM_RIGHT_CLICK(self, ID_LEGEND_TREE, self._OnRightClick)          self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self._OnRightClick, id=ID_LEGEND_TREE)
247    
248          EVT_CLOSE(self, self._OnClose)          self.Bind(wx.EVT_CLOSE, self._OnClose)
249    
250          self.SetMap(map)          self.SetMap(map)
251    
# Line 314  class LegendTree(wxTreeCtrl): Line 313  class LegendTree(wxTreeCtrl):
313              #except ConnectorError:              #except ConnectorError:
314                  #pass                  #pass
315              self.DeleteAllItems()              self.DeleteAllItems()
316            
317          self.map = map          self.map = map
318    
319          if self.map is not None:          if self.map is not None:
# Line 370  class LegendTree(wxTreeCtrl): Line 369  class LegendTree(wxTreeCtrl):
369              layers = self.map.Layers()              layers = self.map.Layers()
370              return layers.index(data2) - layers.index(data1)              return layers.index(data2) - layers.index(data1)
371          else:          else:
372              return wxTreeCtrl.OnCompareItems(self, item1, item2)              return wx.TreeCtrl.OnCompareItems(self, item1, item2)
373    
374      def DoOnShowLayer(self):      def DoOnShowLayer(self):
375          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
# Line 411  class LegendTree(wxTreeCtrl): Line 410  class LegendTree(wxTreeCtrl):
410      def _OnMsgMapsChanged(self):      def _OnMsgMapsChanged(self):
411          #print self.map is self.mainWindow.Map()          #print self.map is self.mainWindow.Map()
412          self.SetMap(self.mainWindow.Map())          self.SetMap(self.mainWindow.Map())
413            
414      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
415          # If we change the selection from normalize_selection do nothing.          # If we change the selection from normalize_selection do nothing.
416          if self.changing_selection:          if self.changing_selection:
# Line 532  class LegendTree(wxTreeCtrl): Line 531  class LegendTree(wxTreeCtrl):
531      def __UpdateSelection(self):      def __UpdateSelection(self):
532          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
533          self.parent.DoOnSelChanged(layer, group)          self.parent.DoOnSelChanged(layer, group)
534            
535      def __FillTree(self, map):      def __FillTree(self, map):
536    
537          self.Freeze()          self.Freeze()
# Line 570  class LegendTree(wxTreeCtrl): Line 569  class LegendTree(wxTreeCtrl):
569                      bmp = self.__BuildGroupImage(g, shapeType)                      bmp = self.__BuildGroupImage(g, shapeType)
570    
571                      if bmp is None:                      if bmp is None:
572                          self.SetItemImage(id, -1, wxTreeItemIcon_Normal)                          self.SetItemImage(id, -1, wx.TreeItemIcon_Normal)
573                          self.SetItemImage(id, -1, wxTreeItemIcon_Selected)                          self.SetItemImage(id, -1, wx.TreeItemIcon_Selected)
574                          #self.SetItemSelectedImage(id, -1)                          #self.SetItemSelectedImage(id, -1)
575                      else:                      else:
576                          if self.availImgListIndices:                          if self.availImgListIndices:
# Line 580  class LegendTree(wxTreeCtrl): Line 579  class LegendTree(wxTreeCtrl):
579                          else:                          else:
580                              i = self.image_list.Add(bmp)                              i = self.image_list.Add(bmp)
581    
582                          self.SetItemImage(id, i, wxTreeItemIcon_Normal)                          self.SetItemImage(id, i, wx.TreeItemIcon_Normal)
583                          self.SetItemImage(id, i, wxTreeItemIcon_Selected)                          self.SetItemImage(id, i, wx.TreeItemIcon_Selected)
584                          #self.SetItemlectedImage(id, i)                          #self.SetItemlectedImage(id, i)
585    
586          self.Thaw()          self.Thaw()
587    
588      def __BuildGroupImage(self, group, shapeType):      def __BuildGroupImage(self, group, shapeType):
589    
590          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)          bmp = wx.EmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
591          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
592          dc = wxMemoryDC()          dc = wx.MemoryDC()
593          dc.SelectObject(bmp)          dc.SelectObject(bmp)
594          dc.Clear()          dc.Clear()
595    
# Line 607  class LegendTree(wxTreeCtrl): Line 606  class LegendTree(wxTreeCtrl):
606              self.__RemoveLayer(id)              self.__RemoveLayer(id)
607              id, cookie = self.GetNextChild(pid, cookie)              id, cookie = self.GetNextChild(pid, cookie)
608    
609          wxTreeCtrl.DeleteAllItems(self)          wx.TreeCtrl.DeleteAllItems(self)
610    
611      def __AddLayer(self, before, l):      def __AddLayer(self, before, l):
612          root = self.GetRootItem()          root = self.GetRootItem()
613          id = self.InsertItemBefore(root, before,          id = self.InsertItemBefore(root, before,
614                              l.Title(),                              l.Title(),
615                              self.mapImageIndex,                              self.mapImageIndex,
616                              self.mapImageIndex)                              self.mapImageIndex)
617    
# Line 623  class LegendTree(wxTreeCtrl): Line 622  class LegendTree(wxTreeCtrl):
622          self.Expand(id)          self.Expand(id)
623    
624          l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)          l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
625          l.Subscribe(LAYER_VISIBILITY_CHANGED,          l.Subscribe(LAYER_VISIBILITY_CHANGED,
626                      self._OnMsgLayerVisibilityChanged)                      self._OnMsgLayerVisibilityChanged)
627          l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)          l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
628    
# Line 631  class LegendTree(wxTreeCtrl): Line 630  class LegendTree(wxTreeCtrl):
630          self.DeleteChildren(id)          self.DeleteChildren(id)
631    
632          layer = self.GetPyData(id)          layer = self.GetPyData(id)
633          layer.Unsubscribe(LAYER_CHANGED,          layer.Unsubscribe(LAYER_CHANGED,
634                            self._OnMsgLayerChanged)                            self._OnMsgLayerChanged)
635          layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,          layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
636                            self._OnMsgLayerVisibilityChanged)                            self._OnMsgLayerVisibilityChanged)
637          layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)          layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
638    
# Line 644  class LegendTree(wxTreeCtrl): Line 643  class LegendTree(wxTreeCtrl):
643          while id.IsOk():          while id.IsOk():
644              self.availImgListIndices.append(self.GetItemImage(id))              self.availImgListIndices.append(self.GetItemImage(id))
645              id, cookie = self.GetNextChild(pid, cookie)              id, cookie = self.GetNextChild(pid, cookie)
646          wxTreeCtrl.DeleteChildren(self, pid)          wx.TreeCtrl.DeleteChildren(self, pid)
647    
648      def GetRootItem(self):      def GetRootItem(self):
649          root = wxTreeCtrl.GetRootItem(self)          root = wx.TreeCtrl.GetRootItem(self)
650    
651          if not root.IsOk():          if not root.IsOk():
652              self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)              self.image_list = wx.ImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
653    
654              bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)              bmp = wx.EmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
655              dc = wxMemoryDC()              dc = wx.MemoryDC()
656              dc.SelectObject(bmp)              dc.SelectObject(bmp)
657              dc.SetBrush(wxBLACK_BRUSH)              dc.SetBrush(wx.BLACK_BRUSH)
658              dc.Clear()              dc.Clear()
659              dc.SelectObject(wxNullBitmap)              dc.SelectObject(wx.NullBitmap)
660    
661              self.emptyImageIndex = \              self.emptyImageIndex = \
662                  self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))                  self.image_list.AddWithColourMask(bmp, wx.Colour(0, 0, 0))
663    
664              bmp = resource.GetBitmapResource("legend_icon_layer",              bmp = resource.GetBitmapResource("legend_icon_layer",
665                                                wxBITMAP_TYPE_XPM)                                                wx.BITMAP_TYPE_XPM)
666              self.mapImageIndex = \              self.mapImageIndex = \
667                  self.image_list.Add(bmp)                  self.image_list.Add(bmp)
668    
# Line 678  class LegendTree(wxTreeCtrl): Line 677  class LegendTree(wxTreeCtrl):
677          font = self.GetItemFont(id)          font = self.GetItemFont(id)
678    
679          if visible:          if visible:
680              font.SetStyle(wxNORMAL)              font.SetStyle(wx.NORMAL)
681              color = wxBLACK              color = wx.BLACK
682          else:          else:
683              #font.SetStyle(wxITALIC)              #font.SetStyle(wxITALIC)
684              font.SetStyle(wxNORMAL)              font.SetStyle(wx.NORMAL)
685              color = wxLIGHT_GREY              color = wx.LIGHT_GREY
686    
687          self.SetItemTextColour(id, color)          self.SetItemTextColour(id, color)
688          self.SetItemFont(id, font)          self.SetItemFont(id, font)
689            
690      def __ShowHideLayer(self, layer):      def __ShowHideLayer(self, layer):
691          parent = self.find_layer(layer)          parent = self.find_layer(layer)
692          assert parent.IsOk()          assert parent.IsOk()
# Line 710  class LegendTree(wxTreeCtrl): Line 709  class LegendTree(wxTreeCtrl):
709      # with this and to make the code usable with both 2.5 and 2.4 we      # with this and to make the code usable with both 2.5 and 2.4 we
710      # overwrite the inherited method when running with 2.4 to provide a      # overwrite the inherited method when running with 2.4 to provide a
711      # default value for the second argument.      # default value for the second argument.
712      if map(int, wxPython.__version__.split(".")[:2]) < [2, 5]:      if map(int, wx.__version__.split(".")[:2]) < [2, 5]:
713          def GetFirstChild(self, item):          def GetFirstChild(self, item):
714              return wxTreeCtrl.GetFirstChild(self, item, 0)              return wx.TreeCtrl.GetFirstChild(self, item, 0)
715    
716    
717  class ScaleBarBitmap(wxBoxSizer):  class ScaleBarBitmap(wx.BoxSizer):
718    
719      def __init__(self, parent, map, mainWindow):      def __init__(self, parent, map, mainWindow):
720          # While the width is fixed, get the height _now_.          # While the width is fixed, get the height _now_.
721          dc = wxMemoryDC()          dc = wx.MemoryDC()
722          textwidth, textheight = dc.GetTextExtent("%d"%0)          textwidth, textheight = dc.GetTextExtent("%d"%0)
723          self.width = 210          self.width = 210
724          self.height = textheight + 3*2 + 8          self.height = textheight + 3*2 + 8
725    
726          wxBoxSizer.__init__(self, wxVERTICAL)          wx.BoxSizer.__init__(self, wx.VERTICAL)
727          bmp=wxEmptyBitmap(self.width, self.height)          bmp=wx.EmptyBitmap(self.width, self.height)
728          self.scalebarBitmap = wxStaticBitmap(parent, -1, bmp)          self.scalebarBitmap = wx.StaticBitmap(parent, -1, bmp)
729          self.Add(self.scalebarBitmap, 0, wxALIGN_CENTER|wxLEFT|wxTOP|wxRIGHT, 1)          self.Add(self.scalebarBitmap, 0, wx.ALIGN_CENTER|wx.LEFT|wx.TOP|wx.RIGHT, 1)
730    
731          self.mainWindow = mainWindow          self.mainWindow = mainWindow
732          self.parent = parent          self.parent = parent
# Line 739  class ScaleBarBitmap(wxBoxSizer): Line 738  class ScaleBarBitmap(wxBoxSizer):
738    
739          if self.canvas is not None:          if self.canvas is not None:
740              for msg, func in sub_list: self.canvas.Unsubscribe(msg, func)              for msg, func in sub_list: self.canvas.Unsubscribe(msg, func)
741            
742          self.canvas = canvas          self.canvas = canvas
743          self.scalebar = ScaleBar(canvas.map)          self.scalebar = ScaleBar(canvas.map)
744    
# Line 751  class ScaleBarBitmap(wxBoxSizer): Line 750  class ScaleBarBitmap(wxBoxSizer):
750          self.__SetScale(scale)          self.__SetScale(scale)
751    
752      def __SetScale(self, scale):      def __SetScale(self, scale):
753          bmp = wxEmptyBitmap(self.width, self.height)          bmp = wx.EmptyBitmap(self.width, self.height)
754          dc = wxMemoryDC()          dc = wx.MemoryDC()
755          dc.SelectObject(bmp)          dc.SelectObject(bmp)
756          dc.Clear()          dc.Clear()
757    

Legend:
Removed from v.2588  
changed lines
  Added in v.2700

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26