1999-07-31 03:56:15 -04:00
|
|
|
|
2003-12-08 20:23:28 -05:00
|
|
|
import sys
|
|
|
|
import wx
|
2000-10-30 16:08:42 -05:00
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
from xml.parsers import expat
|
1999-07-31 03:56:15 -04:00
|
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
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)
|
2003-12-08 20:23:28 -05:00
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
def OnEndDrag(self, evt):
|
|
|
|
itemSrc = self.draggingItem
|
|
|
|
itemDst = evt.GetItem()
|
|
|
|
self.draggingItem = None
|
1999-07-31 03:56:15 -04:00
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
if not itemDst.IsOk():
|
|
|
|
print "Can't drag to here..."
|
|
|
|
return
|
1999-07-31 03:56:15 -04:00
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
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 ):
|
2004-11-12 22:00:09 -05:00
|
|
|
name = name.encode()
|
2004-11-01 14:39:09 -05:00
|
|
|
|
|
|
|
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():
|
2004-11-12 22:00:09 -05:00
|
|
|
data = data.encode()
|
2003-12-08 20:23:28 -05:00
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
self.AppendItem(self.nodeStack[-1], data)
|
1999-07-31 03:56:15 -04:00
|
|
|
|
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
def LoadTree(self, filename):
|
|
|
|
# Create a parser
|
|
|
|
Parser = expat.ParserCreate()
|
1999-07-31 03:56:15 -04:00
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
# Tell the parser what the start element handler is
|
|
|
|
Parser.StartElementHandler = self.StartElement
|
|
|
|
Parser.EndElementHandler = self.EndElement
|
|
|
|
Parser.CharacterDataHandler = self.CharacterData
|
1999-07-31 03:56:15 -04:00
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
# Parse the XML File
|
|
|
|
ParserStatus = Parser.Parse(open(filename,'r').read(), 1)
|
1999-07-31 03:56:15 -04:00
|
|
|
|
|
|
|
|
2004-11-01 14:39:09 -05:00
|
|
|
def runTest(frame, nb, log):
|
|
|
|
win = XMLTree(nb, -1)
|
|
|
|
win.LoadTree("paper.xml")
|
|
|
|
return win
|
1999-07-31 03:56:15 -04:00
|
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
overview = """\
|
|
|
|
"""
|
|
|
|
|
2003-07-02 19:13:10 -04:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
import sys,os
|
|
|
|
import run
|
2004-03-04 19:06:33 -05:00
|
|
|
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
|