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 //---------------------------------------------------------------------------
187 // Get all our defs from the REAL header files.
188 %include framemanager.h
193 //---------------------------------------------------------------------------
194 // Methods to inject into the FrameManager class that will sort out calls to
195 // the overloaded versions of GetPane and AddPane
197 %extend wxAuiManager {
199 def GetPane(self, item):
201 GetPane(self, window_or_info item) -> PaneInfo
203 GetPane is used to search for a `PaneInfo` object either by
204 widget reference or by pane name, which acts as a unique id
205 for a window pane. The returned `PaneInfo` object may then be
206 modified to change a pane's look, state or position. After one
207 or more modifications to the `PaneInfo`, `FrameManager.Update`
208 should be called to realize the changes to the user interface.
210 If the lookup failed (meaning the pane could not be found in
211 the manager) GetPane returns an empty `PaneInfo`, a condition
212 which can be checked by calling `PaneInfo.IsOk`.
214 if isinstance(item, wx.Window):
215 return self._GetPaneByWidget(item)
217 return self._GetPaneByName(item)
219 def AddPane(self, window, info=None, caption=None):
221 AddPane(self, window, info=None, caption=None) -> bool
223 AddPane tells the frame manager to start managing a child
224 window. There are two versions of this function. The first
225 verison accepts a `PaneInfo` object for the ``info`` parameter
226 and allows the full spectrum of pane parameter
227 possibilities. (Say that 3 times fast!)
229 The second version is used for simpler user interfaces which
230 do not require as much configuration. In this case the
231 ``info`` parameter specifies the direction property of the
232 pane info, and defaults to ``wx.LEFT``. The pane caption may
233 also be specified as an extra parameter in this form.
235 if type(info) == AuiPaneInfo:
236 return self._AddPane1(window, info)
243 return self._AddPane2(window, info, caption)
246 // For backwards compatibility
248 SetFrame = wx._deprecated(SetManagedWindow,
249 "SetFrame is deprecated, use `SetManagedWindow` instead.")
250 GetFrame = wx._deprecated(GetManagedWindow,
251 "GetFrame is deprecated, use `GetManagedWindow` instead.")
255 %extend wxAuiDockInfo {
259 %extend wxAuiDockUIPart {
260 ~wxAuiDockUIPart() {}
263 %extend wxAuiPaneButton {
264 ~wxAuiPaneButton() {}
267 //---------------------------------------------------------------------------
270 // A wxDocArt class that knows how to forward virtuals to Python methods
271 class wxPyAuiDockArt : public wxAuiDefaultDockArt
273 wxPyAuiDockArt() : wxAuiDefaultDockArt() {}
275 DEC_PYCALLBACK_INT_INT(GetMetric);
276 DEC_PYCALLBACK_VOID_INTINT(SetMetric);
277 DEC_PYCALLBACK__INTFONT(SetFont);
278 DEC_PYCALLBACK_FONT_INT(GetFont);
279 DEC_PYCALLBACK_COLOUR_INT(GetColour);
280 DEC_PYCALLBACK__INTCOLOUR(SetColour);
282 virtual void DrawSash(wxDC& dc,
288 wxPyBlock_t blocked = wxPyBeginBlockThreads();
289 if ((found = wxPyCBH_findCallback(m_myInst, "DrawSash"))) {
290 PyObject* odc = wxPyMake_wxObject(&dc, false);
291 PyObject* owin = wxPyMake_wxObject(window, false);
292 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
293 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
294 odc, owin, orientation, orect));
299 wxPyEndBlockThreads(blocked);
301 wxAuiDefaultDockArt::DrawSash(dc, window, orientation, rect);
304 virtual void DrawBackground(wxDC& dc,
310 wxPyBlock_t blocked = wxPyBeginBlockThreads();
311 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
312 PyObject* odc = wxPyMake_wxObject(&dc, false);
313 PyObject* owin = wxPyMake_wxObject(window, false);
314 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
315 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
316 odc, owin, orientation, orect));
321 wxPyEndBlockThreads(blocked);
323 wxAuiDefaultDockArt::DrawBackground(dc, window, orientation, rect);
326 virtual void DrawCaption(wxDC& dc,
328 const wxString& text,
333 wxPyBlock_t blocked = wxPyBeginBlockThreads();
334 if ((found = wxPyCBH_findCallback(m_myInst, "DrawCaption"))) {
335 PyObject* odc = wxPyMake_wxObject(&dc, false);
336 PyObject* owin = wxPyMake_wxObject(window, false);
337 PyObject* otext = wx2PyString(text);
338 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
339 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
340 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOOO)",
341 odc, owin, otext, orect, opane));
348 wxPyEndBlockThreads(blocked);
350 wxAuiDefaultDockArt::DrawCaption(dc, window, text, rect, pane);
353 virtual void DrawGripper(wxDC& dc,
359 wxPyBlock_t blocked = wxPyBeginBlockThreads();
360 if ((found = wxPyCBH_findCallback(m_myInst, "DrawGripper"))) {
361 PyObject* odc = wxPyMake_wxObject(&dc, false);
362 PyObject* owin = wxPyMake_wxObject(window, false);
363 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
364 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
365 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOO)", odc, owin, orect, opane));
370 wxPyEndBlockThreads(blocked);
372 wxAuiDefaultDockArt::DrawGripper(dc, window, rect, pane);
375 virtual void DrawBorder(wxDC& dc,
381 wxPyBlock_t blocked = wxPyBeginBlockThreads();
382 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBorder"))) {
383 PyObject* odc = wxPyMake_wxObject(&dc, false);
384 PyObject* owin = wxPyMake_wxObject(window, false);
385 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
386 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
387 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, orect, opane));
393 wxPyEndBlockThreads(blocked);
395 wxAuiDefaultDockArt::DrawBorder(dc, window, rect, pane);
398 virtual void DrawPaneButton(wxDC& dc,
406 wxPyBlock_t blocked = wxPyBeginBlockThreads();
407 if ((found = wxPyCBH_findCallback(m_myInst, "DrawPaneButton"))) {
408 PyObject* odc = wxPyMake_wxObject(&dc, false);
409 PyObject* owin = wxPyMake_wxObject(window, false);
410 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
411 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
412 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiIOO)",
413 odc, owin, button, button_state,
420 wxPyEndBlockThreads(blocked);
422 wxAuiDefaultDockArt::DrawPaneButton(dc, window, button, button_state, rect, pane);
429 IMP_PYCALLBACK_INT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetMetric);
430 IMP_PYCALLBACK_VOID_INTINT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetMetric);
431 IMP_PYCALLBACK__INTFONT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetFont);
432 IMP_PYCALLBACK_FONT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetFont);
433 IMP_PYCALLBACK_COLOUR_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetColour);
434 IMP_PYCALLBACK__INTCOLOUR(wxPyAuiDockArt, wxAuiDefaultDockArt, SetColour);
439 DocStr(wxPyAuiDockArt,
440 "This version of the `AuiDockArt` class has been instrumented to be
441 subclassable in Python and to reflect all calls to the C++ base class
442 methods to the Python methods implemented in the derived class.", "");
444 class wxPyAuiDockArt : public wxAuiDefaultDockArt
446 %pythonAppend wxPyAuiDockArt setCallbackInfo(PyAuiDockArt)
452 //---------------------------------------------------------------------------
454 %extend wxAuiNotebook {
455 %property(PageCount, GetPageCount, doc="See `GetPageCount`");
456 %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
460 %extend wxAuiNotebookEvent {
461 %property(OldSelection, GetOldSelection, SetOldSelection, doc="See `GetOldSelection` and `SetOldSelection`");
462 %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
466 %extend wxAuiTabContainer {
467 %property(ActivePage, GetActivePage, SetActivePage, doc="See `GetActivePage` and `SetActivePage`");
468 %property(PageCount, GetPageCount, doc="See `GetPageCount`");
469 %property(Pages, GetPages, doc="See `GetPages`");
473 %extend wxAuiManager {
474 %property(AllPanes, GetAllPanes, doc="See `GetAllPanes`");
475 %property(ArtProvider, GetArtProvider, SetArtProvider, doc="See `GetArtProvider` and `SetArtProvider`");
476 %property(Flags, GetFlags, SetFlags, doc="See `GetFlags` and `SetFlags`");
477 %property(ManagedWindow, GetManagedWindow, SetManagedWindow, doc="See `GetManagedWindow` and `SetManagedWindow`");
481 %extend wxAuiManagerEvent {
482 %property(Button, GetButton, SetButton, doc="See `GetButton` and `SetButton`");
483 %property(DC, GetDC, SetDC, doc="See `GetDC` and `SetDC`");
484 %property(Pane, GetPane, SetPane, doc="See `GetPane` and `SetPane`");
488 //---------------------------------------------------------------------------
491 // A wxTabArt class that knows how to forward virtuals to Python methods
492 class wxPyAuiTabArt : public wxAuiDefaultTabArt
494 wxPyAuiTabArt() : wxAuiDefaultTabArt() {}
497 virtual void DrawBackground( wxDC& dc,
502 wxPyBlock_t blocked = wxPyBeginBlockThreads();
503 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
504 PyObject* odc = wxPyMake_wxObject(&dc, false);
505 PyObject* ownd = wxPyMake_wxObject(wnd, false);
506 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
507 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, ownd, orect));
512 wxPyEndBlockThreads(blocked);
514 wxAuiDefaultTabArt::DrawBackground(dc, wnd, rect);
517 virtual void DrawTab( wxDC& dc,
519 const wxRect& in_rect,
520 const wxString& caption,
521 const wxBitmap& bitmap,
523 int close_button_state,
524 wxRect* out_tab_rect,
525 wxRect* out_button_rect,
529 const char* errmsg = "DrawTab should return a sequence containing (tab_rect, button_rect, x_extent)";
530 wxPyBlock_t blocked = wxPyBeginBlockThreads();
531 if ((found = wxPyCBH_findCallback(m_myInst, "DrawTab"))) {
532 PyObject* odc = wxPyMake_wxObject(&dc, false);
533 PyObject* ownd = wxPyMake_wxObject(wnd, false);
534 PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
535 PyObject* otext = wx2PyString(caption);
536 PyObject* obmp = wxPyMake_wxObject((wxObject*)&bitmap, false);
538 ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
540 odc, ownd, orect, otext, obmp,
541 (int)active, close_button_state));
543 if (PySequence_Check(ro) && PyObject_Length(ro) == 3) {
544 PyObject* o1 = PySequence_GetItem(ro, 0);
545 PyObject* o2 = PySequence_GetItem(ro, 1);
546 PyObject* o3 = PySequence_GetItem(ro, 2);
547 if (!wxRect_helper(o1, &out_tab_rect))
548 PyErr_SetString(PyExc_TypeError, errmsg);
549 else if (!wxRect_helper(o2, &out_button_rect))
550 PyErr_SetString(PyExc_TypeError, errmsg);
551 else if (!PyInt_Check(o3))
552 PyErr_SetString(PyExc_TypeError, errmsg);
554 *x_extent = PyInt_AsLong(o3);
561 PyErr_SetString(PyExc_TypeError, errmsg);
572 wxPyEndBlockThreads(blocked);
574 wxAuiDefaultTabArt::DrawTab(dc, wnd, in_rect, caption, bitmap, active, close_button_state, out_tab_rect, out_button_rect, x_extent);
578 virtual void DrawButton( wxDC& dc,
580 const wxRect& in_rect,
584 const wxBitmap& bitmap_override,
588 const char* errmsg = "DrawButton should return a wxRect";
589 wxPyBlock_t blocked = wxPyBeginBlockThreads();
590 if ((found = wxPyCBH_findCallback(m_myInst, "DrawButton"))) {
591 PyObject* odc = wxPyMake_wxObject(&dc, false);
592 PyObject* ownd = wxPyMake_wxObject(wnd, false);
593 PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
594 PyObject* obmp = wxPyConstructObject((void*)&bitmap_override, wxT("wxBitmap"), 0);
596 ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OOOiiiO)", odc, ownd, orect,
597 bitmap_id, button_state, orientation,
600 if (!wxRect_helper(ro, &out_rect))
601 PyErr_SetString(PyExc_TypeError, errmsg);
610 wxPyEndBlockThreads(blocked);
612 wxAuiDefaultTabArt::DrawButton(dc, wnd, in_rect, bitmap_id, button_state, orientation, bitmap_override, out_rect);
616 virtual wxSize GetTabSize( wxDC& dc,
618 const wxString& caption,
619 const wxBitmap& bitmap,
621 int close_button_state,
625 wxSize rv, *prv = &rv;
626 const char* errmsg = "GetTabSize should return a sequence containing (size, x_extent)";
627 wxPyBlock_t blocked = wxPyBeginBlockThreads();
628 if ((found = wxPyCBH_findCallback(m_myInst, "GetTabSize"))) {
629 PyObject* odc = wxPyMake_wxObject(&dc, false);
630 PyObject* ownd = wxPyMake_wxObject(wnd, false);
631 PyObject* otext = wx2PyString(caption);
632 PyObject* obmp = wxPyMake_wxObject((wxObject*)&bitmap, false);
634 ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
635 "(OOOOii)", odc, ownd, otext, obmp, (int)active, close_button_state));
637 if (PySequence_Check(ro) && PyObject_Length(ro) == 2) {
638 PyObject* o1 = PySequence_GetItem(ro, 0);
639 PyObject* o2 = PySequence_GetItem(ro, 1);
640 if (!wxSize_helper(o1, &prv))
641 PyErr_SetString(PyExc_TypeError, errmsg);
642 else if (!PyInt_Check(o2))
643 PyErr_SetString(PyExc_TypeError, errmsg);
645 *x_extent = PyInt_AsLong(o2);
651 PyErr_SetString(PyExc_TypeError, errmsg);
661 wxPyEndBlockThreads(blocked);
663 rv = wxAuiDefaultTabArt::GetTabSize(dc, wnd, caption, bitmap, active, close_button_state, x_extent);
668 // virtual int ShowWindowList(
670 // const wxArrayString& items,
673 // virtual int GetBestTabCtrlSize(wxWindow* wnd,
674 // wxAuiNotebookPageArray& pages);
675 // virtual wxAuiTabArt* Clone();
676 // virtual void SetFlags(unsigned int flags);
677 // virtual void SetSizingInfo(const wxSize& tab_ctrl_size,
678 // size_t tab_count);
679 // virtual int GetIndentSize();
683 DEC_PYCALLBACK__FONT(SetNormalFont);
684 DEC_PYCALLBACK__FONT(SetSelectedFont);
685 DEC_PYCALLBACK__FONT(SetMeasuringFont);
686 // DEC_PYCALLBACK_INT_WIN(GetBestTabCtrlSize);
692 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetNormalFont);
693 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetSelectedFont);
694 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetMeasuringFont);
695 //IMP_PYCALLBACK_INT_WIN(wxPyAuiTabArt, wxAuiDefaultTabArt, GetBestTabCtrlSize);
699 DocStr(wxPyAuiTabArt,
700 "This version of the `TabArt` class has been instrumented to be
701 subclassable in Python and to reflect all calls to the C++ base class
702 methods to the Python methods implemented in the derived class.", "");
704 class wxPyAuiTabArt : public wxAuiDefaultTabArt
706 %pythonAppend wxPyAuiTabArt setCallbackInfo(PyAuiTabArt)
712 //---------------------------------------------------------------------------
715 #undef WXDLLIMPEXP_AUI
717 //---------------------------------------------------------------------------