wxPythonで作った簡易XMLエディタ
Revisão | 6028aaf1a49bfa6287ca63f9a9c22ece68fba207 (tree) |
---|---|
Hora | 2014-04-07 09:26:16 |
Autor | tamanegi <tamanegi@user...> |
Commiter | tamanegi |
fix undo
@@ -6,6 +6,7 @@ TODO | ||
6 | 6 | * implement multiple delete, copy, cut |
7 | 7 | |
8 | 8 | CHANGELOG |
9 | +2014/04/07: fix and improve undo functions (paste, del, add) | |
9 | 10 | 2014/03/14: read file from command line argument |
10 | 11 | fix bug on removing attributes |
11 | 12 | add multiple delete (ad hoc); multiple copy/cut is not supported yet |
@@ -226,9 +226,6 @@ class Action: | ||
226 | 226 | def undo( self, treectrl ): |
227 | 227 | return True |
228 | 228 | |
229 | - def gatherItemIdsForUndo( self ): | |
230 | - return [] | |
231 | - | |
232 | 229 | # edit action; reversed action is also edit |
233 | 230 | class ActionEdit( Action ): |
234 | 231 | def __init__( self, itemid = None, myxml = None ): |
@@ -259,9 +256,6 @@ class ActionEdit( Action ): | ||
259 | 256 | def reverse( self ): |
260 | 257 | return ActionEdit( self.itemid, self.myxml ) |
261 | 258 | |
262 | - def gatherItemIdsForUndo( self ): | |
263 | - return [ self.itemid ] | |
264 | - | |
265 | 259 | # edit multipe elements at once |
266 | 260 | class ActionEdits( Action ): |
267 | 261 | def __init__( self, itemids = None, myxmls = None ): |
@@ -292,72 +286,74 @@ class ActionEdits( Action ): | ||
292 | 286 | def reverse( self ): |
293 | 287 | return( ActionEdits( self.itemids, self.myxmls ) ) |
294 | 288 | |
295 | - def gatherItemIdsForUndo( self ): | |
296 | - return self.itemids | |
297 | - | |
298 | 289 | # add action; reversed action is delete |
299 | 290 | class ActionAdd( Action ): |
300 | - def __init__( self, parent = None, pos = None, itemid = None, myxml = None ): | |
291 | + def __init__( self, uniqids = None, pos = None, itemid = None, myxml = None ): | |
301 | 292 | Action.__init__( self ) |
302 | 293 | # itemid is an TreeItemId of added object |
303 | 294 | # myxml is optional argument now |
304 | 295 | if not itemid is None: |
305 | - self.initialize( parent, pos, itemid, myxml ) | |
296 | + self.initialize( uniqids, pos, itemid, myxml ) | |
306 | 297 | |
307 | - def initialize( self, parent, pos, itemid, myxml = None ): | |
308 | - self.parent = parent | |
298 | + def initialize( self, uniqids, pos, itemid, myxml = None ): | |
299 | + self.uniqids = copy.deepcopy( uniqids ) | |
309 | 300 | self.pos = copy.deepcopy( pos ) |
310 | 301 | self.itemid = itemid |
311 | 302 | self.myxml = copy.deepcopy( myxml ) |
312 | 303 | |
313 | 304 | # simply delete specified data |
314 | 305 | def undo( self, treectrl, wmxmled ): |
315 | - self.parent = treectrl.GetItemParent( self.itemid ) | |
306 | + self.itemid = wmxmled.findItemIdByUniqId( self.uniqids[1] ) | |
316 | 307 | self.pos = wmxmled.calculateItemPosition( self.itemid ) |
317 | - self.myxml = wmxmled.createElementTreeFromTreeCtrl( self.itemid ).getroot() | |
308 | + # do not update uniqids here | |
309 | + self.myxml, uniqids = wmxmled.createElementTreeFromTreeCtrl( self.itemid ) | |
310 | + self.myxml = self.myxml.getroot() | |
318 | 311 | # ListCtrl is not updated here |
319 | 312 | return wmxmled.deleteTreeCtrlItem( self.itemid ) |
320 | 313 | |
321 | 314 | def reverse( self ): |
322 | - return ActionDel( self.parent, self.pos, self.itemid, self.myxml ) | |
323 | - | |
324 | - def gatherItemIdsForUndo( self ): | |
325 | - return [ self.parent ] | |
315 | + return ActionDel( self.uniqids, self.pos, self.itemid, self.myxml ) | |
326 | 316 | |
327 | 317 | # delete action; reversed action is add |
328 | 318 | class ActionDel( Action ): |
329 | - def __init__( self, parent = None, pos = None, itemid = None, myxml = None ): | |
319 | + def __init__( self, uniqids = None, pos = None, itemid = None, myxml = None ): | |
330 | 320 | Action.__init__( self ) |
331 | 321 | # note: myxml is not WMXmlElement, but is Element object of ET |
332 | 322 | # itemid is optional, currently unused. |
333 | 323 | if not myxml is None: |
334 | - self.initialize( parent, pos, itemid, myxml ) | |
324 | + self.initialize( uniqids, pos, itemid, myxml ) | |
335 | 325 | |
336 | - def initialize( self, parent, pos, itemid, myxml ): | |
337 | - self.parent = parent | |
326 | + def initialize( self, uniqids, pos, itemid, myxml ): | |
327 | + self.uniqids = copy.deepcopy( uniqids ) | |
338 | 328 | self.pos = copy.deepcopy( pos ) |
339 | 329 | self.itemid = itemid |
340 | 330 | self.myxml = copy.deepcopy( myxml ) |
341 | 331 | |
342 | 332 | # wmxmled is the main class; WMXmlEditor in wmxmled.py |
343 | 333 | def undo( self, treectrl, wmxmled ): |
344 | - if self.parent is None and treectrl.tc.IsEmpty(): # maybe root element | |
334 | + if treectrl.IsEmpty(): # maybe root element | |
345 | 335 | wmxmled.createXmlTree( self.myxml ) |
346 | 336 | else: # add as a child element |
347 | 337 | tag = wmxmled.createTreeCtrlLabel( self.myxml ) |
338 | + parentid = wmxmled.findItemIdByUniqId(self.uniqids[0]) | |
339 | + # find parent from saved uniqid | |
348 | 340 | if self.pos < 0: |
349 | 341 | # if the original item is the last one |
350 | 342 | # i.e. GetNextSibling(itemid) returns false |
351 | - self.itemid = treectrl.AppendItem( self.parent, tag, wmxmled.imageFolder, wmxmled.imageFolderOpen ) | |
343 | + self.itemid = treectrl.AppendItem( parentid, tag, wmxmled.imageFolder, wmxmled.imageFolderOpen ) | |
352 | 344 | else: |
353 | - self.itemid = treectrl.InsertItemBefore( self.parent, self.pos, tag, wmxmled.imageFolder, wmxmled.imageFolderOpen ) | |
354 | - treectrl.SetItemPyData( self.itemid, [ 0, WMXmlElement( self.myxml ) ] ) | |
345 | + self.itemid = treectrl.InsertItemBefore( parentid, self.pos, tag, wmxmled.imageFolder, wmxmled.imageFolderOpen ) | |
346 | + treectrl.SetItemPyData( self.itemid, [ 0, WMXmlElement( self.myxml ), self.uniqids[1] ] ) | |
347 | + # save current uniqid | |
348 | + uniqid_tmp = wmxmled.uniqid | |
349 | + # add to tree | |
355 | 350 | wmxmled.createXmlTreeRecursive( self.myxml, self.itemid ) |
351 | + # reassign uniq ids | |
352 | + wmxmled.reassignUniqIDsRecursive( self.itemid, self.uniqids ) | |
353 | + # reset uniqid | |
354 | + wmxmled.uniqid = uniqid_tmp | |
356 | 355 | # ListCtrl is not updated here |
357 | 356 | return True |
358 | 357 | |
359 | 358 | def reverse( self ): |
360 | - return ActionAdd( self.parent, self.pos, self.itemid, self.myxml ) | |
361 | - | |
362 | - def gatherItemIdsForUndo( self ): | |
363 | - return [ self.parent ] | |
359 | + return ActionAdd( self.uniqids, self.pos, self.itemid, self.myxml ) |
@@ -143,6 +143,8 @@ class WMXmlEditor( wx.App ): | ||
143 | 143 | self.initializeImagesForTreeCtrl() |
144 | 144 | # undo and redo list |
145 | 145 | self.clearUndoList() |
146 | + # unique ids for objects | |
147 | + self.uniqid = 0 | |
146 | 148 | |
147 | 149 | def clearUndoList( self ): |
148 | 150 | self.undo = [] |
@@ -309,11 +311,13 @@ class WMXmlEditor( wx.App ): | ||
309 | 311 | def createXmlTree( self, xmlroot ): |
310 | 312 | # initialize tree control |
311 | 313 | self.tc.DeleteAllItems() |
314 | + self.uniqid = 0 | |
312 | 315 | showname = self.createTreeCtrlLabel( xmlroot ) |
313 | 316 | root_itemid = self.tc.AddRoot( showname, self.imageFolder, self.imageFolderOpen ) |
314 | 317 | num = self.tc.GetCount() - 1 |
315 | 318 | # first element of the data is tentative value |
316 | - self.tc.SetItemPyData( root_itemid, [ num, WMXmlElement( xmlroot ) ] ) | |
319 | + self.tc.SetItemPyData( root_itemid, [ num, WMXmlElement( xmlroot ), self.uniqid ] ) | |
320 | + self.uniqid += 1 | |
317 | 321 | self.createXmlTreeRecursive( xmlroot, root_itemid ) |
318 | 322 | |
319 | 323 | def createXmlTreeRecursive( self, element, itemid ): |
@@ -321,7 +325,8 @@ class WMXmlEditor( wx.App ): | ||
321 | 325 | showname = self.createTreeCtrlLabel( child ) |
322 | 326 | child_itemid = self.tc.AppendItem( itemid, showname, self.imageFolder, self.imageFolderOpen ) |
323 | 327 | num = self.tc.GetCount() - 1 |
324 | - self.tc.SetItemPyData( child_itemid, [ num, WMXmlElement( child ) ] ) | |
328 | + self.tc.SetItemPyData( child_itemid, [ num, WMXmlElement( child ), self.uniqid ] ) | |
329 | + self.uniqid += 1 | |
325 | 330 | self.createXmlTreeRecursive( child, child_itemid ) |
326 | 331 | |
327 | 332 | def createTreeCtrlLabel( self, myxml ): |
@@ -339,6 +344,14 @@ class WMXmlEditor( wx.App ): | ||
339 | 344 | ret += attr + ":" + val |
340 | 345 | return ret |
341 | 346 | |
347 | + def reassignUniqIDsRecursive( self, itemid, uniqids ): | |
348 | + localcounter = 1 | |
349 | + for val in self.childItemIdGeneratorRecursive( itemid ): | |
350 | + localcounter += 1 | |
351 | + # item order shall not be changed | |
352 | + curdata = self.tc.GetItemPyData( val ) | |
353 | + self.tc.SetItemPyData( val, [ curdata[0], curdata[1], uniqids[localcounter] ] ) | |
354 | + | |
342 | 355 | ### create ListCtrl from pre-built TreeCtrl |
343 | 356 | def createListCtrlFromTreeData( self ): |
344 | 357 | # initialize ListCtrl |
@@ -666,38 +679,9 @@ class WMXmlEditor( wx.App ): | ||
666 | 679 | if not itemid.IsOk(): |
667 | 680 | self.miscShowMessageBox( "unexisting item id is requested to delete?" ) |
668 | 681 | return False |
669 | - # check undo queue (queue is expected to be small) | |
670 | - for i in range( 0, len( self.undo ) ): | |
671 | - ####queueitem = self.undo[i] | |
672 | - queueitemids = self.undo[i].gatherItemIdsForUndo() | |
673 | - # if the object trying to delete is found in undo queue, show dialog | |
674 | - if self.isDescendantItem( itemid, queueitemids ): | |
675 | - if not WMXmlEditorParams.UNDO_truncate_queue_wo_query: | |
676 | - message = "Your " + str(i) + "the action cannot be undone due to the technical problem.\n" + "Can I truncate undo queue?" | |
677 | - dialog = wx.MessageDialog( self.frameMain, message, style=wx.YES_NO|wx.NO_DEFAULT ) | |
678 | - try: | |
679 | - if dialog.ShowModal() == wx.ID_YES: | |
680 | - del self.undo[i:] | |
681 | - break | |
682 | - else: | |
683 | - return False | |
684 | - finally: | |
685 | - dialog.Destroy() | |
686 | - else: | |
687 | - del self.undo[i:] | |
688 | - break | |
689 | 682 | self.tc.Delete( itemid ) |
690 | 683 | return True |
691 | 684 | |
692 | - def isDescendantItem( self, parent, candidates ): | |
693 | - for candidate in candidates: | |
694 | - itemid = candidate | |
695 | - while itemid.IsOk(): | |
696 | - if parent == itemid: | |
697 | - return True | |
698 | - itemid = self.tc.GetItemParent( itemid ) | |
699 | - return False | |
700 | - | |
701 | 685 | ### "File" menu events and related |
702 | 686 | def evMenuFileNew( self, event = None ): |
703 | 687 | # NOTE: Close is usually more safer method. |
@@ -770,7 +754,7 @@ class WMXmlEditor( wx.App ): | ||
770 | 754 | fh.close() |
771 | 755 | |
772 | 756 | def writeXml( self, fh ): |
773 | - xmltree = self.createElementTreeFromTreeCtrl( self.tc.GetRootItem() ) | |
757 | + xmltree, uniqids = self.createElementTreeFromTreeCtrl( self.tc.GetRootItem() ) | |
774 | 758 | if xmltree is None: |
775 | 759 | self.miscShowMessageBox( "no data to write." ) |
776 | 760 | else: |
@@ -808,19 +792,24 @@ class WMXmlEditor( wx.App ): | ||
808 | 792 | def createElementTreeFromTreeCtrl( self, itemid ): |
809 | 793 | # if data is empty do nothing and return None |
810 | 794 | if not itemid.IsOk(): |
811 | - return None | |
812 | - element = self.createElementFromWMXmlElement( self.tc.GetItemPyData( itemid )[1] ) | |
813 | - self.createElementFromTreeCtrlRecursive( itemid, element ) | |
795 | + return None, None | |
796 | + element_data = self.tc.GetItemPyData( itemid ) | |
797 | + element = self.createElementFromWMXmlElement( element_data[1] ) | |
798 | + # first item of uniqids is itemid of its parent, and the second is itemid | |
799 | + # of the selected element | |
800 | + uniqids = [element_data[2]] | |
801 | + self.createElementFromTreeCtrlRecursive( itemid, element, uniqids ) | |
814 | 802 | ret = ET.ElementTree( element ) |
815 | - return ret | |
803 | + return ret, uniqids | |
816 | 804 | |
817 | - def createElementFromTreeCtrlRecursive( self, itemid, element ): | |
805 | + def createElementFromTreeCtrlRecursive( self, itemid, element, uniqids ): | |
818 | 806 | if self.tc.ItemHasChildren( itemid ): |
819 | 807 | child_itemid, cookie = self.tc.GetFirstChild( itemid ) |
820 | 808 | while child_itemid.IsOk(): |
821 | - child_element = self.createElementFromWMXmlElement( self.tc.GetItemPyData( child_itemid )[1] ) | |
822 | - element.append( child_element ) | |
823 | - self.createElementFromTreeCtrlRecursive( child_itemid, element[-1] ) | |
809 | + element_data = self.tc.GetItemPyData( child_itemid ) | |
810 | + element.append( self.createElementFromWMXmlElement( element_data[1] ) ) | |
811 | + uniqids.append( element_data[2] ) | |
812 | + self.createElementFromTreeCtrlRecursive( child_itemid, element[-1], uniqids ) | |
824 | 813 | child_itemid, cookie = self.tc.GetNextChild( itemid, cookie ) |
825 | 814 | |
826 | 815 | def createElementFromWMXmlElement( self, wmxml ): |
@@ -1100,7 +1089,9 @@ class WMXmlEditor( wx.App ): | ||
1100 | 1089 | return |
1101 | 1090 | myindex = min( self.lc_editing_index, self.l2l_correspondence[self.lc_editing_index] ) |
1102 | 1091 | treeitemid = self.l2t_correspondence[myindex] |
1103 | - self.copybuffer = self.createElementTreeFromTreeCtrl( treeitemid ).getroot() | |
1092 | + # uniqids will be discarded | |
1093 | + self.copybuffer, uniqids = self.createElementTreeFromTreeCtrl( treeitemid ) | |
1094 | + self.copybuffer = self.copybuffer.getroot() | |
1104 | 1095 | |
1105 | 1096 | def evPopupMenuCut( self, event ): |
1106 | 1097 | if not self.popupIsItemAvailable( self.lc_editing_index ): |
@@ -1155,9 +1146,15 @@ class WMXmlEditor( wx.App ): | ||
1155 | 1146 | return |
1156 | 1147 | else: |
1157 | 1148 | my_itemid = self.appendElement( showname, treeitemid ) |
1158 | - self.tc.SetItemPyData( my_itemid, [ self.tc.GetCount() - 1, WMXmlElement( self.copybuffer ) ] ) | |
1149 | + newxml = WMXmlElement( self.copybuffer ) | |
1150 | + # use new uniq id | |
1151 | + self.tc.SetItemPyData( my_itemid, [ self.tc.GetCount() - 1, newxml, self.uniqid ] ) | |
1152 | + self.uniqid += 1 | |
1159 | 1153 | self.createXmlTreeRecursive( self.copybuffer, my_itemid ) |
1160 | 1154 | self.createListCtrlFromTreeData() |
1155 | + # add to the undo queue | |
1156 | + self.addActionToUndoQueue( ActionAdd( self.gatherUniqIds( my_itemid ), 0, my_itemid, newxml ) ) | |
1157 | + self.IsSaved = False | |
1161 | 1158 | |
1162 | 1159 | def evPopupMenuDelete( self, event ): |
1163 | 1160 | if not self.popupIsItemAvailable( self.lc_editing_index ): |
@@ -1165,17 +1162,22 @@ class WMXmlEditor( wx.App ): | ||
1165 | 1162 | myindex = self.lc_editing_index |
1166 | 1163 | treeitemid = self.l2t_correspondence[myindex] |
1167 | 1164 | # save action |
1168 | - parent = self.tc.GetItemParent( treeitemid ) | |
1169 | 1165 | pos = self.calculateItemPosition( treeitemid ) |
1170 | 1166 | if not self.tc.GetNextSibling( treeitemid ): |
1171 | 1167 | pos = -1 |
1172 | 1168 | ## we need Element, not WMXmlElement |
1173 | - myxml = self.createElementTreeFromTreeCtrl( treeitemid ).getroot() | |
1169 | + myxml, uniqids = self.createElementTreeFromTreeCtrl( treeitemid ) | |
1170 | + myxml = myxml.getroot() | |
1171 | + parent = self.tc.GetItemParent(treeitemid) | |
1172 | + if parent.IsOk(): | |
1173 | + uniqids.insert( 0, self.tc.GetItemPyData(parent)[2] ) | |
1174 | + else: | |
1175 | + uniqids.insert( 0, None ) | |
1174 | 1176 | #myxml = self.tc.GetItemPyData( treeitemid )[1] |
1175 | 1177 | # remove item |
1176 | 1178 | if self.deleteTreeCtrlItem( treeitemid ): |
1177 | 1179 | # add to undo queue |
1178 | - self.addActionToUndoQueue( ActionDel( parent, pos, None, myxml ) ) | |
1180 | + self.addActionToUndoQueue( ActionDel( uniqids, pos, None, myxml ) ) | |
1179 | 1181 | # store removed data for undo |
1180 | 1182 | # reset flag |
1181 | 1183 | self.IsSaved = False |
@@ -1222,10 +1224,11 @@ class WMXmlEditor( wx.App ): | ||
1222 | 1224 | my_itemid = self.insertElement( showname, treeitemid ) |
1223 | 1225 | else: # append |
1224 | 1226 | my_itemid = self.appendElement( showname, treeitemid ) |
1225 | - self.tc.SetItemPyData( my_itemid, [ self.tc.GetCount() - 1, newxml ] ) | |
1227 | + self.tc.SetItemPyData( my_itemid, [ self.tc.GetCount() - 1, newxml, self.uniqid ] ) | |
1228 | + self.uniqid += 1 | |
1226 | 1229 | self.createListCtrlFromTreeData() |
1227 | 1230 | # add to undo queue |
1228 | - self.addActionToUndoQueue( ActionAdd( None, 0, my_itemid, newxml ) ) | |
1231 | + self.addActionToUndoQueue( ActionAdd( self.gatherUniqIds( my_itemid ), 0, my_itemid, newxml ) ) | |
1229 | 1232 | # work-up |
1230 | 1233 | self.IsSaved = False |
1231 | 1234 |
@@ -1294,10 +1297,11 @@ class WMXmlEditor( wx.App ): | ||
1294 | 1297 | my_itemid = self.insertChildElement( showname, treeitemid ) |
1295 | 1298 | else: # append |
1296 | 1299 | my_itemid = self.appendChildElement( showname, treeitemid ) |
1297 | - self.tc.SetItemPyData( my_itemid, [ self.tc.GetCount() - 1, newxml ] ) | |
1300 | + self.tc.SetItemPyData( my_itemid, [ self.tc.GetCount() - 1, newxml, self.uniqid ] ) | |
1301 | + self.uniqid += 1 | |
1298 | 1302 | self.createListCtrlFromTreeData() |
1299 | 1303 | # register undo |
1300 | - self.addActionToUndoQueue( ActionAdd( None, 0, my_itemid, newxml ) ) | |
1304 | + self.addActionToUndoQueue( ActionAdd( self.gatherUniqIds( my_itemid ), 0, my_itemid, newxml ) ) | |
1301 | 1305 | # work up |
1302 | 1306 | self.IsSaved = False |
1303 | 1307 |
@@ -1320,6 +1324,51 @@ class WMXmlEditor( wx.App ): | ||
1320 | 1324 | def miscShowMessageBox( self, msg, msgtype = 'Info' ): |
1321 | 1325 | wx.MessageBox( msg, msgtype ) |
1322 | 1326 | |
1327 | + def findItemIdByUniqId( self, uniqid ): | |
1328 | + for myid in self.allItemIdGenerator(): | |
1329 | + if myid.IsOk(): | |
1330 | + if self.tc.GetItemPyData(myid)[2] == uniqid: | |
1331 | + return myid | |
1332 | + return None | |
1333 | + | |
1334 | + def gatherUniqIds( self, itemid ): | |
1335 | + if not itemid.IsOk(): | |
1336 | + return None | |
1337 | + ret = [self.tc.GetItemPyData(itemid)[2]] | |
1338 | + self.gatherUniqIdsRecursive( itemid, ret ) | |
1339 | + tmpid = self.tc.GetItemParent( itemid ) | |
1340 | + if tmpid.IsOk(): | |
1341 | + ret.insert( 0, self.tc.GetItemPyData( tmpid )[2] ) | |
1342 | + else: | |
1343 | + ret.insert( 0, None ) | |
1344 | + return ret | |
1345 | + | |
1346 | + def gatherUniqIdsRecursive( self, itemid, ret ): | |
1347 | + if self.tc.ItemHasChildren( itemid ): | |
1348 | + child_itemid, cookie = self.tc.GetFirstChild( itemid ) | |
1349 | + while child_itemid.IsOk(): | |
1350 | + ret.append( self.tc.GetItemPyData(child_itemid)[2] ) | |
1351 | + self.gatherUniqIdsRecursive( child_itemid, ret ) | |
1352 | + child_itemid, cookie = self.tc.GetNextChild( itemid, cookie ) | |
1353 | + | |
1354 | + # all itemid generator | |
1355 | + def allItemIdGenerator( self ): | |
1356 | + rootid = self.tc.GetRootItem() | |
1357 | + if rootid.IsOk(): | |
1358 | + yield rootid | |
1359 | + for val in self.childItemIdGeneratorRecursive( rootid ): | |
1360 | + yield val | |
1361 | + | |
1362 | + def childItemIdGeneratorRecursive( self, itemid ): | |
1363 | + if self.tc.ItemHasChildren( itemid ): | |
1364 | + citemid, cookie = self.tc.GetFirstChild( itemid ) | |
1365 | + while citemid.IsOk(): | |
1366 | + yield citemid | |
1367 | + if self.tc.ItemHasChildren( citemid ): | |
1368 | + for val in self.childItemIdGeneratorRecursive( citemid ): | |
1369 | + yield val | |
1370 | + citemid, cookie = self.tc.GetNextChild( itemid, cookie ) | |
1371 | + | |
1323 | 1372 | ### undo and redo queues related |
1324 | 1373 | def addActionToUndoQueue( self, action, remove = False ): |
1325 | 1374 | self.addActionToQueue( action, self.undo ) |
@@ -1382,24 +1431,6 @@ class WMXmlEditor( wx.App ): | ||
1382 | 1431 | for itemid in matched: |
1383 | 1432 | self.tc.SelectItem( itemid ) |
1384 | 1433 | |
1385 | - # all itemid generator | |
1386 | - def allItemIdGenerator( self ): | |
1387 | - rootid = self.tc.GetRootItem() | |
1388 | - if rootid.IsOk(): | |
1389 | - yield rootid | |
1390 | - for val in self.childItemIdGeneratorRecursive( rootid ): | |
1391 | - yield val | |
1392 | - | |
1393 | - def childItemIdGeneratorRecursive( self, itemid ): | |
1394 | - if self.tc.ItemHasChildren( itemid ): | |
1395 | - citemid, cookie = self.tc.GetFirstChild( itemid ) | |
1396 | - while citemid.IsOk(): | |
1397 | - yield citemid | |
1398 | - if self.tc.ItemHasChildren( citemid ): | |
1399 | - for val in self.childItemIdGeneratorRecursive( citemid ): | |
1400 | - yield val | |
1401 | - citemid, cookie = self.tc.GetNextChild( itemid, cookie ) | |
1402 | - | |
1403 | 1434 | def genXmlQuery( self ): |
1404 | 1435 | ret = WMXmlQuery() |
1405 | 1436 | ret.setElementQuery( xrc.XRCCTRL( self.dialogFind, "textCtrlElementFind" ).GetValue(), |