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 //---------------------------------------------------------------------------
 
 135 // Preprocessor stuff so SWIG doesn't get confused when %include-ing
 
 139 %ignore wxABI_VERSION;
 
 141 #define wxUSE_MENUS 1
 
 142 #define wxABI_VERSION 99999
 
 144 #define WXDLLIMPEXP_AUI
 
 146 #define wxDEPRECATED(decl)
 
 147 #define DECLARE_EVENT_TABLE()
 
 148 #define DECLARE_DYNAMIC_CLASS(foo)
 
 152 // We'll skip making wrappers for these, they have overloads that take a
 
 154 %ignore wxAuiPaneInfo::MaxSize(int x, int y);
 
 155 %ignore wxAuiPaneInfo::MinSize(int x, int y);
 
 156 %ignore wxAuiPaneInfo::BestSize(int x, int y);
 
 157 %ignore wxAuiPaneInfo::FloatingPosition(int x, int y);
 
 158 %ignore wxAuiPaneInfo::FloatingSize(int x, int y);
 
 160 // But for these we will do the overloading (see %pythoncode below) so let's
 
 161 // rename the C++ versions
 
 162 %rename(_GetPaneByWidget) wxAuiManager::GetPane(wxWindow* window);
 
 163 %rename(_GetPaneByName)   wxAuiManager::GetPane(const wxString& name);
 
 165 %rename(_AddPane1) wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info);
 
 166 %rename(_AddPane2) wxAuiManager::AddPane(wxWindow* window, int direction = wxLEFT,
 
 167                                          const wxString& caption = wxEmptyString);
 
 169 %rename(AddPaneAtPos) wxAuiManager::AddPane(wxWindow* window,
 
 170                                             const wxPaneInfo& pane_info,
 
 171                                             const wxPoint& drop_pos);
 
 173 // A typemap for the return value of wxFrameManager::GetAllPanes
 
 174 %typemap(out) wxAuiPaneInfoArray& {
 
 175     $result = PyList_New(0);
 
 176     for (size_t i=0; i < $1->GetCount(); i++) {
 
 177         PyObject* pane_obj = SWIG_NewPointerObj((void*)(&$1->Item(i)), SWIGTYPE_p_wxAuiPaneInfo, 0);
 
 178         PyList_Append($result, pane_obj);
 
 183 %nokwargs wxAuiTabContainer::SetActivePage;
 
 185 %pythonAppend wxAuiTabCtrl::wxAuiTabCtrl "self._setOORInfo(self)";
 
 187 %pythonAppend wxAuiNotebook::wxAuiNotebook    "self._setOORInfo(self)";
 
 188 %pythonAppend wxAuiNotebook::wxAuiNotebook()  "val._setOORInfo(val)";
 
 189 %ignore wxAuiiNotebook::~wxAuiNotebook;
 
 190 %rename(PreAuiNotebook) wxAuiNotebook::wxAuiNotebook();
 
 193 %ignore wxAuiDefaultTabArt::SetWindow;        
 
 195 // ignore this overload
 
 196 %ignore wxAuiTabContainer::GetPage(size_t idx) const;
 
 200 %pythonAppend wxAuiMDIParentFrame::wxAuiMDIParentFrame    "self._setOORInfo(self)";
 
 201 %pythonAppend wxAuiMDIParentFrame::wxAuiMDIParentFrame()  "val._setOORInfo(val)";
 
 202 %ignore wxAuiMDIParentFrame::~wxAuiMDIParentFrame;
 
 203 %rename(PreAuiMDIParentFrame) wxAuiMDIParentFrame::wxAuiMDIParentFrame();
 
 205 %pythonAppend wxAuiMDIChildFrame::wxAuiMDIChildFrame    "self._setOORInfo(self)";
 
 206 %pythonAppend wxAuiMDIChildFrame::wxAuiMDIChildFrame()  "val._setOORInfo(val)";
 
 207 %ignore wxAuiMDIChildFrame::~wxAuiMDIChildFrame;
 
 208 %rename(PreAuiMDIChildFrame) wxAuiMDIChildFrame::wxAuiMDIChildFrame();
 
 210 %pythonAppend wxAuiMDIClientWindow::wxAuiMDIClientWindow    "self._setOORInfo(self)";
 
 211 %pythonAppend wxAuiMDIClientWindow::wxAuiMDIClientWindow()  "val._setOORInfo(val)";
 
 212 %ignore wxAuiMDIClientWindow::~wxAuiMDIClientWindow;
 
 213 %rename(PreAuiMDIClientWindow) wxAuiMDIClientWindow::wxAuiMDIClientWindow();
 
 216 //---------------------------------------------------------------------------
 
 217 // Get all our defs from the REAL header files.
 
 219 #define wxColor wxColour  // fix problem in dockart.h
 
 221 %include framemanager.h
 
 229 //---------------------------------------------------------------------------
 
 230 // Methods to inject into the FrameManager class that will sort out calls to
 
 231 // the overloaded versions of GetPane and AddPane
 
 233 %extend wxAuiManager {
 
 235     def GetPane(self, item):
 
 237         GetPane(self, window_or_info item) -> PaneInfo
 
 239         GetPane is used to search for a `PaneInfo` object either by
 
 240         widget reference or by pane name, which acts as a unique id
 
 241         for a window pane. The returned `PaneInfo` object may then be
 
 242         modified to change a pane's look, state or position. After one
 
 243         or more modifications to the `PaneInfo`, `FrameManager.Update`
 
 244         should be called to realize the changes to the user interface.
 
 246         If the lookup failed (meaning the pane could not be found in
 
 247         the manager) GetPane returns an empty `PaneInfo`, a condition
 
 248         which can be checked by calling `PaneInfo.IsOk`.
 
 250         if isinstance(item, wx.Window):
 
 251             return self._GetPaneByWidget(item)
 
 253             return self._GetPaneByName(item)
 
 255     def AddPane(self, window, info=None, caption=None):
 
 257         AddPane(self, window, info=None, caption=None) -> bool
 
 259         AddPane tells the frame manager to start managing a child
 
 260         window. There are two versions of this function. The first
 
 261         verison accepts a `PaneInfo` object for the ``info`` parameter
 
 262         and allows the full spectrum of pane parameter
 
 263         possibilities. (Say that 3 times fast!)
 
 265         The second version is used for simpler user interfaces which
 
 266         do not require as much configuration.  In this case the
 
 267         ``info`` parameter specifies the direction property of the
 
 268         pane info, and defaults to ``wx.LEFT``.  The pane caption may
 
 269         also be specified as an extra parameter in this form.
 
 271         if type(info) == AuiPaneInfo:
 
 272             return self._AddPane1(window, info)
 
 279             return self._AddPane2(window, info, caption)
 
 282     // For backwards compatibility
 
 284          SetFrame = wx._deprecated(SetManagedWindow,
 
 285                                    "SetFrame is deprecated, use `SetManagedWindow` instead.")
 
 286          GetFrame = wx._deprecated(GetManagedWindow,
 
 287                                    "GetFrame is deprecated, use `GetManagedWindow` instead.")
 
 291 %extend wxAuiDockInfo {
 
 295 %extend wxAuiDockUIPart {
 
 296     ~wxAuiDockUIPart() {}
 
 299 %extend wxAuiPaneButton {
 
 300     ~wxAuiPaneButton() {}
 
 303 //---------------------------------------------------------------------------
 
 306 // A wxDocArt class that knows how to forward virtuals to Python methods
 
 307 class wxPyAuiDockArt :  public wxAuiDefaultDockArt
 
 310     wxPyAuiDockArt() : wxAuiDefaultDockArt() {}
 
 312     DEC_PYCALLBACK_INT_INT(GetMetric);
 
 313     DEC_PYCALLBACK_VOID_INTINT(SetMetric);
 
 314     DEC_PYCALLBACK__INTFONT(SetFont);
 
 315     DEC_PYCALLBACK_FONT_INT(GetFont);
 
 316     DEC_PYCALLBACK_COLOUR_INT(GetColour);
 
 317     DEC_PYCALLBACK__INTCOLOUR(SetColour);
 
 319     virtual void DrawSash(wxDC& dc,
 
 325         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 326         if ((found = wxPyCBH_findCallback(m_myInst, "DrawSash"))) {
 
 327             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 328             PyObject* owin = wxPyMake_wxObject(window, false);
 
 329             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 330             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
 
 331                                                          odc, owin, orientation, orect));
 
 336         wxPyEndBlockThreads(blocked);
 
 338             wxAuiDefaultDockArt::DrawSash(dc, window, orientation, rect);
 
 341     virtual void DrawBackground(wxDC& dc,
 
 347         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 348         if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
 
 349             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 350             PyObject* owin = wxPyMake_wxObject(window, false);
 
 351             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 352             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
 
 353                                                          odc, owin, orientation, orect));
 
 358         wxPyEndBlockThreads(blocked);
 
 360             wxAuiDefaultDockArt::DrawBackground(dc, window, orientation, rect);
 
 363     virtual void DrawCaption(wxDC& dc,
 
 365                           const wxString& text,
 
 370         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 371         if ((found = wxPyCBH_findCallback(m_myInst, "DrawCaption"))) {
 
 372             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 373             PyObject* owin = wxPyMake_wxObject(window, false);
 
 374             PyObject* otext = wx2PyString(text);
 
 375             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 376             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
 
 377             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOOO)",
 
 378                                                          odc, owin, otext, orect, opane));
 
 385         wxPyEndBlockThreads(blocked);
 
 387             wxAuiDefaultDockArt::DrawCaption(dc, window, text, rect, pane);
 
 390     virtual void DrawGripper(wxDC& dc,
 
 396         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 397         if ((found = wxPyCBH_findCallback(m_myInst, "DrawGripper"))) {
 
 398             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 399             PyObject* owin = wxPyMake_wxObject(window, false);
 
 400             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 401             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
 
 402             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOO)", odc, owin, orect, opane));
 
 407         wxPyEndBlockThreads(blocked);
 
 409             wxAuiDefaultDockArt::DrawGripper(dc, window, rect, pane);
 
 412     virtual void DrawBorder(wxDC& dc,
 
 418         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 419         if ((found = wxPyCBH_findCallback(m_myInst, "DrawBorder"))) {
 
 420             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 421             PyObject* owin = wxPyMake_wxObject(window, false);
 
 422             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 423             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
 
 424             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, orect, opane));
 
 430         wxPyEndBlockThreads(blocked);
 
 432             wxAuiDefaultDockArt::DrawBorder(dc, window, rect, pane);
 
 435     virtual void DrawPaneButton(wxDC& dc,
 
 443         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 444         if ((found = wxPyCBH_findCallback(m_myInst, "DrawPaneButton"))) {
 
 445             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 446             PyObject* owin = wxPyMake_wxObject(window, false);
 
 447             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 448             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
 
 449             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiIOO)",
 
 450                                                          odc, owin, button, button_state,
 
 457         wxPyEndBlockThreads(blocked);
 
 459             wxAuiDefaultDockArt::DrawPaneButton(dc, window, button, button_state, rect, pane);
 
 466 IMP_PYCALLBACK_INT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetMetric);
 
 467 IMP_PYCALLBACK_VOID_INTINT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetMetric);
 
 468 IMP_PYCALLBACK__INTFONT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetFont);
 
 469 IMP_PYCALLBACK_FONT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetFont);
 
 470 IMP_PYCALLBACK_COLOUR_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetColour);
 
 471 IMP_PYCALLBACK__INTCOLOUR(wxPyAuiDockArt, wxAuiDefaultDockArt, SetColour);
 
 476 DocStr(wxPyAuiDockArt,
 
 477 "This version of the `AuiDockArt` class has been instrumented to be
 
 478 subclassable in Python and to reflect all calls to the C++ base class
 
 479 methods to the Python methods implemented in the derived class.", "");
 
 481 class wxPyAuiDockArt :  public wxAuiDefaultDockArt
 
 484     %pythonAppend wxPyAuiDockArt     setCallbackInfo(PyAuiDockArt)
 
 490 //---------------------------------------------------------------------------
 
 492 %extend wxAuiNotebook {
 
 493     %property(PageCount, GetPageCount, doc="See `GetPageCount`");
 
 494     %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
 
 498 %extend wxAuiNotebookEvent {
 
 499     %property(OldSelection, GetOldSelection, SetOldSelection, doc="See `GetOldSelection` and `SetOldSelection`");
 
 500     %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
 
 504 %extend wxAuiTabContainer {
 
 505     %property(ActivePage, GetActivePage, SetActivePage, doc="See `GetActivePage` and `SetActivePage`");
 
 506     %property(PageCount, GetPageCount, doc="See `GetPageCount`");
 
 507     %property(Pages, GetPages, doc="See `GetPages`");
 
 511 %extend wxAuiManager {
 
 512     %property(AllPanes, GetAllPanes, doc="See `GetAllPanes`");
 
 513     %property(ArtProvider, GetArtProvider, SetArtProvider, doc="See `GetArtProvider` and `SetArtProvider`");
 
 514     %property(Flags, GetFlags, SetFlags, doc="See `GetFlags` and `SetFlags`");
 
 515     %property(ManagedWindow, GetManagedWindow, SetManagedWindow, doc="See `GetManagedWindow` and `SetManagedWindow`");
 
 519 %extend wxAuiManagerEvent {
 
 520     %property(Button, GetButton, SetButton, doc="See `GetButton` and `SetButton`");
 
 521     %property(DC, GetDC, SetDC, doc="See `GetDC` and `SetDC`");
 
 522     %property(Pane, GetPane, SetPane, doc="See `GetPane` and `SetPane`");
 
 526 //---------------------------------------------------------------------------
 
 529 // A wxTabArt class that knows how to forward virtuals to Python methods
 
 530 class wxPyAuiTabArt :  public wxAuiDefaultTabArt
 
 533     wxPyAuiTabArt() : wxAuiDefaultTabArt() {}
 
 536     virtual void DrawBackground( wxDC& dc,
 
 541         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 542         if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
 
 543             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 544             PyObject* ownd = wxPyMake_wxObject(wnd, false);
 
 545             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 546             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, ownd, orect));
 
 551         wxPyEndBlockThreads(blocked);
 
 553             wxAuiDefaultTabArt::DrawBackground(dc, wnd, rect);
 
 556     virtual void DrawTab( wxDC& dc,
 
 558                           const wxAuiNotebookPage& pane,
 
 559                           const wxRect& in_rect,
 
 560                           int close_button_state,
 
 561                           wxRect* out_tab_rect,
 
 562                           wxRect* out_button_rect,
 
 566         const char* errmsg = "DrawTab should return a sequence containing (tab_rect, button_rect, x_extent)";
 
 567         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 568         if ((found = wxPyCBH_findCallback(m_myInst, "DrawTab"))) {
 
 569             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 570             PyObject* ownd = wxPyMake_wxObject(wnd, false);
 
 571             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiNotebookPage"), 0);
 
 572             PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
 
 574             ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
 
 576                                              odc, ownd, orect, opane,
 
 577                                              close_button_state));
 
 579                 if (PySequence_Check(ro) && PyObject_Length(ro) == 3) {
 
 580                     PyObject* o1 = PySequence_GetItem(ro, 0);
 
 581                     PyObject* o2 = PySequence_GetItem(ro, 1);
 
 582                     PyObject* o3 = PySequence_GetItem(ro, 2);
 
 583                     if (!wxRect_helper(o1, &out_tab_rect)) 
 
 584                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 585                     else if (!wxRect_helper(o2, &out_button_rect)) 
 
 586                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 587                     else if (!PyInt_Check(o3)) 
 
 588                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 590                         *x_extent = PyInt_AsLong(o3);
 
 597                     PyErr_SetString(PyExc_TypeError, errmsg);
 
 607         wxPyEndBlockThreads(blocked);
 
 609             wxAuiDefaultTabArt::DrawTab(dc, wnd, pane, in_rect, close_button_state, out_tab_rect, out_button_rect, x_extent);
 
 613     virtual void DrawButton( wxDC& dc,
 
 615                              const wxRect& in_rect,
 
 622         const char* errmsg = "DrawButton should return a wxRect";
 
 623         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 624         if ((found = wxPyCBH_findCallback(m_myInst, "DrawButton"))) {
 
 625             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 626             PyObject* ownd = wxPyMake_wxObject(wnd, false);
 
 627             PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
 
 629             ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OOOiiiO)", odc, ownd, orect,
 
 630                                                                  bitmap_id, button_state, orientation));
 
 632                 if (!wxRect_helper(ro, &out_rect)) 
 
 633                     PyErr_SetString(PyExc_TypeError, errmsg);
 
 641         wxPyEndBlockThreads(blocked);
 
 643             wxAuiDefaultTabArt::DrawButton(dc, wnd, in_rect, bitmap_id, button_state, orientation, out_rect);
 
 647     virtual wxSize GetTabSize( wxDC& dc,
 
 649                                const wxString& caption,
 
 650                                const wxBitmap& bitmap,
 
 652                                int  close_button_state,
 
 656         wxSize rv, *prv = &rv;
 
 657         const char* errmsg = "GetTabSize should return a sequence containing (size, x_extent)";
 
 658         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 659         if ((found = wxPyCBH_findCallback(m_myInst, "GetTabSize"))) {
 
 660             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 661             PyObject* ownd = wxPyMake_wxObject(wnd, false);
 
 662             PyObject* otext = wx2PyString(caption);
 
 663             PyObject* obmp = wxPyMake_wxObject((wxObject*)&bitmap, false);
 
 665             ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
 
 666                                              "(OOOOii)", odc, ownd, otext, obmp, (int)active, close_button_state));
 
 668                 if (PySequence_Check(ro) && PyObject_Length(ro) == 2) {
 
 669                     PyObject* o1 = PySequence_GetItem(ro, 0);
 
 670                     PyObject* o2 = PySequence_GetItem(ro, 1);
 
 671                     if (!wxSize_helper(o1, &prv)) 
 
 672                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 673                     else if (!PyInt_Check(o2)) 
 
 674                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 676                         *x_extent = PyInt_AsLong(o2);
 
 682                     PyErr_SetString(PyExc_TypeError, errmsg);
 
 692         wxPyEndBlockThreads(blocked);
 
 694             rv = wxAuiDefaultTabArt::GetTabSize(dc, wnd, caption, bitmap, active, close_button_state, x_extent);
 
 699 //     virtual int ShowDropDown(
 
 701 //                          const wxAuiNotebookPageArray& items,
 
 704 //     virtual int GetIndentSize();
 
 706 //     virtual int GetBestTabCtrlSize(wxWindow* wnd,
 
 707 //                                    const wxAuiNotebookPageArray& pages, 
 
 708 //                                    const wxSize& required_bmp_size);      
 
 709 //     virtual wxAuiTabArt* Clone();
 
 710 //     virtual void SetFlags(unsigned int flags);
 
 711 //     virtual void SetSizingInfo(const wxSize& tab_ctrl_size,
 
 712 //                                size_t tab_count);
 
 713 //     virtual int GetIndentSize();
 
 717     DEC_PYCALLBACK__FONT(SetNormalFont);
 
 718     DEC_PYCALLBACK__FONT(SetSelectedFont);
 
 719     DEC_PYCALLBACK__FONT(SetMeasuringFont);
 
 720 //    DEC_PYCALLBACK_INT_WIN(GetBestTabCtrlSize);
 
 726 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetNormalFont);
 
 727 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetSelectedFont);
 
 728 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetMeasuringFont);
 
 729 //IMP_PYCALLBACK_INT_WIN(wxPyAuiTabArt, wxAuiDefaultTabArt, GetBestTabCtrlSize);
 
 733 DocStr(wxPyAuiTabArt,
 
 734 "This version of the `TabArt` class has been instrumented to be
 
 735 subclassable in Python and to reflect all calls to the C++ base class
 
 736 methods to the Python methods implemented in the derived class.", "");
 
 738 class wxPyAuiTabArt :  public wxAuiDefaultTabArt
 
 741     %pythonAppend wxPyAuiTabArt     setCallbackInfo(PyAuiTabArt)
 
 747 //---------------------------------------------------------------------------