2 # Purpose:      XRC editor, toolbar 
   3 # Author:       Roman Rolinsky <rolinsky@mema.ucl.ac.be> 
   7 from xxx 
import *                       # xxx imports globals and params 
   8 from tree 
import ID_NEW
 
  15 GROUP_WINDOWS
, GROUP_MENUS
, GROUP_SIZERS
, GROUP_CONTROLS 
= range(GROUPNUM
) 
  17 # States depending on current selection and Control/Shift keys 
  18 STATE_ROOT
, STATE_MENUBAR
, STATE_TOOLBAR
, STATE_MENU
, STATE_ELSE 
= range(5) 
  20 # Left toolbar for GUI elements 
  23     def __init__(self
, parent
): 
  24         if wxPlatform 
== '__WXGTK__': 
  25             wxPanel
.__init
__(self
, parent
, -1, 
  26                              style
=wxRAISED_BORDER|wxWANTS_CHARS
) 
  28             wxPanel
.__init
__(self
, parent
, -1, style
=wxWANTS_CHARS
) 
  29         # Create sizer for groups 
  30         self
.sizer 
= wxBoxSizer(wxVERTICAL
) 
  31         # Data to create buttons 
  32         pullDownMenu 
= g
.pullDownMenu
 
  34         self
.ctrl 
= self
.shift 
= False 
  35         # Current state (what to enable/disable) 
  39              (ID_NEW
.FRAME
, images
.getToolFrameBitmap()), 
  40              (ID_NEW
.DIALOG
, images
.getToolDialogBitmap()), 
  41              (ID_NEW
.PANEL
, images
.getToolPanelBitmap())], 
  43              (ID_NEW
.TOOL_BAR
, images
.getToolToolBarBitmap()), 
  44              (ID_NEW
.MENU_BAR
, images
.getToolMenuBarBitmap()), 
  45              (ID_NEW
.MENU
, images
.getToolMenuBitmap()), 
  46              (ID_NEW
.TOOL
, images
.getToolToolBitmap()), 
  47              (ID_NEW
.MENU_ITEM
, images
.getToolMenuItemBitmap()), 
  48              (ID_NEW
.SEPARATOR
, images
.getToolSeparatorBitmap())], 
  50              (ID_NEW
.BOX_SIZER
, images
.getToolBoxSizerBitmap()), 
  51              (ID_NEW
.STATIC_BOX_SIZER
, images
.getToolStaticBoxSizerBitmap()), 
  52              (ID_NEW
.GRID_SIZER
, images
.getToolGridSizerBitmap()), 
  53              (ID_NEW
.FLEX_GRID_SIZER
, images
.getToolFlexGridSizerBitmap()), 
  54              (ID_NEW
.GRID_BAG_SIZER
, images
.getToolGridBagSizerBitmap()), 
  55              (ID_NEW
.SPACER
, images
.getToolSpacerBitmap())], 
  57              (ID_NEW
.STATIC_TEXT
, images
.getToolStaticTextBitmap()), 
  58              (ID_NEW
.STATIC_BITMAP
, images
.getToolStaticBitmapBitmap()), 
  59              (ID_NEW
.STATIC_LINE
, images
.getToolStaticLineBitmap()), 
  61              (ID_NEW
.BUTTON
, images
.getToolButtonBitmap()), 
  62              (ID_NEW
.BITMAP_BUTTON
, images
.getToolBitmapButtonBitmap()), 
  63              (ID_NEW
.STATIC_BOX
, images
.getToolStaticBoxBitmap()), 
  65              (ID_NEW
.TEXT_CTRL
, images
.getToolTextCtrlBitmap()), 
  66              (ID_NEW
.COMBO_BOX
, images
.getToolComboBoxBitmap()), 
  67              (ID_NEW
.CHOICE
, images
.getToolChoiceBitmap()), 
  69              (ID_NEW
.RADIO_BUTTON
, images
.getToolRadioButtonBitmap()), 
  70              (ID_NEW
.CHECK_BOX
, images
.getToolCheckBoxBitmap()), 
  71              (ID_NEW
.RADIO_BOX
, images
.getToolRadioBoxBitmap()), 
  73              (ID_NEW
.SPIN_CTRL
, images
.getToolSpinCtrlBitmap()), 
  74              (ID_NEW
.SPIN_BUTTON
, images
.getToolSpinButtonBitmap()), 
  75              (ID_NEW
.SCROLL_BAR
, images
.getToolScrollBarBitmap()), 
  77              (ID_NEW
.SLIDER
, images
.getToolSliderBitmap()), 
  78              (ID_NEW
.GAUGE
, images
.getToolGaugeBitmap()), 
  79              (ID_NEW
.TREE_CTRL
, images
.getToolTreeCtrlBitmap()), 
  81              (ID_NEW
.LIST_BOX
, images
.getToolListBoxBitmap()), 
  82              (ID_NEW
.CHECK_LIST
, images
.getToolCheckListBitmap()), 
  83              (ID_NEW
.LIST_CTRL
, images
.getToolListCtrlBitmap()), 
  85              (ID_NEW
.NOTEBOOK
, images
.getToolNotebookBitmap()), 
  86              (ID_NEW
.SPLITTER_WINDOW
, images
.getToolSplitterWindowBitmap()), 
  88              (ID_NEW
.UNKNOWN
, images
.getToolUnknownBitmap())] 
  93                 self
