X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6e1f851b1760803b32c3d1d61bcc76feace46f9d..ab67e8874db324fab5223cc8d5dff8a8de3e2b77:/include/wx/sizer.h diff --git a/include/wx/sizer.h b/include/wx/sizer.h index 316602ca44..7e01ff8ad9 100644 --- a/include/wx/sizer.h +++ b/include/wx/sizer.h @@ -125,6 +125,10 @@ public: wxSizerFlags& Border(int direction, int borderInPixels) { + wxCHECK_MSG( !(direction & ~wxALL), *this, + wxS("direction must be a combination of wxDirection ") + wxS("enum values.") ); + m_flags &= ~wxALL; m_flags |= direction; @@ -251,10 +255,10 @@ class WXDLLIMPEXP_CORE wxSizerItem : public wxObject public: // window wxSizerItem( wxWindow *window, - int proportion, - int flag, - int border, - wxObject* userData ); + int proportion=0, + int flag=0, + int border=0, + wxObject* userData=NULL ); // window with flags wxSizerItem(wxWindow *window, const wxSizerFlags& flags) @@ -266,10 +270,10 @@ public: // subsizer wxSizerItem( wxSizer *sizer, - int proportion, - int flag, - int border, - wxObject* userData ); + int proportion=0, + int flag=0, + int border=0, + wxObject* userData=NULL ); // sizer with flags wxSizerItem(wxSizer *sizer, const wxSizerFlags& flags) @@ -282,10 +286,10 @@ public: // spacer wxSizerItem( int width, int height, - int proportion, - int flag, - int border, - wxObject* userData); + int proportion=0, + int flag=0, + int border=0, + wxObject* userData=NULL); // spacer with flags wxSizerItem(int width, int height, const wxSizerFlags& flags) @@ -311,6 +315,10 @@ public: { return m_minSize; } wxSize GetMinSizeWithBorder() const; + wxSize GetMaxSize() const + { return IsWindow() ? m_window->GetMaxSize() : wxDefaultSize; } + wxSize GetMaxSizeWithBorder() const; + void SetMinSize(const wxSize& size) { if ( IsWindow() ) @@ -436,6 +444,10 @@ protected: void DoSetSizer(wxSizer *sizer); void DoSetSpacer(const wxSize& size); + // Add the border specified for this item to the given size + // if it's != wxDefaultSize, just return wxDefaultSize otherwise. + wxSize AddBorderToSize(const wxSize& size) const; + // discriminated union: depending on m_kind one of the fields is valid enum { @@ -471,7 +483,7 @@ protected: private: DECLARE_CLASS(wxSizerItem) - DECLARE_NO_COPY_CLASS(wxSizerItem) + wxDECLARE_NO_COPY_CLASS(wxSizerItem); }; WX_DECLARE_EXPORTED_LIST( wxSizerItem, wxSizerItemList ); @@ -510,7 +522,7 @@ public: wxSizerItem* Add( int width, int height, const wxSizerFlags& flags); wxSizerItem* Add( wxSizerItem *item); - wxSizerItem* AddSpacer(int size); + virtual wxSizerItem *AddSpacer(int size); wxSizerItem* AddStretchSpacer(int prop = 1); wxSizerItem* Insert(size_t index, @@ -542,7 +554,11 @@ public: int width, int height, const wxSizerFlags& flags); - virtual wxSizerItem* Insert( size_t index, wxSizerItem *item); + + // NB: do _not_ override this function in the derived classes, this one is + // virtual for compatibility reasons only to allow old code overriding + // it to continue to work, override DoInsert() instead in the new code + virtual wxSizerItem* Insert(size_t index, wxSizerItem *item); wxSizerItem* InsertSpacer(size_t index, int size); wxSizerItem* InsertStretchSpacer(size_t index, int prop = 1); @@ -597,7 +613,7 @@ public: virtual void DeleteWindows(); // Inform sizer about the first direction that has been decided (by parent item) - // Returns true if it made use of the informtion (and recalculated min size) + // Returns true if it made use of the information (and recalculated min size) virtual bool InformFirstDirection( int WXUNUSED(direction), int WXUNUSED(size), int WXUNUSED(availableOtherDir) ) { return false; } @@ -661,6 +677,10 @@ public: m_position = pos; m_size = size; Layout(); + + // This call is required for wxWrapSizer to be able to calculate its + // minimal size correctly. + InformFirstDirection(wxHORIZONTAL, size.x, size.y); } void SetDimension(int x, int y, int width, int height) { SetDimension(wxPoint(x, y), wxSize(width, height)); } @@ -713,6 +733,10 @@ protected: virtual bool DoSetItemMinSize( wxSizer *sizer, int width, int height ); virtual bool DoSetItemMinSize( size_t index, int width, int height ); + // insert a new item into m_children at given index and return the item + // itself + virtual wxSizerItem* DoInsert(size_t index, wxSizerItem *item); + private: DECLARE_CLASS(wxSizer) }; @@ -724,14 +748,30 @@ private: class WXDLLIMPEXP_CORE wxGridSizer: public wxSizer { public: + // ctors specifying the number of columns only: number of rows will be + // deduced automatically depending on the number of sizer elements + wxGridSizer( int cols, int vgap, int hgap ); + wxGridSizer( int cols, const wxSize& gap = wxSize(0, 0) ); + + // ctors specifying the number of rows and columns wxGridSizer( int rows, int cols, int vgap, int hgap ); - wxGridSizer( int cols, int vgap = 0, int hgap = 0 ); + wxGridSizer( int rows, int cols, const wxSize& gap ); virtual void RecalcSizes(); virtual wxSize CalcMin(); - void SetCols( int cols ) { m_cols = cols; } - void SetRows( int rows ) { m_rows = rows; } + void SetCols( int cols ) + { + wxASSERT_MSG( cols >= 0, "Number of columns must be non-negative"); + m_cols = cols; + } + + void SetRows( int rows ) + { + wxASSERT_MSG( rows >= 0, "Number of rows must be non-negative"); + m_rows = rows; + } + void SetVGap( int gap ) { m_vgap = gap; } void SetHGap( int gap ) { m_hgap = gap; } int GetCols() const { return m_cols; } @@ -739,17 +779,51 @@ public: int GetVGap() const { return m_vgap; } int GetHGap() const { return m_hgap; } + int GetEffectiveColsCount() const { return m_cols ? m_cols : CalcCols(); } + int GetEffectiveRowsCount() const { return m_rows ? m_rows : CalcRows(); } + + // return the number of total items and the number of columns and rows + // (for internal use only) + int CalcRowsCols(int& rows, int& cols) const; + protected: + // the number of rows/columns in the sizer, if 0 then it is determined + // dynamically depending on the total number of items int m_rows; int m_cols; + + // gaps between rows and columns int m_vgap; int m_hgap; - // return the number of total items and the number of columns and rows - int CalcRowsCols(int& rows, int& cols) const; + virtual wxSizerItem *DoInsert(size_t index, wxSizerItem *item); void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h ); + // returns the number of columns/rows needed for the current total number + // of children (and the fixed number of rows/columns) + int CalcCols() const + { + wxCHECK_MSG + ( + m_rows, 0, + "Can't calculate number of cols if number of rows is not specified" + ); + + return (m_children.GetCount() + m_rows - 1) / m_rows; + } + + int CalcRows() const + { + wxCHECK_MSG + ( + m_cols, 0, + "Can't calculate number of cols if number of rows is not specified" + ); + + return (m_children.GetCount() + m_cols - 1) / m_cols; + } + private: DECLARE_CLASS(wxGridSizer) }; @@ -758,8 +832,8 @@ private: // wxFlexGridSizer //--------------------------------------------------------------------------- -// the bevaiour for resizing wxFlexGridSizer cells in the "non-flexible" -// direction +// values which define the behaviour for resizing wxFlexGridSizer cells in the +// "non-flexible" direction enum wxFlexSizerGrowMode { // don't resize the cells in non-flexible direction at all @@ -775,11 +849,17 @@ enum wxFlexSizerGrowMode class WXDLLIMPEXP_CORE wxFlexGridSizer: public wxGridSizer { public: - // ctors/dtor + // ctors specifying the number of columns only: number of rows will be + // deduced automatically depending on the number of sizer elements + wxFlexGridSizer( int cols, int vgap, int hgap ); + wxFlexGridSizer( int cols, const wxSize& gap = wxSize(0, 0) ); + + // ctors specifying the number of rows and columns wxFlexGridSizer( int rows, int cols, int vgap, int hgap ); - wxFlexGridSizer( int cols, int vgap = 0, int hgap = 0 ); - virtual ~wxFlexGridSizer(); + wxFlexGridSizer( int rows, int cols, const wxSize& gap ); + // dtor + virtual ~wxFlexGridSizer(); // set the rows/columns which will grow (the others will remain of the // constant initial size) @@ -838,7 +918,7 @@ protected: private: DECLARE_CLASS(wxFlexGridSizer) - DECLARE_NO_COPY_CLASS(wxFlexGridSizer) + wxDECLARE_NO_COPY_CLASS(wxFlexGridSizer); }; //--------------------------------------------------------------------------- @@ -854,9 +934,11 @@ public: m_totalProportion = 0; wxASSERT_MSG( m_orient == wxHORIZONTAL || m_orient == wxVERTICAL, - _T("invalid value for wxBoxSizer orientation") ); + wxT("invalid value for wxBoxSizer orientation") ); } + virtual wxSizerItem *AddSpacer(int size); + int GetOrientation() const { return m_orient; } bool IsVertical() const { return m_orient == wxVERTICAL; } @@ -961,11 +1043,15 @@ protected: private: DECLARE_CLASS(wxStaticBoxSizer) - DECLARE_NO_COPY_CLASS(wxStaticBoxSizer) + wxDECLARE_NO_COPY_CLASS(wxStaticBoxSizer); }; #endif // wxUSE_STATBOX +//--------------------------------------------------------------------------- +// wxStdDialogButtonSizer +//--------------------------------------------------------------------------- + #if wxUSE_BUTTON class WXDLLIMPEXP_CORE wxStdDialogButtonSizer: public wxBoxSizer @@ -1009,7 +1095,7 @@ protected: private: DECLARE_CLASS(wxStdDialogButtonSizer) - DECLARE_NO_COPY_CLASS(wxStdDialogButtonSizer) + wxDECLARE_NO_COPY_CLASS(wxStdDialogButtonSizer); }; #endif // wxUSE_BUTTON @@ -1043,6 +1129,12 @@ inline void wxSizerItem::SetSpacer(int width, int height) #endif // WXWIN_COMPATIBILITY_2_8 +inline wxSizerItem* +wxSizer::Insert(size_t index, wxSizerItem *item) +{ + return DoInsert(index, item); +} + inline wxSizerItem* wxSizer::Add( wxSizerItem *item )