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