/[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 562 by jonathan, Wed Mar 26 11:06:22 2003 UTC revision 795 by jonathan, Wed Apr 30 17:01:06 2003 UTC
# Line 9  __version__ = "$Revision$" Line 9  __version__ = "$Revision$"
9    
10  from Thuban import _  from Thuban import _
11    
12    import resource
13    
14  from wxPython.wx import *  from wxPython.wx import *
15    
16  from Thuban.Model.layer import Layer  from Thuban.Model.layer import Layer
# Line 16  from Thuban.Model.map import Map Line 18  from Thuban.Model.map import Map
18  from Thuban.Model.messages import *  from Thuban.Model.messages import *
19  from Thuban.Model.classification import ClassGroup  from Thuban.Model.classification import ClassGroup
20    
21    from Thuban.UI.messages import *
22  from Thuban.UI.classifier import ClassDataPreviewer  from Thuban.UI.classifier import ClassDataPreviewer
23  from Thuban.UI.dock import DockPanel  from Thuban.UI.dock import DockPanel
24    
25  ID_LEGEND_MOVEUP = 4001  from Thuban.Lib.connector import ConnectorError
26  ID_LEGEND_MOVEDOWN = 4002  
27    ID_LEGEND_RAISE = 4001
28    ID_LEGEND_LOWER = 4002
29  ID_LEGEND_TREE = 4003  ID_LEGEND_TREE = 4003
30  ID_LEGEND_CLASSIFY = 4004  ID_LEGEND_PROPS = 4004
31  ID_LEGEND_SHOWLAYER = 4005  ID_LEGEND_SHOWLAYER = 4005
32  ID_LEGEND_HIDELAYER = 4006  ID_LEGEND_HIDELAYER = 4006
 ID_LEGEND_DOCK = 4007  
 ID_LEGEND_UNDOCK = 4008  
33    
34  BMP_SIZE_W = 30  BMP_SIZE_W = 30
35  BMP_SIZE_H = 15  BMP_SIZE_H = 15
36    
37  #class LegendDialog(NonModalDialog):  RAISE_BMP = "raise_layer"
38    LOWER_BMP = "lower_layer"
39      #def __init__(self, parent, name, panel):  SHOW_BMP  = "show_layer"
40          #NonModalDialog.__init__(self, parent, name,  HIDE_BMP  = "hide_layer"
41                                  #_("Legend: %s") % map.Title())  PROPS_BMP = "layer_properties"
   
         ##topBox = wxBoxSizer(wxVERTICAL)  
   
         #panel = LegendPanel(self, map)  
   
         #self.panel = panel  
   
         #topBox.Add(panel, 1, wxGROW, 4)  
   
         ##self.SetAutoLayout(True)  
         ##self.SetSizer(topBox)  
   
     #def GetLegendPanel(self):  
         #return self.panel  
42    
     #def OnClose(self, event):  
         #NonModalDialog.OnClose(self, event)  
43    
         #self.panel.SetMap(None)  
       
44  class LegendPanel(DockPanel):  class LegendPanel(DockPanel):
45    
46      def __init__(self, parent, map, mainWindow):      def __init__(self, parent, map, mainWindow):
# Line 64  class LegendPanel(DockPanel): Line 49  class LegendPanel(DockPanel):
49          self.mainWindow = mainWindow          self.mainWindow = mainWindow
50          self.parent = parent          self.parent = parent
51    
         panelBox = wxBoxSizer(wxVERTICAL)  
   
         buttonBox = wxGridSizer(2, 3, 0, 0)  
   
52          self.buttons = []          self.buttons = []
53    
54          button = wxButton(self, ID_LEGEND_MOVEUP, _("Move Up"))          panelBox = wxBoxSizer(wxVERTICAL)
55          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
56          self.buttons.append(button)          self.toolBar = wxToolBar(self, -1)
57            self.toolBar.SetToolBitmapSize(wxSize(24, 24))
         button = wxButton(self, ID_LEGEND_SHOWLAYER, _("Show Layer"))  
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
   
         button = wxButton(self, ID_LEGEND_CLASSIFY, _("Classify"))  
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
   
         button = wxButton(self, ID_LEGEND_MOVEDOWN, _("Move Down"))  
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
   
         button = wxButton(self, ID_LEGEND_HIDELAYER, _("Hide Layer"))  
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
   
 #       button = wxButton(self, ID_LEGEND_DOCK, _("Dock"))  
 #       buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
 #       self.buttons.append(button)  
   
 #       button = wxButton(self, ID_LEGEND_UNDOCK, _("Undock"))  
 #       buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
 #       self.buttons.append(button)  
   
   
         EVT_BUTTON(self, ID_LEGEND_MOVEUP, self._OnMoveUp)  
         EVT_BUTTON(self, ID_LEGEND_MOVEDOWN, self._OnMoveDown)  
         EVT_BUTTON(self, ID_LEGEND_CLASSIFY, self._OnClassify)  
         EVT_BUTTON(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)  
         EVT_BUTTON(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)  
         #EVT_BUTTON(self, ID_LEGEND_DOCK, self._OnDock)  
         #EVT_BUTTON(self, ID_LEGEND_UNDOCK, self._OnUndock)  
58    
59          panelBox.Add(buttonBox, 0, 0, 4)          bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)
60            self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
61                shortHelpString=_("Raise Layer"))
62    
63            bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)
64            self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
65                shortHelpString=_("Lower Layer"))
66    
67            bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)
68            self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
69                shortHelpString=_("Show Layer"))
70    
71            bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)
72            self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
73                shortHelpString=_("Hide Layer"))
74    
75            bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)
76            self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
77                shortHelpString=_("Edit Layer Properties"))
78    
79            self.toolBar.Realize()
80            panelBox.Add(self.toolBar, 0, wxGROW, 0)
81    
82            EVT_TOOL(self, ID_LEGEND_RAISE, self._OnMoveUp)
83            EVT_TOOL(self, ID_LEGEND_LOWER, self._OnMoveDown)
84            EVT_TOOL(self, ID_LEGEND_PROPS, self._OnProperties)
85            EVT_TOOL(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)
86            EVT_TOOL(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)
87    
88          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
89    
90          panelBox.Add(self.tree, 1, wxGROW, 4)          panelBox.Add(self.tree, 1, wxGROW, 0)
91    
92          self.SetAutoLayout(True)          self.SetAutoLayout(True)
93          self.SetSizer(panelBox)          self.SetSizer(panelBox)
94          panelBox.SetSizeHints(self)          panelBox.SetSizeHints(self)
95    
         #panelBox.SetSizeHints(self.parent)  