.AddButton(b
[0], b
[1], g
.pullDownMenu
.createMap
[b
[0]]) 
  94         self
.SetAutoLayout(True) 
  95         self
.SetSizerAndFit(self
.sizer
) 
  96         # Allow to be resized in vertical direction only 
  97         self
.SetSizeHints(self
.GetSize()[0], -1) 
  99         EVT_COMMAND_RANGE(self
, ID_NEW
.PANEL
, ID_NEW
.LAST
, 
 100                           wxEVT_COMMAND_BUTTON_CLICKED
, g
.frame
.OnCreate
) 
 101         EVT_KEY_DOWN(self
, self
.OnKeyDown
) 
 102         EVT_KEY_UP(self
, self
.OnKeyUp
) 
 104     def AddButton(self
, id, image
, text
): 
 105         from wxPython
.lib 
import buttons
 
 106         button 
= buttons
.wxGenBitmapButton(self
, id, image
, size
=self
.TOOL_SIZE
, 
 107                                            style
=wxNO_BORDER|wxWANTS_CHARS
) 
 108         button
.SetBezelWidth(0) 
 109         EVT_KEY_DOWN(button
, self
.OnKeyDown
) 
 110         EVT_KEY_UP(button
, self
.OnKeyUp
) 
 111         button
.SetToolTipString(text
) 
 112         self
.curSizer
.Add(button
) 
 113         self
.groups
[-1][1][id] = button
 
 115     def AddGroup(self
, name
): 
 116         # Each group is inside box 
 117         box 
= wxStaticBox(self
, -1, name
, style
=wxWANTS_CHARS
) 
 118         box
.SetFont(g
.smallerFont()) 
 119         boxSizer 
= wxStaticBoxSizer(box
, wxVERTICAL
) 
 121         self
.curSizer 
= wxGridSizer(0, 3) 
 122         boxSizer
.Add(self
.curSizer
) 
 123         self
.sizer
.Add(boxSizer
, 0, wxTOP | wxLEFT | wxRIGHT
, 4) 
 124         self
.groups
.append((box
,{})) 
 126     # Enable/disable group 
 127     def EnableGroup(self
, gnum
, enable 
= True): 
 128         grp 
= self
.groups
[gnum
] 
 129         grp
[0].Enable(enable
) 
 130         for b 
in grp
[1].values(): b
.Enable(enable
) 
 132     # Enable/disable group item 
 133     def EnableGroupItem(self
, gnum
, id, enable 
= True): 
 134         grp 
= self
.groups
[gnum
] 
 135         grp
[1][id].Enable(enable
) 
 137     # Enable/disable group items 
 138     def EnableGroupItems(self
, gnum
, ids
, enable 
= True): 
 139         grp 
= self
.groups
[gnum
] 
 141             grp
[1][id].Enable(enable
) 
 144     def OnKeyDown(self
, evt
): 
 145         if evt
.GetKeyCode() == WXK_CONTROL
: 
 147         elif evt
.GetKeyCode() == WXK_SHIFT
: 
 149         self
.UpdateIfNeeded() 
 152     def OnKeyUp(self
, evt
): 
 153         if evt
.GetKeyCode() == WXK_CONTROL
: 
 155         elif evt
.GetKeyCode() == WXK_SHIFT
: 
 157         self
