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 // Ignore these for now because they need a typemap for the return value, see below.
 
 206 %ignore wxAuiMDIParentFrame::GetNotebook;
 
 207 %ignore wxAuiMDIParentFrame::GetActiveChild;
 
 208 %ignore wxAuiMDIParentFrame::GetClientWindow;
 
 210 %pythonAppend wxAuiMDIChildFrame::wxAuiMDIChildFrame    "self._setOORInfo(self)";
 
 211 %pythonAppend wxAuiMDIChildFrame::wxAuiMDIChildFrame()  "val._setOORInfo(val)";
 
 212 %ignore wxAuiMDIChildFrame::~wxAuiMDIChildFrame;
 
 213 %rename(PreAuiMDIChildFrame) wxAuiMDIChildFrame::wxAuiMDIChildFrame();
 
 215 %pythonAppend wxAuiMDIClientWindow::wxAuiMDIClientWindow    "self._setOORInfo(self)";
 
 216 %pythonAppend wxAuiMDIClientWindow::wxAuiMDIClientWindow()  "val._setOORInfo(val)";
 
 217 %ignore wxAuiMDIClientWindow::~wxAuiMDIClientWindow;
 
 218 %rename(PreAuiMDIClientWindow) wxAuiMDIClientWindow::wxAuiMDIClientWindow();
 
 221 %typemap(out) wxEvtHandler*             { $result = wxPyMake_wxObject($1, $owner); }
 
 223 //---------------------------------------------------------------------------
 
 224 // Get all our defs from the REAL header files.
 
 226 #define wxColor wxColour  // fix problem in dockart.h
 
 228 %include framemanager.h
 
 236 //---------------------------------------------------------------------------
 
 237 // Methods to inject into the FrameManager class that will sort out calls to
 
 238 // the overloaded versions of GetPane and AddPane
 
 240 %extend wxAuiManager {
 
 242     def GetPane(self, item):
 
 244         GetPane(self, window_or_info item) -> PaneInfo
 
 246         GetPane is used to search for a `PaneInfo` object either by
 
 247         widget reference or by pane name, which acts as a unique id
 
 248         for a window pane. The returned `PaneInfo` object may then be
 
 249         modified to change a pane's look, state or position. After one
 
 250         or more modifications to the `PaneInfo`, `FrameManager.Update`
 
 251         should be called to realize the changes to the user interface.
 
 253         If the lookup failed (meaning the pane could not be found in
 
 254         the manager) GetPane returns an empty `PaneInfo`, a condition
 
 255         which can be checked by calling `PaneInfo.IsOk`.
 
 257         if isinstance(item, wx.Window):
 
 258             return self._GetPaneByWidget(item)
 
 260             return self._GetPaneByName(item)
 
 262     def AddPane(self, window, info=None, caption=None):
 
 264         AddPane(self, window, info=None, caption=None) -> bool
 
 266         AddPane tells the frame manager to start managing a child
 
 267         window. There are two versions of this function. The first
 
 268         verison accepts a `PaneInfo` object for the ``info`` parameter
 
 269         and allows the full spectrum of pane parameter
 
 270         possibilities. (Say that 3 times fast!)
 
 272         The second version is used for simpler user interfaces which
 
 273         do not require as much configuration.  In this case the
 
 274         ``info`` parameter specifies the direction property of the
 
 275         pane info, and defaults to ``wx.LEFT``.  The pane caption may
 
 276         also be specified as an extra parameter in this form.
 
 278         if type(info) == AuiPaneInfo:
 
 279             return self._AddPane1(window, info)
 
 286             return self._AddPane2(window, info, caption)
 
 289     // For backwards compatibility
 
 291          SetFrame = wx._deprecated(SetManagedWindow,
 
 292                                    "SetFrame is deprecated, use `SetManagedWindow` instead.")
 
 293          GetFrame = wx._deprecated(GetManagedWindow,
 
 294                                    "GetFrame is deprecated, use `GetManagedWindow` instead.")
 
 298 %extend wxAuiDockInfo {
 
 302 %extend wxAuiDockUIPart {
 
 303     ~wxAuiDockUIPart() {}
 
 306 %extend wxAuiPaneButton {
 
 307     ~wxAuiPaneButton() {}
 
 310 %extend wxAuiMDIParentFrame {
 
 311     %typemap(out) wxAuiNotebook*          { $result = wxPyMake_wxObject($1, $owner); }
 
 312     %typemap(out) wxAuiMDIChildFrame*     { $result = wxPyMake_wxObject($1, $owner); }
 
 313     %typemap(out) wxAuiMDIClientWindow*   { $result = wxPyMake_wxObject($1, $owner); }
 
 315     %rename(GetNotebook) _GetNotebook;
 
 316     %rename(GetActiveChild) _GetActiveChild;
 
 317     %rename(GetClientWindow) _GetClientWindow;
 
 319     wxAuiNotebook* _GetNotebook() const
 
 321         return self->GetNotebook();
 
 324     wxAuiMDIChildFrame* _GetActiveChild() const
 
 326         return self->GetActiveChild();
 
 329     wxAuiMDIClientWindow* _GetClientWindow() const
 
 331         return self->GetClientWindow();
 
 334     %typemap(out) wxAuiNotebook*;       
 
 335     %typemap(out) wxAuiMDIChildFrame*;  
 
 336     %typemap(out) wxAuiMDIClientWindow*;
 
 340 //---------------------------------------------------------------------------
 
 343 // A wxDocArt class that knows how to forward virtuals to Python methods
 
 344 class wxPyAuiDockArt :  public wxAuiDefaultDockArt
 
 347     wxPyAuiDockArt() : wxAuiDefaultDockArt() {}
 
 349     DEC_PYCALLBACK_INT_INT(GetMetric);
 
 350     DEC_PYCALLBACK_VOID_INTINT(SetMetric);
 
 351     DEC_PYCALLBACK__INTFONT(SetFont);
 
 352     DEC_PYCALLBACK_FONT_INT(GetFont);
 
 353     DEC_PYCALLBACK_COLOUR_INT(GetColour);
 
 354     DEC_PYCALLBACK__INTCOLOUR(SetColour);
 
 356     virtual void DrawSash(wxDC& dc,
 
 362         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 363         if ((found = wxPyCBH_findCallback(m_myInst, "DrawSash"))) {
 
 364             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 365             PyObject* owin = wxPyMake_wxObject(window, false);
 
 366             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 367             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
 
 368                                                          odc, owin, orientation, orect));
 
 373         wxPyEndBlockThreads(blocked);
 
 375             wxAuiDefaultDockArt::DrawSash(dc, window, orientation, rect);
 
 378     virtual void DrawBackground(wxDC& dc,
 
 384         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 385         if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
 
 386             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 387             PyObject* owin = wxPyMake_wxObject(window, false);
 
 388             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 389             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
 
 390                                                          odc, owin, orientation, orect));
 
 395         wxPyEndBlockThreads(blocked);
 
 397             wxAuiDefaultDockArt::DrawBackground(dc, window, orientation, rect);
 
 400     virtual void DrawCaption(wxDC& dc,
 
 402                           const wxString& text,
 
 407         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 408         if ((found = wxPyCBH_findCallback(m_myInst, "DrawCaption"))) {
 
 409             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 410             PyObject* owin = wxPyMake_wxObject(window, false);
 
 411             PyObject* otext = wx2PyString(text);
 
 412             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 413             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
 
 414             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOOO)",
 
 415                                                          odc, owin, otext, orect, opane));
 
 422         wxPyEndBlockThreads(blocked);
 
 424             wxAuiDefaultDockArt::DrawCaption(dc, window, text, rect, pane);
 
 427     virtual void DrawGripper(wxDC& dc,
 
 433         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 434         if ((found = wxPyCBH_findCallback(m_myInst, "DrawGripper"))) {
 
 435             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 436             PyObject* owin = wxPyMake_wxObject(window, false);
 
 437             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 438             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
 
 439             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOO)", odc, owin, orect, opane));
 
 444         wxPyEndBlockThreads(blocked);
 
 446             wxAuiDefaultDockArt::DrawGripper(dc, window, rect, pane);
 
 449     virtual void DrawBorder(wxDC& dc,
 
 455         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 456         if ((found = wxPyCBH_findCallback(m_myInst, "DrawBorder"))) {
 
 457             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 458             PyObject* owin = wxPyMake_wxObject(window, false);
 
 459             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 460             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
 
 461             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, orect, opane));
 
 467         wxPyEndBlockThreads(blocked);
 
 469             wxAuiDefaultDockArt::DrawBorder(dc, window, rect, pane);
 
 472     virtual void DrawPaneButton(wxDC& dc,
 
 480         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 481         if ((found = wxPyCBH_findCallback(m_myInst, "DrawPaneButton"))) {
 
 482             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 483             PyObject* owin = wxPyMake_wxObject(window, false);
 
 484             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 485             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
 
 486             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiIOO)",
 
 487                                                          odc, owin, button, button_state,
 
 494         wxPyEndBlockThreads(blocked);
 
 496             wxAuiDefaultDockArt::DrawPaneButton(dc, window, button, button_state, rect, pane);
 
 503 IMP_PYCALLBACK_INT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetMetric);
 
 504 IMP_PYCALLBACK_VOID_INTINT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetMetric);
 
 505 IMP_PYCALLBACK__INTFONT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetFont);
 
 506 IMP_PYCALLBACK_FONT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetFont);
 
 507 IMP_PYCALLBACK_COLOUR_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetColour);
 
 508 IMP_PYCALLBACK__INTCOLOUR(wxPyAuiDockArt, wxAuiDefaultDockArt, SetColour);
 
 513 DocStr(wxPyAuiDockArt,
 
 514 "This version of the `AuiDockArt` class has been instrumented to be
 
 515 subclassable in Python and to reflect all calls to the C++ base class
 
 516 methods to the Python methods implemented in the derived class.", "");
 
 518 class wxPyAuiDockArt :  public wxAuiDefaultDockArt
 
 521     %pythonAppend wxPyAuiDockArt     setCallbackInfo(PyAuiDockArt)
 
 524     void _setCallbackInfo(PyObject* self, PyObject* _class);
 
 528 //---------------------------------------------------------------------------
 
 530 %extend wxAuiNotebook {
 
 531     %property(PageCount, GetPageCount, doc="See `GetPageCount`");
 
 532     %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
 
 536 %extend wxAuiNotebookEvent {
 
 537     %property(OldSelection, GetOldSelection, SetOldSelection, doc="See `GetOldSelection` and `SetOldSelection`");
 
 538     %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
 
 542 %extend wxAuiTabContainer {
 
 543     %property(ActivePage, GetActivePage, SetActivePage, doc="See `GetActivePage` and `SetActivePage`");
 
 544     %property(PageCount, GetPageCount, doc="See `GetPageCount`");
 
 545     %property(Pages, GetPages, doc="See `GetPages`");
 
 549 %extend wxAuiManager {
 
 550     %property(AllPanes, GetAllPanes, doc="See `GetAllPanes`");
 
 551     %property(ArtProvider, GetArtProvider, SetArtProvider, doc="See `GetArtProvider` and `SetArtProvider`");
 
 552     %property(Flags, GetFlags, SetFlags, doc="See `GetFlags` and `SetFlags`");
 
 553     %property(ManagedWindow, GetManagedWindow, SetManagedWindow, doc="See `GetManagedWindow` and `SetManagedWindow`");
 
 557 %extend wxAuiManagerEvent {
 
 558     %property(Button, GetButton, SetButton, doc="See `GetButton` and `SetButton`");
 
 559     %property(DC, GetDC, SetDC, doc="See `GetDC` and `SetDC`");
 
 560     %property(Pane, GetPane, SetPane, doc="See `GetPane` and `SetPane`");
 
 564 //---------------------------------------------------------------------------
 
 567 // A wxTabArt class that knows how to forward virtuals to Python methods
 
 568 class wxPyAuiTabArt :  public wxAuiDefaultTabArt
 
 571     wxPyAuiTabArt() : wxAuiDefaultTabArt() {}
 
 574     virtual void DrawBackground( wxDC& dc,
 
 579         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 580         if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
 
 581             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 582             PyObject* ownd = wxPyMake_wxObject(wnd, false);
 
 583             PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
 
 584             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, ownd, orect));
 
 589         wxPyEndBlockThreads(blocked);
 
 591             wxAuiDefaultTabArt::DrawBackground(dc, wnd, rect);
 
 594     virtual void DrawTab( wxDC& dc,
 
 596                           const wxAuiNotebookPage& pane,
 
 597                           const wxRect& in_rect,
 
 598                           int close_button_state,
 
 599                           wxRect* out_tab_rect,
 
 600                           wxRect* out_button_rect,
 
 604         const char* errmsg = "DrawTab should return a sequence containing (tab_rect, button_rect, x_extent)";
 
 605         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 606         if ((found = wxPyCBH_findCallback(m_myInst, "DrawTab"))) {
 
 607             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 608             PyObject* ownd = wxPyMake_wxObject(wnd, false);
 
 609             PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiNotebookPage"), 0);
 
 610             PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
 
 612             ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
 
 614                                              odc, ownd, orect, opane,
 
 615                                              close_button_state));
 
 617                 if (PySequence_Check(ro) && PyObject_Length(ro) == 3) {
 
 618                     PyObject* o1 = PySequence_GetItem(ro, 0);
 
 619                     PyObject* o2 = PySequence_GetItem(ro, 1);
 
 620                     PyObject* o3 = PySequence_GetItem(ro, 2);
 
 621                     if (!wxRect_helper(o1, &out_tab_rect)) 
 
 622                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 623                     else if (!wxRect_helper(o2, &out_button_rect)) 
 
 624                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 625                     else if (!PyInt_Check(o3)) 
 
 626                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 628                         *x_extent = PyInt_AsLong(o3);
 
 635                     PyErr_SetString(PyExc_TypeError, errmsg);
 
 645         wxPyEndBlockThreads(blocked);
 
 647             wxAuiDefaultTabArt::DrawTab(dc, wnd, pane, in_rect, close_button_state, out_tab_rect, out_button_rect, x_extent);
 
 651     virtual void DrawButton( wxDC& dc,
 
 653                              const wxRect& in_rect,
 
 660         const char* errmsg = "DrawButton should return a wxRect";
 
 661         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 662         if ((found = wxPyCBH_findCallback(m_myInst, "DrawButton"))) {
 
 663             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 664             PyObject* ownd = wxPyMake_wxObject(wnd, false);
 
 665             PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
 
 667             ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OOOiiiO)", odc, ownd, orect,
 
 668                                                                  bitmap_id, button_state, orientation));
 
 670                 if (!wxRect_helper(ro, &out_rect)) 
 
 671                     PyErr_SetString(PyExc_TypeError, errmsg);
 
 679         wxPyEndBlockThreads(blocked);
 
 681             wxAuiDefaultTabArt::DrawButton(dc, wnd, in_rect, bitmap_id, button_state, orientation, out_rect);
 
 685     virtual wxSize GetTabSize( wxDC& dc,
 
 687                                const wxString& caption,
 
 688                                const wxBitmap& bitmap,
 
 690                                int  close_button_state,
 
 694         wxSize rv, *prv = &rv;
 
 695         const char* errmsg = "GetTabSize should return a sequence containing (size, x_extent)";
 
 696         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 697         if ((found = wxPyCBH_findCallback(m_myInst, "GetTabSize"))) {
 
 698             PyObject* odc = wxPyMake_wxObject(&dc, false);
 
 699             PyObject* ownd = wxPyMake_wxObject(wnd, false);
 
 700             PyObject* otext = wx2PyString(caption);
 
 701             PyObject* obmp = wxPyMake_wxObject((wxObject*)&bitmap, false);
 
 703             ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
 
 704                                              "(OOOOii)", odc, ownd, otext, obmp, (int)active, close_button_state));
 
 706                 if (PySequence_Check(ro) && PyObject_Length(ro) == 2) {
 
 707                     PyObject* o1 = PySequence_GetItem(ro, 0);
 
 708                     PyObject* o2 = PySequence_GetItem(ro, 1);
 
 709                     if (!wxSize_helper(o1, &prv)) 
 
 710                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 711                     else if (!PyInt_Check(o2)) 
 
 712                         PyErr_SetString(PyExc_TypeError, errmsg);
 
 714                         *x_extent = PyInt_AsLong(o2);
 
 720                     PyErr_SetString(PyExc_TypeError, errmsg);
 
 730         wxPyEndBlockThreads(blocked);
 
 732             rv = wxAuiDefaultTabArt::GetTabSize(dc, wnd, caption, bitmap, active, close_button_state, x_extent);
 
 737 //     virtual int ShowDropDown(
 
 739 //                          const wxAuiNotebookPageArray& items,
 
 742 //     virtual int GetIndentSize();
 
 744 //     virtual int GetBestTabCtrlSize(wxWindow* wnd,
 
 745 //                                    const wxAuiNotebookPageArray& pages, 
 
 746 //                                    const wxSize& required_bmp_size);      
 
 747 //     virtual wxAuiTabArt* Clone();
 
 748 //     virtual void SetFlags(unsigned int flags);
 
 749 //     virtual void SetSizingInfo(const wxSize& tab_ctrl_size,
 
 750 //                                size_t tab_count);
 
 751 //     virtual int GetIndentSize();
 
 755     DEC_PYCALLBACK__FONT(SetNormalFont);
 
 756     DEC_PYCALLBACK__FONT(SetSelectedFont);
 
 757     DEC_PYCALLBACK__FONT(SetMeasuringFont);
 
 763 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetNormalFont);
 
 764 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetSelectedFont);
 
 765 IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetMeasuringFont);
 
 769 DocStr(wxPyAuiTabArt,
 
 770 "This version of the `TabArt` class has been instrumented to be
 
 771 subclassable in Python and to reflect all calls to the C++ base class
 
 772 methods to the Python methods implemented in the derived class.", "");
 
 774 class wxPyAuiTabArt :  public wxAuiDefaultTabArt
 
 777     %pythonAppend wxPyAuiTabArt     setCallbackInfo(PyAuiTabArt)
 
 780     void _setCallbackInfo(PyObject* self, PyObject* _class);   
 
 784 //---------------------------------------------------------------------------