]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/demo/XMLtreeview.py
Some little demo tweaks
[wxWidgets.git] / wxPython / demo / XMLtreeview.py
index 853bd40b8e076a15597c18fbd61cbd14f1f868b9..36dc81f63f57dd3e65b8026b036ad3832bc9c5be 100644 (file)
 
-import string
+import  sys
+import  wx
 
-from wxPython.wx import *
-try:
-    from xml.parsers import pyexpat
-    haveXML = true
-except ImportError:
-    haveXML = false
+from xml.parsers import expat
 
 #----------------------------------------------------------------------
 
-if not haveXML:
-    def runTest(frame, nb, log):
-        dlg = wxMessageDialog(frame, 'This demo requires the XML package.  See http://www.python.org/sigs/xml-sig/',
-                          'Sorry', wxOK | wxICON_INFORMATION)
-        dlg.ShowModal()
-        dlg.Destroy()
+class XMLTree(wx.TreeCtrl):
+    def __init__(self, parent, ID):
+        wx.TreeCtrl.__init__(self, parent, ID)
+        self._root = self.AddRoot("Root")
+        self.nodeStack = [self._root]
 
-else:
+        # Trees need an image list to do DnD...
+        self.il = wx.ImageList(16,16)
+        self.SetImageList(self.il)
 
-    class XMLTree(wxTreeCtrl):
-        def __init__(self, parent, ID):
-            wxTreeCtrl.__init__(self, parent, ID)
-            self.nodeStack = [self.AddRoot("Root")]
+        # event handlers for DnD
+        self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnBeginDrag)
+        self.Bind(wx.EVT_TREE_END_DRAG, self.OnEndDrag)
 
-        # Define a handler for start element events
-        def StartElement(self, name, attrs ):
-            id = self.AppendItem(self.nodeStack[-1], name)
-            self.nodeStack.append(id)
 
-        def EndElement(self,  name ):
-            self.nodeStack = self.nodeStack[:-1]
+    def OnBeginDrag(self, event):
+        item = event.GetItem()
 
-        def CharacterData(self, data ):
-            if string.strip(data):
-                self.AppendItem(self.nodeStack[-1], data)
+        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 LoadTree(self, filename):
-            # Create a parser
-            Parser = pyexpat.ParserCreate()
+    def OnEndDrag(self, evt):
+        itemSrc = self.draggingItem
+        itemDst = evt.GetItem()
+        self.draggingItem = None
 
-            # Tell the parser what the start element handler is
-            Parser.StartElementHandler = self.StartElement
-            Parser.EndElementHandler = self.EndElement
-            Parser.CharacterDataHandler = self.CharacterData
+        if not itemDst.IsOk():
+            print "Can't drag to here..."
+            return
 
-            # Parse the XML File
-            ParserStatus = Parser.Parse(open(filename,'r').read(), 1)
+        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)
 
-    def runTest(frame, nb, log):
-        win = XMLTree(nb, -1)
-        win.LoadTree("paper.xml")
-        return win
 
-#----------------------------------------------------------------------
+    # 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:])