Implemented xxxComment. Due to different minidom XML types (Comments

are not Elements) had to add xxxObject.isElement flag and changed
xxxObject.element variable to xxxObject.node (xxxComment is derived
from xxxObject to minimize changes in processing). More testing is still
needed to verify that things didn't break. Use previous commit (0.1.8-4
release on 2007/03/10) if you need a stable version.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44764 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Roman Rolinsky
2007-03-11 05:08:45 +00:00
parent 047c5f3e6d
commit b372319fa0
9 changed files with 240 additions and 123 deletions

View File

@@ -489,10 +489,14 @@ class Frame(wx.Frame):
if not selected: return # key pressed event
xxx = tree.GetPyData(selected)
if wx.TheClipboard.Open():
data = wx.CustomDataObject('XRCED')
# Set encoding in header
# (False,True)
s = xxx.element.toxml(encoding=expat.native_encoding)
if xxx.isElement:
data = wx.CustomDataObject('XRCED')
# Set encoding in header
# (False,True)
s = xxx.node.toxml(encoding=expat.native_encoding)
else:
data = wx.CustomDataObject('XRCED_node')
s = xxx.node.data
data.SetData(cPickle.dumps(s))
wx.TheClipboard.SetData(data)
wx.TheClipboard.Close()
@@ -527,21 +531,28 @@ class Frame(wx.Frame):
parent = tree.GetPyData(parentLeaf).treeObject()
# Create a copy of clipboard pickled element
success = False
success = success_node = False
if wx.TheClipboard.Open():
data = wx.CustomDataObject('XRCED')
if wx.TheClipboard.IsSupported(data.GetFormat()):
success = wx.TheClipboard.GetData(data)
if not success: # try other format
data = wx.CustomDataObject('XRCED_node')
if wx.TheClipboard.IsSupported(data.GetFormat()):
success_node = wx.TheClipboard.GetData(data)
wx.TheClipboard.Close()
if not success:
if not success and not success_node:
wx.MessageBox(
"There is no data in the clipboard in the required format",
"Error")
return
xml = cPickle.loads(data.GetData()) # xml representation of element
elem = minidom.parseString(xml).childNodes[0]
if success:
elem = minidom.parseString(xml).childNodes[0]
else:
elem = g.tree.dom.createComment(xml)
# Tempopary xxx object to test things
xxx = MakeXXXFromDOM(parent, elem)
@@ -558,9 +569,9 @@ class Frame(wx.Frame):
((parent.isSizer and not isinstance(xxx, xxxSizerItem)) or \
(parentIsBook and not isinstance(xxx, xxxPage)) or \
not (parent.isSizer or parentIsBook)):
elem.removeChild(xxx.child.element) # detach child
elem.removeChild(xxx.child.node) # detach child
elem.unlink() # delete child container
elem = xxx.child.element # replace
elem = xxx.child.node # replace
# This may help garbage collection
xxx.child.parent = None
isChildContainer = False
@@ -605,6 +616,9 @@ class Frame(wx.Frame):
def ItemsAreCompatible(self, parent, child):
# Check compatibility
error = False
# Comments are always compatible
if child.__class__ == xxxComment:
return True
# Top-level
if child.__class__ in [xxxDialog, xxxFrame, xxxWizard]:
# Top-level classes
@@ -732,9 +746,9 @@ class Frame(wx.Frame):
((parent.isSizer and not isinstance(xxx, xxxSizerItem)) or \
(isinstance(parent, xxxNotebook) and not isinstance(xxx, xxxNotebookPage)) or \
not (parent.isSizer or isinstance(parent, xxxNotebook))):
elem.removeChild(xxx.child.element) # detach child
elem.removeChild(xxx.child.node) # detach child
elem.unlink() # delete child container
elem = xxx.child.element # replace
elem = xxx.child.node # replace
# This may help garbage collection
xxx.child.parent = None
isChildContainer = False
@@ -789,9 +803,9 @@ class Frame(wx.Frame):
((parent.isSizer and not isinstance(xxx, xxxSizerItem)) or \
(isinstance(parent, xxxNotebook) and not isinstance(xxx, xxxNotebookPage)) or \
not (parent.isSizer or isinstance(parent, xxxNotebook))):
elem.removeChild(xxx.child.element) # detach child
elem.removeChild(xxx.child.node) # detach child
elem.unlink() # delete child container
elem = xxx.child.element # replace
elem = xxx.child.node # replace
# This may help garbage collection
xxx.child.parent = None
isChildContainer = False
@@ -841,14 +855,19 @@ class Frame(wx.Frame):
# Prepare undo data
panel.Apply()
index = tree.ItemFullIndex(selected)
xxx = tree.GetPyData(selected)
parent = tree.GetPyData(tree.GetItemParent(selected)).treeObject()
elem = tree.RemoveLeaf(selected)
undoMan.RegisterUndo(UndoCutDelete(index, parent, elem))
if evt.GetId() == wx.ID_CUT:
if wx.TheClipboard.Open():
data = wx.CustomDataObject('XRCED')
# (False, True)
s = elem.toxml(encoding=expat.native_encoding)
if xxx.isElement:
data = wx.CustomDataObject('XRCED')
# (False, True)
s = elem.toxml(encoding=expat.native_encoding)
else:
data = wx.CustomDataObject('XRCED_node')
s = xxx.node.data
data.SetData(cPickle.dumps(s))
wx.TheClipboard.SetData(data)
wx.TheClipboard.Close()
@@ -866,7 +885,7 @@ class Frame(wx.Frame):
def OnSubclass(self, evt):
selected = tree.selection
xxx = tree.GetPyData(selected).treeObject()
elem = xxx.element
elem = xxx.node
subclass = xxx.subclass
dlg = wx.TextEntryDialog(self, 'Subclass:', defaultValue=subclass)
if dlg.ShowModal() == wx.ID_OK:
@@ -1063,29 +1082,33 @@ Homepage: http://xrced.sourceforge.net\
ref = wx.GetTextFromUser('Create reference to:', 'Create reference')
if not ref: return
xxx = MakeEmptyRefXXX(parent, ref)
elif evt.GetId() == ID_NEW.COMMENT:
xxx = MakeEmptyCommentXXX(parent)
else:
# Create empty element
className = pullDownMenu.createMap[evt.GetId()]
xxx = MakeEmptyXXX(parent, className)
# Set default name for top-level windows
if parent.__class__ == xxxMainNode:
cl = xxx.treeObject().__class__
frame.maxIDs[cl] += 1
xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl]))
# And for some other standard controls
elif parent.__class__ == xxxStdDialogButtonSizer:
xxx.setTreeName(pullDownMenu.stdButtonIDs[evt.GetId()][0])
# We can even set label
obj = xxx.treeObject()
elem = g.tree.dom.createElement('label')
elem.appendChild(g.tree.dom.createTextNode(pullDownMenu.stdButtonIDs[evt.GetId()][1]))
obj.params['label'] = xxxParam(elem)
xxx.treeObject().element.appendChild(elem)
# Insert new node, register undo
elem = xxx.element
newItem = tree.InsertNode(parentLeaf, parent, elem, nextItem)
if xxx.isElement: # true object
# Set default name for top-level windows
if parent.__class__ == xxxMainNode:
cl = xxx.treeObject().__class__
frame.maxIDs[cl] += 1
xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl]))
# And for some other standard controls
elif parent.__class__ == xxxStdDialogButtonSizer:
xxx.setTreeName(pullDownMenu.stdButtonIDs[evt.GetId()][0])
# We can even set label
obj = xxx.treeObject()
elem = g.tree.dom.createElement('label')
elem.appendChild(g.tree.dom.createTextNode(pullDownMenu.stdButtonIDs[evt.GetId()][1]))
obj.params['label'] = xxxParam(elem)
xxx.treeObject().node.appendChild(elem)
newItem = tree.InsertNode(parentLeaf, parent, xxx.node, nextItem)
else: # comment node
newItem = tree.InsertNode(parentLeaf, parent, xxx.node, nextItem)
undoMan.RegisterUndo(UndoPasteCreate(parentLeaf, parent, newItem, selected))
tree.EnsureVisible(newItem)
tree.SelectItem(newItem)
@@ -1093,7 +1116,7 @@ Homepage: http://xrced.sourceforge.net\
tree.ScrollTo(newItem)
tree.Refresh()
# Update view?
if g.testWin and tree.IsHighlatable(newItem):
if xxx.isElement and g.testWin and tree.IsHighlatable(newItem):
if conf.autoRefresh:
tree.needUpdate = True
tree.pendingHighLight = newItem
@@ -1106,7 +1129,7 @@ Homepage: http://xrced.sourceforge.net\
def OnReplace(self, evt):
selected = tree.selection
xxx = tree.GetPyData(selected).treeObject()
elem = xxx.element
elem = xxx.node
parent = elem.parentNode
undoMan.RegisterUndo(UndoReplace(selected))
# New class
@@ -1383,6 +1406,10 @@ Homepage: http://xrced.sourceforge.net\
return True
def Indent(self, node, indent = 0):
if node.nodeType == minidom.Node.COMMENT_NODE:
text = self.domCopy.createTextNode('\n' + ' ' * indent)
node.parentNode.insertBefore(text, node)
return # no children
# Copy child list because it will change soon
children = node.childNodes[:]
# Main node doesn't need to be indented
@@ -1396,7 +1423,8 @@ Homepage: http://xrced.sourceforge.net\
node.appendChild(text)
# Indent children which are elements
for n in children:
if n.nodeType == minidom.Node.ELEMENT_NODE:
if n.nodeType == minidom.Node.ELEMENT_NODE or \
n.nodeType == minidom.Node.COMMENT_NODE:
self.Indent(n, indent + 2)
def Save(self, path):