.UpdateIfNeeded() 
 160     def OnMouse(self
, evt
): 
 161         # Update control and shift states 
 162         g
.tree
.ctrl 
= evt
.ControlDown() 
 163         g
.tree
.shift 
= evt
.ShiftDown() 
 164         self
.UpdateIfNeeded() 
 167     # Update UI after key presses, if necessary 
 168     def UpdateIfNeeded(self
): 
 170         if self
.ctrl 
!= tree
.ctrl 
or self
.shift 
!= tree
.shift
: 
 171             # Enabling is needed only for ctrl 
 172             if self
.ctrl 
!= tree
.ctrl
: self
.UpdateUI() 
 173             self
.ctrl 
= tree
.ctrl
 
 174             self
.shift 
= tree
.shift
 
 181             g
.frame
.SetStatusText(status
, 1) 
 185         if not self
.IsShown(): return 
 187         pullDownMenu 
= g
.pullDownMenu
 
 189         item 
= tree
.selection
 
 190         # If nothing selected, disable everything and return 
 193             for grp 
in range(GROUPNUM
): 
 194                 self
.EnableGroup(grp
, False) 
 197         if tree
.ctrl
: needInsert 
= True 
 198         else: needInsert 
= tree
.NeedInsert(item
) 
 199         # Enable depending on selection 
 200         if item 
== tree
.root 
or needInsert 
and tree
.GetItemParent(item
) == tree
.root
: 
 203             xxx 
= tree
.GetPyData(item
).treeObject() 
 204             # Check parent for possible child nodes if inserting sibling 
 205             if needInsert
: xxx 
= xxx
.parent
 
 206             if xxx
.__class
__ == xxxMenuBar
: 
 207                 state 
= STATE_MENUBAR
 
 208             elif xxx
.__class
__ in [xxxToolBar
, xxxTool
] or \
 
 209                  xxx
.__class
__ == xxxSeparator 
and xxx
.parent
.__class
__ == xxxToolBar
: 
 210                 state 
= STATE_TOOLBAR
 
 211             elif xxx
.__class
__ in [xxxMenu
, xxxMenuItem
]: 
 216         # Enable depending on selection 
 217         if state 
!= self
.state
: 
 219             for grp 
in range(GROUPNUM
): 
 220                 self
.EnableGroup(grp
, False) 
 222             if state 
== STATE_ROOT
: 
 223                 self
.EnableGroup(GROUP_WINDOWS
, True) 
 224                 self
.EnableGroup(GROUP_MENUS
, True) 
 226                 self
.EnableGroupItems(GROUP_MENUS
, 
 231             elif state 
== STATE_MENUBAR
: 
 232                 self
.EnableGroup(GROUP_MENUS
) 
 233                 self
.EnableGroupItems(GROUP_MENUS
, 
 238             elif state 
== STATE_TOOLBAR
: 
 239                 self
.EnableGroup(GROUP_MENUS
) 
 240                 self
.EnableGroupItems(GROUP_MENUS
, 
 246                 self
.EnableGroup(GROUP_CONTROLS
) 
 247                 self
.EnableGroupItems(GROUP_CONTROLS
, 
 250                                         ID_NEW
.SPLITTER_WINDOW 
], 
 252             elif state 
== STATE_MENU
: 
 253                 self
.EnableGroup(GROUP_MENUS
) 
 254                 self
.EnableGroupItems(GROUP_MENUS
, 
 260                 self
.EnableGroup(GROUP_WINDOWS
) 
 261                 self
.EnableGroupItems(GROUP_WINDOWS
, 
 265                 self
.EnableGroup(GROUP_MENUS
) 
 266                 self
.EnableGroupItems(GROUP_MENUS
, 
 274                 self
.EnableGroup(GROUP_SIZERS
) 
 275                 self
.EnableGroup(GROUP_CONTROLS
) 
 276         # Special case for notebook (always executed) 
 277         if state 
== STATE_ELSE
: 
 278             if xxx
.__class
__ == xxxNotebook
: 
 279                 self
.EnableGroup(GROUP_SIZERS
, False) 
 281                 self
.EnableGroup(GROUP_SIZERS
) 
 282                 if not (xxx
.isSizer 
or xxx
.parent 
and xxx
.parent
.isSizer
): 
 283                     self
.EnableGroupItem(GROUP_SIZERS
, ID_NEW
.SPACER
, False)