+            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)
+