| 1 | |
| 2 | import sys |
| 3 | import wx |
| 4 | |
| 5 | from xml.parsers import expat |
| 6 | |
| 7 | #---------------------------------------------------------------------- |
| 8 | |
| 9 | class XMLTree(wx.TreeCtrl): |
| 10 | def __init__(self, parent, ID): |
| 11 | wx.TreeCtrl.__init__(self, parent, ID) |
| 12 | self._root = self.AddRoot("Root") |
| 13 | self.nodeStack = [self._root] |
| 14 | |
| 15 | # Trees need an image list to do DnD... |
| 16 | self.il = wx.ImageList(16,16) |
| 17 | self.SetImageList(self.il) |
| 18 | |
| 19 | # event handlers for DnD |
| 20 | self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnBeginDrag) |
| 21 | self.Bind(wx.EVT_TREE_END_DRAG, self.OnEndDrag) |
| 22 | |
| 23 | |
| 24 | def OnBeginDrag(self, event): |
| 25 | item = event.GetItem() |
| 26 | |
| 27 | if item != self.GetRootItem(): |
| 28 | self.draggingItem = item |
| 29 | event.Allow() # if DnD of this item is okay Allow it. |
| 30 | |
| 31 | def IsDescendant(self, firstItem, secondItem): |
| 32 | "Recursive check if firstItem is a descendant of a secondItem." |
| 33 | if firstItem == self._root: |
| 34 | return False |
| 35 | parentItem = self.GetItemParent(firstItem) |
| 36 | if parentItem == secondItem: |
| 37 | return True |
| 38 | else: |
| 39 | return self.IsDescendant(parentItem, secondItem) |
| 40 | |
| 41 | def OnEndDrag(self, evt): |
| 42 | itemSrc = self.draggingItem |
| 43 | itemDst = evt.GetItem() |
| 44 | self.draggingItem = None |
| 45 | |
| 46 | if not itemDst.IsOk(): |
| 47 | print "Can't drag to here..." |
| 48 | return |
| 49 | |
| 50 | if self.IsDescendant(itemDst, itemSrc): |
| 51 | print "Can't move item to its descendant" |
| 52 | return |
| 53 | |
| 54 | # For this simple example just take the text of the source item |
| 55 | # and append it to the destination item. In real life you would |
| 56 | # possibly want to copy subtrees... |
| 57 | text = self.GetItemText(itemSrc) |
| 58 | self.AppendItem(itemDst, text) |
| 59 | self.Delete(itemSrc) |
| 60 | |
| 61 | |
| 62 | # Define a handler for start element events |
| 63 | def StartElement(self, name, attrs ): |
| 64 | name = name.encode() |
| 65 | |
| 66 | id = self.AppendItem(self.nodeStack[-1], name) |
| 67 | self.nodeStack.append(id) |
| 68 | |
| 69 | def EndElement(self, name ): |
| 70 | self.nodeStack = self.nodeStack[:-1] |
| 71 | |
| 72 | def CharacterData(self, data ): |
| 73 | if data.strip(): |
| 74 | data = data.encode() |
| 75 | |
| 76 | self.AppendItem(self.nodeStack[-1], data) |
| 77 | |
| 78 | |
| 79 | def LoadTree(self, filename): |
| 80 | # Create a parser |
| 81 | Parser = expat.ParserCreate() |
| 82 | |
| 83 | # Tell the parser what the start element handler is |
| 84 | Parser.StartElementHandler = self.StartElement |
| 85 | Parser.EndElementHandler = self.EndElement |
| 86 | Parser.CharacterDataHandler = self.CharacterData |
| 87 | |
| 88 | # Parse the XML File |
| 89 | ParserStatus = Parser.Parse(open(filename,'r').read(), 1) |
| 90 | |
| 91 | |
| 92 | def runTest(frame, nb, log): |
| 93 | win = XMLTree(nb, -1) |
| 94 | win.LoadTree("paper.xml") |
| 95 | return win |
| 96 | |
| 97 | #---------------------------------------------------------------------- |
| 98 | |
| 99 | |
| 100 | |
| 101 | overview = """\ |
| 102 | """ |
| 103 | |
| 104 | |
| 105 | if __name__ == '__main__': |
| 106 | import sys,os |
| 107 | import run |
| 108 | run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) |