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()), 
  87              (ID_NEW
.UNKNOWN
, images
.getToolUnknownBitmap())] 
  92                 self
.AddButton(b
[0], b
[1], g
.pullDownMenu
.createMap
[b
[0]]) 
  93         self
.SetAutoLayout(True) 
  94         self
.SetSizerAndFit(self
.sizer
) 
  95         # Allow to be resized in vertical direction only 
  96         self
.SetSizeHints(self
.GetSize()[0], -1) 
  98         EVT_COMMAND_RANGE(self
, ID_NEW
.PANEL
, ID_NEW
.LAST
, 
  99                           wxEVT_COMMAND_BUTTON_CLICKED
, g
.frame
.OnCreate
) 
 100         EVT_KEY_DOWN(self
, self
.OnKeyDown
) 
 101         EVT_KEY_UP(self
, self
.OnKeyUp
) 
 103     def AddButton(self
, id, image
, text
): 
 104         from wxPython
.lib 
import buttons
 
 105         button 
= buttons
.wxGenBitmapButton(self
, id, image
, size
=self
.TOOL_SIZE
, 
 106                                            style
=wxNO_BORDER|wxWANTS_CHARS
) 
 107         button
.SetBezelWidth(0) 
 108         EVT_KEY_DOWN(button
, self
.OnKeyDown
) 
 109         EVT_KEY_UP(button
, self
.OnKeyUp
) 
 110         button
.SetToolTipString(text
) 
 111         self
.curSizer
.Add(button
) 
 112         self
.groups
[-1][1][id] = button
 
 114     def AddGroup(self
, name
): 
 115         # Each group is inside box 
 116         box 
= wxStaticBox(self
, -1, name
, style
=wxWANTS_CHARS
) 
 117         box
.SetFont(g
.smallerFont()) 
 118         boxSizer 
= wxStaticBoxSizer(box
, wxVERTICAL
) 
 120         self
.curSizer 
= wxGridSizer(0, 3) 
 121         boxSizer
.Add(self
.curSizer
) 
 122         self
.sizer
.Add(boxSizer
, 0, wxTOP | wxLEFT | wxRIGHT
, 4) 
 123         self
.groups
.append((box
,{})) 
 125     # Enable/disable group 
 126     def EnableGroup(self
, gnum
, enable 
= True): 
 127         grp 
= self
.groups
[gnum
] 
 128         grp
[0].Enable(enable
) 
 129         for b 
in grp
[1].values(): b
.Enable(enable
) 
 131     # Enable/disable group item 
 132     def EnableGroupItem(self
, gnum
, id, enable 
= True): 
 133         grp 
= self
.groups
[gnum
] 
 134         grp
[1][id].Enable(enable
) 
 136     # Enable/disable group items 
 137     def EnableGroupItems(self
, gnum
, ids
, enable 
= True): 
 138         grp 
= self
.groups
[gnum
] 
 140             grp
[1][id].Enable(enable
) 
 143     def OnKeyDown(self
, evt
): 
 144         if evt
.GetKeyCode() == WXK_CONTROL
: 
 146         elif evt
.GetKeyCode() == WXK_SHIFT
: 
 148         self
.UpdateIfNeeded() 
 151     def OnKeyUp(self
, evt
): 
 152         if evt
.GetKeyCode() == WXK_CONTROL
: 
 154         elif evt
.GetKeyCode() == WXK_SHIFT
: 
 156         self
.UpdateIfNeeded() 
 159     def OnMouse(self
, evt
): 
 160         # Update control and shift states 
 161         g
.tree
.ctrl 
= evt
.ControlDown() 
 162         g
.tree
.shift 
= evt
.ShiftDown() 
 163         self
.UpdateIfNeeded() 
 166     # Update UI after key presses, if necessary 
 167     def UpdateIfNeeded(self
): 
 169         if self
.ctrl 
!= tree
.ctrl 
or self
.shift 
!= tree
.shift
: 
 170             # Enabling is needed only for ctrl 
 171             if self
.ctrl 
!= tree
.ctrl
: self
.UpdateUI() 
 172             self
.ctrl 
= tree
.ctrl
 
 173             self
.shift 
= tree
.shift
 
 180             g
.frame
.SetStatusText(status
, 1) 
 184         if not self
.IsShown(): return 
 186         pullDownMenu 
= g
.pullDownMenu
 
 188         item 
= tree
.selection
 
 189         # If nothing selected, disable everything and return 
 192             for grp 
in range(GROUPNUM
): 
 193                 self
.EnableGroup(grp
, False) 
 196         if tree
.ctrl
: needInsert 
= True 
 197         else: needInsert 
= tree
.NeedInsert(item
) 
 198         # Enable depending on selection 
 199         if item 
== tree
.root 
or needInsert 
and tree
.GetItemParent(item
) == tree
.root
: 
 202             xxx 
= tree
.GetPyData(item
).treeObject() 
 203             # Check parent for possible child nodes if inserting sibling 
 204             if needInsert
: xxx 
= xxx
.parent
 
 205             if xxx
.__class
__ == xxxMenuBar
: 
 206                 state 
= STATE_MENUBAR
 
 207             elif xxx
.__class
__ in [xxxToolBar
, xxxTool
] or \
 
 208                  xxx
.__class
__ == xxxSeparator 
and xxx
.parent
.__class
__ == xxxToolBar
: 
 209                 state 
= STATE_TOOLBAR
 
 210             elif xxx
.__class
__ in [xxxMenu
, xxxMenuItem
]: 
 215         # Enable depending on selection 
 216         if state 
!= self
.state
: 
 218             for grp 
in range(GROUPNUM
): 
 219                 self
.EnableGroup(grp
, False) 
 221             if state 
== STATE_ROOT
: 
 222                 self
.EnableGroup(GROUP_WINDOWS
, True) 
 223                 self
.EnableGroup(GROUP_MENUS
, True) 
 225                 self
.EnableGroupItems(GROUP_MENUS
, 
 230             elif state 
== STATE_MENUBAR
: 
 231                 self
.EnableGroup(GROUP_MENUS
) 
 232                 self
.EnableGroupItems(GROUP_MENUS
, 
 237             elif state 
== STATE_TOOLBAR
: 
 238                 self
.EnableGroup(GROUP_MENUS
) 
 239                 self
.EnableGroupItems(GROUP_MENUS
, 
 245                 self
.EnableGroup(GROUP_CONTROLS
) 
 246                 self
.EnableGroupItems(GROUP_CONTROLS
, 
 250             elif state 
== STATE_MENU
: 
 251                 self
.EnableGroup(GROUP_MENUS
) 
 252                 self
.EnableGroupItems(GROUP_MENUS
, 
 258                 self
.EnableGroup(GROUP_WINDOWS
) 
 259                 self
.EnableGroupItems(GROUP_WINDOWS
, 
 263                 self
.EnableGroup(GROUP_MENUS
) 
 264                 self
.EnableGroupItems(GROUP_MENUS
, 
 272                 self
.EnableGroup(GROUP_SIZERS
) 
 273                 self
.EnableGroup(GROUP_CONTROLS
) 
 274         # Special case for notebook (always executed) 
 275         if state 
== STATE_ELSE
: 
 276             if xxx
.__class
__ == xxxNotebook
: 
 277                 self
.EnableGroup(GROUP_SIZERS
, False) 
 279                 self
.EnableGroup(GROUP_SIZERS
) 
 280                 if not (xxx
.isSizer 
or xxx
.parent 
and xxx
.parent
.isSizer
): 
 281                     self
.EnableGroupItem(GROUP_SIZERS
, ID_NEW
.SPACER
, False)