git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30514 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| import  sys
 | |
| import  wx
 | |
| 
 | |
| from xml.parsers import expat
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| class XMLTree(wx.TreeCtrl):
 | |
|     def __init__(self, parent, ID):
 | |
|         wx.TreeCtrl.__init__(self, parent, ID)
 | |
|         self._root = self.AddRoot("Root")
 | |
|         self.nodeStack = [self._root]
 | |
| 
 | |
|         # Trees need an image list to do DnD...
 | |
|         self.il = wx.ImageList(16,16)
 | |
|         self.SetImageList(self.il)
 | |
| 
 | |
|         # event handlers for DnD
 | |
|         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnBeginDrag)
 | |
|         self.Bind(wx.EVT_TREE_END_DRAG, self.OnEndDrag)
 | |
| 
 | |
| 
 | |
|     def OnBeginDrag(self, event):
 | |
|         item = event.GetItem()
 | |
| 
 | |
|         if item != self.GetRootItem():
 | |
|             self.draggingItem = item
 | |
|             event.Allow()  # if DnD of this item is okay Allow it.
 | |
| 
 | |
|     def IsDescendant(self, firstItem, secondItem):
 | |
|         "Recursive check if firstItem is a descendant of a secondItem."
 | |
|         if firstItem == self._root:
 | |
|             return False
 | |
|         parentItem = self.GetItemParent(firstItem)
 | |
|         if parentItem == secondItem:
 | |
|             return True
 | |
|         else:
 | |
|             return self.IsDescendant(parentItem, secondItem)
 | |
| 
 | |
|     def OnEndDrag(self, evt):
 | |
|         itemSrc = self.draggingItem
 | |
|         itemDst = evt.GetItem()
 | |
|         self.draggingItem = None
 | |
| 
 | |
|         if not itemDst.IsOk():
 | |
|             print "Can't drag to here..."
 | |
|             return
 | |
| 
 | |
|         if self.IsDescendant(itemDst, itemSrc):
 | |
|             print "Can't move item to its descendant"
 | |
|             return
 | |
| 
 | |
|         # For this simple example just take the text of the source item
 | |
|         # and append it to the destination item.  In real life you would
 | |
|         # possibly want to copy subtrees...
 | |
|         text = self.GetItemText(itemSrc)
 | |
|         self.AppendItem(itemDst, text)
 | |
|         self.Delete(itemSrc)
 | |
| 
 | |
| 
 | |
|     # Define a handler for start element events
 | |
|     def StartElement(self, name, attrs ):
 | |
|         name = name.encode()
 | |
| 
 | |
|         id = self.AppendItem(self.nodeStack[-1], name)
 | |
|         self.nodeStack.append(id)
 | |
| 
 | |
|     def EndElement(self,  name ):
 | |
|         self.nodeStack = self.nodeStack[:-1]
 | |
| 
 | |
|     def CharacterData(self, data ):
 | |
|         if data.strip():
 | |
|             data = data.encode()
 | |
| 
 | |
|             self.AppendItem(self.nodeStack[-1], data)
 | |
| 
 | |
| 
 | |
|     def LoadTree(self, filename):
 | |
|         # Create a parser
 | |
|         Parser = expat.ParserCreate()
 | |
| 
 | |
|         # Tell the parser what the start element handler is
 | |
|         Parser.StartElementHandler = self.StartElement
 | |
|         Parser.EndElementHandler = self.EndElement
 | |
|         Parser.CharacterDataHandler = self.CharacterData
 | |
| 
 | |
|         # Parse the XML File
 | |
|         ParserStatus = Parser.Parse(open(filename,'r').read(), 1)
 | |
| 
 | |
| 
 | |
| def runTest(frame, nb, log):
 | |
|     win = XMLTree(nb, -1)
 | |
|     win.LoadTree("paper.xml")
 | |
|     return win
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| 
 | |
| overview = """\
 | |
| """
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     import sys,os
 | |
|     import run
 | |
|     run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
 |