]> git.saurik.com Git - wxWidgets.git/blame - wxPython/src/_sizers.i
Detect Apple bug that prevents the joystick code compiling for OS X 10.1
[wxWidgets.git] / wxPython / src / _sizers.i
CommitLineData
d14a1e28
RD
1/////////////////////////////////////////////////////////////////////////////
2// Name: _sizers.i
3// Purpose: SWIG interface defs for the Sizers
4//
5// Author: Robin Dunn
6//
7// Created: 18-Sept-1999
8// RCS-ID: $Id$
9// Copyright: (c) 2003 by Total Control Software
10// Licence: wxWindows license
11/////////////////////////////////////////////////////////////////////////////
12
13// Not a %module
14
15
16//---------------------------------------------------------------------------
17
18%{
19%}
20
21//---------------------------------------------------------------------------
22%newgroup;
23
3ea6e0ec
RD
24DocStr(wxSizerItem,
25"The wx.SizerItem class is used to track the position, size and other
26attributes of each item managed by a `wx.Sizer`. In normal usage user
27code should never need to deal directly with a wx.SizerItem, but
28custom classes derived from `wx.PySizer` will probably need to use the
29collection of wx.SizerItems held by wx.Sizer when calculating layout.
30
31:see: `wx.Sizer`, `wx.GBSizerItem`", "");
d14a1e28
RD
32
33class wxSizerItem : public wxObject {
34public:
3ea6e0ec
RD
35 DocCtorStr(
36 wxSizerItem(),
37 "Constructs an empty wx.SizerItem. Either a window, sizer or spacer
38size will need to be set before this item can be used in a Sizer.
39
40You will probably never need to create a wx.SizerItem directly as they
41are created automatically when the sizer's Add, Insert or Prepend
42methods are called.
43
44:see: `wx.SizerItemSpacer`, `wx.SizerItemWindow`, `wx.SizerItemSizer`", "");
45
46
7e8f0df9 47
3ea6e0ec
RD
48 %extend {
49 DocStr(
50 wxSizerItem( wxWindow *window, int proportion, int flag,
51 int border, PyObject* userData=NULL ),
7e8f0df9
RD
52 "Constructs a `wx.SizerItem` for tracking a window.", "");
53
1b8c7ba6
RD
54 %RenameCtor(SizerItemWindow, wxSizerItem( wxWindow *window, int proportion, int flag,
55 int border, PyObject* userData=NULL ))
56 {
3ea6e0ec
RD
57 wxPyUserData* data = NULL;
58 if ( userData ) {
6e6b3557 59 wxPyBlock_t blocked = wxPyBeginBlockThreads();
3ea6e0ec
RD
60 data = new wxPyUserData(userData);
61 wxPyEndBlockThreads(blocked);
62 }
63 return new wxSizerItem(window, proportion, flag, border, data);
64 }
65
7e8f0df9 66
3ea6e0ec
RD
67 DocStr(
68 wxSizerItem( int width, int height, int proportion, int flag,
69 int border, PyObject* userData=NULL),
70 "Constructs a `wx.SizerItem` for tracking a spacer.", "");
7e8f0df9 71
1b8c7ba6
RD
72 %RenameCtor(SizerItemSpacer, wxSizerItem( int width, int height, int proportion, int flag,
73 int border, PyObject* userData=NULL))
74 {
3ea6e0ec
RD
75 wxPyUserData* data = NULL;
76 if ( userData ) {
6e6b3557 77 wxPyBlock_t blocked = wxPyBeginBlockThreads();
3ea6e0ec
RD
78 data = new wxPyUserData(userData);
79 wxPyEndBlockThreads(blocked);
80 }
81 return new wxSizerItem(width, height, proportion, flag, border, data);
82 }
7e8f0df9 83
3ea6e0ec
RD
84 DocStr(
85 wxSizerItem( wxSizer *sizer, int proportion, int flag,
86 int border, PyObject* userData=NULL ),
1b8c7ba6 87 "Constructs a `wx.SizerItem` for tracking a subsizer", "");
7e8f0df9 88
1b8c7ba6
RD
89 %RenameCtor(SizerItemSizer, wxSizerItem( wxSizer *sizer, int proportion, int flag,
90 int border, PyObject* userData=NULL ))
91 {
3ea6e0ec
RD
92 wxPyUserData* data = NULL;
93 if ( userData ) {
6e6b3557 94 wxPyBlock_t blocked = wxPyBeginBlockThreads();
3ea6e0ec
RD
95 data = new wxPyUserData(userData);
96 wxPyEndBlockThreads(blocked);
97 }
98 return new wxSizerItem(sizer, proportion, flag, border, data);
99 }
100 }
d14a1e28 101
d14a1e28 102
7e8f0df9 103
3ea6e0ec
RD
104 DocDeclStr(
105 void , DeleteWindows(),
106 "Destroy the window or the windows in a subsizer, depending on the type
107of item.", "");
7e8f0df9 108
3ea6e0ec
RD
109 DocDeclStr(
110 void , DetachSizer(),
111 "Enable deleting the SizerItem without destroying the contained sizer.", "");
7e8f0df9 112
d14a1e28 113
3ea6e0ec
RD
114 DocDeclStr(
115 wxSize , GetSize(),
116 "Get the current size of the item, as set in the last Layout.", "");
7e8f0df9 117
3ea6e0ec
RD
118 DocDeclStr(
119 wxSize , CalcMin(),
120 "Calculates the minimum desired size for the item, including any space
121needed by borders.", "");
7e8f0df9 122
3ea6e0ec
RD
123 DocDeclStr(
124 void , SetDimension( wxPoint pos, wxSize size ),
125 "Set the position and size of the space allocated for this item by the
126sizer, and adjust the position and size of the item (window or
127subsizer) to be within that space taking alignment and borders into
128account.", "");
7e8f0df9 129
3ea6e0ec
RD
130
131 DocDeclStr(
132 wxSize , GetMinSize(),
133 "Get the minimum size needed for the item.", "");
7e8f0df9 134
329b045c
RD
135 DocDeclStr(
136 wxSize , GetMinSizeWithBorder() const,
137 "Get the minimum size needed for the item with space for the borders
138added, if needed.", "");
139
3ea6e0ec
RD
140 DocDeclStr(
141 void , SetInitSize( int x, int y ),
142 "", "");
7e8f0df9 143
d14a1e28 144
3ea6e0ec
RD
145 DocStr(SetRatio,
146 "Set the ratio item attribute.", "");
1b8c7ba6 147 %Rename(SetRatioWH, void, SetRatio( int width, int height ));
f1e759d7 148 %Rename(SetRatioSize, void, SetRatio( const wxSize& size ));
d14a1e28 149 void SetRatio( float ratio );
7e8f0df9 150
3ea6e0ec
RD
151 DocDeclStr(
152 float , GetRatio(),
153 "Set the ratio item attribute.", "");
7aada1e0
RD
154
155 DocDeclStr(
156 wxRect , GetRect(),
157 "Returns the rectangle that the sizer item should occupy", "");
7e8f0df9 158
d14a1e28 159
3ea6e0ec
RD
160 DocDeclStr(
161 bool , IsWindow(),
162 "Is this sizer item a window?", "");
7e8f0df9 163
3ea6e0ec
RD
164 DocDeclStr(
165 bool , IsSizer(),
166 "Is this sizer item a subsizer?", "");
7e8f0df9 167
3ea6e0ec
RD
168 DocDeclStr(
169 bool , IsSpacer(),
170 "Is this sizer item a spacer?", "");
7e8f0df9 171
d14a1e28 172
3ea6e0ec
RD
173 DocDeclStr(
174 void , SetProportion( int proportion ),
175 "Set the proportion value for this item.", "");
7e8f0df9 176
3ea6e0ec
RD
177 DocDeclStr(
178 int , GetProportion(),
179 "Get the proportion value for this item.", "");
7e8f0df9 180
3ea6e0ec
RD
181 %pythoncode { SetOption = wx._deprecated(SetProportion, "Please use `SetProportion` instead.") }
182 %pythoncode { GetOption = wx._deprecated(GetProportion, "Please use `GetProportion` instead.") }
d14a1e28 183
7e8f0df9 184
3ea6e0ec
RD
185 DocDeclStr(
186 void , SetFlag( int flag ),
187 "Set the flag value for this item.", "");
7e8f0df9 188
3ea6e0ec
RD
189 DocDeclStr(
190 int , GetFlag(),
191 "Get the flag value for this item.", "");
7e8f0df9
RD
192
193
3ea6e0ec
RD
194 DocDeclStr(
195 void , SetBorder( int border ),
196 "Set the border value for this item.", "");
7e8f0df9 197
3ea6e0ec
RD
198 DocDeclStr(
199 int , GetBorder(),
200 "Get the border value for this item.", "");
d14a1e28 201
7e8f0df9
RD
202
203
3ea6e0ec
RD
204 DocDeclStr(
205 wxWindow *, GetWindow(),
206 "Get the window (if any) that is managed by this sizer item.", "");
7e8f0df9 207
3ea6e0ec
RD
208 DocDeclStr(
209 void , SetWindow( wxWindow *window ),
210 "Set the window to be managed by this sizer item.", "");
7e8f0df9
RD
211
212
3ea6e0ec
RD
213 DocDeclStr(
214 wxSizer *, GetSizer(),
215 "Get the subsizer (if any) that is managed by this sizer item.", "");
7e8f0df9 216
3ea6e0ec
RD
217 DocDeclStr(
218 void , SetSizer( wxSizer *sizer ),
219 "Set the subsizer to be managed by this sizer item.", "");
7e8f0df9
RD
220
221
3ea6e0ec
RD
222 DocDeclStr(
223 const wxSize& , GetSpacer(),
224 "Get the size of the spacer managed by this sizer item.", "");
7e8f0df9 225
3ea6e0ec
RD
226 DocDeclStr(
227 void , SetSpacer( const wxSize &size ),
228 "Set the size of the spacer to be managed by this sizer item.", "");
7e8f0df9 229
d14a1e28 230
3ea6e0ec
RD
231 DocDeclStr(
232 void , Show( bool show ),
233 "Set the show item attribute, which sizers use to determine if the item
234is to be made part of the layout or not. If the item is tracking a
235window then it is shown or hidden as needed.", "");
7e8f0df9 236
3ea6e0ec
RD
237 DocDeclStr(
238 bool , IsShown(),
239 "Is the item to be shown in the layout?", "");
7e8f0df9 240
3ea6e0ec
RD
241
242 DocDeclStr(
243 wxPoint , GetPosition(),
244 "Returns the current position of the item, as set in the last Layout.", "");
7e8f0df9 245
d14a1e28
RD
246
247 // wxObject* GetUserData();
248 %extend {
249 // Assume that the user data is a wxPyUserData object and return the contents
3ea6e0ec
RD
250
251 DocStr(GetUserData,
252 "Returns the userData associated with this sizer item, or None if there
253isn't any.", "");
d14a1e28
RD
254 PyObject* GetUserData() {
255 wxPyUserData* data = (wxPyUserData*)self->GetUserData();
256 if (data) {
257 Py_INCREF(data->m_obj);
258 return data->m_obj;
259 } else {
260 Py_INCREF(Py_None);
261 return Py_None;
262 }
263 }
264 }
265};
266
267
268//---------------------------------------------------------------------------
269
270%{
271// Figure out the type of the sizer item
272
273struct wxPySizerItemInfo {
274 wxPySizerItemInfo()
a72f4631
RD
275 : window(NULL), sizer(NULL), gotSize(false),
276 size(wxDefaultSize), gotPos(false), pos(-1)
d14a1e28 277 {}
7e8f0df9 278
d14a1e28
RD
279 wxWindow* window;
280 wxSizer* sizer;
281 bool gotSize;
282 wxSize size;
283 bool gotPos;
284 int pos;
285};
7e8f0df9 286
d14a1e28
RD
287static wxPySizerItemInfo wxPySizerItemTypeHelper(PyObject* item, bool checkSize, bool checkIdx ) {
288
289 wxPySizerItemInfo info;
290 wxSize size;
291 wxSize* sizePtr = &size;
292
293 // Find out what the type of the item is
294 // try wxWindow
295 if ( ! wxPyConvertSwigPtr(item, (void**)&info.window, wxT("wxWindow")) ) {
296 PyErr_Clear();
297 info.window = NULL;
7e8f0df9 298
d14a1e28
RD
299 // try wxSizer
300 if ( ! wxPyConvertSwigPtr(item, (void**)&info.sizer, wxT("wxSizer")) ) {
301 PyErr_Clear();
302 info.sizer = NULL;
7e8f0df9 303
d14a1e28
RD
304 // try wxSize or (w,h)
305 if ( checkSize && wxSize_helper(item, &sizePtr)) {
306 info.size = *sizePtr;
a72f4631 307 info.gotSize = true;
d14a1e28
RD
308 }
309
310 // or a single int
311 if (checkIdx && PyInt_Check(item)) {
312 info.pos = PyInt_AsLong(item);
a72f4631 313 info.gotPos = true;
d14a1e28
RD
314 }
315 }
316 }
317
318 if ( !(info.window || info.sizer || (checkSize && info.gotSize) || (checkIdx && info.gotPos)) ) {
319 // no expected type, figure out what kind of error message to generate
320 if ( !checkSize && !checkIdx )
321 PyErr_SetString(PyExc_TypeError, "wxWindow or wxSizer expected for item");
322 else if ( checkSize && !checkIdx )
323 PyErr_SetString(PyExc_TypeError, "wxWindow, wxSizer, wxSize, or (w,h) expected for item");
324 else if ( !checkSize && checkIdx)
325 PyErr_SetString(PyExc_TypeError, "wxWindow, wxSizer or int (position) expected for item");
326 else
327 // can this one happen?
328 PyErr_SetString(PyExc_TypeError, "wxWindow, wxSizer, wxSize, or (w,h) or int (position) expected for item");
329 }
330
331 return info;
332}
333%}
334
335
336
337
3ea6e0ec
RD
338DocStr(wxSizer,
339"wx.Sizer is the abstract base class used for laying out subwindows in
340a window. You cannot use wx.Sizer directly; instead, you will have to
341use one of the sizer classes derived from it such as `wx.BoxSizer`,
342`wx.StaticBoxSizer`, `wx.NotebookSizer`, `wx.GridSizer`, `wx.FlexGridSizer`
343and `wx.GridBagSizer`.
344
345The concept implemented by sizers in wxWidgets is closely related to
346layout tools in other GUI toolkits, such as Java's AWT, the GTK
347toolkit or the Qt toolkit. It is based upon the idea of the individual
348subwindows reporting their minimal required size and their ability to
349get stretched if the size of the parent window has changed. This will
350most often mean that the programmer does not set the original size of
351a dialog in the beginning, rather the dialog will assigned a sizer and
352this sizer will be queried about the recommended size. The sizer in
353turn will query its children, which can be normal windows or contorls,
354empty space or other sizers, so that a hierarchy of sizers can be
355constructed. Note that wxSizer does not derive from wxWindow and thus
356do not interfere with tab ordering and requires very little resources
357compared to a real window on screen.
358
359What makes sizers so well fitted for use in wxWidgets is the fact that
360every control reports its own minimal size and the algorithm can
361handle differences in font sizes or different window (dialog item)
362sizes on different platforms without problems. If for example the
363standard font as well as the overall design of Mac widgets requires
364more space than on Windows, then the initial size of a dialog using a
365sizer will automatically be bigger on Mac than on Windows.", "
366
38260cce
RD
367Sizers may also be used to control the layout of custom drawn items on
368the window. The `Add`, `Insert`, and `Prepend` functions return a
369pointer to the newly added `wx.SizerItem`. Just add empty space of the
370desired size and attributes, and then use the `wx.SizerItem.GetRect`
371method to determine where the drawing operations should take place.
372
3ea6e0ec
RD
373:note: If you wish to create a custom sizer class in wxPython you
374 should derive the class from `wx.PySizer` in order to get
375 Python-aware capabilities for the various virtual methods.
376
377:see: `wx.SizerItem`
378
379:todo: More dscriptive text here along with some pictures...
380
381");
382
d14a1e28
RD
383class wxSizer : public wxObject {
384public:
385 // wxSizer(); **** abstract, can't instantiate
386 // ~wxSizer();
387
388 %extend {
389 void _setOORInfo(PyObject* _self) {
a77bf68f
RD
390 if (!self->GetClientObject())
391 self->SetClientObject(new wxPyOORClientData(_self));
d14a1e28
RD
392 }
393
3ea6e0ec
RD
394 DocAStr(Add,
395 "Add(self, item, int proportion=0, int flag=0, int border=0,
7aada1e0 396 PyObject userData=None) -> wx.SizerItem",
3ea6e0ec
RD
397
398 "Appends a child item to the sizer.", "
399
400 :param item: The item can be one of three kinds of objects:
401
402 - **window**: A `wx.Window` to be managed by the sizer. Its
403 minimal size (either set explicitly by the user or
404 calculated internally when constructed with wx.DefaultSize)
405 is interpreted as the minimal size to use when laying out
406 item in the sizer. This is particularly useful in
407 connection with `wx.Window.SetSizeHints`.
408
409 - **sizer**: The (child-)sizer to be added to the sizer. This
410 allows placing a child sizer in a sizer and thus to create
411 hierarchies of sizers (typically a vertical box as the top
412 sizer and several horizontal boxes on the level beneath).
413
414 - **size**: A `wx.Size` or a 2-element sequence of integers
415 that represents the width and height of a spacer to be added
416 to the sizer. Adding spacers to sizers gives more
417 flexibility in the design of dialogs; imagine for example a
418 horizontal box with two buttons at the bottom of a dialog:
419 you might want to insert a space between the two buttons and
420 make that space stretchable using the *proportion* value and
421 the result will be that the left button will be aligned with
422 the left side of the dialog and the right button with the
423 right side - the space in between will shrink and grow with
424 the dialog.
425
426 :param proportion: Although the meaning of this parameter is
427 undefined in wx.Sizer, it is used in `wx.BoxSizer` to indicate
428 if a child of a sizer can change its size in the main
429 orientation of the wx.BoxSizer - where 0 stands for not
430 changeable and a value of more than zero is interpreted
431 relative (a proportion of the total) to the value of other
432 children of the same wx.BoxSizer. For example, you might have
433 a horizontal wx.BoxSizer with three children, two of which are
434 supposed to change their size with the sizer. Then the two
435 stretchable windows should each be given *proportion* value of
436 1 to make them grow and shrink equally with the sizer's
437 horizontal dimension. But if one of them had a *proportion*
438 value of 2 then it would get a double share of the space
439 available after the fixed size items are positioned.
440
441 :param flag: This parameter can be used to set a number of flags
442 which can be combined using the binary OR operator ``|``. Two
443 main behaviours are defined using these flags. One is the
444 border around a window: the *border* parameter determines the
445 border width whereas the flags given here determine which
446 side(s) of the item that the border will be added. The other
447 flags determine how the sizer item behaves when the space
448 allotted to the sizer changes, and is somewhat dependent on
449 the specific kind of sizer used.
450
451 +----------------------------+------------------------------------------+
452 |- wx.TOP |These flags are used to specify |
453 |- wx.BOTTOM |which side(s) of the sizer item that |
454 |- wx.LEFT |the *border* width will apply to. |
455 |- wx.RIGHT | |
456 |- wx.ALL | |
457 | | |
458 +----------------------------+------------------------------------------+
8b5895b0 459 |- wx.EXPAND |The item will be expanded to fill |
3ea6e0ec
RD
460 | |the space allotted to the item. |
461 +----------------------------+------------------------------------------+
462 |- wx.SHAPED |The item will be expanded as much as |
463 | |possible while also maintaining its |
464 | |aspect ratio |
465 +----------------------------+------------------------------------------+
466 |- wx.FIXED_MINSIZE |Normally wx.Sizers will use |
467 | |`wx.Window.GetMinSize` or |
468 | |`wx.Window.GetBestSize` to determine what |
469 | |the minimal size of window items should |
470 | |be, and will use that size to calculate |
471 | |the layout. This allows layouts to adjust |
472 | |when an item changes and it's best size |
473 | |becomes different. If you would rather |
474 | |have a window item stay the size it |
475 | |started with then use wx.FIXED_MINSIZE. |
476 +----------------------------+------------------------------------------+
477 |- wx.ALIGN_CENTER |The wx.ALIGN flags allow you to specify |
478 |- wx.ALIGN_LEFT |the alignment of the item within the space|
479 |- wx.ALIGN_RIGHT |allotted to it by the sizer, ajusted for |
480 |- wx.ALIGN_TOP |the border if any. |
481 |- wx.ALIGN_BOTTOM | |
482 |- wx.ALIGN_CENTER_VERTICAL | |
483 |- wx.ALIGN_CENTER_HORIZONTAL| |
484 +----------------------------+------------------------------------------+
485
486
487 :param border: Determines the border width, if the *flag*
488 parameter is set to include any border flag.
489
490 :param userData: Allows an extra object to be attached to the
491 sizer item, for use in derived classes when sizing information
492 is more complex than the *proportion* and *flag* will allow for.
493");
d14a1e28 494
7aada1e0
RD
495 wxSizerItem* Add(PyObject* item, int proportion=0, int flag=0, int border=0,
496 PyObject* userData=NULL) {
7e8f0df9 497
d14a1e28 498 wxPyUserData* data = NULL;
6e6b3557 499 wxPyBlock_t blocked = wxPyBeginBlockThreads();
a72f4631 500 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, true, false);
d14a1e28
RD
501 if ( userData && (info.window || info.sizer || info.gotSize) )
502 data = new wxPyUserData(userData);
da32eb53 503 wxPyEndBlockThreads(blocked);
7e8f0df9 504
d14a1e28
RD
505 // Now call the real Add method if a valid item type was found
506 if ( info.window )
7aada1e0 507 return self->Add(info.window, proportion, flag, border, data);
d14a1e28 508 else if ( info.sizer )
7aada1e0 509 return self->Add(info.sizer, proportion, flag, border, data);
d14a1e28 510 else if (info.gotSize)
7aada1e0
RD
511 return self->Add(info.size.GetWidth(), info.size.GetHeight(),
512 proportion, flag, border, data);
513 else
514 return NULL;
d14a1e28
RD
515 }
516
7aada1e0
RD
517// virtual wxSizerItem* AddSpacer(int size);
518// virtual wxSizerItem* AddStretchSpacer(int prop = 1);
d14a1e28 519
3ea6e0ec
RD
520 DocAStr(Insert,
521 "Insert(self, int before, item, int proportion=0, int flag=0, int border=0,
7aada1e0 522 PyObject userData=None) -> wx.SizerItem",
3ea6e0ec
RD
523
524 "Inserts a new item into the list of items managed by this sizer before
525the item at index *before*. See `Add` for a description of the parameters.", "");
7aada1e0
RD
526 wxSizerItem* Insert(int before, PyObject* item, int proportion=0, int flag=0,
527 int border=0, PyObject* userData=NULL) {
d14a1e28
RD
528
529 wxPyUserData* data = NULL;
6e6b3557 530 wxPyBlock_t blocked = wxPyBeginBlockThreads();
a72f4631 531 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, true, false);
d14a1e28
RD
532 if ( userData && (info.window || info.sizer || info.gotSize) )
533 data = new wxPyUserData(userData);
da32eb53 534 wxPyEndBlockThreads(blocked);
7e8f0df9 535
d14a1e28
RD
536 // Now call the real Insert method if a valid item type was found
537 if ( info.window )
7aada1e0 538 return self->Insert(before, info.window, proportion, flag, border, data);
d14a1e28 539 else if ( info.sizer )
7aada1e0 540 return self->Insert(before, info.sizer, proportion, flag, border, data);
d14a1e28 541 else if (info.gotSize)
7aada1e0
RD
542 return self->Insert(before, info.size.GetWidth(), info.size.GetHeight(),
543 proportion, flag, border, data);
544 else
545 return NULL;
d14a1e28
RD
546 }
547
548
7aada1e0
RD
549// virtual wxSizerItem* InsertSpacer(size_t index, int size);
550// virtual wxSizerItem* InsertStretchSpacer(size_t index, int prop = 1);
7e8f0df9 551
3ea6e0ec
RD
552 DocAStr(Prepend,
553 "Prepend(self, item, int proportion=0, int flag=0, int border=0,
7aada1e0 554 PyObject userData=None) -> wx.SizerItem",
d14a1e28 555
3ea6e0ec
RD
556 "Adds a new item to the begining of the list of sizer items managed by
557this sizer. See `Add` for a description of the parameters.", "");
7aada1e0
RD
558 wxSizerItem* Prepend(PyObject* item, int proportion=0, int flag=0, int border=0,
559 PyObject* userData=NULL) {
d14a1e28
RD
560
561 wxPyUserData* data = NULL;
6e6b3557 562 wxPyBlock_t blocked = wxPyBeginBlockThreads();
a72f4631 563 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, true, false);
d14a1e28
RD
564 if ( userData && (info.window || info.sizer || info.gotSize) )
565 data = new wxPyUserData(userData);
da32eb53 566 wxPyEndBlockThreads(blocked);
7e8f0df9 567
d14a1e28
RD
568 // Now call the real Prepend method if a valid item type was found
569 if ( info.window )
7aada1e0 570 return self->Prepend(info.window, proportion, flag, border, data);
d14a1e28 571 else if ( info.sizer )
7aada1e0 572 return self->Prepend(info.sizer, proportion, flag, border, data);
d14a1e28 573 else if (info.gotSize)
7aada1e0
RD
574 return self->Prepend(info.size.GetWidth(), info.size.GetHeight(),
575 proportion, flag, border, data);
576 else
577 return NULL;
d14a1e28
RD
578 }
579
7aada1e0
RD
580// virtual wxSizerItem* PrependSpacer(int size);
581// virtual wxSizerItem* PrependStretchSpacer(int prop = 1);
3ea6e0ec
RD
582
583 DocAStr(Remove,
584 "Remove(self, item) -> bool",
585 "Removes an item from the sizer and destroys it. This method does not
586cause any layout or resizing to take place, call `Layout` to update
587the layout on screen after removing a child from the sizer. The
588*item* parameter can be either a window, a sizer, or the zero-based
589index of an item to remove. Returns True if the child item was found
590and removed.", "
591
592:note: For historical reasons calling this method with a `wx.Window`
593 parameter is depreacted, as it will not be able to destroy the
594 window since it is owned by its parent. You should use `Detach`
595 instead.
596");
d14a1e28 597 bool Remove(PyObject* item) {
6e6b3557 598 wxPyBlock_t blocked = wxPyBeginBlockThreads();
a72f4631 599 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
da32eb53 600 wxPyEndBlockThreads(blocked);
d14a1e28
RD
601 if ( info.window )
602 return self->Remove(info.window);
603 else if ( info.sizer )
604 return self->Remove(info.sizer);
605 else if ( info.gotPos )
606 return self->Remove(info.pos);
7e8f0df9 607 else
a72f4631 608 return false;
d14a1e28
RD
609 }
610
3ea6e0ec
RD
611
612 DocAStr(Detach,
613 "Detach(self, item) -> bool",
614 "Detaches an item from the sizer without destroying it. This method
615does not cause any layout or resizing to take place, call `Layout` to
616do so. The *item* parameter can be either a window, a sizer, or the
617zero-based index of the item to be detached. Returns True if the child item
618was found and detached.", "");
60a71c29 619 bool Detach(PyObject* item) {
6e6b3557 620 wxPyBlock_t blocked = wxPyBeginBlockThreads();
a72f4631 621 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
60a71c29
RD
622 wxPyEndBlockThreads(blocked);
623 if ( info.window )
624 return self->Detach(info.window);
625 else if ( info.sizer )
626 return self->Detach(info.sizer);
627 else if ( info.gotPos )
628 return self->Detach(info.pos);
7e8f0df9 629 else
a72f4631 630 return false;
60a71c29
RD
631 }
632
7e8f0df9 633
7aada1e0
RD
634 DocAStr(GetItem,
635 "GetItem(self, item) -> wx.SizerItem",
636 "Returns the `wx.SizerItem` which holds the *item* given. The *item*
637parameter can be either a window, a sizer, or the zero-based index of
638the item to be detached.", "");
639 wxSizerItem* GetItem(PyObject* item) {
6e6b3557 640 wxPyBlock_t blocked = wxPyBeginBlockThreads();
7aada1e0
RD
641 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
642 wxPyEndBlockThreads(blocked);
643 if ( info.window )
644 return self->GetItem(info.window);
645 else if ( info.sizer )
646 return self->GetItem(info.sizer);
647 else if ( info.gotPos )
648 return self->GetItem(info.pos);
649 else
650 return NULL;
651 }
652
7e8f0df9 653
dd9f7fea 654 void _SetItemMinSize(PyObject* item, const wxSize& size) {
6e6b3557 655 wxPyBlock_t blocked = wxPyBeginBlockThreads();
a72f4631 656 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
da32eb53 657 wxPyEndBlockThreads(blocked);
d14a1e28
RD
658 if ( info.window )
659 self->SetItemMinSize(info.window, size);
660 else if ( info.sizer )
661 self->SetItemMinSize(info.sizer, size);
662 else if ( info.gotPos )
663 self->SetItemMinSize(info.pos, size);
664 }
665 }
666
3ea6e0ec
RD
667 %pythoncode {
668 def SetItemMinSize(self, item, *args):
669 """
670 SetItemMinSize(self, item, Size size)
671
672 Sets the minimum size that will be allocated for an item in the sizer.
673 The *item* parameter can be either a window, a sizer, or the
674 zero-based index of the item. If a window or sizer is given then it
675 will be searched for recursivly in subsizers if neccessary.
676 """
677 if len(args) == 2:
678 %# for backward compatibility accept separate width,height args too
679 return self._SetItemMinSize(item, args)
680 else:
681 return self._SetItemMinSize(item, args[0])
682 }
7e8f0df9 683
3ea6e0ec 684 DocDeclAStrName(
7aada1e0 685 wxSizerItem* , Add( wxSizerItem *item ),
3ea6e0ec
RD
686 "AddItem(self, SizerItem item)",
687 "Adds a `wx.SizerItem` to the sizer.", "",
688 AddItem);
7e8f0df9 689
3ea6e0ec 690 DocDeclAStrName(
7aada1e0 691 wxSizerItem* , Insert( size_t index, wxSizerItem *item ),
3ea6e0ec
RD
692 "InsertItem(self, int index, SizerItem item)",
693 "Inserts a `wx.SizerItem` to the sizer at the position given by *index*.", "",
694 InsertItem);
7e8f0df9 695
3ea6e0ec 696 DocDeclAStrName(
7aada1e0 697 wxSizerItem* , Prepend( wxSizerItem *item ),
3ea6e0ec
RD
698 "PrependItem(self, SizerItem item)",
699 "Prepends a `wx.SizerItem` to the sizer.", "",
700 PrependItem);
7e8f0df9 701
d14a1e28
RD
702
703
704 %pythoncode {
3ea6e0ec 705 def AddMany(self, items):
dce2bd22
RD
706 """
707 AddMany is a convenience method for adding several items
708 to a sizer at one time. Simply pass it a list of tuples,
709 where each tuple consists of the parameters that you
710 would normally pass to the `Add` method.
711 """
3ea6e0ec
RD
712 for item in items:
713 if type(item) != type(()) or (len(item) == 2 and type(item[0]) == type(1)):
714 item = (item, )
715 self.Add(*item)
d14a1e28 716
d147c724 717 %# for backwards compatibility only, please do not use in new code
7e8f0df9
RD
718 def AddWindow(self, *args, **kw):
719 """Compatibility alias for `Add`."""
720 return self.Add(*args, **kw)
721 def AddSizer(self, *args, **kw):
722 """Compatibility alias for `Add`."""
723 return self.Add(*args, **kw)
724 def AddSpacer(self, *args, **kw):
725 """Compatibility alias for `Add`."""
726 return self.Add(*args, **kw)
727
728 def PrependWindow(self, *args, **kw):
729 """Compatibility alias for `Prepend`."""
730 return self.Prepend(*args, **kw)
731 def PrependSizer(self, *args, **kw):
732 """Compatibility alias for `Prepend`."""
733 return self.Prepend(*args, **kw)
734 def PrependSpacer(self, *args, **kw):
735 """Compatibility alias for `Prepend`."""
736 return self.Prepend(*args, **kw)
737
738 def InsertWindow(self, *args, **kw):
739 """Compatibility alias for `Insert`."""
740 return self.Insert(*args, **kw)
741 def InsertSizer(self, *args, **kw):
742 """Compatibility alias for `Insert`."""
743 return self.Insert(*args, **kw)
744 def InsertSpacer(self, *args, **kw):
745 """Compatibility alias for `Insert`."""
746 return self.Insert(*args, **kw)
747
748 def RemoveWindow(self, *args, **kw):
749 """Compatibility alias for `Remove`."""
750 return self.Remove(*args, **kw)
751 def RemoveSizer(self, *args, **kw):
752 """Compatibility alias for `Remove`."""
753 return self.Remove(*args, **kw)
754 def RemovePos(self, *args, **kw):
755 """Compatibility alias for `Remove`."""
756 return self.Remove(*args, **kw)
d14a1e28 757
d14a1e28
RD
758 }
759
760
3ea6e0ec
RD
761 DocDeclStr(
762 void , SetDimension( int x, int y, int width, int height ),
763 "Call this to force the sizer to take the given dimension and thus
764force the items owned by the sizer to resize themselves according to
765the rules defined by the parameter in the `Add`, `Insert` or `Prepend`
766methods.", "");
7e8f0df9 767
3ea6e0ec
RD
768 DocDeclStr(
769 void , SetMinSize( const wxSize &size ),
770 "Call this to give the sizer a minimal size. Normally, the sizer will
771calculate its minimal size based purely on how much space its children
772need. After calling this method `GetMinSize` will return either the
773minimal size as requested by its children or the minimal size set
774here, depending on which is bigger.", "");
7e8f0df9 775
d14a1e28 776
3ea6e0ec
RD
777 DocDeclStr(
778 wxSize , GetSize(),
779 "Returns the current size of the space managed by the sizer.", "");
7e8f0df9 780
3ea6e0ec
RD
781 DocDeclStr(
782 wxPoint , GetPosition(),
783 "Returns the current position of the sizer's managed space.", "");
7e8f0df9 784
3ea6e0ec
RD
785 DocDeclStr(
786 wxSize , GetMinSize(),
787 "Returns the minimal size of the sizer. This is either the combined
788minimal size of all the children and their borders or the minimal size
789set by SetMinSize, depending on which is bigger.", "");
7e8f0df9 790
d14a1e28
RD
791
792 %pythoncode {
793 def GetSizeTuple(self):
60a71c29 794 return self.GetSize().Get()
d14a1e28 795 def GetPositionTuple(self):
60a71c29 796 return self.GetPosition().Get()
d14a1e28 797 def GetMinSizeTuple(self):
60a71c29 798 return self.GetMinSize().Get()
d14a1e28
RD
799 }
800
3ea6e0ec
RD
801 DocDeclStr(
802 virtual void , RecalcSizes(),
803 "Using the sizes calculated by `CalcMin` reposition and resize all the
804items managed by this sizer. You should not need to call this directly as
805it is called by `Layout`.", "");
7e8f0df9 806
3ea6e0ec
RD
807 DocDeclStr(
808 virtual wxSize , CalcMin(),
809 "This method is where the sizer will do the actual calculation of its
810children's minimal sizes. You should not need to call this directly as
811it is called by `Layout`.", "");
7e8f0df9 812
3ea6e0ec
RD
813
814 DocDeclStr(
815 void , Layout(),
816 "This method will force the recalculation and layout of the items
817controlled by the sizer using the current space allocated to the
818sizer. Normally this is called automatically from the owning window's
819EVT_SIZE handler, but it is also useful to call it from user code when
820one of the items in a sizer change size, or items are added or
821removed.", "");
7e8f0df9 822
d14a1e28 823
3ea6e0ec
RD
824 DocDeclStr(
825 wxSize , Fit( wxWindow *window ),
826 "Tell the sizer to resize the *window* to match the sizer's minimal
827size. This is commonly done in the constructor of the window itself in
828order to set its initial size to match the needs of the children as
829determined by the sizer. Returns the new size.
d14a1e28 830
3ea6e0ec 831For a top level window this is the total window size, not the client size.", "");
7e8f0df9 832
3ea6e0ec
RD
833 DocDeclStr(
834 void , FitInside( wxWindow *window ),
835 "Tell the sizer to resize the *virtual size* of the *window* to match the
836sizer's minimal size. This will not alter the on screen size of the
837window, but may cause the addition/removal/alteration of scrollbars
838required to view the virtual area in windows which manage it.
839
840:see: `wx.ScrolledWindow.SetScrollbars`, `SetVirtualSizeHints`
841", "");
7e8f0df9 842
d14a1e28 843
3ea6e0ec
RD
844 DocDeclStr(
845 void , SetSizeHints( wxWindow *window ),
846 "Tell the sizer to set (and `Fit`) the minimal size of the *window* to
847match the sizer's minimal size. This is commonly done in the
848constructor of the window itself if the window is resizable (as are
849many dialogs under Unix and frames on probably all platforms) in order
850to prevent the window from being sized smaller than the minimal size
851required by the sizer.", "");
7e8f0df9 852
3ea6e0ec
RD
853 DocDeclStr(
854 void , SetVirtualSizeHints( wxWindow *window ),
855 "Tell the sizer to set the minimal size of the window virtual area to
856match the sizer's minimal size. For windows with managed scrollbars
857this will set them appropriately.
858
859:see: `wx.ScrolledWindow.SetScrollbars`
860", "");
7e8f0df9 861
d14a1e28 862
3ea6e0ec 863 DocDeclStr(
a72f4631 864 void , Clear( bool deleteWindows=false ),
3ea6e0ec
RD
865 "Clear all items from the sizer, optionally destroying the window items
866as well.", "");
7e8f0df9 867
3ea6e0ec
RD
868 DocDeclStr(
869 void , DeleteWindows(),
870 "Destroy all windows managed by the sizer.", "");
7e8f0df9 871
d14a1e28
RD
872
873
874 // wxList& GetChildren();
875 %extend {
3ea6e0ec 876 DocAStr(GetChildren,
50ed1e35 877 "GetChildren(self) -> list",
3ea6e0ec 878 "Returns a list of all the `wx.SizerItem` objects managed by the sizer.", "");
d14a1e28
RD
879 PyObject* GetChildren() {
880 wxSizerItemList& list = self->GetChildren();
881 return wxPy_ConvertList(&list);
882 }
883 }
884
885
3ea6e0ec 886 // Manage whether individual windows or subsizers are considered
d14a1e28
RD
887 // in the layout calculations or not.
888
889 %extend {
3ea6e0ec 890 DocAStr(Show,
a72f4631 891 "Show(self, item, bool show=True, bool recursive=false) -> bool",
3ea6e0ec
RD
892 "Shows or hides an item managed by the sizer. To make a sizer item
893disappear or reappear, use Show followed by `Layout`. The *item*
894parameter can be either a window, a sizer, or the zero-based index of
8f214674
RD
895the item. Use the recursive parameter to show or hide an item in a
896subsizer. Returns True if the item was found.", "");
a72f4631 897 bool Show(PyObject* item, bool show = true, bool recursive=false) {
6e6b3557 898 wxPyBlock_t blocked = wxPyBeginBlockThreads();
a72f4631 899 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
019fd9d3 900 wxPyEndBlockThreads(blocked);
d14a1e28 901 if ( info.window )
8f214674 902 return self->Show(info.window, show, recursive);
d14a1e28 903 else if ( info.sizer )
8f214674 904 return self->Show(info.sizer, show, recursive);
3ea6e0ec 905 else if ( info.gotPos )
8f214674 906 return self->Show(info.pos, show);
5f476690
RD
907 else
908 return false;
d14a1e28 909 }
7e8f0df9 910
3ea6e0ec
RD
911 DocAStr(IsShown,
912 "IsShown(self, item)",
913 "Determines if the item is currently shown. sizer. To make a sizer
914item disappear or reappear, use Show followed by `Layout`. The *item*
915parameter can be either a window, a sizer, or the zero-based index of
916the item.", "");
d14a1e28 917 bool IsShown(PyObject* item) {
6e6b3557 918 wxPyBlock_t blocked = wxPyBeginBlockThreads();
a72f4631 919 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, false);
019fd9d3 920 wxPyEndBlockThreads(blocked);
7e8f0df9 921 if ( info.window )
d14a1e28 922 return self->IsShown(info.window);
7e8f0df9 923 else if ( info.sizer )
d14a1e28 924 return self->IsShown(info.sizer);
3ea6e0ec
RD
925 else if ( info.gotPos )
926 return self->IsShown(info.pos);
d14a1e28 927 else
a72f4631 928 return false;
d14a1e28
RD
929 }
930 }
931
3ea6e0ec 932 %pythoncode {
41b78a7a 933 def Hide(self, item, recursive=False):
3ea6e0ec 934 """
d5a7caf6 935 A convenience method for `Show` (item, False, recursive).
3ea6e0ec 936 """
9dcf02b4 937 return self.Show(item, False, recursive)
3ea6e0ec 938 }
d14a1e28 939
7e8f0df9 940
3ea6e0ec
RD
941 DocDeclStr(
942 void , ShowItems(bool show),
e2837d11 943 "Recursively call `wx.SizerItem.Show` on all sizer items.", "");
7e8f0df9 944
f1e759d7
RD
945 // TODO:
946 // void Show(bool show);
947 // bool IsShown();
948
d14a1e28
RD
949};
950
951
952//---------------------------------------------------------------------------
953// Use this one for deriving Python classes from
954%{
7e8f0df9 955// See pyclasses.h
d14a1e28
RD
956IMP_PYCALLBACK___pure(wxPySizer, wxSizer, RecalcSizes);
957IMP_PYCALLBACK_wxSize__pure(wxPySizer, wxSizer, CalcMin);
958IMPLEMENT_DYNAMIC_CLASS(wxPySizer, wxSizer);
959%}
960
961
3ea6e0ec
RD
962DocStr(wxPySizer,
963"wx.PySizer is a special version of `wx.Sizer` that has been
964instrumented to allow the C++ virtual methods to be overloaded in
965Python derived classes. You would derive from this class if you are
966wanting to implement a custom sizer in Python code. Simply implement
967`CalcMin` and `RecalcSizes` in the derived class and you're all set.
968For example::
969
970 class MySizer(wx.PySizer):
971 def __init__(self):
972 wx.PySizer.__init__(self)
973
974 def CalcMin(self):
975 for item in self.GetChildren():
976 # calculate the total minimum width and height needed
977 # by all items in the sizer according to this sizer's
978 # layout algorithm.
979 ...
980 return wx.Size(width, height)
981
982 def RecalcSizes(self):
983 # find the space allotted to this sizer
984 pos = self.GetPosition()
985 size = self.GetSize()
986 for item in self.GetChildren():
987 # Recalculate (if necessary) the position and size of
988 # each item and then call item.SetDimension to do the
989 # actual positioning and sizing of the items within the
990 # space alloted to this sizer.
991 ...
992 item.SetDimension(itemPos, itemSize)
993
994
995When `Layout` is called it first calls `CalcMin` followed by
996`RecalcSizes` so you can optimize a bit by saving the results of
9283228f 997`CalcMin` and reusing them in `RecalcSizes`.
3ea6e0ec
RD
998
999:see: `wx.SizerItem`, `wx.Sizer.GetChildren`
1000
1001", "");
d14a1e28
RD
1002class wxPySizer : public wxSizer {
1003public:
2b9048c5 1004 %pythonAppend wxPySizer "self._setCallbackInfo(self, PySizer);self._setOORInfo(self)"
d14a1e28 1005
3ea6e0ec
RD
1006 DocCtorStr(
1007 wxPySizer(),
1008 "Creates a wx.PySizer. Must be called from the __init__ in the derived
1009class.", "");
7e8f0df9 1010
d14a1e28
RD
1011 void _setCallbackInfo(PyObject* self, PyObject* _class);
1012};
1013
1014
1015//---------------------------------------------------------------------------
1016%newgroup;
1017
3ea6e0ec
RD
1018
1019DocStr(wxBoxSizer,
1020"The basic idea behind a box sizer is that windows will most often be
1021laid out in rather simple basic geometry, typically in a row or a
1022column or nested hierarchies of either. A wx.BoxSizer will lay out
1023its items in a simple row or column, depending on the orientation
1024parameter passed to the constructor.", "
1025
1026It is the unique feature of a box sizer, that it can grow in both
1027directions (height and width) but can distribute its growth in the
1028main direction (horizontal for a row) *unevenly* among its children.
1029This is determined by the proportion parameter give to items when they
1030are added to the sizer. It is interpreted as a weight factor, i.e. it
1031can be zero, indicating that the window may not be resized at all, or
1032above zero. If several windows have a value above zero, the value is
1033interpreted relative to the sum of all weight factors of the sizer, so
1034when adding two windows with a value of 1, they will both get resized
1035equally and each will receive half of the available space after the
1036fixed size items have been sized. If the items have unequal
1037proportion settings then they will receive a coresondingly unequal
1038allotment of the free space.
1039
1040:see: `wx.StaticBoxSizer`
1041");
1042
d14a1e28
RD
1043class wxBoxSizer : public wxSizer {
1044public:
2b9048c5 1045 %pythonAppend wxBoxSizer "self._setOORInfo(self)"
d14a1e28 1046
3ea6e0ec
RD
1047 DocCtorStr(
1048 wxBoxSizer(int orient = wxHORIZONTAL),
1049 "Constructor for a wx.BoxSizer. *orient* may be one of ``wx.VERTICAL``
1050or ``wx.HORIZONTAL`` for creating either a column sizer or a row
1051sizer.", "");
d14a1e28 1052
7e8f0df9 1053
3ea6e0ec
RD
1054 DocDeclStr(
1055 int , GetOrientation(),
1056 "Returns the current orientation of the sizer.", "");
7e8f0df9 1057
3ea6e0ec
RD
1058 DocDeclStr(
1059 void , SetOrientation(int orient),
1060 "Resets the orientation of the sizer.", "");
7e8f0df9 1061
d14a1e28
RD
1062};
1063
1064//---------------------------------------------------------------------------
1065%newgroup;
1066
3ea6e0ec
RD
1067
1068DocStr(wxStaticBoxSizer,
1069"wx.StaticBoxSizer derives from and functions identically to the
1070`wx.BoxSizer` and adds a `wx.StaticBox` around the items that the sizer
1071manages. Note that this static box must be created separately and
1072passed to the sizer constructor.", "");
1073
d14a1e28
RD
1074class wxStaticBoxSizer : public wxBoxSizer {
1075public:
2b9048c5 1076 %pythonAppend wxStaticBoxSizer "self._setOORInfo(self)"
d14a1e28 1077
3ea6e0ec
RD
1078 DocCtorStr(
1079 wxStaticBoxSizer(wxStaticBox *box, int orient = wxHORIZONTAL),
1080 "Constructor. It takes an associated static box and the orientation
1081*orient* as parameters - orient can be either of ``wx.VERTICAL`` or
1082``wx.HORIZONTAL``.", "");
39d160c3
RD
1083
1084 // TODO: wxStaticBoxSizer(int orient, wxWindow *win, const wxString& label = wxEmptyString);
7e8f0df9 1085
39d160c3
RD
1086 DocDeclStr(
1087 wxStaticBox *, GetStaticBox(),
1088 "Returns the static box associated with this sizer.", "");
7e8f0df9 1089
d14a1e28
RD
1090};
1091
1092//---------------------------------------------------------------------------
1093%newgroup;
1094
3ea6e0ec
RD
1095
1096DocStr(wxGridSizer,
1097"A grid sizer is a sizer which lays out its children in a
1098two-dimensional table with all cells having the same size. In other
1099words, the width of each cell within the grid is the width of the
1100widest item added to the sizer and the height of each grid cell is the
1101height of the tallest item. An optional vertical and/or horizontal
1102gap between items can also be specified (in pixels.)
1103
1104Items are placed in the cells of the grid in the order they are added,
1105in row-major order. In other words, the first row is filled first,
1106then the second, and so on until all items have been added. (If
1107neccessary, additional rows will be added as items are added.) If you
1108need to have greater control over the cells that items are placed in
1109then use the `wx.GridBagSizer`.
1110", "");
1111
d14a1e28
RD
1112class wxGridSizer: public wxSizer
1113{
1114public:
2b9048c5 1115 %pythonAppend wxGridSizer "self._setOORInfo(self)"
d14a1e28 1116
3ea6e0ec
RD
1117 DocCtorStr(
1118 wxGridSizer( int rows=1, int cols=0, int vgap=0, int hgap=0 ),
1119 "Constructor for a wx.GridSizer. *rows* and *cols* determine the number
1120of columns and rows in the sizer - if either of the parameters is
1121zero, it will be calculated to from the total number of children in
1122the sizer, thus making the sizer grow dynamically. *vgap* and *hgap*
1123define extra space between all children.", "");
1124
1125 DocDeclStr(
1126 void , SetCols( int cols ),
1127 "Sets the number of columns in the sizer.", "");
7e8f0df9 1128
3ea6e0ec
RD
1129 DocDeclStr(
1130 void , SetRows( int rows ),
1131 "Sets the number of rows in the sizer.", "");
7e8f0df9 1132
3ea6e0ec
RD
1133 DocDeclStr(
1134 void , SetVGap( int gap ),
1135 "Sets the vertical gap (in pixels) between the cells in the sizer.", "");
7e8f0df9 1136
3ea6e0ec
RD
1137 DocDeclStr(
1138 void , SetHGap( int gap ),
1139 "Sets the horizontal gap (in pixels) between cells in the sizer", "");
7e8f0df9 1140
3ea6e0ec
RD
1141 DocDeclStr(
1142 int , GetCols(),
1143 "Returns the number of columns in the sizer.", "");
7e8f0df9 1144
3ea6e0ec
RD
1145 DocDeclStr(
1146 int , GetRows(),
1147 "Returns the number of rows in the sizer.", "");
7e8f0df9 1148
3ea6e0ec
RD
1149 DocDeclStr(
1150 int , GetVGap(),
1151 "Returns the vertical gap (in pixels) between the cells in the sizer.", "");
7e8f0df9 1152
3ea6e0ec
RD
1153 DocDeclStr(
1154 int , GetHGap(),
1155 "Returns the horizontal gap (in pixels) between cells in the sizer.", "");
7e8f0df9 1156
d14a1e28
RD
1157};
1158
1159//---------------------------------------------------------------------------
1160%newgroup;
1161
1162enum wxFlexSizerGrowMode
1163{
1164 // don't resize the cells in non-flexible direction at all
1165 wxFLEX_GROWMODE_NONE,
1166
1167 // uniformly resize only the specified ones (default)
1168 wxFLEX_GROWMODE_SPECIFIED,
1169
1170 // uniformly resize all cells
1171 wxFLEX_GROWMODE_ALL
1172};
1173
1174
3ea6e0ec
RD
1175
1176
1177
1178DocStr(wxFlexGridSizer,
1179"A flex grid sizer is a sizer which lays out its children in a
1180two-dimensional table with all table cells in one row having the same
1181height and all cells in one column having the same width, but all
1182rows or all columns are not necessarily the same height or width as in
1183the `wx.GridSizer`.
1184
1185wx.FlexGridSizer can also size items equally in one direction but
1186unequally (\"flexibly\") in the other. If the sizer is only flexible
1187in one direction (this can be changed using `SetFlexibleDirection`), it
1188needs to be decided how the sizer should grow in the other (\"non
1189flexible\") direction in order to fill the available space. The
1190`SetNonFlexibleGrowMode` method serves this purpose.
1191
1192", "");
1193
d14a1e28
RD
1194class wxFlexGridSizer: public wxGridSizer
1195{
1196public:
2b9048c5 1197 %pythonAppend wxFlexGridSizer "self._setOORInfo(self)"
d14a1e28 1198
3ea6e0ec
RD
1199 DocCtorStr(
1200 wxFlexGridSizer( int rows=1, int cols=0, int vgap=0, int hgap=0 ),
1201 "Constructor for a wx.FlexGridSizer. *rows* and *cols* determine the
1202number of columns and rows in the sizer - if either of the parameters
1203is zero, it will be calculated to from the total number of children in
1204the sizer, thus making the sizer grow dynamically. *vgap* and *hgap*
1205define extra space between all children.", "");
7e8f0df9 1206
3ea6e0ec
RD
1207
1208 DocDeclStr(
1209 void , AddGrowableRow( size_t idx, int proportion = 0 ),
1210 "Specifies that row *idx* (starting from zero) should be grown if there
1211is extra space available to the sizer.
1212
1213The *proportion* parameter has the same meaning as the stretch factor
1214for the box sizers except that if all proportions are 0, then all
1215columns are resized equally (instead of not being resized at all).", "");
7e8f0df9 1216
3ea6e0ec
RD
1217 DocDeclStr(
1218 void , RemoveGrowableRow( size_t idx ),
1219 "Specifies that row *idx* is no longer growable.", "");
7e8f0df9 1220
3ea6e0ec
RD
1221 DocDeclStr(
1222 void , AddGrowableCol( size_t idx, int proportion = 0 ),
1223 "Specifies that column *idx* (starting from zero) should be grown if
1224there is extra space available to the sizer.
1225
1226The *proportion* parameter has the same meaning as the stretch factor
1227for the box sizers except that if all proportions are 0, then all
1228columns are resized equally (instead of not being resized at all).", "");
7e8f0df9 1229
3ea6e0ec
RD
1230 DocDeclStr(
1231 void , RemoveGrowableCol( size_t idx ),
1232 "Specifies that column *idx* is no longer growable.", "");
7e8f0df9 1233
3ea6e0ec
RD
1234
1235 DocDeclStr(
1236 void , SetFlexibleDirection(int direction),
1237 "Specifies whether the sizer should flexibly resize its columns, rows,
1238or both. Argument *direction* can be one of the following values. Any
1239other value is ignored.
1240
1241 ============== =======================================
1242 wx.VERTICAL Rows are flexibly sized.
1243 wx.HORIZONTAL Columns are flexibly sized.
1244 wx.BOTH Both rows and columns are flexibly sized
1245 (this is the default value).
1246 ============== =======================================
1247
1248Note that this method does not trigger relayout.
1249", "");
7e8f0df9 1250
3ea6e0ec
RD
1251 DocDeclStr(
1252 int , GetFlexibleDirection(),
1253 "Returns a value that specifies whether the sizer
1254flexibly resizes its columns, rows, or both (default).
d14a1e28 1255
3ea6e0ec 1256:see: `SetFlexibleDirection`", "");
d14a1e28 1257
7e8f0df9 1258
d14a1e28 1259
3ea6e0ec
RD
1260 DocDeclStr(
1261 void , SetNonFlexibleGrowMode(wxFlexSizerGrowMode mode),
1262 "Specifies how the sizer should grow in the non-flexible direction if
1263there is one (so `SetFlexibleDirection` must have been called
1264previously). Argument *mode* can be one of the following values:
1265
1266 ========================== =================================================
1267 wx.FLEX_GROWMODE_NONE Sizer doesn't grow in the non flexible direction.
1268 wx.FLEX_GROWMODE_SPECIFIED Sizer honors growable columns/rows set with
1269 `AddGrowableCol` and `AddGrowableRow`. In this
1270 case equal sizing applies to minimum sizes of
1271 columns or rows (this is the default value).
1272 wx.FLEX_GROWMODE_ALL Sizer equally stretches all columns or rows in
1273 the non flexible direction, whether they are
1274 growable or not in the flexbile direction.
1275 ========================== =================================================
1276
1277Note that this method does not trigger relayout.
1278
1279", "");
7e8f0df9 1280
3ea6e0ec
RD
1281 DocDeclStr(
1282 wxFlexSizerGrowMode , GetNonFlexibleGrowMode(),
1283 "Returns the value that specifies how the sizer grows in the
1284non-flexible direction if there is one.
d14a1e28 1285
3ea6e0ec 1286:see: `SetNonFlexibleGrowMode`", "");
7e8f0df9 1287
dd9f7fea
RD
1288
1289 // Read-only access to the row heights and col widths arrays
3ea6e0ec
RD
1290 DocDeclAStr(
1291 const wxArrayInt& , GetRowHeights() const,
1292 "GetRowHeights(self) -> list",
1293 "Returns a list of integers representing the heights of each of the
1294rows in the sizer.", "");
7e8f0df9 1295
3ea6e0ec
RD
1296 DocDeclAStr(
1297 const wxArrayInt& , GetColWidths() const,
1298 "GetColWidths(self) -> list",
1299 "Returns a list of integers representing the widths of each of the
1300columns in the sizer.", "");
7e8f0df9 1301
d14a1e28
RD
1302};
1303
9283228f
RD
1304//---------------------------------------------------------------------------
1305
1306DocStr(wxStdDialogButtonSizer,
1307"A special sizer that knows how to order and position standard buttons
1308in order to conform to the current platform's standards. You simply
1309need to add each `wx.Button` to the sizer, and be sure to create the
718903fe 1310buttons using the standard ID's. Then call `Realize` and the sizer
9283228f
RD
1311will take care of the rest.
1312", "");
1313
1314class wxStdDialogButtonSizer: public wxBoxSizer
1315{
1316public:
1317 DocCtorStr(
1318 wxStdDialogButtonSizer(),
1319 "", "");
1320
1321 DocDeclStr(
1322 void , AddButton(wxButton *button),
1323 "Use this to add the buttons to this sizer. Do not use the `Add`
1324method in the base class.", "");
7e8f0df9 1325
9283228f 1326 DocDeclStr(
718903fe 1327 void , Realize(),
9283228f
RD
1328 "This funciton needs to be called after all the buttons have been added
1329to the sizer. It will reorder them and position them in a platform
1330specifc manner.", "");
3ba93175
RD
1331
1332 void SetAffirmativeButton( wxButton *button );
1333 void SetNegativeButton( wxButton *button );
1334 void SetCancelButton( wxButton *button );
7e8f0df9 1335
9283228f
RD
1336 wxButton* GetAffirmativeButton() const;
1337 wxButton* GetApplyButton() const;
1338 wxButton* GetNegativeButton() const;
1339 wxButton* GetCancelButton() const;
1340 wxButton* GetHelpButton() const;
1341};
1342
1343
d14a1e28 1344//---------------------------------------------------------------------------