]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wx/tools/XRCed/xrced.py
Respect the REUSEADDR flag to allow rebinding; bind to local port prior to connecting...
[wxWidgets.git] / wxPython / wx / tools / XRCed / xrced.py
index a68597b7fd51e55943f7b06da312732ecb75a257..fcc27120a7d601732c26321d8aa956d2c035fb01 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
@@ -54,7 +54,7 @@ Consult README file for the details.</HTML>
 
 defaultIDs = {xxxPanel:'PANEL', xxxDialog:'DIALOG', xxxFrame:'FRAME',
               xxxMenuBar:'MENUBAR', xxxMenu:'MENU', xxxToolBar:'TOOLBAR',
-              xxxWizard:'WIZARD'}
+              xxxWizard:'WIZARD', xxxBitmap:'BITMAP', xxxIcon:'ICON'}
 
 defaultName = 'UNTITLED.xrc'
 
@@ -207,8 +207,8 @@ class Frame(wxFrame):
                          'Refresh', 'Refresh view')
         tb.AddSimpleTool(self.ID_AUTO_REFRESH, images.getAutoRefreshBitmap(),
                          'Auto-refresh', 'Toggle auto-refresh mode', True)
-        if wxPlatform == '__WXGTK__':
-            tb.AddSeparator()   # otherwise auto-refresh sticks in status line
+#        if wxPlatform == '__WXGTK__':
+#            tb.AddSeparator()   # otherwise auto-refresh sticks in status line
         tb.ToggleTool(self.ID_AUTO_REFRESH, conf.autoRefresh)
         tb.Realize()
  
@@ -306,7 +306,6 @@ class Frame(wxFrame):
         self.SetSizer(sizer)
 
         # Initialize
-        self.clipboard = None
         self.Clear()
 
         # Other events
@@ -414,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):
@@ -443,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)
 
@@ -471,7 +482,8 @@ class Frame(wxFrame):
             if not parent.__class__ in [xxxMainNode, xxxMenuBar, xxxMenu]: error = True
         elif x.__class__ == xxxMenuItem:
             if not parent.__class__ in [xxxMenuBar, xxxMenu]: error = True
-        elif x.isSizer and parent.__class__ == xxxNotebook: error = True
+        elif x.isSizer and parent.__class__ in [xxxNotebook, xxxChoicebook, xxxListbook]:
+            error = True
         else:                           # normal controls can be almost anywhere
             if parent.__class__ == xxxMainNode or \
                parent.__class__ in [xxxMenuBar, xxxMenu]: error = True
@@ -486,10 +498,11 @@ class Frame(wxFrame):
         # If parent is sizer or notebook, child is of wrong class or
         # parent is normal window, child is child container then detach child.
         isChildContainer = isinstance(xxx, xxxChildContainer)
+        parentIsBook = parent.__class__ in [xxxNotebook, xxxChoicebook, xxxListbook]
         if isChildContainer and \
            ((parent.isSizer and not isinstance(xxx, xxxSizerItem)) or \
-            (isinstance(parent, xxxNotebook) and not isinstance(xxx, xxxNotebookPage)) or \
-           not (parent.isSizer or isinstance(parent, xxxNotebook))):
+            (parentIsBook and not isinstance(xxx, xxxPage)) or \
+           not (parent.isSizer or parentIsBook)):
             elem.removeChild(xxx.child.element) # detach child
             elem.unlink()           # delete child container
             elem = xxx.child.element # replace
@@ -506,6 +519,14 @@ class Frame(wxFrame):
             pageElem = MakeEmptyDOM('notebookpage')
             pageElem.appendChild(elem)
             elem = pageElem
+        elif isinstance(parent, xxxChoicebook) and not isChildContainer:
+            pageElem = MakeEmptyDOM('choicebookpage')
+            pageElem.appendChild(elem)
+            elem = pageElem
+        elif isinstance(parent, xxxListbook) and not isChildContainer:
+            pageElem = MakeEmptyDOM('listbookpage')
+            pageElem.appendChild(elem)
+            elem = pageElem
         # Insert new node, register undo
         newItem = tree.InsertNode(parentLeaf, parent, elem, nextItem)
         undoMan.RegisterUndo(UndoPasteCreate(parentLeaf, parent, newItem, selected))
@@ -553,8 +574,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
@@ -935,7 +959,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]:
@@ -946,19 +970,28 @@ Homepage: http://xrced.sourceforge.net\
     def OnIdle(self, evt):
         if self.inIdle: return          # Recursive call protection
         self.inIdle = True
-        if tree.needUpdate:
-            if conf.autoRefresh:
-                if g.testWin:
-                    self.SetStatusText('Refreshing test window...')
-                    # (re)create
-                    tree.CreateTestWin(g.testWin.item)
-                    self.SetStatusText('')
-                tree.needUpdate = False
-        elif tree.pendingHighLight:
-            tree.HighLight(tree.pendingHighLight)
-        else:
-            evt.Skip()
-        self.inIdle = False
+        try:
+            if tree.needUpdate:
+                if conf.autoRefresh:
+                    if g.testWin:
+                        self.SetStatusText('Refreshing test window...')
+                        # (re)create
+                        tree.CreateTestWin(g.testWin.item)
+                        self.SetStatusText('')
+                    tree.needUpdate = False
+            elif tree.pendingHighLight:
+                try:
+                    tree.HighLight(tree.pendingHighLight)
+                except:
+                    # Remove highlight if any problem
+                    if g.testWin.highLight:
+                        g.testWin.highLight.Remove()
+                    tree.pendingHighLight = None
+                    raise
+            else:
+                evt.Skip()
+        finally:
+            self.inIdle = False
 
     # We don't let close panel window
     def OnCloseMiniFrame(self, evt):
@@ -995,9 +1028,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()
@@ -1007,9 +1037,10 @@ Homepage: http://xrced.sourceforge.net\
             g.testWin = None
         # Numbers for new controls
         self.maxIDs = {}
-        self.maxIDs[xxxPanel] = self.maxIDs[xxxDialog] = self.maxIDs[xxxFrame] = \
-        self.maxIDs[xxxMenuBar] = self.maxIDs[xxxMenu] = self.maxIDs[xxxToolBar] = \
-        self.maxIDs[xxxWizard] = 0
+        for cl in [xxxPanel, xxxDialog, xxxFrame,
+                   xxxMenuBar, xxxMenu, xxxToolBar,
+                   xxxWizard, xxxBitmap, xxxIcon]:
+            self.maxIDs[cl] = 0
 
     def SetModified(self, state=True):
         self.modified = state
@@ -1127,6 +1158,11 @@ def usage():
 
 class App(wxApp):
     def OnInit(self):
+        # Check version
+        if wxVERSION[:3] < MinWxVersion:
+            wxLogWarning('''\
+This version of XRCed may not work correctly on your version of wxWindows. \
+Please upgrade wxWindows to %d.%d.%d or higher.''' % MinWxVersion)
         global debug
         # Process comand-line
         opts = args = None