]> git.saurik.com Git - wxWidgets.git/blame - wxPython/src/aui.i
handle mouse capture lost event in grid windows and reset the grid to normal state...
[wxWidgets.git] / wxPython / src / aui.i
CommitLineData
febb39df
RD
1/////////////////////////////////////////////////////////////////////////////
2// Name: aui.i
3// Purpose: Wrappers for the wxAUI classes.
4//
5// Author: Robin Dunn
6//
7// Created: 5-July-2006
8// RCS-ID: $Id$
9// Copyright: (c) 2006 by Total Control Software
10// Licence: wxWindows license
11/////////////////////////////////////////////////////////////////////////////
12
13%define DOCSTRING
14"The wx.aui moduleis an Advanced User Interface library that aims to
15implement \"cutting-edge\" interface usability and design features so
16developers can quickly and easily create beautiful and usable
17application interfaces.
18
19**Vision and Design Principles**
20
21wx.aui attempts to encapsulate the following aspects of the user
22interface:
23
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.
28
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.
34
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.
40
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
45 animation.
46
2a783b2d 47**wx.aui adheres to the following principles**
febb39df
RD
48
49 - Use native floating frames to obtain a native look and feel for
50 all platforms;
51
52 - Use existing wxPython code where possible, such as sizer
53 implementation for frame management;
54
55 - Use standard wxPython coding conventions.
56
57
58**Usage**
59
60The following example shows a simple implementation that utilizes
61`wx.aui.FrameManager` to manage three text controls in a frame window::
62
63 import wx
64 import wx.aui
65
66 class MyFrame(wx.Frame):
67
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)
71
2a783b2d 72 self._mgr = wx.aui.AuiManager(self)
febb39df
RD
73
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)
78
79 text2 = wx.TextCtrl(self, -1, 'Pane 2 - sample text',
80 wx.DefaultPosition, wx.Size(200,150),
81 wx.NO_BORDER | wx.TE_MULTILINE)
82
83 text3 = wx.TextCtrl(self, -1, 'Main content window',
84 wx.DefaultPosition, wx.Size(200,150),
85 wx.NO_BORDER | wx.TE_MULTILINE)
86
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)
91
92 # tell the manager to 'commit' all the changes just made
93 self._mgr.Update()
94
95 self.Bind(wx.EVT_CLOSE, self.OnClose)
96
97
98 def OnClose(self, event):
99 # deinitialize the frame manager
100 self._mgr.UnInit()
101 # delete the frame
102 self.Destroy()
103
104
105 app = wx.App()
106 frame = MyFrame(None)
107 frame.Show()
108 app.MainLoop()
109"
110%enddef
111
112
113
114%module(package="wx", docstring=DOCSTRING) aui
115
116%{
117#include "wx/wxPython/wxPython.h"
118#include "wx/wxPython/pyclasses.h"
119#include <wx/aui/aui.h>
120%}
121
122//---------------------------------------------------------------------------
123
124%import core.i
125%import windows.i
126
127%pythoncode { wx = _core }
128%pythoncode { __docfilter__ = wx.__DocFilter(globals()) }
129
130
131%include _aui_docstrings.i
132
133//---------------------------------------------------------------------------
134
34d71f81
RD
135// Preprocessor stuff so SWIG doesn't get confused when %include-ing
136// the aui .h files.
070a1e7e
RD
137%ignore wxUSE_AUI;
138%ignore wxUSE_MENUS;
139%ignore wxABI_VERSION;
febb39df 140#define wxUSE_AUI 1
34d71f81 141#define wxUSE_MENUS 1
070a1e7e
RD
142#define wxABI_VERSION 99999
143
febb39df
RD
144#define WXDLLIMPEXP_AUI
145#define unsigned
d7a7616b 146#define wxDEPRECATED(decl)
34d71f81
RD
147#define DECLARE_EVENT_TABLE()
148#define DECLARE_DYNAMIC_CLASS(foo)
149
d7a7616b 150
febb39df 151
1c976bff
RD
152// We'll skip making wrappers for these, they have overloads that take a
153// wxSize or wxPoint
2a783b2d
RD
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);
febb39df
RD
159
160// But for these we will do the overloading (see %pythoncode below) so let's
161// rename the C++ versions
2a783b2d
RD
162%rename(_GetPaneByWidget) wxAuiManager::GetPane(wxWindow* window);
163%rename(_GetPaneByName) wxAuiManager::GetPane(const wxString& name);
febb39df 164
2a783b2d
RD
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);
febb39df 168
2a783b2d
RD
169%rename(AddPaneAtPos) wxAuiManager::AddPane(wxWindow* window,
170 const wxPaneInfo& pane_info,
171 const wxPoint& drop_pos);
febb39df
RD
172
173// A typemap for the return value of wxFrameManager::GetAllPanes
2a783b2d 174%typemap(out) wxAuiPaneInfoArray& {
febb39df
RD
175 $result = PyList_New(0);
176 for (size_t i=0; i < $1->GetCount(); i++) {
2a783b2d 177 PyObject* pane_obj = SWIG_NewPointerObj((void*)(&$1->Item(i)), SWIGTYPE_p_wxAuiPaneInfo, 0);
febb39df
RD
178 PyList_Append($result, pane_obj);
179 }
180}
181
182
1c976bff
RD
183%nokwargs wxAuiTabContainer::SetActivePage;
184
185%pythonAppend wxAuiTabCtrl::wxAuiTabCtrl "self._setOORInfo(self)";
186
2a783b2d 187%pythonAppend wxAuiNotebook::wxAuiNotebook "self._setOORInfo(self)";
34d71f81 188%pythonAppend wxAuiNotebook::wxAuiNotebook() "val._setOORInfo(val)";
2a783b2d
RD
189%ignore wxAuiiNotebook::~wxAuiNotebook;
190%rename(PreAuiNotebook) wxAuiNotebook::wxAuiNotebook();
1c976bff 191
34d71f81
RD
192// Link error...
193%ignore wxAuiDefaultTabArt::SetWindow;
54af9b8b 194
d48ae46b
RD
195// ignore this overload
196%ignore wxAuiTabContainer::GetPage(size_t idx) const;
197
198
34d71f81
RD
199
200%pythonAppend wxAuiMDIParentFrame::wxAuiMDIParentFrame "self._setOORInfo(self)";
201%pythonAppend wxAuiMDIParentFrame::wxAuiMDIParentFrame() "val._setOORInfo(val)";
202%ignore wxAuiMDIParentFrame::~wxAuiMDIParentFrame;
203%rename(PreAuiMDIParentFrame) wxAuiMDIParentFrame::wxAuiMDIParentFrame();
204
205%pythonAppend wxAuiMDIChildFrame::wxAuiMDIChildFrame "self._setOORInfo(self)";
206%pythonAppend wxAuiMDIChildFrame::wxAuiMDIChildFrame() "val._setOORInfo(val)";
207%ignore wxAuiMDIChildFrame::~wxAuiMDIChildFrame;
208%rename(PreAuiMDIChildFrame) wxAuiMDIChildFrame::wxAuiMDIChildFrame();
209
210%pythonAppend wxAuiMDIClientWindow::wxAuiMDIClientWindow "self._setOORInfo(self)";
211%pythonAppend wxAuiMDIClientWindow::wxAuiMDIClientWindow() "val._setOORInfo(val)";
212%ignore wxAuiMDIClientWindow::~wxAuiMDIClientWindow;
213%rename(PreAuiMDIClientWindow) wxAuiMDIClientWindow::wxAuiMDIClientWindow();
214
215
febb39df
RD
216//---------------------------------------------------------------------------
217// Get all our defs from the REAL header files.
55424c8c
RD
218
219#define wxColor wxColour // fix problem in dockart.h
220
febb39df
RD
221%include framemanager.h
222%include dockart.h
223%include floatpane.h
1c976bff 224%include auibook.h
34d71f81 225%include tabmdi.h
febb39df 226
55424c8c
RD
227#undef wxColor
228
febb39df
RD
229//---------------------------------------------------------------------------
230// Methods to inject into the FrameManager class that will sort out calls to
231// the overloaded versions of GetPane and AddPane
232
2a783b2d 233%extend wxAuiManager {
d7a7616b 234 %pythoncode {
febb39df
RD
235 def GetPane(self, item):
236 """
237 GetPane(self, window_or_info item) -> PaneInfo
238
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.
245
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`.
249 """
250 if isinstance(item, wx.Window):
251 return self._GetPaneByWidget(item)
252 else:
253 return self._GetPaneByName(item)
254
255 def AddPane(self, window, info=None, caption=None):
256 """
257 AddPane(self, window, info=None, caption=None) -> bool
258
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!)
264
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.
270 """
2a783b2d 271 if type(info) == AuiPaneInfo:
4c16bedf 272 return self._AddPane1(window, info)
febb39df
RD
273 else:
274 # This Is AddPane2
4c16bedf
RD
275 if info is None:
276 info = wx.LEFT
277 if caption is None:
278 caption = ""
279 return self._AddPane2(window, info, caption)
d7a7616b
RD
280 }
281
282 // For backwards compatibility
283 %pythoncode {
284 SetFrame = wx._deprecated(SetManagedWindow,
285 "SetFrame is deprecated, use `SetManagedWindow` instead.")
286 GetFrame = wx._deprecated(GetManagedWindow,
287 "GetFrame is deprecated, use `GetManagedWindow` instead.")
288 }
febb39df
RD
289}
290
2a783b2d
RD
291%extend wxAuiDockInfo {
292 ~wxAuiDockInfo() {}
050441c8
RD
293}
294
2a783b2d
RD
295%extend wxAuiDockUIPart {
296 ~wxAuiDockUIPart() {}
050441c8
RD
297}
298
2a783b2d
RD
299%extend wxAuiPaneButton {
300 ~wxAuiPaneButton() {}
050441c8
RD
301}
302
febb39df
RD
303//---------------------------------------------------------------------------
304
305%{
2db4b82e 306// A wxDocArt class that knows how to forward virtuals to Python methods
2a783b2d 307class wxPyAuiDockArt : public wxAuiDefaultDockArt
febb39df 308{
3c69a2ec 309public:
2a783b2d 310 wxPyAuiDockArt() : wxAuiDefaultDockArt() {}
febb39df
RD
311
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);
318
319 virtual void DrawSash(wxDC& dc,
e81b607b 320 wxWindow* window,
febb39df
RD
321 int orientation,
322 const wxRect& rect)
323 {
324 bool found;
325 wxPyBlock_t blocked = wxPyBeginBlockThreads();
326 if ((found = wxPyCBH_findCallback(m_myInst, "DrawSash"))) {
327 PyObject* odc = wxPyMake_wxObject(&dc, false);
e81b607b 328 PyObject* owin = wxPyMake_wxObject(window, false);
febb39df 329 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
e81b607b
RD
330 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
331 odc, owin, orientation, orect));
febb39df 332 Py_DECREF(odc);
8f514ab4 333 Py_DECREF(owin);
febb39df
RD
334 Py_DECREF(orect);
335 }
336 wxPyEndBlockThreads(blocked);
337 if (! found)
2a783b2d 338 wxAuiDefaultDockArt::DrawSash(dc, window, orientation, rect);
febb39df
RD
339 }
340
341 virtual void DrawBackground(wxDC& dc,
e81b607b 342 wxWindow* window,
febb39df
RD
343 int orientation,
344 const wxRect& rect)
345 {
346 bool found;
347 wxPyBlock_t blocked = wxPyBeginBlockThreads();
348 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
349 PyObject* odc = wxPyMake_wxObject(&dc, false);
e81b607b 350 PyObject* owin = wxPyMake_wxObject(window, false);
febb39df 351 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
e81b607b
RD
352 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiO)",
353 odc, owin, orientation, orect));
febb39df 354 Py_DECREF(odc);
8f514ab4 355 Py_DECREF(owin);
febb39df
RD
356 Py_DECREF(orect);
357 }
358 wxPyEndBlockThreads(blocked);
359 if (! found)
2a783b2d 360 wxAuiDefaultDockArt::DrawBackground(dc, window, orientation, rect);
febb39df
RD
361 }
362
363 virtual void DrawCaption(wxDC& dc,
e81b607b 364 wxWindow* window,
febb39df
RD
365 const wxString& text,
366 const wxRect& rect,
2a783b2d 367 wxAuiPaneInfo& pane)
febb39df
RD
368 {
369 bool found;
370 wxPyBlock_t blocked = wxPyBeginBlockThreads();
371 if ((found = wxPyCBH_findCallback(m_myInst, "DrawCaption"))) {
372 PyObject* odc = wxPyMake_wxObject(&dc, false);
e81b607b 373 PyObject* owin = wxPyMake_wxObject(window, false);
febb39df
RD
374 PyObject* otext = wx2PyString(text);
375 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
2a783b2d 376 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
e81b607b
RD
377 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOOO)",
378 odc, owin, otext, orect, opane));
febb39df 379 Py_DECREF(odc);
8f514ab4 380 Py_DECREF(owin);
febb39df
RD
381 Py_DECREF(otext);
382 Py_DECREF(orect);
383 Py_DECREF(opane);
384 }
385 wxPyEndBlockThreads(blocked);
386 if (! found)
2a783b2d 387 wxAuiDefaultDockArt::DrawCaption(dc, window, text, rect, pane);
febb39df
RD
388 }
389
390 virtual void DrawGripper(wxDC& dc,
e81b607b 391 wxWindow* window,
febb39df 392 const wxRect& rect,
2a783b2d 393 wxAuiPaneInfo& pane)
febb39df
RD
394 {
395 bool found;
396 wxPyBlock_t blocked = wxPyBeginBlockThreads();
397 if ((found = wxPyCBH_findCallback(m_myInst, "DrawGripper"))) {
398 PyObject* odc = wxPyMake_wxObject(&dc, false);
e81b607b 399 PyObject* owin = wxPyMake_wxObject(window, false);
febb39df 400 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
2a783b2d 401 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
e81b607b 402 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOO)", odc, owin, orect, opane));
febb39df
RD
403 Py_DECREF(odc);
404 Py_DECREF(orect);
405 Py_DECREF(opane);
406 }
407 wxPyEndBlockThreads(blocked);
408 if (! found)
2a783b2d 409 wxAuiDefaultDockArt::DrawGripper(dc, window, rect, pane);
febb39df
RD
410 }
411
412 virtual void DrawBorder(wxDC& dc,
e81b607b 413 wxWindow* window,
febb39df 414 const wxRect& rect,
2a783b2d 415 wxAuiPaneInfo& pane)
febb39df
RD
416 {
417 bool found;
418 wxPyBlock_t blocked = wxPyBeginBlockThreads();
419 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBorder"))) {
420 PyObject* odc = wxPyMake_wxObject(&dc, false);
e81b607b 421 PyObject* owin = wxPyMake_wxObject(window, false);
febb39df 422 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
2a783b2d 423 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
febb39df
RD
424 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, orect, opane));
425 Py_DECREF(odc);
8f514ab4 426 Py_DECREF(owin);
febb39df
RD
427 Py_DECREF(orect);
428 Py_DECREF(opane);
429 }
430 wxPyEndBlockThreads(blocked);
431 if (! found)
2a783b2d 432 wxAuiDefaultDockArt::DrawBorder(dc, window, rect, pane);
febb39df
RD
433 }
434
435 virtual void DrawPaneButton(wxDC& dc,
e81b607b 436 wxWindow* window,
febb39df
RD
437 int button,
438 int button_state,
439 const wxRect& rect,
2a783b2d 440 wxAuiPaneInfo& pane)
febb39df
RD
441 {
442 bool found;
443 wxPyBlock_t blocked = wxPyBeginBlockThreads();
444 if ((found = wxPyCBH_findCallback(m_myInst, "DrawPaneButton"))) {
445 PyObject* odc = wxPyMake_wxObject(&dc, false);
e81b607b 446 PyObject* owin = wxPyMake_wxObject(window, false);
febb39df 447 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
2a783b2d 448 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiPaneInfo"), 0);
e81b607b
RD
449 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOiIOO)",
450 odc, owin, button, button_state,
febb39df
RD
451 orect, opane));
452 Py_DECREF(odc);
8f514ab4 453 Py_DECREF(owin);
febb39df
RD
454 Py_DECREF(orect);
455 Py_DECREF(opane);
456 }
457 wxPyEndBlockThreads(blocked);
458 if (! found)
2a783b2d 459 wxAuiDefaultDockArt::DrawPaneButton(dc, window, button, button_state, rect, pane);
febb39df
RD
460 }
461
462 PYPRIVATE;
463
464};
465
2a783b2d
RD
466IMP_PYCALLBACK_INT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetMetric);
467IMP_PYCALLBACK_VOID_INTINT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetMetric);
468IMP_PYCALLBACK__INTFONT(wxPyAuiDockArt, wxAuiDefaultDockArt, SetFont);
469IMP_PYCALLBACK_FONT_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetFont);
470IMP_PYCALLBACK_COLOUR_INT(wxPyAuiDockArt, wxAuiDefaultDockArt, GetColour);
471IMP_PYCALLBACK__INTCOLOUR(wxPyAuiDockArt, wxAuiDefaultDockArt, SetColour);
febb39df
RD
472
473%}
474
475
2a783b2d
RD
476DocStr(wxPyAuiDockArt,
477"This version of the `AuiDockArt` class has been instrumented to be
febb39df
RD
478subclassable in Python and to reflect all calls to the C++ base class
479methods to the Python methods implemented in the derived class.", "");
480
2a783b2d 481class wxPyAuiDockArt : public wxAuiDefaultDockArt
febb39df 482{
3c69a2ec 483public:
c25f90f6 484 %pythonAppend wxPyAuiDockArt setCallbackInfo(PyAuiDockArt)
2a783b2d 485 wxPyAuiDocArt();
febb39df
RD
486
487};
488
489
777e547f
RD
490//---------------------------------------------------------------------------
491
2a783b2d 492%extend wxAuiNotebook {
777e547f
RD
493 %property(PageCount, GetPageCount, doc="See `GetPageCount`");
494 %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
495}
496
497
498%extend wxAuiNotebookEvent {
499 %property(OldSelection, GetOldSelection, SetOldSelection, doc="See `GetOldSelection` and `SetOldSelection`");
500 %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
501}
502
503
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`");
508}
509
510
2a783b2d 511%extend wxAuiManager {
777e547f
RD
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`");
516}
517
518
2a783b2d 519%extend wxAuiManagerEvent {
777e547f
RD
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`");
523}
524
525
2db4b82e
RD
526//---------------------------------------------------------------------------
527
528%{
529// A wxTabArt class that knows how to forward virtuals to Python methods
2a783b2d 530class wxPyAuiTabArt : public wxAuiDefaultTabArt
2db4b82e 531{
3c69a2ec 532public:
2a783b2d 533 wxPyAuiTabArt() : wxAuiDefaultTabArt() {}
2db4b82e 534
8f514ab4 535
d95b9f2b 536 virtual void DrawBackground( wxDC& dc,
54af9b8b 537 wxWindow* wnd,
2db4b82e
RD
538 const wxRect& rect )
539 {
540 bool found;
541 wxPyBlock_t blocked = wxPyBeginBlockThreads();
542 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
d95b9f2b 543 PyObject* odc = wxPyMake_wxObject(&dc, false);
54af9b8b 544 PyObject* ownd = wxPyMake_wxObject(wnd, false);
2db4b82e 545 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
54af9b8b 546 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, ownd, orect));
2db4b82e 547 Py_DECREF(odc);
54af9b8b 548 Py_DECREF(ownd);
2db4b82e
RD
549 Py_DECREF(orect);
550 }
551 wxPyEndBlockThreads(blocked);
552 if (!found)
54af9b8b 553 wxAuiDefaultTabArt::DrawBackground(dc, wnd, rect);
2db4b82e
RD
554 }
555
d95b9f2b 556 virtual void DrawTab( wxDC& dc,
54af9b8b 557 wxWindow* wnd,
81fd0478 558 const wxAuiNotebookPage& pane,
2db4b82e 559 const wxRect& in_rect,
36cb9ebe
RD
560 int close_button_state,
561 wxRect* out_tab_rect,
562 wxRect* out_button_rect,
2db4b82e
RD
563 int* x_extent)
564 {
565 bool found;
36cb9ebe 566 const char* errmsg = "DrawTab should return a sequence containing (tab_rect, button_rect, x_extent)";
2db4b82e
RD
567 wxPyBlock_t blocked = wxPyBeginBlockThreads();
568 if ((found = wxPyCBH_findCallback(m_myInst, "DrawTab"))) {
d95b9f2b 569 PyObject* odc = wxPyMake_wxObject(&dc, false);
54af9b8b 570 PyObject* ownd = wxPyMake_wxObject(wnd, false);
81fd0478 571 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxAuiNotebookPage"), 0);
2db4b82e 572 PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
2db4b82e 573 PyObject* ro;
2a783b2d 574 ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
bce16979 575 "(OOOOOii)",
81fd0478
KO
576 odc, ownd, orect, opane,
577 close_button_state));
2db4b82e 578 if (ro) {
36cb9ebe 579 if (PySequence_Check(ro) && PyObject_Length(ro) == 3) {
2db4b82e
RD
580 PyObject* o1 = PySequence_GetItem(ro, 0);
581 PyObject* o2 = PySequence_GetItem(ro, 1);
36cb9ebe
RD
582 PyObject* o3 = PySequence_GetItem(ro, 2);
583 if (!wxRect_helper(o1, &out_tab_rect))
2db4b82e 584 PyErr_SetString(PyExc_TypeError, errmsg);
36cb9ebe
RD
585 else if (!wxRect_helper(o2, &out_button_rect))
586 PyErr_SetString(PyExc_TypeError, errmsg);
587 else if (!PyInt_Check(o3))
2db4b82e
RD
588 PyErr_SetString(PyExc_TypeError, errmsg);
589 else
36cb9ebe 590 *x_extent = PyInt_AsLong(o3);
2db4b82e
RD
591
592 Py_DECREF(o1);
593 Py_DECREF(o2);
36cb9ebe 594 Py_DECREF(o3);
2db4b82e
RD
595 }
596 else {
597 PyErr_SetString(PyExc_TypeError, errmsg);
598 }
599 Py_DECREF(ro);
600 }
601
602 Py_DECREF(odc);
54af9b8b 603 Py_DECREF(ownd);
2db4b82e 604 Py_DECREF(orect);
81fd0478 605 Py_DECREF(opane);
2db4b82e
RD
606 }
607 wxPyEndBlockThreads(blocked);
608 if (!found)
81fd0478 609 wxAuiDefaultTabArt::DrawTab(dc, wnd, pane, in_rect, close_button_state, out_tab_rect, out_button_rect, x_extent);
2db4b82e
RD
610 }
611
612
d95b9f2b 613 virtual void DrawButton( wxDC& dc,
54af9b8b 614 wxWindow* wnd,
8f514ab4
RD
615 const wxRect& in_rect,
616 int bitmap_id,
617 int button_state,
618 int orientation,
8f514ab4
RD
619 wxRect* out_rect)
620 {
621 bool found;
622 const char* errmsg = "DrawButton should return a wxRect";
623 wxPyBlock_t blocked = wxPyBeginBlockThreads();
624 if ((found = wxPyCBH_findCallback(m_myInst, "DrawButton"))) {
d95b9f2b 625 PyObject* odc = wxPyMake_wxObject(&dc, false);
54af9b8b 626 PyObject* ownd = wxPyMake_wxObject(wnd, false);
8f514ab4 627 PyObject* orect = wxPyConstructObject((void*)&in_rect, wxT("wxRect"), 0);
8f514ab4 628 PyObject* ro;
54af9b8b 629 ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OOOiiiO)", odc, ownd, orect,
81fd0478 630 bitmap_id, button_state, orientation));
8f514ab4
RD
631 if (ro) {
632 if (!wxRect_helper(ro, &out_rect))
633 PyErr_SetString(PyExc_TypeError, errmsg);
634 Py_DECREF(ro);
635 }
636
637 Py_DECREF(odc);
54af9b8b 638 Py_DECREF(ownd);
8f514ab4 639 Py_DECREF(orect);
8f514ab4
RD
640 }
641 wxPyEndBlockThreads(blocked);
642 if (!found)
81fd0478 643 wxAuiDefaultTabArt::DrawButton(dc, wnd, in_rect, bitmap_id, button_state, orientation, out_rect);
8f514ab4
RD
644 }
645
54af9b8b 646
d95b9f2b 647 virtual wxSize GetTabSize( wxDC& dc,
54af9b8b 648 wxWindow* wnd,
8f514ab4 649 const wxString& caption,
bce16979 650 const wxBitmap& bitmap,
8f514ab4 651 bool active,
36cb9ebe 652 int close_button_state,
8f514ab4
RD
653 int* x_extent)
654 {
655 bool found;
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"))) {
d95b9f2b 660 PyObject* odc = wxPyMake_wxObject(&dc, false);
54af9b8b 661 PyObject* ownd = wxPyMake_wxObject(wnd, false);
8f514ab4 662 PyObject* otext = wx2PyString(caption);
bce16979 663 PyObject* obmp = wxPyMake_wxObject((wxObject*)&bitmap, false);
8f514ab4 664 PyObject* ro;
2a783b2d 665 ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue(
bce16979 666 "(OOOOii)", odc, ownd, otext, obmp, (int)active, close_button_state));
8f514ab4
RD
667 if (ro) {
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);
675 else
676 *x_extent = PyInt_AsLong(o2);
677
678 Py_DECREF(o1);
679 Py_DECREF(o2);
680 }
681 else {
682 PyErr_SetString(PyExc_TypeError, errmsg);
683 }
684 Py_DECREF(ro);
685 }
686
687 Py_DECREF(odc);
54af9b8b 688 Py_DECREF(ownd);
8f514ab4 689 Py_DECREF(otext);
bce16979 690 Py_DECREF(obmp);
8f514ab4
RD
691 }
692 wxPyEndBlockThreads(blocked);
693 if (!found)
bce16979 694 rv = wxAuiDefaultTabArt::GetTabSize(dc, wnd, caption, bitmap, active, close_button_state, x_extent);
8f514ab4
RD
695 return rv;
696 }
54af9b8b 697
d95b9f2b 698// TODO
81fd0478 699// virtual int ShowDropDown(
d95b9f2b 700// wxWindow* wnd,
81fd0478 701// const wxAuiNotebookPageArray& items,
d95b9f2b 702// int active_idx);
81fd0478
KO
703
704// virtual int GetIndentSize();
705
bce16979 706// virtual int GetBestTabCtrlSize(wxWindow* wnd,
81fd0478
KO
707// const wxAuiNotebookPageArray& pages,
708// const wxSize& required_bmp_size);
bce16979
RD
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();
714
d95b9f2b 715
8f514ab4 716
2db4b82e
RD
717 DEC_PYCALLBACK__FONT(SetNormalFont);
718 DEC_PYCALLBACK__FONT(SetSelectedFont);
719 DEC_PYCALLBACK__FONT(SetMeasuringFont);
bce16979 720// DEC_PYCALLBACK_INT_WIN(GetBestTabCtrlSize);
2db4b82e
RD
721
722 PYPRIVATE;
723};
724
725
2a783b2d
RD
726IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetNormalFont);
727IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetSelectedFont);
728IMP_PYCALLBACK__FONT(wxPyAuiTabArt, wxAuiDefaultTabArt, SetMeasuringFont);
bce16979 729//IMP_PYCALLBACK_INT_WIN(wxPyAuiTabArt, wxAuiDefaultTabArt, GetBestTabCtrlSize);
2db4b82e
RD
730%}
731
732
2a783b2d 733DocStr(wxPyAuiTabArt,
2db4b82e
RD
734"This version of the `TabArt` class has been instrumented to be
735subclassable in Python and to reflect all calls to the C++ base class
736methods to the Python methods implemented in the derived class.", "");
737
2a783b2d 738class wxPyAuiTabArt : public wxAuiDefaultTabArt
2db4b82e 739{
3c69a2ec 740public:
c25f90f6 741 %pythonAppend wxPyAuiTabArt setCallbackInfo(PyAuiTabArt)
2a783b2d 742 wxPyAuiTabArt();
2db4b82e
RD
743
744};
745
746
777e547f 747//---------------------------------------------------------------------------
febb39df 748
febb39df 749