]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wx/tools/XRCed/xrced.py
Macros for simplified testing Open Watcom version and required tweaks.
[wxWidgets.git] / wxPython / wx / tools / XRCed / xrced.py
index 36c553a6e13c0863c938ec369c8c6532e8bc4fd0..0f50d477eb227e4f995d27dd4bda4e24ce398b0c 100644 (file)
@@ -21,7 +21,7 @@ Options:
 """
 
 from globals import *
-import os, sys, getopt, re, traceback, tempfile, shutil
+import os, sys, getopt, re, traceback, tempfile, shutil, cPickle
 
 # Local modules
 from tree import *                      # imports xxx which imports params
@@ -306,7 +306,6 @@ class Frame(wxFrame):
         self.SetSizer(sizer)
 
         # Initialize
-        self.clipboard = None
         self.Clear()
 
         # Other events
@@ -314,6 +313,7 @@ class Frame(wxFrame):
         EVT_CLOSE(self, self.OnCloseWindow)
         EVT_KEY_DOWN(self, tools.OnKeyDown)
         EVT_KEY_UP(self, tools.OnKeyUp)
+        EVT_ICONIZE(self, self.OnIconize)
     
     def AppendRecent(self, menu):
         # add recently used files to the menu
@@ -347,7 +347,6 @@ class Frame(wxFrame):
         if dlg.ShowModal() == wxID_OK:
             path = dlg.GetPath()
             self.SetStatusText('Loading...')
-            wxYield()
             wxBeginBusyCursor()
             try:
                 if self.Open(path):
@@ -375,7 +374,6 @@ class Frame(wxFrame):
         else:
             path = self.dataFile
         self.SetStatusText('Saving...')
-        wxYield()
         wxBeginBusyCursor()
         try:
             try:
@@ -415,7 +413,11 @@ class Frame(wxFrame):
         selected = tree.selection
         if not selected: return         # key pressed event
         xxx = tree.GetPyData(selected)
-        self.clipboard = xxx.element.cloneNode(True)
+        wx.TheClipboard.Open()
+        data = wx.CustomDataObject('XRCED')
+        data.SetData(cPickle.dumps(xxx.element))
+        wx.TheClipboard.SetData(data)
+        wx.TheClipboard.Close()
         self.SetStatusText('Copied')
 
     def OnPaste(self, evt):
@@ -444,8 +446,16 @@ class Frame(wxFrame):
             parentLeaf = selected
         parent = tree.GetPyData(parentLeaf).treeObject()
 
-        # Create a copy of clipboard element
-        elem = self.clipboard.cloneNode(True)
+        # Create a copy of clipboard pickled element
+        wx.TheClipboard.Open()
+        data = wx.CustomDataObject('XRCED')
+        if not wx.TheClipboard.IsSupported(data.GetFormat()):
+            wx.TheClipboard.Close()
+            wx.LogError('unsupported clipboard format')
+            return
+        wx.TheClipboard.GetData(data)
+        wx.TheClipboard.Close()
+        elem = cPickle.loads(data.GetData())
         # Tempopary xxx object to test things
         xxx = MakeXXXFromDOM(parent, elem)
 
@@ -554,8 +564,11 @@ class Frame(wxFrame):
         elem = tree.RemoveLeaf(selected)
         undoMan.RegisterUndo(UndoCutDelete(index, parent, elem))
         if evt.GetId() == wxID_CUT:
-            if self.clipboard: self.clipboard.unlink()
-            self.clipboard = elem.cloneNode(True)
+            wx.TheClipboard.Open()
+            data = wx.CustomDataObject('XRCED')
+            data.SetData(cPickle.dumps(elem))
+            wx.TheClipboard.SetData(data)
+            wx.TheClipboard.Close()
         tree.pendingHighLight = None
         tree.UnselectAll()
         tree.selection = None
@@ -594,7 +607,6 @@ class Frame(wxFrame):
             sizePanel = panel.GetSize()
             panel.Reparent(self.splitter)
             self.miniFrame.GetSizer().Remove(panel)
-            wxYield()
             # Widen
             self.SetDimensions(pos.x, pos.y, size.width + sizePanel.width, size.height)
             self.splitter.SplitVertically(tree, panel, conf.sashPos)
@@ -612,7 +624,6 @@ class Frame(wxFrame):
             self.miniFrame.Show(True)
             self.miniFrame.SetDimensions(conf.panelX, conf.panelY,
                                          conf.panelWidth, conf.panelHeight)
-            wxYield()
             # Reduce width
             self.SetDimensions(pos.x, pos.y,
                                max(size.width - sizePanel.width, self.minWidth), size.height)
@@ -804,21 +815,25 @@ Homepage: http://xrced.sourceforge.net\
         tree.SetFocus()
         self.SetModified()
 
-
     # Replace one object with another
     def OnReplace(self, evt):
         selected = tree.selection
         xxx = tree.GetPyData(selected).treeObject()
         elem = xxx.element
         parent = elem.parentNode
-        parentXXX = xxx.parent
+        undoMan.RegisterUndo(UndoReplace(selected))
         # New class
         className = pullDownMenu.createMap[evt.GetId() - 1000]
         # Create temporary empty node (with default values)
         dummy = MakeEmptyDOM(className)
-        xxxClass = xxxDict[className]
+        if className == 'spacer' and xxx.className != 'spacer':
+            klass = xxxSpacer
+        elif xxx.className == 'spacer' and className != 'spacer':
+            klass = xxxSizerItem
+        else:
+            klass = xxxDict[className]
         # Remove non-compatible children
-        if tree.ItemHasChildren(selected) and not xxxClass.hasChildren:
+        if tree.ItemHasChildren(selected) and not klass.hasChildren:
             tree.DeleteChildren(selected)
         nodes = elem.childNodes[:]
         tags = []
@@ -827,10 +842,9 @@ Homepage: http://xrced.sourceforge.net\
             remove = False
             tag = node.tagName
             if tag == 'object':
-                if not xxxClass.hasChildren:
-                    remove = True
-            elif tag not in xxxClass.allParams and \
-                     (not xxxClass.hasStyle or tag not in xxxClass.styles):
+                if not klass.hasChildren:  remove = True
+            elif tag not in klass.allParams and \
+                     (not klass.hasStyle or tag not in klass.styles):
                 remove = True
             else:
                 tags.append(tag)
@@ -838,18 +852,37 @@ Homepage: http://xrced.sourceforge.net\
                 elem.removeChild(node)
                 node.unlink()
         
-        # Copy parameters present in dummy but not in elem
-        for node in dummy.childNodes:
-            tag = node.tagName
-            if tag not in tags:
-                elem.appendChild(node.cloneNode(True))
+        # Remove sizeritem child if spacer
+        if className == 'spacer' and xxx.className != 'spacer':
+            sizeritem = elem.parentNode
+            assert sizeritem.getAttribute('class') == 'sizeritem'
+            sizeritem.removeChild(elem)
+            elem.unlink()
+            elem = sizeritem
+            tree.GetPyData(selected).hasChild = false
+        elif xxx.className == 'spacer' and className != 'spacer':
+            # Create sizeritem element
+            assert xxx.parent.isSizer
+            elem.setAttribute('class', 'sizeritem')
+            node = MakeEmptyDOM(className)
+            elem.appendChild(node)
+            # Replace to point to new object
+            xxx = xxxSizerItem(xxx.parent, elem)
+            elem = node
+            tree.SetPyData(selected, xxx)
+            xxx = xxx.child
+        else:
+            # Copy parameters present in dummy but not in elem
+            for node in dummy.childNodes:
+                if node.tagName not in tags:  elem.appendChild(node.cloneNode(True))
         dummy.unlink()
+        
         # Change class name
-        elem.setAttribute('class', className)        
+        elem.setAttribute('class', className)
         if elem.hasAttribute('subclass'):
             elem.removeAttribute('subclass') # clear subclassing
         # Re-create xxx element
-        xxx = MakeXXXFromDOM(parentXXX, elem)
+        xxx = MakeXXXFromDOM(xxx.parent, elem)
         # Update parent in child objects
         if tree.ItemHasChildren(selected):
             i, cookie = tree.GetFirstChild(selected)
@@ -858,13 +891,14 @@ Homepage: http://xrced.sourceforge.net\
                 x.parent = xxx
                 if x.hasChild: x.child.parent = xxx
                 i, cookie = tree.GetNextChild(selected, cookie)
-    
+
         # Update tree
         if tree.GetPyData(selected).hasChild: # child container
             container = tree.GetPyData(selected)
             container.child = xxx
             container.hasChildren = xxx.hasChildren
             container.isSizer = xxx.isSizer
+            xxx = container
         else:
             tree.SetPyData(selected, xxx)
         tree.SetItemText(selected, xxx.treeName())
@@ -915,7 +949,7 @@ Homepage: http://xrced.sourceforge.net\
         elif evt.GetId() == wxID_SAVE:
             evt.Enable(self.modified)
         elif evt.GetId() in [wxID_PASTE, self.ID_TOOL_PASTE]:
-            evt.Enable((self.clipboard and tree.selection) != None)
+            evt.Enable(tree.selection is not None)
         elif evt.GetId() == self.ID_TEST:
             evt.Enable(tree.selection is not None and tree.selection != tree.root)
         elif evt.GetId() in [self.ID_LOCATE, self.ID_TOOL_LOCATE]:
@@ -932,7 +966,6 @@ Homepage: http://xrced.sourceforge.net\
                     self.SetStatusText('Refreshing test window...')
                     # (re)create
                     tree.CreateTestWin(g.testWin.item)
-                    wxYield()
                     self.SetStatusText('')
                 tree.needUpdate = False
         elif tree.pendingHighLight:
@@ -945,6 +978,17 @@ Homepage: http://xrced.sourceforge.net\
     def OnCloseMiniFrame(self, evt):
         return
 
+    def OnIconize(self, evt):
+        conf.x, conf.y = self.GetPosition()
+        conf.width, conf.height = self.GetSize()
+        if conf.embedPanel:
+            conf.sashPos = self.splitter.GetSashPosition()
+        else:
+            conf.panelX, conf.panelY = self.miniFrame.GetPosition()
+            conf.panelWidth, conf.panelHeight = self.miniFrame.GetSize()
+            self.miniFrame.Iconize()
+        evt.Skip()
+
     def OnCloseWindow(self, evt):
         if not self.AskSave(): return
         if g.testWin: g.testWin.Destroy()
@@ -965,9 +1009,6 @@ Homepage: http://xrced.sourceforge.net\
 
     def Clear(self):
         self.dataFile = ''
-        if self.clipboard:
-            self.clipboard.unlink()
-            self.clipboard = None
         undoMan.Clear()
         self.SetModified(False)
         tree.Clear()
@@ -1053,6 +1094,10 @@ Homepage: http://xrced.sourceforge.net\
             #self.domCopy = tree.dom.cloneNode(True)
             self.domCopy = MyDocument()
             mainNode = self.domCopy.appendChild(tree.mainNode.cloneNode(True))
+            # Remove first child (test element)
+            testElem = mainNode.firstChild
+            mainNode.removeChild(testElem)
+            testElem.unlink()
             self.Indent(mainNode)
             self.domCopy.writexml(f, encoding = g.currentEncoding)
             f.close()