X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/83173c7a4d79083bc3ad7dd08a399cf970559e80..716a5baa6ecd0d5d0c31914567e4da3165ca6ff0:/wxPython/wx/tools/XRCed/tree.py diff --git a/wxPython/wx/tools/XRCed/tree.py b/wxPython/wx/tools/XRCed/tree.py index 01867d750f..77a86720de 100644 --- a/wxPython/wx/tools/XRCed/tree.py +++ b/wxPython/wx/tools/XRCed/tree.py @@ -56,6 +56,7 @@ class ID_NEW: TOOL = wxNewId() MENU_BAR = wxNewId() MENU = wxNewId() + STATUS_BAR = wxNewId() STATIC_TEXT = wxNewId() TEXT_CTRL = wxNewId() @@ -82,16 +83,21 @@ class ID_NEW: LIST_CTRL = wxNewId() CHECK_LIST = wxNewId() NOTEBOOK = wxNewId() + CHOICEBOOK = wxNewId() + LISTBOOK = wxNewId() SPLITTER_WINDOW = wxNewId() SCROLLED_WINDOW = wxNewId() HTML_WINDOW = wxNewId() CALENDAR_CTRL = wxNewId() + DATE_CTRL = wxNewId() GENERIC_DIR_CTRL = wxNewId() SPIN_CTRL = wxNewId() UNKNOWN = wxNewId() WIZARD = wxNewId() WIZARD_PAGE = wxNewId() WIZARD_PAGE_SIMPLE = wxNewId() + BITMAP = wxNewId() + ICON = wxNewId() STATUS_BAR = wxNewId() BOX_SIZER = wxNewId() @@ -151,9 +157,12 @@ class PullDownMenu: ID_NEW.WIZARD_PAGE_SIMPLE: 'wxWizardPageSimple', ID_NEW.TOOL_BAR: 'wxToolBar', ID_NEW.TOOL: 'tool', + ID_NEW.STATUS_BAR: 'wxStatusBar', ID_NEW.MENU_BAR: 'wxMenuBar', ID_NEW.MENU: 'wxMenu', ID_NEW.MENU_ITEM: 'wxMenuItem', + ID_NEW.BITMAP: 'wxBitmap', + ID_NEW.ICON: 'wxIcon', ID_NEW.SEPARATOR: 'separator', ID_NEW.STATIC_TEXT: 'wxStaticText', @@ -170,6 +179,7 @@ class PullDownMenu: ID_NEW.RADIO_BOX: 'wxRadioBox', ID_NEW.COMBO_BOX: 'wxComboBox', ID_NEW.LIST_BOX: 'wxListBox', + ID_NEW.CHECK_LIST: 'wxCheckListBox', ID_NEW.STATIC_LINE: 'wxStaticLine', ID_NEW.STATIC_BITMAP: 'wxStaticBitmap', @@ -179,12 +189,14 @@ class PullDownMenu: ID_NEW.SCROLL_BAR: 'wxScrollBar', ID_NEW.TREE_CTRL: 'wxTreeCtrl', ID_NEW.LIST_CTRL: 'wxListCtrl', - ID_NEW.CHECK_LIST: 'wxCheckListBox', ID_NEW.NOTEBOOK: 'wxNotebook', + ID_NEW.CHOICEBOOK: 'wxChoicebook', + ID_NEW.LISTBOOK: 'wxListbook', ID_NEW.SPLITTER_WINDOW: 'wxSplitterWindow', ID_NEW.SCROLLED_WINDOW: 'wxScrolledWindow', ID_NEW.HTML_WINDOW: 'wxHtmlWindow', ID_NEW.CALENDAR_CTRL: 'wxCalendarCtrl', + ID_NEW.DATE_CTRL: 'wxDatePickerCtrl', ID_NEW.GENERIC_DIR_CTRL: 'wxGenericDirCtrl', ID_NEW.SPIN_CTRL: 'wxSpinCtrl', @@ -214,13 +226,19 @@ class PullDownMenu: None, (ID_NEW.TOOL_BAR, 'ToolBar', 'Create toolbar'), (ID_NEW.MENU_BAR, 'MenuBar', 'Create menubar'), - (ID_NEW.MENU, 'Menu', 'Create menu') + (ID_NEW.MENU, 'Menu', 'Create menu'), + None, + (ID_NEW.BITMAP, 'Bitmap', 'Create bitmap'), + (ID_NEW.ICON, 'Icon', 'Create icon'), ] self.containers = [ (ID_NEW.PANEL, 'Panel', 'Create panel'), (ID_NEW.NOTEBOOK, 'Notebook', 'Create notebook control'), + (ID_NEW.CHOICEBOOK, 'Choicebook', 'Create choicebook control'), + (ID_NEW.LISTBOOK, 'Listbook', 'Create listbook control'), (ID_NEW.SPLITTER_WINDOW, 'SplitterWindow', 'Create splitter window'), (ID_NEW.TOOL_BAR, 'ToolBar', 'Create toolbar'), + (ID_NEW.STATUS_BAR, 'StatusBar', 'Create status bar'), # (ID_NEW.WIZARD_PAGE, 'WizardPage', 'Create wizard page'), (ID_NEW.WIZARD_PAGE_SIMPLE, 'WizardPageSimple', 'Create simple wizard page'), ] @@ -250,10 +268,10 @@ class PullDownMenu: (ID_NEW.SCROLL_BAR, 'ScrollBar', 'Create scroll bar'), (ID_NEW.TREE_CTRL, 'TreeCtrl', 'Create tree'), (ID_NEW.LIST_CTRL, 'ListCtrl', 'Create list'), - (ID_NEW.CHECK_LIST, 'CheckList', 'Create check list'), (ID_NEW.SCROLLED_WINDOW, 'ScrolledWindow', 'Create scrolled window'), (ID_NEW.HTML_WINDOW, 'HtmlWindow', 'Create HTML window'), (ID_NEW.CALENDAR_CTRL, 'CalendarCtrl', 'Create calendar control'), + (ID_NEW.DATE_CTRL, 'DatePickerCtrl', 'Create date picker control'), (ID_NEW.GENERIC_DIR_CTRL, 'GenericDirCtrl', 'Create generic dir control'), (ID_NEW.UNKNOWN, 'Unknown', 'Create custom control placeholder'), ], @@ -270,12 +288,16 @@ class PullDownMenu: (ID_NEW.RADIO_BOX, 'RadioBox', 'Create radio box'), (ID_NEW.COMBO_BOX, 'ComboBox', 'Create combo box'), (ID_NEW.LIST_BOX, 'ListBox', 'Create list box'), + (ID_NEW.CHECK_LIST, 'CheckListBox', 'Create checklist box'), ], ['container', 'Containers', (ID_NEW.PANEL, 'Panel', 'Create panel'), (ID_NEW.NOTEBOOK, 'Notebook', 'Create notebook control'), + (ID_NEW.CHOICEBOOK, 'Choicebook', 'Create choicebook control'), + (ID_NEW.LISTBOOK, 'Listbook', 'Create listbook control'), (ID_NEW.SPLITTER_WINDOW, 'SplitterWindow', 'Create splitter window'), (ID_NEW.TOOL_BAR, 'ToolBar', 'Create toolbar'), + (ID_NEW.STATUS_BAR, 'StatusBar', 'Create status bar'), # (ID_NEW.WIZARD_PAGE, 'Wizard Page', 'Create wizard page'), (ID_NEW.WIZARD_PAGE_SIMPLE, 'WizardPageSimple', 'Create simple wizard page'), ], @@ -311,7 +333,6 @@ class PullDownMenu: (ID_NEW.GAUGE, 'Gauge', 'Create gauge'), (ID_NEW.SCROLL_BAR, 'ScrollBar', 'Create scroll bar'), (ID_NEW.LIST_CTRL, 'ListCtrl', 'Create list control'), - (ID_NEW.CHECK_LIST, 'CheckList', 'Create check list'), ], ['button', 'Buttons', (ID_NEW.BUTTON, 'Button', 'Create button'), @@ -325,6 +346,7 @@ class PullDownMenu: (ID_NEW.RADIO_BOX, 'RadioBox', 'Create radio box'), (ID_NEW.COMBO_BOX, 'ComboBox', 'Create combo box'), (ID_NEW.LIST_BOX, 'ListBox', 'Create list box'), + (ID_NEW.CHECK_LIST, 'CheckListBox', 'Create checklist box'), ], ] self.stdButtons = [ @@ -365,7 +387,7 @@ def SetMenu(m, list, shift=False): apply(m.Append, l) elif type(l) == types.ListType: subMenu = wxMenu() - SetMenu(subMenu, l[2:]) + SetMenu(subMenu, l[2:], shift) m.AppendMenu(wxNewId(), l[0], subMenu, l[1]) else: # separator m.AppendSeparator() @@ -419,7 +441,7 @@ class XML_Tree(wxTreeCtrl): EVT_TREE_ITEM_COLLAPSED(self, self.GetId(), self.OnItemExpandedCollapsed) self.selection = None - self.selectionChanging = False + self.selectionChanging = False self.needUpdate = False self.pendingHighLight = None self.ctrl = self.shift = False @@ -475,6 +497,8 @@ class XML_Tree(wxTreeCtrl): # Clear tree def Clear(self): + self.selection = None + self.UnselectAll() self.DeleteAllItems() # Add minimal structure if self.dom: self.dom.unlink() @@ -487,11 +511,14 @@ class XML_Tree(wxTreeCtrl): self.root = self.AddRoot('XML tree', self.rootImage, data=wxTreeItemData(self.rootObj)) self.SetItemHasChildren(self.root) - self.UnselectAll() + self.testElem = self.dom.createElement('dummy') + self.mainNode.appendChild(self.testElem) self.Expand(self.root) # Clear old data and set new def SetData(self, dom): + self.selection = None + self.UnselectAll() self.DeleteAllItems() # Add minimal structure if self.dom: self.dom.unlink() @@ -510,8 +537,13 @@ class XML_Tree(wxTreeCtrl): else: self.mainNode.removeChild(node) node.unlink() + if self.mainNode.firstChild: + self.testElem = self.dom.createElement('dummy') + self.mainNode.insertBefore(self.testElem, self.mainNode.firstChild) + else: + self.testElem = self.dom.createElement('dummy') + self.mainNode.appendChild(self.testElem) self.Expand(self.root) - self.UnselectAll() # Add tree item for given parent item if node is DOM element node with # object/object_ref tag. xxxParent is parent xxx object @@ -582,15 +614,16 @@ class XML_Tree(wxTreeCtrl): # Root at (0,0) if item == g.testWin.item: return wxPoint(0, 0) itemParent = self.GetItemParent(item) - # Select NB page + # Select book page if not obj: obj = self.FindNodeObject(item) - if self.GetPyData(itemParent).treeObject().__class__ == xxxNotebook: - notebook = self.FindNodeObject(itemParent) + if self.GetPyData(itemParent).treeObject().__class__ in \ + [xxxNotebook, xxxChoicebook, xxxListbook]: + book = self.FindNodeObject(itemParent) # Find position - for i in range(notebook.GetPageCount()): - if notebook.GetPage(i) == obj: - if notebook.GetSelection() != i: - notebook.SetSelection(i) + for i in range(book.GetPageCount()): + if book.GetPage(i) == obj: + if book.GetSelection() != i: + book.SetSelection(i) # Remove highlight - otherwise highlight window won't be visible if g.testWin.highLight: g.testWin.highLight.Remove() @@ -620,8 +653,12 @@ class XML_Tree(wxTreeCtrl): # Top-level sizer? return window's sizer if xxx.isSizer and isinstance(parentWin, wxWindow): return parentWin.GetSizer() + elif isinstance(xxx, xxxStatusBar): return None + elif isinstance(xxx, xxxToolBar): + # If it's the main toolbar, we can't really select it + if xxx.parent.__class__ == xxxFrame: return None elif isinstance(xxx.parent, xxxToolBar): - # How to get tool from toolbar? + # Select complete toolbar return parentWin elif isinstance(xxx.parent, xxxStdDialogButtonSizer): # This sizer returns non-existing children @@ -629,6 +666,9 @@ class XML_Tree(wxTreeCtrl): if ch.GetWindow() and ch.GetWindow().GetName() == xxx.name: return ch.GetWindow() return None + elif xxx.parent.__class__ in [xxxChoicebook, xxxListbook]: + # First window is controld + return parentWin.GetChildren()[self.ItemIndex(item)+1] # Otherwise get parent's object and it's child child = parentWin.GetChildren()[self.ItemIndex(item)] # Return window or sizer for sizer items @@ -636,17 +676,17 @@ class XML_Tree(wxTreeCtrl): if child.IsWindow(): child = child.GetWindow() elif child.IsSizer(): child = child.GetSizer() - # Test for notebook sizers + # Test for notebook sizers (deprecated) if isinstance(child, wxNotebookSizer): - child = child.GetNotebook() + child = child.GetNotebook() return child def OnSelChanged(self, evt): if self.selectionChanging: return - self.selectionChanging = True + self.selectionChanging = True self.UnselectAll() self.SelectItem(evt.GetItem()) - self.selectionChanging = False + self.selectionChanging = False def ChangeSelection(self, item): # Apply changes @@ -716,18 +756,29 @@ class XML_Tree(wxTreeCtrl): xxx = self.GetPyData(item) if g.panel.IsModified(): self.Apply(xxx, item) # apply changes - treeObj = xxx.treeObject() - if treeObj.className not in ['wxFrame', 'wxPanel', 'wxDialog', - 'wxMenuBar', 'wxToolBar', 'wxWizard', - 'wxWizardPageSimple']: + availableViews = ['wxFrame', 'wxPanel', 'wxDialog', + 'wxMenuBar', 'wxToolBar', 'wxWizard', + 'wxWizardPageSimple'] + originalItem = item + # Walk up the tree until we find an item that has a view + while item and self.GetPyData(item).treeObject().className not in availableViews: + item = self.GetItemParent(item) + if not item or not item.IsOk(): wxLogMessage('No view for this element (yet)') return # Show item in bold if g.testWin: # Reset old self.SetItemBold(g.testWin.item, False) - self.CreateTestWin(item) + try: + wxBeginBusyCursor() + self.CreateTestWin(item) + finally: + wxEndBusyCursor() # Maybe an error occurred, so we need to test - if g.testWin: self.SetItemBold(g.testWin.item) + if g.testWin: + self.SetItemBold(g.testWin.item) + # Select original item + self.ChangeSelection(originalItem) # Double-click on Linux def OnItemActivated(self, evt): @@ -765,8 +816,6 @@ class XML_Tree(wxTreeCtrl): # self.CreateTestWin(child) # return - wxBeginBusyCursor() - wxYield() # Close old window, remember where it was highLight = None if testWin: @@ -792,33 +841,30 @@ class XML_Tree(wxTreeCtrl): # Save in memory FS memFile = MemoryFile('xxx.xrc') # Create memory XML file - elem = xxx.element - # Change window id to _XRCED_T_W. This gives some name for - # unnamed windows, and for named gives the possibility to - # write sawfish scripts. + elem = xxx.element.cloneNode(True) if not xxx.name: name = 'noname' else: name = xxx.name elem.setAttribute('name', STD_NAME) + oldTestNode = self.testElem + self.testElem = elem + self.mainNode.replaceChild(elem, oldTestNode) + oldTestNode.unlink() # Replace wizard page class temporarily if xxx.__class__ in [xxxWizardPage, xxxWizardPageSimple]: oldCl = elem.getAttribute('class') elem.setAttribute('class', 'wxPanel') parent = elem.parentNode - next = elem.nextSibling encd = self.rootObj.params['encoding'].value() if not encd: encd = None - self.dom.writexml(open('ttt.xrc','w'), encoding=encd) - self.dom.writexml(memFile, encoding=encd) - # Put back in place - # Remove temporary name or restore changed - if not xxx.name: - elem.removeAttribute('name') - else: - elem.setAttribute('name', xxx.name) - if xxx.__class__ in [xxxWizardPage, xxxWizardPageSimple]: - elem.setAttribute('class', oldCl) + try: + self.dom.writexml(memFile, encoding=encd) + except: + inf = sys.exc_info() + wxLogError(traceback.format_exception(inf[0], inf[1], None)[-1]) + wxLogError('Error writing temporary file') + if debug: raise memFile.close() # write to wxMemoryFS xmlFlags = wxXRC_NO_SUBCLASSING # Use translations if encoding is not specified @@ -842,7 +888,7 @@ class XML_Tree(wxTreeCtrl): res.LoadOnFrame(testWin, g.frame, STD_NAME) # Create status bar testWin.panel = testWin - testWin.CreateStatusBar() + #testWin.CreateStatusBar() testWin.SetClientSize(testWin.GetBestSize()) testWin.SetPosition(pos) testWin.Show(True) @@ -923,7 +969,6 @@ class XML_Tree(wxTreeCtrl): wxLogError(traceback.format_exception(inf[0], inf[1], None)[-1]) wxLogError('Error loading resource') wxMemoryFSHandler_RemoveFile('xxx.xrc') - wxEndBusyCursor() def CloseTestWindow(self): if not g.testWin: return @@ -972,7 +1017,7 @@ class XML_Tree(wxTreeCtrl): # Override to use like single-selection tree def GetSelection(self): - self.GetSelections(self)[:1] + return self.selection def SelectItem(self, item): self.UnselectAll() self.ChangeSelection(item) @@ -1021,7 +1066,7 @@ class XML_Tree(wxTreeCtrl): SetMenu(m, pullDownMenu.stdButtons) else: SetMenu(m, pullDownMenu.controls) - if xxx.__class__ == xxxNotebook: + if xxx.__class__ in [xxxNotebook, xxxChoicebook, xxxListbook]: m.Enable(m.FindItem('sizer'), False) elif not (xxx.isSizer or xxx.parent and xxx.parent.isSizer): m.Enable(ID_NEW.SPACER, False)