X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/27ea1d8aae3055025b2ebac9d9f7e93feee7569d..bf7d7ee7062f7f6028df40e43745235658e38b4d:/include/wx/sizer.h diff --git a/include/wx/sizer.h b/include/wx/sizer.h index 61eda2e4ec..bcdeb0339c 100644 --- a/include/wx/sizer.h +++ b/include/wx/sizer.h @@ -1,9 +1,9 @@ ///////////////////////////////////////////////////////////////////////////// // Name: sizer.h -// Purpose: provide wxSizer class for layounting +// Purpose: provide wxSizer class for layouting // Author: Robert Roebling and Robin Dunn // Modified by: -// Created: +// Created: // RCS-ID: $Id$ // Copyright: (c) Robin Dunn, Dirk Holtwick and Robert Roebling // Licence: wxWindows licence @@ -26,12 +26,9 @@ // classes //--------------------------------------------------------------------------- -class wxStaticBox; - class wxSizerItem; class wxSizer; class wxBoxSizer; -class wxStaticBoxSizer; //--------------------------------------------------------------------------- // wxSizerItem @@ -40,42 +37,84 @@ class wxStaticBoxSizer; class WXDLLEXPORT wxSizerItem: public wxObject { public: - // spacer - wxSizerItem( int width, int height, int option, int flag, int border ); + // spacer + wxSizerItem( int width, int height, int option, int flag, int border, wxObject* userData); - // window - wxSizerItem( wxWindow *window, int option, int flag, int border ); + // window + wxSizerItem( wxWindow *window, int option, int flag, int border, wxObject* userData ); - // subsizer - wxSizerItem( wxSizer *sizer, int option, int flag, int border ); + // subsizer + wxSizerItem( wxSizer *sizer, int option, int flag, int border, wxObject* userData ); - virtual wxSize GetSize(); - virtual wxSize CalcMin(); - virtual void SetDimension( wxPoint pos, wxSize size ); - - bool IsWindow(); - bool IsSizer(); - bool IsSpacer(); - - wxWindow *GetWindow() const - { return m_window; } - wxSizer *GetSizer() const - { return m_sizer; } - int GetOption() const - { return m_option; } - int GetFlag() const - { return m_flag; } - int GetBorder() const - { return m_border; } + ~wxSizerItem(); + + virtual wxSize GetSize(); + virtual wxSize CalcMin(); + virtual void SetDimension( wxPoint pos, wxSize size ); + + wxSize GetMinSize() + { return m_minSize; } + + void SetRatio( int width, int height ) + // if either of dimensions is zero, ratio is assumed to be 1 + // to avoid "divide by zero" errors + { m_ratio = (width && height) ? ((float) width / (float) height) : 1; } + void SetRatio( wxSize size ) + { m_ratio = (size.x && size.y) ? ((float) size.x / (float) size.y) : 1; } + void SetRatio( float ratio ) + { m_ratio = ratio; } + float GetRatio() const + { return m_ratio; } + + bool IsWindow(); + bool IsSizer(); + bool IsSpacer(); + void SetInitSize( int x, int y ) + { m_minSize.x = x; m_minSize.y = y; } + void SetOption( int option ) + { m_option = option; } + void SetFlag( int flag ) + { m_flag = flag; } + void SetBorder( int border ) + { m_border = border; } + + wxWindow *GetWindow() const + { return m_window; } + void SetWindow( wxWindow *window ) + { m_window = window; } + wxSizer *GetSizer() const + { return m_sizer; } + void SetSizer( wxSizer *sizer ) + { m_sizer = sizer; } + int GetOption() const + { return m_option; } + int GetFlag() const + { return m_flag; } + int GetBorder() const + { return m_border; } + wxObject* GetUserData() + { return m_userData; } + wxPoint GetPosition() + { return m_pos; } + protected: - wxWindow *m_window; - wxSizer *m_sizer; - wxSize m_size; - wxSize m_minSize; - int m_option; - int m_border; - int m_flag; + wxWindow *m_window; + wxSizer *m_sizer; + wxSize m_size; + wxPoint m_pos; + wxSize m_minSize; + int m_option; + int m_border; + int m_flag; + // als: aspect ratio can always be calculated from m_size, + // but this would cause precision loss when the window + // is shrinked. it is safer to preserve initial value. + float m_ratio; + wxObject *m_userData; + +private: + DECLARE_CLASS(wxSizerItem); }; //--------------------------------------------------------------------------- @@ -85,36 +124,151 @@ protected: class WXDLLEXPORT wxSizer: public wxObject { public: - wxSizer(); - ~wxSizer(); - - virtual void Add( wxWindow *window, int option = 0, int flag = 0, int border = 0 ); - virtual void Add( wxSizer *sizer, int option = 0, int flag = 0, int border = 0 ); - virtual void Add( int width, int height, int option = 0, int flag = 0, int border = 0 ); - - void SetDimension( int x, int y, int width, int height ); - - wxSize GetSize() - { return m_size; } - wxPoint GetPosition() - { return m_position; } - wxSize GetMinSize() - { return CalcMin(); } - - virtual void RecalcSizes() = 0; - virtual wxSize CalcMin() = 0; - - virtual void Layout(); - - void Fit( wxWindow *window ); - void SetSizeHints( wxWindow *window ); - + wxSizer(); + ~wxSizer(); + + /* These should be called Append() really. */ + virtual void Add( wxWindow *window, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual void Add( wxSizer *sizer, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual void Add( int width, int height, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + + virtual void Insert( int before, wxWindow *window, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual void Insert( int before, wxSizer *sizer, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual void Insert( int before, int width, int height, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + + virtual void Prepend( wxWindow *window, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual void Prepend( wxSizer *sizer, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual void Prepend( int width, int height, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + + virtual bool Remove( wxWindow *window ); + virtual bool Remove( wxSizer *sizer ); + virtual bool Remove( int pos ); + + void SetMinSize( int width, int height ) + { DoSetMinSize( width, height ); } + void SetMinSize( wxSize size ) + { DoSetMinSize( size.x, size.y ); } + + /* Searches recursively */ + bool SetItemMinSize( wxWindow *window, int width, int height ) + { return DoSetItemMinSize( window, width, height ); } + bool SetItemMinSize( wxWindow *window, wxSize size ) + { return DoSetItemMinSize( window, size.x, size.y ); } + + /* Searches recursively */ + bool SetItemMinSize( wxSizer *sizer, int width, int height ) + { return DoSetItemMinSize( sizer, width, height ); } + bool SetItemMinSize( wxSizer *sizer, wxSize size ) + { return DoSetItemMinSize( sizer, size.x, size.y ); } + + bool SetItemMinSize( int pos, int width, int height ) + { return DoSetItemMinSize( pos, width, height ); } + bool SetItemMinSize( int pos, wxSize size ) + { return DoSetItemMinSize( pos, size.x, size.y ); } + + wxSize GetSize() + { return m_size; } + wxPoint GetPosition() + { return m_position; } + + /* Calculate the minimal size or return m_minSize if bigger. */ + wxSize GetMinSize(); + + virtual void RecalcSizes() = 0; + virtual wxSize CalcMin() = 0; + + virtual void Layout(); + + void Fit( wxWindow *window ); + void SetSizeHints( wxWindow *window ); + + wxList& GetChildren() + { return m_children; } + + void SetDimension( int x, int y, int width, int height ); + +protected: + wxSize m_size; + wxSize m_minSize; + wxPoint m_position; + wxList m_children; + + wxSize GetMaxWindowSize( wxWindow *window ); + wxSize GetMinWindowSize( wxWindow *window ); + wxSize FitSize( wxWindow *window ); + + virtual void DoSetMinSize( int width, int height ); + virtual bool DoSetItemMinSize( wxWindow *window, int width, int height ); + virtual bool DoSetItemMinSize( wxSizer *sizer, int width, int height ); + virtual bool DoSetItemMinSize( int pos, int width, int height ); + +private: + DECLARE_CLASS(wxSizer); +}; + +//--------------------------------------------------------------------------- +// wxGridSizer +//--------------------------------------------------------------------------- + +class WXDLLEXPORT wxGridSizer: public wxSizer +{ +public: + wxGridSizer( int rows, int cols, int vgap, int hgap ); + wxGridSizer( int cols, int vgap = 0, int hgap = 0 ); + + void RecalcSizes(); + wxSize CalcMin(); + + void SetCols( int cols ) { m_cols = cols; } + void SetRows( int rows ) { m_rows = rows; } + void SetVGap( int gap ) { m_vgap = gap; } + void SetHGap( int gap ) { m_hgap = gap; } + int GetCols() { return m_cols; } + int GetRows() { return m_rows; } + int GetVGap() { return m_vgap; } + int GetHGap() { return m_hgap; } + +protected: + int m_rows; + int m_cols; + int m_vgap; + int m_hgap; + + void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h ); + +private: + DECLARE_CLASS(wxGridSizer); +}; + +//--------------------------------------------------------------------------- +// wxFlexGridSizer +//--------------------------------------------------------------------------- + +class WXDLLEXPORT wxFlexGridSizer: public wxGridSizer +{ +public: + wxFlexGridSizer( int rows, int cols, int vgap, int hgap ); + wxFlexGridSizer( int cols, int vgap = 0, int hgap = 0 ); + ~wxFlexGridSizer(); + + void RecalcSizes(); + wxSize CalcMin(); + + void AddGrowableRow( size_t idx ); + void RemoveGrowableRow( size_t idx ); + void AddGrowableCol( size_t idx ); + void RemoveGrowableCol( size_t idx ); + protected: - wxSize m_size; - wxPoint m_position; - wxList m_children; - - wxSize GetMinWindowSize( wxWindow *window ); + int *m_rowHeights; + int *m_colWidths; + wxArrayInt m_growableRows; + wxArrayInt m_growableCols; + + void CreateArrays(); + +private: + DECLARE_CLASS(wxFlexGridSizer); }; //--------------------------------------------------------------------------- @@ -124,14 +278,14 @@ protected: class WXDLLEXPORT wxBoxSizer: public wxSizer { public: - wxBoxSizer( int orient ); - - void RecalcSizes(); - wxSize CalcMin(); - - int GetOrientation() - { return m_orient; } - + wxBoxSizer( int orient ); + + void RecalcSizes(); + wxSize CalcMin(); + + int GetOrientation() + { return m_orient; } + protected: int m_orient; int m_stretchable; @@ -139,26 +293,67 @@ protected: int m_minHeight; int m_fixedWidth; int m_fixedHeight; + +private: + DECLARE_CLASS(wxBoxSizer); }; - + //--------------------------------------------------------------------------- // wxStaticBoxSizer //--------------------------------------------------------------------------- +#if wxUSE_STATBOX + +class WXDLLEXPORT wxStaticBox; + class WXDLLEXPORT wxStaticBoxSizer: public wxBoxSizer { public: - wxStaticBoxSizer( wxStaticBox *box, int orient ); - - void RecalcSizes(); - wxSize CalcMin(); - - wxStaticBox *GetStaticBox() - { return m_staticBox; } - + wxStaticBoxSizer( wxStaticBox *box, int orient ); + + void RecalcSizes(); + wxSize CalcMin(); + + wxStaticBox *GetStaticBox() + { return m_staticBox; } + protected: - wxStaticBox *m_staticBox; + wxStaticBox *m_staticBox; + +private: + DECLARE_CLASS(wxStaticBoxSizer); }; +#endif // wxUSE_STATBOX + +//--------------------------------------------------------------------------- +// wxNotebookSizer +//--------------------------------------------------------------------------- + +#if wxUSE_NOTEBOOK + +class WXDLLEXPORT wxNotebook; + +class WXDLLEXPORT wxNotebookSizer: public wxSizer +{ +public: + wxNotebookSizer( wxNotebook *nb ); + + void RecalcSizes(); + wxSize CalcMin(); + + wxNotebook *GetNotebook() + { return m_notebook; } + +protected: + wxNotebook *m_notebook; + +private: + DECLARE_CLASS(wxNotebookSizer); +}; + +#endif // wxUSE_NOTEBOOK + + #endif // __WXSIZER_H__