96    
97          self.panelBox = panelBox          self.panelBox = panelBox
98    
99            self.__EnableButtons(False)
100    
101            self.Create()
102    
103            EVT_CLOSE(self, self._OnClose)
104    
105    
106      def GetMap(self):      def GetMap(self):
107          return self.tree.GetMap()          return self.tree.GetMap()
108    
109      def SetMap(self, map):      def SetMap(self, map):
110          self.tree.SetMap(map)          self.tree.SetMap(map)
111    
112      def DoOnSelChanged(self):      def DoOnSelChanged(self, layer, group):
         self.__EnableButtons(self.tree.GetSelection().IsOk())  
113    
114      def _OnClassify(self, event):          ok = isinstance(layer, Layer)
115          self.tree.DoOnClassify()          self.__EnableButtons(ok)
116    
117            self.mainWindow.SelectLayer(layer)
118    
119        def DoOnProperties(self):
120            list = self.tree.GetSelectedHierarchy()
121    
122            ok = isinstance(list[0], Layer)
123            if ok:
124                self.mainWindow.OpenLayerProperties(list[0], list[1])
125    
126        def Destroy(self):
127            self.__Close()
128    
129        def _OnProperties(self, event):
130            self.DoOnProperties()
131    
132      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
133          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
# Line 143  class LegendPanel(DockPanel): Line 139  class LegendPanel(DockPanel):
139          self.tree.DoOnShowLayer()          self.tree.DoOnShowLayer()
140          pass          pass
141    
142        #def Close(self, force = False):
143            #DockPanel.Close(self, force)
144            
145        def _OnClose(self, event):
146            self.__Close()
147    
148      def _OnHideLayer(self, event):      def _OnHideLayer(self, event):
149          self.tree.DoOnHideLayer()          self.tree.DoOnHideLayer()
150          pass          pass
151    
     def _OnDock(self, event):  
         self.Dock()  
   
     def _OnUndock(self, event):  
         self.UnDock()  
   
