1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Wrappers for the wxAUI classes.
7 // Created: 5-July-2006
9 // Copyright: (c) 2006 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
14 "The wx.aui moduleis an Advanced User Interface library that aims to
15 implement \"cutting-edge\" interface usability and design features so
16 developers can quickly and easily create beautiful and usable
17 application interfaces.
19 **Vision and Design Principles**
21 wx.aui attempts to encapsulate the following aspects of the user
24 * Frame Management: Frame management provides the means to open,
25 move and hide common controls that are needed to interact with the
26 document, and allow these configurations to be saved into
27 different perspectives and loaded at a later time.
29 * Toolbars: Toolbars are a specialized subset of the frame
30 management system and should behave similarly to other docked
31 components. However, they also require additional functionality,
32 such as \"spring-loaded\" rebar support, \"chevron\" buttons and
33 end-user customizability.
35 * Modeless Controls: Modeless controls expose a tool palette or set
36 of options that float above the application content while allowing
37 it to be accessed. Usually accessed by the toolbar, these controls
38 disappear when an option is selected, but may also be \"torn off\"
39 the toolbar into a floating frame of their own.
41 * Look and Feel: Look and feel encompasses the way controls are
42 drawn, both when shown statically as well as when they are being
43 moved. This aspect of user interface design incorporates \"special
44 effects\" such as transparent window dragging as well as frame
47 **wx.aui adheres to the following principles**
49 - Use native floating frames to obtain a native look and feel for
52 - Use existing wxPython code where possible, such as sizer
53 implementation for frame management;
55 - Use standard wxPython coding conventions.
60 The following example shows a simple implementation that utilizes
61 `wx.aui.FrameManager` to manage three text controls in a frame window::
66 class MyFrame(wx.Frame):
68 def __init__(self, parent, id=-1, title='wx.aui Test',
69 size=(800, 600), style=wx.DEFAULT_FRAME_STYLE):
70 wx.Frame.__init__(self, parent, id, title, pos, size, style)
72 self._mgr = wx.aui.AuiManager(self)
74 # create several text controls
75 text1 = wx.TextCtrl(self, -1, 'Pane 1 - sample text',
76 wx.DefaultPosition, wx.Size(200,150),
77 wx.NO_BORDER | wx.TE_MULTILINE)
79 text2 = wx.TextCtrl(self, -1, 'Pane 2 - sample text',
80 wx.DefaultPosition, wx.Size(200,150),
81 wx.NO_BORDER | wx.TE_MULTILINE)
83 text3 = wx.TextCtrl(self, -1, 'Main content window',
84 wx.DefaultPosition, wx.Size(200,150),
85 wx.NO_BORDER | wx.TE_MULTILINE)
87 # add the panes to the manager
88 self._mgr.AddPane(text1, wx.LEFT, 'Pane Number One')
89 self._mgr.AddPane(text2, wx.BOTTOM, 'Pane Number Two')
90 self._mgr.AddPane(text3, wx.CENTER)
92 # tell the manager to 'commit' all the changes just made
95 self.Bind(wx.EVT_CLOSE, self.OnClose)
98 def OnClose(self, event):
99 # deinitialize the frame manager
106 frame = MyFrame(None)
114 %module(package="wx", docstring=DOCSTRING) aui
117 #include "wx/wxPython/wxPython.h"
118 #include "wx/wxPython/pyclasses.h"
119 #include <wx/aui/aui.h>
122 //---------------------------------------------------------------------------
127 %pythoncode { wx = _core }
128 %pythoncode { __docfilter__ = wx.__DocFilter(globals()) }
131 %include _aui_docstrings.i
133 //---------------------------------------------------------------------------
137 #define WXDLLIMPEXP_AUI
139 #define wxDEPRECATED(decl)
142 // We'll skip making wrappers for these, they have overloads that take a
144 %ignore wxAuiPaneInfo::MaxSize(int x, int y);
145 %ignore wxAuiPaneInfo::MinSize(int x, int y);
146 %ignore wxAuiPaneInfo::BestSize(int x, int y);
147 %ignore wxAuiPaneInfo::FloatingPosition(int x, int y);
148 %ignore wxAuiPaneInfo::FloatingSize(int x, int y);
150 // But for these we will do the overloading (see %pythoncode below) so let's
151 // rename the C++ versions
152 %rename(_GetPaneByWidget) wxAuiManager::GetPane(wxWindow* window);
153 %rename(_GetPaneByName) wxAuiManager::GetPane(const wxString& name);
155 %rename(_AddPane1) wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info);
156 %rename(_AddPane2) wxAuiManager::AddPane(wxWindow* window, int direction = wxLEFT,
157 const wxString& caption = wxEmptyString);
159 %rename(AddPaneAtPos) wxAuiManager::AddPane(wxWindow* window,
160 const wxPaneInfo& pane_info,
161 const wxPoint& drop_pos);
163 // A typemap for the return value of wxFrameManager::GetAllPanes
164 %typemap(out) wxAuiPaneInfoArray& {
165 $result = PyList_New(0);
166 for (size_t i=0; i < $1->GetCount(); i++) {
167 PyObject* pane_obj = SWIG_NewPointerObj((void*)(&$1->Item(i)), SWIGTYPE_p_wxAuiPaneInfo, 0);
168 PyList_Append($result, pane_obj);
173 %nokwargs wxAuiTabContainer::SetActivePage;
175 %pythonAppend wxAuiTabCtrl::wxAuiTabCtrl "self._setOORInfo(self)";
177 %pythonAppend wxAuiNotebook::wxAuiNotebook "self._setOORInfo(self)";
178 %pythonAppend wxAuiNotebook::wxAuiNotebook() "self._setOORInfo(self)";
179 %ignore wxAuiiNotebook::~wxAuiNotebook;
180 %rename(PreAuiNotebook) wxAuiNotebook::wxAuiNotebook();
184 %ignore wxAuiDefaultTabArt::SetWindow; // Link error...
186 // ignore this overload
187 %ignore wxAuiTabContainer::GetPage(size_t idx) const;
190 //---------------------------------------------------------------------------
191 // Get all our defs from the REAL header files.
193 #define wxColor wxColour // fix problem in dockart.h
195 %include framemanager.h
202 //---------------------------------------------------------------------------
203 // Methods to inject into the FrameManager class that will sort out calls to
204 // the overloaded versions of GetPane and AddPane
206 %extend wxAuiManager {
208 def GetPane(self, item):
210 GetPane(self, window_or_info item) -> PaneInfo
212 GetPane is used to search for a `PaneInfo` object either by
213 widget reference or by pane name, which acts as a unique id
214 for a window pane. The returned `PaneInfo` object may then be
215 modified to change a pane's look, state or position. After one
216 or more modifications to the `PaneInfo`, `FrameManager.Update`
217 should be called to realize the changes to the user interface.
219 If the lookup failed (meaning the pane could not be found in
220 the manager) GetPane returns an empty `PaneInfo`, a condition
221 which can be checked by calling `PaneInfo.IsOk`.
223 if isinstance(item, wx.Window):
224 return self._GetPaneByWidget(item)
226 return self._GetPaneByName(item)
228 def AddPane(self, window, info=None, caption=None):
230 AddPane(self, window, info=None, caption=None) -> bool
232 AddPane tells the frame manager to start managing a child
233 window. There are two versions of this function. The first
234 verison accepts a `PaneInfo` object for the ``info`` parameter
235 and allows the full spectrum of pane parameter
236 possibilities. (Say that 3 times fast!)
238 The second version is used for simpler user interfaces which
239 do not require as much configuration. In this case the
240 ``info`` parameter specifies the direction property of the
241 pane info, and defaults to ``wx.LEFT``. The pane caption may
242 also be specified as an extra parameter in this form.
244 if type(info) == AuiPaneInfo:
245 return self._AddPane1(window, info)
252 return self._AddPane2(window, info, caption)
255 // For backwards compatibility
257 SetFrame = wx._deprecated(SetManagedWindow,
258 "SetFrame is deprecated, use `SetManagedWindow` instead.")
259 GetFrame = wx._deprecated(GetManagedWindow,
260 "GetFrame is deprecated, use `GetManagedWindow` instead.")
264 %extend wxAuiDockInfo {
268 %extend wxAuiDockUIPart {
269 ~wxAuiDockUIPart() {}
272 %extend wxAuiPaneButton {
273 ~wxAuiPaneButton() {}
276 //---------------------------------------------------------------------------
279 // A wxDocArt class that knows how to forward virtuals to Python methods
280 class wxPyAuiDockArt : public wxAuiDefaultDockArt
282 wxPyAuiDockArt() : wxAuiDefaultDockArt() {}
284 DEC_PYCALLBACK_INT_INT(GetMetric);
285 DEC_PYCALLBACK_VOID_INTINT(SetMetric);
286 DEC_PYCALLBACK__INTFONT(SetFont);
287 DEC_PYCALLBACK_FONT_INT(GetFont);
288 DEC_PYCALLBACK_COLOUR_INT(GetColour);
289 DEC_PYCALLBACK__INTCOLOUR(SetColour);
291 virtual void DrawSash(wxDC& dc,
297 wxPyBlock_t blocked = wxPyBeginBlockThreads();
298 if ((found = wxPyCBH_findCallback(m_myInst, "DrawSash"))) {
299 PyObject* odc = wxPyMake_wxObject(&dc, false);
300 PyObject* owin = wxPyMake_wxObject(window, false);
301 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
302 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
303 odc, owin, orientation, orect));
308 wxPyEndBlockThreads(blocked);
310 wxAuiDefaultDockArt::DrawSash(dc, window, orientation, rect);
313 virtual void DrawBackground(wxDC& dc,
319 wxPyBlock_t blocked = wxPyBeginBlockThreads();
320 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
321 PyObject* odc = wxPyMake_wxObject(&dc, false);
322 PyObject* owin = wxPyMake_wxObject(window, false);
323 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
324 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
325 odc, owin, orientation, orect));
330 wxPyEndBlockThreads(blocked);
332 wxAuiDefaultDockArt::DrawBackground(dc, window, orientation, rect);
335 virtual void DrawCaption(wxDC& dc,
337 const wxString& text,
342 wxPyBlock_t blocked = wxPyBeginBlockThreads();
343 if ((found = wxPyCBH_findCallback(m_myInst, "DrawCaption"))) {
344 PyObject* odc = wxPyMake_wxObject(&dc, false);
345 PyObject* owin = wxPyMake_wxObject(window, false);
346 PyObject* otext = wx2PyString(text);
347 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
348 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
349 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOOO)",
350 odc, owin, otext, orect, opane));
357 wxPyEndBlockThreads(blocked);
359 wxAuiDefaultDockArt::DrawCaption(dc, window, text, rect, pane);
362 virtual void DrawGripper(wxDC& dc,
368 wxPyBlock_t blocked = wxPyBeginBlockThreads();
369 if ((found = wxPyCBH_findCallback(m_myInst, "DrawGripper"))) {
370 PyObject* odc = wxPyMake_wxObject(&dc, false);
371 PyObject* owin = wxPyMake_wxObject(window, false);
372 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
373 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
374 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOO)", odc, owin, orect, opane));
379 wxPyEndBlockThreads(blocked);
381 wxAuiDefaultDockArt::DrawGripper(dc, window, rect, pane);
384 virtual void DrawBorder(wxDC& dc,
390 wxPyBlock_t blocked = wxPyBeginBlockThreads();
391 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBorder"))) {
392 PyObject* odc = wxPyMake_wxObject(&dc, false);
393 PyObject* owin = wxPyMake_wxObject(window, false);
394 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
395 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
396 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, orect, opane));
402 wxPyEndBlockThreads(blocked);
404 wxAuiDefaultDockArt::DrawBorder(dc, window, rect, pane);
407 virtual void DrawPaneButton(wxDC& dc,
415 wxPyBlock_t blocked = wxPyBeginBlockThreads();
416 if ((found = wxPyCBH_findCallback(m_myInst, "DrawPaneButton"))) {
417 PyObject* odc = wxPyMake_wxObject(&dc, false);
418 PyObject* owin = wxPyMake_wxObject(window, false);
419 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
420 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
421 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiIOO)",
422 odc, owin, button, button_state,
429 wxPyEndBlockThreads(blocked);
431 wxAuiDefaultDockArt::DrawPaneButton(dc, window, button, button_state, rect, pane);
438 IMP_PYCALLBACK_INT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetMetric);
439 IMP_PYCALLBACK_VOID_INTINT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetMetric);
440 IMP_PYCALLBACK__INTFONT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetFont);
441 IMP_PYCALLBACK_FONT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetFont);
442 IMP_PYCALLBACK_COLOUR_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetColour);
443 IMP_PYCALLBACK__INTCOLOUR(wxPyAuiDockArt, wxAuiDefaultDockArt, SetColour);
448 DocStr(wxPyAuiDockArt,
449 "This version of the `AuiDockArt` class has been instrumented to be
450 subclassable in Python and to reflect all calls to the C++ base class
451 methods to the Python methods implemented in the derived class.", "");
453 class wxPyAuiDockArt : public wxAuiDefaultDockArt
455 %pythonAppend wxPyAuiDockArt setCallbackInfo(PyAuiDockArt)
461 //---------------------------------------------------------------------------
463 %extend wxAuiNotebook {
464 %property(PageCount, GetPageCount, doc="See `GetPageCount`");
465 %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
469 %extend wxAuiNotebookEvent {
470 %property(OldSelection, GetOldSelection, SetOldSelection, doc="See `GetOldSelection` and `SetOldSelection`");
471 %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
475 %extend wxAuiTabContainer {
476 %property(ActivePage, GetActivePage, SetActivePage, doc="See `GetActivePage` and `SetActivePage`");
477 %property(PageCount, GetPageCount, doc="See `GetPageCount`");
478 %property(Pages, GetPages, doc="See `GetPages`");
482 %extend wxAuiManager {
483 %property(AllPanes, GetAllPanes, doc="See `GetAllPanes`");
484 %property(ArtProvider, GetArtProvider, SetArtProvider, doc="See `GetArtProvider` and `SetArtProvider`");
485 %property(Flags, GetFlags, SetFlags, doc="See `GetFlags` and `SetFlags`");
486 %property(ManagedWindow, GetManagedWindow, SetManagedWindow, doc="See `GetManagedWindow` and `SetManagedWindow`");
490 %extend wxAuiManagerEvent {
491 %property(Button, GetButton, SetButton, doc="See `GetButton` and `SetButton`");
492 %property(DC, GetDC, SetDC, doc="See `GetDC` and `SetDC`");
493 %property(Pane, GetPane, SetPane, doc="See `GetPane` and `SetPane`");
497 //---------------------------------------------------------------------------
500 // A wxTabArt class that knows how to forward virtuals to Python methods
501 class wxPyAuiTabArt : public wxAuiDefaultTabArt
503 wxPyAuiTabArt() : wxAuiDefaultTabArt() {}
506 virtual void DrawBackground( wxDC& dc,
511 wxPyBlock_t blocked = wxPyBeginBlockThreads();
512 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
513 PyObject* odc = wxPyMake_wxObject(&dc, false);
514 PyObject* ownd = wxPyMake_wxObject(wnd, false);
515 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
516 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, ownd, orect));
521 wxPyEndBlockThreads(blocked);
523 wxAuiDefaultTabArt::DrawBackground(dc, wnd, rect);
526 virtual void DrawTab( wxDC& dc,
528 const wxAuiNotebookPage& pane,
529 const wxRect& in_rect,
530 int close_button_state,
531 wxRect* out_tab_rect,
532 wxRect* out_button_rect,
536 const char* errmsg = "DrawTab should return a sequence containing (tab_rect, button_rect, x_extent)";
537 wxPyBlock_t blocked = wxPyBeginBlockThreads();
538 if ((found = wxPyCBH_findCallback(m_myInst, "DrawTab"))) {
539 PyObject* odc = wxPyMake_wxObject(&dc, false);
540 PyObject* ownd = wxPyMake_wxObject(wnd, false);
541 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiNotebookPage"), 0);
542 PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
544 ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
546 odc, ownd, orect, opane,
547 close_button_state));
549 if (PySequence_Check(ro) && PyObject_Length(ro) == 3) {
550 PyObject* o1 = PySequence_GetItem(ro, 0);
551 PyObject* o2 = PySequence_GetItem(ro, 1);
552 PyObject* o3 = PySequence_GetItem(ro, 2);
553 if (!wxRect_helper(o1, &out_tab_rect))
554 PyErr_SetString(PyExc_TypeError, errmsg);
555 else if (!wxRect_helper(o2, &out_button_rect))
556 PyErr_SetString(PyExc_TypeError, errmsg);
557 else if (!PyInt_Check(o3))
558 PyErr_SetString(PyExc_TypeError, errmsg);
560 *x_extent = PyInt_AsLong(o3);
567 PyErr_SetString(PyExc_TypeError, errmsg);
577 wxPyEndBlockThreads(blocked);
579 wxAuiDefaultTabArt::DrawTab(dc, wnd, pane, in_rect, close_button_state, out_tab_rect, out_button_rect, x_extent);
583 virtual void DrawButton( wxDC& dc,
585 const wxRect& in_rect,
592 const char* errmsg = "DrawButton should return a wxRect";
593 wxPyBlock_t blocked = wxPyBeginBlockThreads();
594 if ((found = wxPyCBH_findCallback(m_myInst, "DrawButton"))) {
595 PyObject* odc = wxPyMake_wxObject(&dc, false);
596 PyObject* ownd = wxPyMake_wxObject(wnd, false);
597 PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
599 ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OOOiiiO)", odc, ownd, orect,
600 bitmap_id, button_state, orientation));
602 if (!wxRect_helper(ro, &out_rect))
603 PyErr_SetString(PyExc_TypeError, errmsg);
611 wxPyEndBlockThreads(blocked);
613 wxAuiDefaultTabArt::DrawButton(dc, wnd, in_rect, bitmap_id, button_state, orientation, out_rect);
617 virtual wxSize GetTabSize( wxDC& dc,
619 const wxString& caption,
620 const wxBitmap& bitmap,
622 int close_button_state,
626 wxSize rv, *prv = &rv;
627 const char* errmsg = "GetTabSize should return a sequence containing (size, x_extent)";
628 wxPyBlock_t blocked = wxPyBeginBlockThreads();
629 if ((found = wxPyCBH_findCallback(m_myInst, "GetTabSize"))) {
630 PyObject* odc = wxPyMake_wxObject(&dc, false);
631 PyObject* ownd = wxPyMake_wxObject(wnd, false);
632 PyObject* otext = wx2PyString(caption);
633 PyObject* obmp = wxPyMake_wxObject((wxObject*)&bitmap, false);
635 ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
636 "(OOOOii)", odc, ownd, otext, obmp, (int)active, close_button_state));
638 if (PySequence_Check(ro) && PyObject_Length(ro) == 2) {
639 PyObject* o1 = PySequence_GetItem(ro, 0);
640 PyObject* o2 = PySequence_GetItem(ro, 1);
641 if (!wxSize_helper(o1, &prv))
642 PyErr_SetString(PyExc_TypeError, errmsg);
643 else if (!PyInt_Check(o2))
644 PyErr_SetString(PyExc_TypeError, errmsg);
646 *x_extent = PyInt_AsLong(o2);
652 PyErr_SetString(PyExc_TypeError, errmsg);
662 wxPyEndBlockThreads(blocked);
664 rv = wxAuiDefaultTabArt::GetTabSize(dc, wnd, caption, bitmap, active, close_button_state, x_extent);
669 // virtual int ShowDropDown(
671 // const wxAuiNotebookPageArray& items,
674 // virtual int GetIndentSize();
676 // virtual int GetBestTabCtrlSize(wxWindow* wnd,
677 // const wxAuiNotebookPageArray& pages,
678 // const wxSize& required_bmp_size);
679 // virtual wxAuiTabArt* Clone();
680 // virtual void SetFlags(unsigned int flags);
681 // virtual void SetSizingInfo(const wxSize& tab_ctrl_size,
682 // size_t tab_count);
683 // virtual int GetIndentSize();
687 DEC_PYCALLBACK__FONT(SetNormalFont);
688 DEC_PYCALLBACK__FONT(SetSelectedFont);
689 DEC_PYCALLBACK__FONT(SetMeasuringFont);
690 // DEC_PYCALLBACK_INT_WIN(GetBestTabCtrlSize);
696 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetNormalFont);
697 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetSelectedFont);
698 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetMeasuringFont);
699 //IMP_PYCALLBACK_INT_WIN(wxPyAuiTabArt, wxAuiDefaultTabArt, GetBestTabCtrlSize);
703 DocStr(wxPyAuiTabArt,
704 "This version of the `TabArt` class has been instrumented to be
705 subclassable in Python and to reflect all calls to the C++ base class
706 methods to the Python methods implemented in the derived class.", "");
708 class wxPyAuiTabArt : public wxAuiDefaultTabArt
710 %pythonAppend wxPyAuiTabArt setCallbackInfo(PyAuiTabArt)
716 //---------------------------------------------------------------------------
719 #undef WXDLLIMPEXP_AUI
721 //---------------------------------------------------------------------------