+ g.frame.SetModified()
+
+ def OnBeginLabelEdit(self, evt):
+ xxx = self.GetPyData(evt.GetItem())
+ if xxx.isElement:
+ evt.Veto()
+ else:
+ evt.Skip()
+
+ def OnEndLabelEdit(self, evt):
+ xxx = self.GetPyData(evt.GetItem())
+ node = xxx.node
+ if not xxx.isElement:
+ node.data = evt.GetLabel()
+ g.panel.SetData(xxx)
+ evt.Skip()
+
+################################################################################
+
+# DragAndDrop
+
+class DropTarget(wx.PyDropTarget):
+ def __init__(self):
+ self.do = MyDataObject()
+ wx.DropTarget.__init__(self, self.do)
+
+ # Find best object for dropping
+ def WhereToDrop(self, x, y, d):
+ # Find object by position
+ obj = wx.FindWindowAtPoint(g.testWin.ClientToScreen((x,y)))
+ if not obj:
+ return wx.DragNone, ()
+ item = g.frame.FindObject(g.testWin.item, obj)
+ if not item:
+ return wx.DragNone, ()
+ xxx = g.tree.GetPyData(item).treeObject()
+ parentItem = None
+ # Check if window has a XRC sizer, then use it as parent
+ if obj.GetSizer():
+ sizer = obj.GetSizer()
+ sizerItem = g.frame.FindObject(g.testWin.item, sizer)
+ if sizerItem:
+ parentItem = sizerItem
+ obj = sizer
+ item = wx.TreeItemId()
+ # if not sizer but can have children, it is parent with free placement
+ elif xxx.hasChildren:
+ parentItem = item
+ item = wx.TreeItemId()
+ # Otherwise, try to add to item's parent
+ if not parentItem:
+ parentItem = g.tree.GetItemParent(item)
+ obj = g.tree.FindNodeObject(parentItem)
+ parent = g.tree.GetPyData(parentItem).treeObject()
+ return d,(obj,parent,parentItem,item)
+
+ # Drop
+ def OnData(self, x, y, d):
+ self.GetData()
+ id = int(self.do.GetDataHere())
+ d,other = self.WhereToDrop(x, y, d)
+ if d != wx.DragNone:
+ obj,parent,parentItem,item = other
+ g.tree.selection = parentItem
+ xxx = g.frame.CreateXXX(parent, parentItem, item, id)
+ # Set coordinates if parent is not sizer
+ if not parent.isSizer:
+ xxx.set('pos', '%d,%d' % (x, y))
+ g.panel.SetData(xxx)
+ g.frame.SetStatusText('Object created')
+ self.RemoveHL()
+ return d
+
+ def OnDragOver(self, x, y, d):
+ d,other = self.WhereToDrop(x, y, d)
+ if d != wx.DragNone:
+ obj,parent,parentItem,item = other
+ pos, size = g.tree.FindNodePos(parentItem, obj), obj.GetSize()
+ hl = g.testWin.highLightDT
+ # Set color of highlighted item back to normal
+ if hl and hl.item:
+ if hl.item != parentItem:
+ g.tree.SetItemTextColour(hl.item, g.tree.itemColour)
+ # Highlight future parent
+ g.tree.itemColour = g.tree.GetItemTextColour(parentItem) # save current
+ if not hl or hl.item != parentItem:
+ g.testWin.highLightDT = updateHL(hl, HighLightDTBox, pos, size)
+ g.testWin.highLightDT.item = parentItem
+ g.tree.SetItemTextColour(parentItem, g.tree.COLOUR_DT)
+ g.tree.EnsureVisible(parentItem)
+ g.frame.SetStatusText('Drop target: %s' % parent.treeName())
+ else:
+ g.frame.SetStatusText('Inappropriate drop target')
+ self.RemoveHL()
+ return d
+
+ def OnLeave(self):
+ self.RemoveHL()