152      def __EnableButtons(self, on):      def __EnableButtons(self, on):
153          for b in self.buttons:          self.toolBar.EnableTool(ID_LEGEND_RAISE, on)
154              b.Enable(on)          self.toolBar.EnableTool(ID_LEGEND_LOWER, on)
155            self.toolBar.EnableTool(ID_LEGEND_SHOWLAYER,  on)
156            self.toolBar.EnableTool(ID_LEGEND_HIDELAYER,  on)
157            self.toolBar.EnableTool(ID_LEGEND_PROPS, on)
158    
159        def __Close(self):
160            self.tree.Close()
161    
162  class LegendTree(wxTreeCtrl):  class LegendTree(wxTreeCtrl):
163    
# Line 164  class LegendTree(wxTreeCtrl): Line 166  class LegendTree(wxTreeCtrl):
166                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
167                              size = (200, 200))                              size = (200, 200))
168    
169            self.mainWindow = mainWindow
170          self.map = None          self.map = None
171          self.parent = parent          self.parent = parent
172          self.layer2id = None          self.layer2id = {}
   
173    
174          self.image_list = None          self.image_list = None
175          self.emptyImageIndex = 0          self.emptyImageIndex = 0
# Line 177  class LegendTree(wxTreeCtrl): Line 179  class LegendTree(wxTreeCtrl):
179          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
180          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
181    
182            EVT_CLOSE(self, self._OnClose)
183    
184          self.SetMap(map)          self.SetMap(map)
185    
186        def _OnClose(self, event):
187            self.SetMap(None)
188    
189      def GetMap(self):      def GetMap(self):
190          return self.map          return self.map
191    
# Line 190  class LegendTree(wxTreeCtrl): Line 197  class LegendTree(wxTreeCtrl):
197    
198          if self.map is not None:          if self.map is not None:
199              for msg, func in sub_list: self.map.Unsubscribe(msg, func)              for msg, func in sub_list: self.map.Unsubscribe(msg, func)
200                #self.mainWindow.application.Unsubscribe(SESSION_REPLACED,
201                    #self._OnMsgMapsChanged)
202                #try:
203                    #self.mainWindow.application.session.Unsubscribe(MAPS_CHANGED,
204                        #self._OnMsgMapsChanged)
205                #except ConnectorError:
206                    #pass
207              self.__DeleteAllItems()              self.__DeleteAllItems()
208                    
209          self.map = map          self.map = map
210    
211          if self.map is not None:          if self.map is not None:
212              for msg, func in sub_list: self.map.Subscribe(msg, func)              for msg, func in sub_list: self.map.Subscribe(msg, func)
213                #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
214                    #self._OnMsgMapsChanged)
215                #self.mainWindow.application.Subscribe(SESSION_REPLACED,
216                    #self._OnMsgMapsChanged)
217              self.__FillTree(self.map)              self.__FillTree(self.map)
218    
219                            
220      def MoveCurrentItemUp(self):      def MoveCurrentItemUp(self):
221          cur_id = self.GetSelection()          layer, group = self.GetSelectedHierarchy()
         assert(cur_id.IsOk())  
   
         cur_data = self.GetPyData(cur_id)  
   
         #prev_id = self.GetPrevSibling(cur_id)  
222    
223          #          if layer is not None:
224          # Get out if there's nowhere to go              self.map.RaiseLayer(layer)
         #  
         #if prev_id == INVALID_TREE_ID: return  
   
         if isinstance(cur_data, Layer):  
             self.map.RaiseLayer(cur_data)  
         elif isinstance(cur_data, ClassGroup):  
             pass  
225          else:          else:
226              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be allowed."
227              pass              pass
228    
229      def MoveCurrentItemDown(self):      def MoveCurrentItemDown(self):
230          cur_id = self.GetSelection()          layer, group = self.GetSelectedHierarchy()
         assert(cur_id.IsOk())  
   
         cur_data = self.GetPyData(cur_id)  
231    
232          if isinstance(cur_data, Layer):          if layer is not None:
233              self.map.LowerLayer(cur_data)              self.map.LowerLayer(layer)
         elif isinstance(cur_data, ClassGroup):  
             pass  
234          else:          else:
235              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be allowed."
236              pass              pass
237    
   
