1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: provide wxSizer class for layout
4 // Author: Robert Roebling and Robin Dunn
5 // Modified by: Ron Lee, Vadim Zeitlin (wxSizerFlags)
8 // Copyright: (c) Robin Dunn, Robert Roebling
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
15 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
16 #pragma interface "sizer.h"
21 #include "wx/window.h"
23 #include "wx/dialog.h"
24 #include "wx/bookctrl.h"
26 //---------------------------------------------------------------------------
28 //---------------------------------------------------------------------------
30 class WXDLLEXPORT wxSizerItem
;
31 class WXDLLEXPORT wxSizer
;
32 class WXDLLEXPORT wxBoxSizer
;
35 // ----------------------------------------------------------------------------
36 // wxSizerFlags: flags used for an item in the sizer
37 // ----------------------------------------------------------------------------
39 class WXDLLEXPORT wxSizerFlags
42 // construct the flags object initialized with the given proportion (0 by
44 wxSizerFlags(int proportion
= 0) : m_proportion(proportion
)
50 // setters for all sizer flags, they all return the object itself so that
51 // calls to them can be chained
53 wxSizerFlags
& Proportion(int proportion
)
55 m_proportion
= proportion
;
59 wxSizerFlags
& Align(int alignment
) // combination of wxAlignment values
67 // some shortcuts for Align()
68 wxSizerFlags
& Expand() { return Align(wxEXPAND
); }
69 wxSizerFlags
& Centre() { return Align(wxCENTRE
); }
70 wxSizerFlags
& Center() { return Centre(); }
73 wxSizerFlags
& Border(int direction
, int borderInPixels
)
78 m_borderInPixels
= borderInPixels
;
83 wxSizerFlags
& Border(int direction
= wxALL
)
85 // FIXME: default border size shouldn't be hardcoded
86 return Border(direction
, 5);
90 // accessors for wxSizer only
91 int GetProportion() const { return m_proportion
; }
92 int GetFlags() const { return m_flags
; }
93 int GetBorderInPixels() const { return m_borderInPixels
; }
102 //---------------------------------------------------------------------------
104 //---------------------------------------------------------------------------
106 class WXDLLEXPORT wxSizerItem
: public wxObject
110 wxSizerItem(wxWindow
*window
, const wxSizerFlags
& flags
)
118 wxSizerItem(wxSizer
*sizer
, const wxSizerFlags
& flags
)
126 wxSizerItem( wxWindow
*window
,
130 wxObject
* userData
);
133 wxSizerItem( wxSizer
*sizer
,
137 wxObject
* userData
);
140 wxSizerItem( int width
,
148 virtual ~wxSizerItem();
150 virtual void DeleteWindows();
152 // Enable deleting the SizerItem without destroying the contained sizer.
156 virtual wxSize
GetSize() const;
157 virtual wxSize
CalcMin();
158 virtual void SetDimension( wxPoint pos
, wxSize size
);
160 wxSize
GetMinSize() const
161 { return m_minSize
; }
162 wxSize
GetMinSizeWithBorder() const;
164 void SetMinSize(const wxSize
& size
)
166 if (IsWindow()) m_window
->SetMinSize(size
);
169 void SetMinSize( int x
, int y
)
170 { SetMinSize(wxSize(x
, y
)); }
171 void SetInitSize( int x
, int y
)
172 { SetMinSize(wxSize(x
, y
)); }
174 void SetRatio( int width
, int height
)
175 // if either of dimensions is zero, ratio is assumed to be 1
176 // to avoid "divide by zero" errors
177 { m_ratio
= (width
&& height
) ? ((float) width
/ (float) height
) : 1; }
178 void SetRatio( wxSize size
)
179 { m_ratio
= (size
.x
&& size
.y
) ? ((float) size
.x
/ (float) size
.y
) : 1; }
180 void SetRatio( float ratio
)
182 float GetRatio() const
185 bool IsWindow() const;
186 bool IsSizer() const;
187 bool IsSpacer() const;
189 // Deprecated in 2.6, use {G,S}etProportion instead.
190 wxDEPRECATED( void SetOption( int option
) );
191 wxDEPRECATED( int GetOption() const );
193 void SetProportion( int proportion
)
194 { m_proportion
= proportion
; }
195 int GetProportion() const
196 { return m_proportion
; }
197 void SetFlag( int flag
)
201 void SetBorder( int border
)
202 { m_border
= border
; }
203 int GetBorder() const
206 wxWindow
*GetWindow() const
208 void SetWindow( wxWindow
*window
)
209 { m_window
= window
; m_minSize
= window
->GetSize(); }
210 wxSizer
*GetSizer() const
212 void SetSizer( wxSizer
*sizer
)
214 const wxSize
&GetSpacer() const
216 void SetSpacer( const wxSize
&size
)
217 { m_size
= size
; m_minSize
= size
; }
219 void Show ( bool show
);
223 wxObject
* GetUserData() const
224 { return m_userData
; }
225 wxPoint
GetPosition() const
229 // common part of several ctors
232 // common part of ctors taking wxSizerFlags
233 void Init(const wxSizerFlags
& flags
);
245 // If true, then this item is considered in the layout
246 // calculation. Otherwise, it is skipped over.
249 // Aspect ratio can always be calculated from m_size,
250 // but this would cause precision loss when the window
251 // is shrunk. It is safer to preserve the initial value.
254 wxObject
*m_userData
;
257 DECLARE_CLASS(wxSizerItem
)
258 DECLARE_NO_COPY_CLASS(wxSizerItem
)
261 WX_DECLARE_EXPORTED_LIST( wxSizerItem
, wxSizerItemList
);
264 //---------------------------------------------------------------------------
266 //---------------------------------------------------------------------------
268 class WXDLLEXPORT wxSizer
: public wxObject
, public wxClientDataContainer
274 // methods for adding elements to the sizer: there are Add/Insert/Prepend
275 // overloads for each of window/sizer/spacer/wxSizerItem
276 inline void Add( wxWindow
*window
,
280 wxObject
* userData
= NULL
);
281 inline void Add( wxSizer
*sizer
,
285 wxObject
* userData
= NULL
);
286 inline void Add( int width
,
291 wxObject
* userData
= NULL
);
292 inline void Add( wxWindow
*window
, const wxSizerFlags
& flags
);
293 inline void Add( wxSizer
*sizer
, const wxSizerFlags
& flags
);
294 inline void Add( wxSizerItem
*item
);
296 inline void AddSpacer(int size
);
297 inline void AddStretchSpacer(int prop
= 1);
299 inline void Insert( size_t index
,
304 wxObject
* userData
= NULL
);
305 inline void Insert( size_t index
,
310 wxObject
* userData
= NULL
);
311 inline void Insert( size_t index
,
317 wxObject
* userData
= NULL
);
318 inline void Insert( size_t index
,
320 const wxSizerFlags
& flags
);
321 inline void Insert( size_t index
,
323 const wxSizerFlags
& flags
);
324 virtual void Insert( size_t index
, wxSizerItem
*item
);
326 inline void InsertSpacer(size_t index
, int size
);
327 inline void InsertStretchSpacer(size_t index
, int prop
= 1);
329 inline void Prepend( wxWindow
*window
,
333 wxObject
* userData
= NULL
);
334 inline void Prepend( wxSizer
*sizer
,
338 wxObject
* userData
= NULL
);
339 inline void Prepend( int width
,
344 wxObject
* userData
= NULL
);
345 inline void Prepend( wxWindow
*window
, const wxSizerFlags
& flags
);
346 inline void Prepend( wxSizer
*sizer
, const wxSizerFlags
& flags
);
347 inline void Prepend( wxSizerItem
*item
);
349 inline void PrependSpacer(int size
);
350 inline void PrependStretchSpacer(int prop
= 1);
353 // Deprecated in 2.6 since historically it does not delete the window,
354 // use Detach instead.
355 wxDEPRECATED( virtual bool Remove( wxWindow
*window
) );
356 virtual bool Remove( wxSizer
*sizer
);
357 virtual bool Remove( int index
);
359 virtual bool Detach( wxWindow
*window
);
360 virtual bool Detach( wxSizer
*sizer
);
361 virtual bool Detach( int index
);
363 virtual void Clear( bool delete_windows
= false );
364 virtual void DeleteWindows();
366 void SetMinSize( int width
, int height
)
367 { DoSetMinSize( width
, height
); }
368 void SetMinSize( wxSize size
)
369 { DoSetMinSize( size
.x
, size
.y
); }
371 /* Searches recursively */
372 bool SetItemMinSize( wxWindow
*window
, int width
, int height
)
373 { return DoSetItemMinSize( window
, width
, height
); }
374 bool SetItemMinSize( wxWindow
*window
, wxSize size
)
375 { return DoSetItemMinSize( window
, size
.x
, size
.y
); }
377 /* Searches recursively */
378 bool SetItemMinSize( wxSizer
*sizer
, int width
, int height
)
379 { return DoSetItemMinSize( sizer
, width
, height
); }
380 bool SetItemMinSize( wxSizer
*sizer
, wxSize size
)
381 { return DoSetItemMinSize( sizer
, size
.x
, size
.y
); }
383 bool SetItemMinSize( size_t index
, int width
, int height
)
384 { return DoSetItemMinSize( index
, width
, height
); }
385 bool SetItemMinSize( size_t index
, wxSize size
)
386 { return DoSetItemMinSize( index
, size
.x
, size
.y
); }
388 wxSize
GetSize() const
390 wxPoint
GetPosition() const
391 { return m_position
; }
393 /* Calculate the minimal size or return m_minSize if bigger. */
396 virtual void RecalcSizes() = 0;
397 virtual wxSize
CalcMin() = 0;
399 virtual void Layout();
401 wxSize
Fit( wxWindow
*window
);
402 void FitInside( wxWindow
*window
);
403 void SetSizeHints( wxWindow
*window
);
404 void SetVirtualSizeHints( wxWindow
*window
);
406 wxSizerItemList
& GetChildren()
407 { return m_children
; }
409 void SetDimension( int x
, int y
, int width
, int height
);
411 // Manage whether individual scene items are considered
412 // in the layout calculations or not.
413 bool Show( wxWindow
*window
, bool show
= true, bool recursive
= false );
414 bool Show( wxSizer
*sizer
, bool show
= true, bool recursive
= false );
415 bool Show( size_t index
, bool show
= true );
417 bool Hide( wxSizer
*sizer
, bool recursive
= false )
418 { return Show( sizer
, false, recursive
); }
419 bool Hide( wxWindow
*window
, bool recursive
= false )
420 { return Show( window
, false, recursive
); }
421 bool Hide( size_t index
)
422 { return Show( index
, false ); }
424 bool IsShown( wxWindow
*window
) const;
425 bool IsShown( wxSizer
*sizer
) const;
426 bool IsShown( size_t index
) const;
428 // Recursively call wxWindow::Show () on all sizer items.
429 virtual void ShowItems (bool show
);
435 wxSizerItemList m_children
;
437 wxSize
GetMaxWindowSize( wxWindow
*window
) const;
438 wxSize
GetMinWindowSize( wxWindow
*window
);
439 wxSize
GetMaxClientSize( wxWindow
*window
) const;
440 wxSize
GetMinClientSize( wxWindow
*window
);
441 wxSize
FitSize( wxWindow
*window
);
442 wxSize
VirtualFitSize( wxWindow
*window
);
444 virtual void DoSetMinSize( int width
, int height
);
445 virtual bool DoSetItemMinSize( wxWindow
*window
, int width
, int height
);
446 virtual bool DoSetItemMinSize( wxSizer
*sizer
, int width
, int height
);
447 virtual bool DoSetItemMinSize( size_t index
, int width
, int height
);
450 DECLARE_CLASS(wxSizer
)
453 //---------------------------------------------------------------------------
455 //---------------------------------------------------------------------------
457 class WXDLLEXPORT wxGridSizer
: public wxSizer
460 wxGridSizer( int rows
, int cols
, int vgap
, int hgap
);
461 wxGridSizer( int cols
, int vgap
= 0, int hgap
= 0 );
463 virtual void RecalcSizes();
464 virtual wxSize
CalcMin();
466 void SetCols( int cols
) { m_cols
= cols
; }
467 void SetRows( int rows
) { m_rows
= rows
; }
468 void SetVGap( int gap
) { m_vgap
= gap
; }
469 void SetHGap( int gap
) { m_hgap
= gap
; }
470 int GetCols() const { return m_cols
; }
471 int GetRows() const { return m_rows
; }
472 int GetVGap() const { return m_vgap
; }
473 int GetHGap() const { return m_hgap
; }
481 // return the number of total items and the number of columns and rows
482 int CalcRowsCols(int& rows
, int& cols
) const;
484 void SetItemBounds( wxSizerItem
*item
, int x
, int y
, int w
, int h
);
487 DECLARE_CLASS(wxGridSizer
)
490 //---------------------------------------------------------------------------
492 //---------------------------------------------------------------------------
494 // the bevaiour for resizing wxFlexGridSizer cells in the "non-flexible"
496 enum wxFlexSizerGrowMode
498 // don't resize the cells in non-flexible direction at all
499 wxFLEX_GROWMODE_NONE
,
501 // uniformly resize only the specified ones (default)
502 wxFLEX_GROWMODE_SPECIFIED
,
504 // uniformly resize all cells
508 class WXDLLEXPORT wxFlexGridSizer
: public wxGridSizer
512 wxFlexGridSizer( int rows
, int cols
, int vgap
, int hgap
);
513 wxFlexGridSizer( int cols
, int vgap
= 0, int hgap
= 0 );
514 virtual ~wxFlexGridSizer();
517 // set the rows/columns which will grow (the others will remain of the
518 // constant initial size)
519 void AddGrowableRow( size_t idx
, int proportion
= 0 );
520 void RemoveGrowableRow( size_t idx
);
521 void AddGrowableCol( size_t idx
, int proportion
= 0 );
522 void RemoveGrowableCol( size_t idx
);
525 // the sizer cells may grow in both directions, not grow at all or only
526 // grow in one direction but not the other
528 // the direction may be wxVERTICAL, wxHORIZONTAL or wxBOTH (default)
529 void SetFlexibleDirection(int direction
) { m_flexDirection
= direction
; }
530 int GetFlexibleDirection() const { return m_flexDirection
; }
532 // note that the grow mode only applies to the direction which is not
534 void SetNonFlexibleGrowMode(wxFlexSizerGrowMode mode
) { m_growMode
= mode
; }
535 wxFlexSizerGrowMode
GetNonFlexibleGrowMode() const { return m_growMode
; }
537 // Read-only access to the row heights and col widths arrays
538 const wxArrayInt
& GetRowHeights() const { return m_rowHeights
; }
539 const wxArrayInt
& GetColWidths() const { return m_colWidths
; }
542 virtual void RecalcSizes();
543 virtual wxSize
CalcMin();
546 void AdjustForFlexDirection();
547 void AdjustForGrowables(const wxSize
& sz
, const wxSize
& minsz
,
548 int nrows
, int ncols
);
550 // the heights/widths of all rows/columns
551 wxArrayInt m_rowHeights
,
554 // indices of the growable columns and rows
555 wxArrayInt m_growableRows
,
558 // proportion values of the corresponding growable rows and columns
559 wxArrayInt m_growableRowsProportions
,
560 m_growableColsProportions
;
562 // parameters describing whether the growable cells should be resized in
563 // both directions or only one
565 wxFlexSizerGrowMode m_growMode
;
567 // saves CalcMin result to optimize RecalcSizes
568 wxSize m_calculatedMinSize
;
571 DECLARE_CLASS(wxFlexGridSizer
)
572 DECLARE_NO_COPY_CLASS(wxFlexGridSizer
)
575 //---------------------------------------------------------------------------
577 //---------------------------------------------------------------------------
579 class WXDLLEXPORT wxBoxSizer
: public wxSizer
582 wxBoxSizer( int orient
);
587 int GetOrientation() const
590 void SetOrientation(int orient
)
591 { m_orient
= orient
; }
602 DECLARE_CLASS(wxBoxSizer
)
605 //---------------------------------------------------------------------------
607 //---------------------------------------------------------------------------
611 class WXDLLEXPORT wxStaticBox
;
613 class WXDLLEXPORT wxStaticBoxSizer
: public wxBoxSizer
616 wxStaticBoxSizer( wxStaticBox
*box
, int orient
);
621 wxStaticBox
*GetStaticBox() const
622 { return m_staticBox
; }
624 // override to hide/show the static box as well
625 virtual void ShowItems (bool show
);
628 wxStaticBox
*m_staticBox
;
631 DECLARE_CLASS(wxStaticBoxSizer
)
632 DECLARE_NO_COPY_CLASS(wxStaticBoxSizer
)
635 #endif // wxUSE_STATBOX
638 #if WXWIN_COMPATIBILITY_2_4
639 // NB: wxBookCtrlSizer and wxNotebookSizer are deprecated, they
640 // don't do anything. wxBookCtrl::DoGetBestSize does the job now.
642 // ----------------------------------------------------------------------------
644 // ----------------------------------------------------------------------------
648 // this sizer works with wxNotebook/wxListbook/... and sizes the control to
650 class WXDLLEXPORT wxBookCtrl
;
652 class WXDLLEXPORT wxBookCtrlSizer
: public wxSizer
655 wxDEPRECATED( wxBookCtrlSizer(wxBookCtrl
*bookctrl
) );
657 wxBookCtrl
*GetControl() const { return m_bookctrl
; }
659 virtual void RecalcSizes();
660 virtual wxSize
CalcMin();
663 // this protected ctor lets us mark the real one above as deprecated
664 // and still have warning-free build of the library itself:
667 wxBookCtrl
*m_bookctrl
;
670 DECLARE_CLASS(wxBookCtrlSizer
)
671 DECLARE_NO_COPY_CLASS(wxBookCtrlSizer
)
677 // before wxBookCtrl we only had wxNotebookSizer, keep it for backwards
679 class WXDLLEXPORT wxNotebook
;
681 class WXDLLEXPORT wxNotebookSizer
: public wxBookCtrlSizer
684 wxDEPRECATED( wxNotebookSizer(wxNotebook
*nb
) );
686 wxNotebook
*GetNotebook() const { return (wxNotebook
*)m_bookctrl
; }
689 DECLARE_CLASS(wxNotebookSizer
)
690 DECLARE_NO_COPY_CLASS(wxNotebookSizer
)
693 #endif // wxUSE_NOTEBOOK
695 #endif // wxUSE_BOOKCTRL
697 #endif // WXWIN_COMPATIBILITY_2_4
699 // ----------------------------------------------------------------------------
700 // inline functions implementation
701 // ----------------------------------------------------------------------------
704 wxSizer::Add( wxWindow
*window
, int proportion
, int flag
, int border
, wxObject
* userData
)
706 Add( new wxSizerItem( window
, proportion
, flag
, border
, userData
) );
710 wxSizer::Add( wxSizer
*sizer
, int proportion
, int flag
, int border
, wxObject
* userData
)
712 Add( new wxSizerItem( sizer
, proportion
, flag
, border
, userData
) );
716 wxSizer::Add( int width
, int height
, int proportion
, int flag
, int border
, wxObject
* userData
)
718 Add( new wxSizerItem( width
, height
, proportion
, flag
, border
, userData
) );
722 wxSizer::Add( wxWindow
*window
, const wxSizerFlags
& flags
)
724 Add( new wxSizerItem(window
, flags
) );
728 wxSizer::Add( wxSizer
*sizer
, const wxSizerFlags
& flags
)
730 Add( new wxSizerItem(sizer
, flags
) );
734 wxSizer::Add( wxSizerItem
*item
)
736 Insert( m_children
.GetCount(), item
);
740 wxSizer::AddSpacer(int size
)
746 wxSizer::AddStretchSpacer(int prop
)
752 wxSizer::Prepend( wxWindow
*window
, int proportion
, int flag
, int border
, wxObject
* userData
)
754 Prepend( new wxSizerItem( window
, proportion
, flag
, border
, userData
) );
758 wxSizer::Prepend( wxSizer
*sizer
, int proportion
, int flag
, int border
, wxObject
* userData
)
760 Prepend( new wxSizerItem( sizer
, proportion
, flag
, border
, userData
) );
764 wxSizer::Prepend( int width
, int height
, int proportion
, int flag
, int border
, wxObject
* userData
)
766 Prepend( new wxSizerItem( width
, height
, proportion
, flag
, border
, userData
) );
770 wxSizer::Prepend( wxSizerItem
*item
)
776 wxSizer::PrependSpacer(int size
)
782 wxSizer::PrependStretchSpacer(int prop
)
788 wxSizer::Prepend( wxWindow
*window
, const wxSizerFlags
& flags
)
790 Prepend( new wxSizerItem(window
, flags
) );
794 wxSizer::Prepend( wxSizer
*sizer
, const wxSizerFlags
& flags
)
796 Prepend( new wxSizerItem(sizer
, flags
) );
800 wxSizer::Insert( size_t index
,
807 Insert( index
, new wxSizerItem( window
, proportion
, flag
, border
, userData
) );
811 wxSizer::Insert( size_t index
,
818 Insert( index
, new wxSizerItem( sizer
, proportion
, flag
, border
, userData
) );
822 wxSizer::Insert( size_t index
,
830 Insert( index
, new wxSizerItem( width
, height
, proportion
, flag
, border
, userData
) );
834 wxSizer::Insert( size_t index
, wxWindow
*window
, const wxSizerFlags
& flags
)
836 Insert( index
, new wxSizerItem(window
, flags
) );
840 wxSizer::Insert( size_t index
, wxSizer
*sizer
, const wxSizerFlags
& flags
)
842 Insert( index
, new wxSizerItem(sizer
, flags
) );
846 wxSizer::InsertSpacer(size_t index
, int size
)
848 Insert(index
, size
, size
);
852 wxSizer::InsertStretchSpacer(size_t index
, int prop
)
854 Insert(index
, 0, 0, prop
);
858 #endif // __WXSIZER_H__