X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d95527de9ac48fa54207ebf698286f92e909faaf..c3ee7025523a7a0ac32bf4c807ae1276fd3bcc09:/include/wx/sizer.h diff --git a/include/wx/sizer.h b/include/wx/sizer.h index d477a2e0f4..40f32e6e19 100644 --- a/include/wx/sizer.h +++ b/include/wx/sizer.h @@ -20,10 +20,10 @@ // classes //--------------------------------------------------------------------------- -class WXDLLEXPORT wxButton; -class WXDLLEXPORT wxBoxSizer; -class WXDLLEXPORT wxSizerItem; -class WXDLLEXPORT wxSizer; +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxBoxSizer; +class WXDLLIMPEXP_FWD_CORE wxSizerItem; +class WXDLLIMPEXP_FWD_CORE wxSizer; #ifndef wxUSE_BORDER_BY_DEFAULT #ifdef __SMARTPHONE__ @@ -73,10 +73,12 @@ public: } // some shortcuts for Align() - wxSizerFlags& Centre() { return Align(wxCENTRE); } + wxSizerFlags& Centre() { return Align(wxALIGN_CENTRE); } wxSizerFlags& Center() { return Centre(); } + wxSizerFlags& Top() { return Align(wxALIGN_TOP); } wxSizerFlags& Left() { return Align(wxALIGN_LEFT); } wxSizerFlags& Right() { return Align(wxALIGN_RIGHT); } + wxSizerFlags& Bottom() { return Align(wxALIGN_BOTTOM); } // default border size used by Border() below static int GetDefaultBorder() @@ -153,7 +155,6 @@ public: #endif } -#if wxABI_VERSION >= 20802 // setters for the others flags wxSizerFlags& Shaped() { @@ -168,7 +169,6 @@ public: return *this; } -#endif // wx 2.8.2+ // accessors for wxSizer only int GetProportion() const { return m_proportion; } @@ -224,7 +224,7 @@ public: { Init(flags); - SetWindow(window); + DoSetWindow(window); } // subsizer @@ -239,7 +239,7 @@ public: { Init(flags); - SetSizer(sizer); + DoSetSizer(sizer); } // spacer @@ -255,7 +255,7 @@ public: { Init(flags); - SetSpacer(width, height); + DoSetSpacer(wxSize(width, height)); } wxSizerItem(); @@ -340,20 +340,51 @@ public: wxPoint GetPosition() const { return m_pos; } + // these functions delete the current contents of the item if it's a sizer + // or a spacer but not if it is a window + void AssignWindow(wxWindow *window) + { + Free(); + DoSetWindow(window); + } + + void AssignSizer(wxSizer *sizer) + { + Free(); + DoSetSizer(sizer); + } - // these functions do not free old sizer/spacer - void SetWindow(wxWindow *window); - void SetSizer(wxSizer *sizer); - void SetSpacer(const wxSize& size); - void SetSpacer(int width, int height) { SetSpacer(wxSize(width, height)); } + void AssignSpacer(const wxSize& size) + { + Free(); + DoSetSpacer(size); + } + + void AssignSpacer(int w, int h) { AssignSpacer(wxSize(w, h)); } + +#if WXWIN_COMPATIBILITY_2_8 + // these functions do not free the old sizer/spacer and so can easily + // provoke the memory leaks and so shouldn't be used, use Assign() instead + wxDEPRECATED( void SetWindow(wxWindow *window) ); + wxDEPRECATED( void SetSizer(wxSizer *sizer) ); + wxDEPRECATED( void SetSpacer(const wxSize& size) ); + wxDEPRECATED( void SetSpacer(int width, int height) ); +#endif // WXWIN_COMPATIBILITY_2_8 protected: // common part of several ctors - void Init() { m_userData = NULL; } + void Init() { m_userData = NULL; m_kind = Item_None; } // common part of ctors taking wxSizerFlags void Init(const wxSizerFlags& flags); + // free current contents + void Free(); + + // common parts of Set/AssignXXX() + void DoSetWindow(wxWindow *window); + void DoSetSizer(wxSizer *sizer); + void DoSetSpacer(const wxSize& size); // discriminated union: depending on m_kind one of the fields is valid enum @@ -538,8 +569,12 @@ public: // Calculate the minimal size or return m_minSize if bigger. wxSize GetMinSize(); - virtual void RecalcSizes() = 0; + // These virtual functions are used by the layout algorithm: first + // CalcMin() is called to calculate the minimal size of the sizer and + // prepare for laying it out and then RecalcSizes() is called to really + // update all the sizer items virtual wxSize CalcMin() = 0; + virtual void RecalcSizes() = 0; virtual void Layout(); @@ -550,6 +585,8 @@ public: wxSizerItemList& GetChildren() { return m_children; } + const wxSizerItemList& GetChildren() const + { return m_children; } void SetDimension( int x, int y, int width, int height ); @@ -697,8 +734,7 @@ public: protected: void AdjustForFlexDirection(); - void AdjustForGrowables(const wxSize& sz, const wxSize& minsz, - int nrows, int ncols); + void AdjustForGrowables(const wxSize& sz); // the heights/widths of all rows/columns wxArrayInt m_rowHeights, @@ -732,24 +768,80 @@ private: class WXDLLEXPORT wxBoxSizer: public wxSizer { public: - wxBoxSizer( int orient ); + wxBoxSizer(int orient) + { + m_orient = orient; - void RecalcSizes(); - wxSize CalcMin(); + wxASSERT_MSG( m_orient == wxHORIZONTAL || m_orient == wxVERTICAL, + _T("invalid value for wxBoxSizer orientation") ); + } + + int GetOrientation() const { return m_orient; } - int GetOrientation() const - { return m_orient; } + bool IsVertical() const { return m_orient == wxVERTICAL; } - void SetOrientation(int orient) - { m_orient = orient; } + void SetOrientation(int orient) { m_orient = orient; } + + // implementation of our resizing logic + virtual wxSize CalcMin(); + virtual void RecalcSizes(); protected: + // helpers for our code: this returns the component of the given wxSize in + // the direction of the sizer and in the other direction, respectively + int SizeInMajorDir(const wxSize& sz) const + { + return m_orient == wxHORIZONTAL ? sz.x : sz.y; + } + + int& SizeInMajorDir(wxSize& sz) + { + return m_orient == wxHORIZONTAL ? sz.x : sz.y; + } + + int& PosInMajorDir(wxPoint& pt) + { + return m_orient == wxHORIZONTAL ? pt.x : pt.y; + } + + int SizeInMinorDir(const wxSize& sz) const + { + return m_orient == wxHORIZONTAL ? sz.y : sz.x; + } + + int& SizeInMinorDir(wxSize& sz) + { + return m_orient == wxHORIZONTAL ? sz.y : sz.x; + } + + int& PosInMinorDir(wxPoint& pt) + { + return m_orient == wxHORIZONTAL ? pt.y : pt.x; + } + + // another helper: creates wxSize from major and minor components + wxSize SizeFromMajorMinor(int major, int minor) const + { + if ( m_orient == wxHORIZONTAL ) + { + return wxSize(major, minor); + } + else // wxVERTICAL + { + return wxSize(minor, major); + } + } + + + // either wxHORIZONTAL or wxVERTICAL int m_orient; - int m_stretchable; - int m_minWidth; - int m_minHeight; - int m_fixedWidth; - int m_fixedHeight; + + // the sum of proportion of all of our elements + int m_totalProportion; + + // the minimal size needed for this sizer as calculated by the last call to + // our CalcMin() + wxSize m_minSize; private: DECLARE_CLASS(wxBoxSizer) @@ -761,7 +853,7 @@ private: #if wxUSE_STATBOX -class WXDLLEXPORT wxStaticBox; +class WXDLLIMPEXP_FWD_CORE wxStaticBox; class WXDLLEXPORT wxStaticBoxSizer: public wxBoxSizer { @@ -829,10 +921,10 @@ public: protected: wxButton *m_buttonAffirmative; // wxID_OK, wxID_YES, wxID_SAVE go here - wxButton *m_buttonApply; + wxButton *m_buttonApply; // wxID_APPLY wxButton *m_buttonNegative; // wxID_NO - wxButton *m_buttonCancel; - wxButton *m_buttonHelp; + wxButton *m_buttonCancel; // wxID_CANCEL, wxID_CLOSE + wxButton *m_buttonHelp; // wxID_HELP, wxID_CONTEXT_HELP private: DECLARE_CLASS(wxStdDialogButtonSizer) @@ -841,74 +933,35 @@ private: #endif // wxUSE_BUTTON -#if WXWIN_COMPATIBILITY_2_4 -// NB: wxBookCtrlSizer and wxNotebookSizer are deprecated, they -// don't do anything. wxBookCtrlBase::DoGetBestSize does the job now. // ---------------------------------------------------------------------------- -// wxBookCtrlSizer +// inline functions implementation // ---------------------------------------------------------------------------- -#if wxUSE_BOOKCTRL - -// this sizer works with wxNotebook/wxListbook/... and sizes the control to -// fit its pages -class WXDLLEXPORT wxBookCtrlBase; +#if WXWIN_COMPATIBILITY_2_8 -class WXDLLEXPORT wxBookCtrlSizer : public wxSizer +inline void wxSizerItem::SetWindow(wxWindow *window) { -public: -#if WXWIN_COMPATIBILITY_2_6 - wxDEPRECATED( wxBookCtrlSizer(wxBookCtrlBase *bookctrl) ); -#endif // WXWIN_COMPATIBILITY_2_6 - - wxBookCtrlBase *GetControl() const { return m_bookctrl; } - - virtual void RecalcSizes(); - virtual wxSize CalcMin(); - -protected: - // this protected ctor lets us mark the real one above as deprecated - // and still have warning-free build of the library itself: - wxBookCtrlSizer() {} - - wxBookCtrlBase *m_bookctrl; - -private: - DECLARE_CLASS(wxBookCtrlSizer) - DECLARE_NO_COPY_CLASS(wxBookCtrlSizer) -}; - - -#if wxUSE_NOTEBOOK - -// before wxBookCtrlBase we only had wxNotebookSizer, keep it for backwards -// compatibility -class WXDLLEXPORT wxNotebook; + DoSetWindow(window); +} -class WXDLLEXPORT wxNotebookSizer : public wxBookCtrlSizer +inline void wxSizerItem::SetSizer(wxSizer *sizer) { -public: -#if WXWIN_COMPATIBILITY_2_6 - wxDEPRECATED( wxNotebookSizer(wxNotebook *nb) ); -#endif // WXWIN_COMPATIBILITY_2_6 - - wxNotebook *GetNotebook() const { return (wxNotebook *)m_bookctrl; } - -private: - DECLARE_CLASS(wxNotebookSizer) - DECLARE_NO_COPY_CLASS(wxNotebookSizer) -}; + DoSetSizer(sizer); +} -#endif // wxUSE_NOTEBOOK +inline void wxSizerItem::SetSpacer(const wxSize& size) +{ + DoSetSpacer(size); +} -#endif // wxUSE_BOOKCTRL +inline void wxSizerItem::SetSpacer(int width, int height) +{ + DoSetSpacer(wxSize(width, height)); +} -#endif // WXWIN_COMPATIBILITY_2_4 +#endif // WXWIN_COMPATIBILITY_2_8 -// ---------------------------------------------------------------------------- -// inline functions implementation -// ---------------------------------------------------------------------------- inline wxSizerItem* wxSizer::Add( wxSizerItem *item ) @@ -1064,5 +1117,4 @@ wxSizer::InsertStretchSpacer(size_t index, int prop) return Insert(index, 0, 0, prop); } - #endif // __WXSIZER_H__