238      def OnCompareItems(self, item1, item2):      def OnCompareItems(self, item1, item2):
239    
240          data1 = self.GetPyData(item1)          data1 = self.GetPyData(item1)
# Line 248  class LegendTree(wxTreeCtrl): Line 248  class LegendTree(wxTreeCtrl):
248    
249    
250      def DoOnShowLayer(self):      def DoOnShowLayer(self):
251          self.__ShowHideLayer(True)          #self.__ShowHideLayer(True)
252            layer, group = self.GetSelectedHierarchy()
253            layer.SetVisible(True)
254    
255      def DoOnHideLayer(self):      def DoOnHideLayer(self):
256          self.__ShowHideLayer(False)          #self.__ShowHideLayer(False)
257            layer, group = self.GetSelectedHierarchy()
258            layer.SetVisible(False)
259    
260      def DoOnClassify(self):      def Sort(self):
261          id = self.GetSelection()          self.SortChildren(self.GetRootItem())
         assert(id.IsOk())  
         assert(id.IsOk())  
262    
263          item = self.GetPyData(id)      def GetSelectedHierarchy(self):
264          if isinstance(item, ClassGroup):          id = self.GetSelection()
             id = self.GetItemParent(id)  
             assert(id.IsOk())  
             item = self.GetPyData(id)  
265    
266          # XXX: THIS IS SUCH AWFUL STYLE! YUCK!          if not id.IsOk():
267          self.parent.mainWindow.OpenClassifier(item)              return (None, None)
         #assert(False, "XXX: FIXME HERE")  
268    
269      def Sort(self):          layer = self.GetPyData(id)
270          self.SortChildren(self.GetRootItem())          group = None
271    
272            if isinstance(layer, ClassGroup):
273                id = self.GetItemParent(id)
274                assert id.IsOk()
275                group = layer
276                layer = self.GetPyData(id)
277    
278            return (layer, group)
279    
280        def _OnMsgMapsChanged(self):
281            #print self.map is self.mainWindow.Map()
282            self.SetMap(self.mainWindow.Map())
283            
284      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
285          self.parent.DoOnSelChanged()          self.__UpdateSelection()
286    
287      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
288          self.DoOnClassify()          self.parent.DoOnProperties()
289    
290      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
291          assert(isinstance(layer, Layer))          assert isinstance(layer, Layer)
292    
293          id = self.layer2id[layer]          id = self.layer2id[layer]
294            assert id.IsOk()
295    
296          self.__FillTreeLayer(id)          # XXX: yikes! this is so bad, we should be doing what is
297            #      commented out, but there is a problem with keeping
298            #      track of the images in the image list when we replace
299            #      a layer. it ends up causing a seg fault.
300            self.__FillTree(self.map)
301            self.__UpdateSelection()
302            #self.__FillTreeLayer(id)
303    
304      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
305          self.Sort()          self.Sort()
# Line 290  class LegendTree(wxTreeCtrl): Line 307  class LegendTree(wxTreeCtrl):
307    
308          if id.IsOk():          if id.IsOk():
309              self.EnsureVisible(id)              self.EnsureVisible(id)
310            self.__UpdateSelection()
311    
312      def _OnMsgMapLayersAddedRemoved(self, map):      def _OnMsgMapLayersAddedRemoved(self, map):
313          assert(id(map) == id(self.map))          assert map is self.map
314    
315          self.__FillTree(self.map)          self.__FillTree(self.map)
316            self.__UpdateSelection()
317    
318      def __FillTree(self, map):      def _OnMsgLayerVisibilityChanged(self, layer):
319            assert isinstance(layer, Layer)
320    
321          assert(isinstance(map, Map))          self.__ShowHideLayer(layer)
322            self.__UpdateSelection()
323    
324        def _OnMsgLayerTitleChanged(self, layer):
325    
326            id = self.layer2id[layer]
327            if id.IsOk():
328                self.SetItemText(id, layer.Title())
329            self.__UpdateSelection()
330    
331        def __UpdateSelection(self):
332            layer, group = self.GetSelectedHierarchy()
333            self.parent.DoOnSelChanged(layer, group)
334            
335        def __FillTree(self, map):
336    
337          self.Freeze()          self.Freeze()
338    
# Line 325  class LegendTree(wxTreeCtrl): Line 359  class LegendTree(wxTreeCtrl):
359              for l in map.Layers():              for l in map.Layers():
360                  id = self.PrependItem(root, l.Title())                  id = self.PrependItem(root, l.Title())
361                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
362                    l.Subscribe(LAYER_VISIBILITY_CHANGED,
363                                self._OnMsgLayerVisibilityChanged)
364                    l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
365                  self.SetPyData(id, l)                  self.SetPyData(id, l)
366                  font = self.GetItemFont(id)                  self.__SetVisibilityStyle(l.Visible(), id)
                 if not l.Visible():  
                     font.SetStyle(wxITALIC)  
                     self.SetItemFont(id, font)  
367    
368                  self.layer2id[l] = id                  self.layer2id[l] = id
369    
# Line 349  class LegendTree(wxTreeCtrl): Line 383  class LegendTree(wxTreeCtrl):
383    
384          shapeType = layer.ShapeType()          shapeType = layer.ShapeType()
385    
386            show = layer.Visible()
387          for g in clazz:          for g in clazz:
388              id = self.AppendItem(pid, g.GetDisplayText())              if g.IsVisible():
389              self.SetPyData(id, g)                  id = self.AppendItem(pid, g.GetDisplayText())
390                    self.SetPyData(id, g)
391              bmp = self.__BuildGroupImage(g, shapeType)                  self.__SetVisibilityStyle(show, id)
392    
393              if bmp is None:                  bmp = self.__BuildGroupImage(g, shapeType)
394                  self.SetItemImage(id, self.emptyImageIndex)  
395              else:                  if bmp is None:
396                  i = self.image_list.Add(bmp)                      self.SetItemImage(id, self.emptyImageIndex)
397                  self.SetItemImage(id, i)                  else:
398                        i = self.image_list.Add(bmp)
399              #self.layer2id[g] = id                      self.SetItemImage(id, i)
400    
401          self.Thaw()          self.Thaw()
402    
403      def __BuildGroupImage(self, group, shapeType):      def __BuildGroupImage(self, group, shapeType):
         assert(isinstance(group, ClassGroup))  
404    
405          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
406          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
# Line 379  class LegendTree(wxTreeCtrl): Line 413  class LegendTree(wxTreeCtrl):
413          return bmp          return bmp
414    
415      def __DeleteAllItems(self):      def __DeleteAllItems(self):
         self.DeleteAllItems()  
         self.layer2id = {}  
416    
417            while len(self.layer2id) > 0:
418                layer, id = self.layer2id.popitem()
419                layer.Unsubscribe(LAYER_CHANGED,
420                                  self._OnMsgLayerChanged)
421                layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
422                                  self._OnMsgLayerVisibilityChanged)
423                layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
424    
425      def __ShowHideLayer(self, show):          self.DeleteAllItems()
         id = self.GetSelection()  
         assert(id.IsOk())  
           
         item = self.GetPyData(id)  
         if isinstance(item, ClassGroup):  
             id = self.GetItemParent(id)  
             assert(id.IsOk())  
             item = self.GetPyData(id)  
426    
427        def __SetVisibilityStyle(self, visible, id):
428            font = self.GetItemFont(id)
429    
430          if show != item.Visible():          if visible:
431                font.SetStyle(wxNORMAL)
432                color = wxBLACK
433            else:
434                font.SetStyle(wxITALIC)
435                color = wxLIGHT_GREY
436    
437              item.SetVisible(show)          self.SetItemTextColour(id, color)
438            self.SetItemFont(id, font)
439            
440        def __ShowHideLayer(self, layer):
441            parent = self.layer2id[layer]
442            assert parent.IsOk()
443    
444              font = self.GetItemFont(id)          visible = layer.Visible()
             if show:  
                 font.SetStyle(wxNORMAL)  
                 self.SetItemFont(id, font)  
             else:  
                 font.SetStyle(wxITALIC)  
                 self.SetItemFont(id, font)  
445    
446            self.__SetVisibilityStyle(visible, parent)
447    
448            id, cookie = self.GetFirstChild(parent, 123)
449    
450            while id.IsOk():
451                self.__SetVisibilityStyle(visible, id)
452                id, cookie = self.GetNextChild(parent, cookie)
453                

Legend:
Removed from v.562  
changed lines
  Added in v.795

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26