X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a3622daa901777a33969d8bc04e2d62dee14d164..220af862c14ef432584fae3ef096aa17a6cfaf2d:/include/wx/layout.h diff --git a/include/wx/layout.h b/include/wx/layout.h index 2f525bb1f0..f0affc67ed 100644 --- a/include/wx/layout.h +++ b/include/wx/layout.h @@ -6,153 +6,198 @@ // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1998 Julian Smart -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// -#ifndef __LAYOUTH__ -#define __LAYOUTH__ +#ifndef _WX_LAYOUTH__ +#define _WX_LAYOUTH__ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- #ifdef __GNUG__ -#pragma interface "layout.h" + #pragma interface "layout.h" #endif #include "wx/defs.h" -class WXDLLEXPORT wxWindow; - // X stupidly defines these in X.h #ifdef Above -#undef Above + #undef Above #endif #ifdef Below -#undef Below + #undef Below #endif +// ---------------------------------------------------------------------------- +// forward declrations +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowBase; +class WXDLLEXPORT wxLayoutConstraints; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + #define wxLAYOUT_DEFAULT_MARGIN 0 -enum wxEdge { wxLeft, wxTop, wxRight, wxBottom, wxWidth, wxHeight, - wxCentre, wxCenter = wxCentre, wxCentreX, wxCentreY }; -enum wxRelationship { wxUnconstrained = 0, - wxAsIs, - wxPercentOf, - wxAbove, - wxBelow, - wxLeftOf, - wxRightOf, - wxSameAs, - wxAbsolute }; +enum wxEdge +{ + wxLeft, wxTop, wxRight, wxBottom, wxWidth, wxHeight, + wxCentre, wxCenter = wxCentre, wxCentreX, wxCentreY +}; -class WXDLLEXPORT wxLayoutConstraints; -class WXDLLEXPORT wxIndividualLayoutConstraint: public wxObject +enum wxRelationship { - DECLARE_DYNAMIC_CLASS(wxIndividualLayoutConstraint) - - protected: - // 'This' window is the parent or sibling of otherWin - wxWindow *otherWin; - - wxEdge myEdge; - wxRelationship relationship; - int margin; - int value; - int percent; - wxEdge otherEdge; - bool done; - - public: - wxIndividualLayoutConstraint(); - ~wxIndividualLayoutConstraint(); - - void Set(wxRelationship rel, wxWindow *otherW, wxEdge otherE, int val = 0, int marg = wxLAYOUT_DEFAULT_MARGIN); - - // - // Sibling relationships - // - void LeftOf(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); - void RightOf(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); - void Above(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); - void Below(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); - - // - // 'Same edge' alignment - // - void SameAs(wxWindow *otherW, wxEdge edge, int marg = wxLAYOUT_DEFAULT_MARGIN); - - // The edge is a percentage of the other window's edge - void PercentOf(wxWindow *otherW, wxEdge wh, int per); - - // - // Edge has absolute value - // - void Absolute(int val); - - // - // Dimension is unconstrained - // - inline void Unconstrained() { relationship = wxUnconstrained; } - - // - // Dimension is 'as is' (use current size settings) - // - inline void AsIs() { relationship = wxAsIs; } - - // - // Accessors - // - inline wxWindow *GetOtherWindow() { return otherWin; } - inline wxEdge GetMyEdge() const { return myEdge; } - inline void SetEdge(wxEdge which) { myEdge = which; } - inline void SetValue(int v) { value = v; } - inline int GetMargin() { return margin; } - inline void SetMargin(int m) { margin = m; } - inline int GetValue() const { return value; } - inline int GetPercent() const { return percent; } - inline int GetOtherEdge() const { return otherEdge; } - inline bool GetDone() const { return done; } - inline void SetDone(bool d) { done = d; } - inline wxRelationship GetRelationship() { return relationship; } - inline void SetRelationship(wxRelationship r) { relationship = r; } - - // Reset constraint if it mentions otherWin - bool ResetIfWin(wxWindow *otherW); - - // Try to satisfy constraint - bool SatisfyConstraint(wxLayoutConstraints *constraints, wxWindow *win); - - // Get the value of this edge or dimension, or if this - // is not determinable, -1. - int GetEdge(wxEdge which, wxWindow *thisWin, wxWindow *other) const; + wxUnconstrained = 0, + wxAsIs, + wxPercentOf, + wxAbove, + wxBelow, + wxLeftOf, + wxRightOf, + wxSameAs, + wxAbsolute }; -class WXDLLEXPORT wxLayoutConstraints: public wxObject +enum wxSizerBehaviour +{ + wxSizerShrink, + wxSizerExpand, + wxSizerNone +}; + +#define wxTYPE_SIZER 90 + +// ============================================================================= +// classes +// ============================================================================= + +// ---------------------------------------------------------------------------- +// wxIndividualLayoutConstraint: a constraint on window position +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxIndividualLayoutConstraint : public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxIndividualLayoutConstraint) + +protected: + // To be allowed to modify the internal variables + friend class wxIndividualLayoutConstraint_Serialize; + + // 'This' window is the parent or sibling of otherWin + wxWindowBase *otherWin; + + wxEdge myEdge; + wxRelationship relationship; + int margin; + int value; + int percent; + wxEdge otherEdge; + bool done; + +public: + wxIndividualLayoutConstraint(); + ~wxIndividualLayoutConstraint(); + + void Set(wxRelationship rel, wxWindowBase *otherW, wxEdge otherE, int val = 0, int marg = wxLAYOUT_DEFAULT_MARGIN); + + // + // Sibling relationships + // + void LeftOf(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + void RightOf(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + void Above(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + void Below(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + + // + // 'Same edge' alignment + // + void SameAs(wxWindowBase *otherW, wxEdge edge, int marg = wxLAYOUT_DEFAULT_MARGIN); + + // The edge is a percentage of the other window's edge + void PercentOf(wxWindowBase *otherW, wxEdge wh, int per); + + // + // Edge has absolute value + // + void Absolute(int val); + + // + // Dimension is unconstrained + // + void Unconstrained() { relationship = wxUnconstrained; } + + // + // Dimension is 'as is' (use current size settings) + // + void AsIs() { relationship = wxAsIs; } + + // + // Accessors + // + wxWindowBase *GetOtherWindow() { return otherWin; } + wxEdge GetMyEdge() const { return myEdge; } + void SetEdge(wxEdge which) { myEdge = which; } + void SetValue(int v) { value = v; } + int GetMargin() { return margin; } + void SetMargin(int m) { margin = m; } + int GetValue() const { return value; } + int GetPercent() const { return percent; } + int GetOtherEdge() const { return otherEdge; } + bool GetDone() const { return done; } + void SetDone(bool d) { done = d; } + wxRelationship GetRelationship() { return relationship; } + void SetRelationship(wxRelationship r) { relationship = r; } + + // Reset constraint if it mentions otherWin + bool ResetIfWin(wxWindowBase *otherW); + + // Try to satisfy constraint + bool SatisfyConstraint(wxLayoutConstraints *constraints, wxWindowBase *win); + + // Get the value of this edge or dimension, or if this + // is not determinable, -1. + int GetEdge(wxEdge which, wxWindowBase *thisWin, wxWindowBase *other) const; +}; + +// ---------------------------------------------------------------------------- +// wxLayoutConstraints: the complete set of constraints for a window +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxLayoutConstraints : public wxObject { - DECLARE_DYNAMIC_CLASS(wxLayoutConstraints) - - public: - // Edge constraints - wxIndividualLayoutConstraint left; - wxIndividualLayoutConstraint top; - wxIndividualLayoutConstraint right; - wxIndividualLayoutConstraint bottom; - // Size constraints - wxIndividualLayoutConstraint width; - wxIndividualLayoutConstraint height; - // Centre constraints - wxIndividualLayoutConstraint centreX; - wxIndividualLayoutConstraint centreY; - - wxLayoutConstraints(); - ~wxLayoutConstraints(); - - bool SatisfyConstraints(wxWindow *win, int *noChanges); - bool AreSatisfied() const - { - return left.GetDone() && top.GetDone() && right.GetDone() && - bottom.GetDone() && centreX.GetDone() && centreY.GetDone(); - } + DECLARE_DYNAMIC_CLASS(wxLayoutConstraints) + +public: + // Edge constraints + wxIndividualLayoutConstraint left; + wxIndividualLayoutConstraint top; + wxIndividualLayoutConstraint right; + wxIndividualLayoutConstraint bottom; + // Size constraints + wxIndividualLayoutConstraint width; + wxIndividualLayoutConstraint height; + // Centre constraints + wxIndividualLayoutConstraint centreX; + wxIndividualLayoutConstraint centreY; + + wxLayoutConstraints(); + ~wxLayoutConstraints(); + + bool SatisfyConstraints(wxWindowBase *win, int *noChanges); + bool AreSatisfied() const + { + return left.GetDone() && top.GetDone() && right.GetDone() && + bottom.GetDone() && centreX.GetDone() && centreY.GetDone(); + } }; -bool WXDLLEXPORT wxOldDoLayout(wxWindow *win); +// ---------------------------------------------------------------------------- +// sizers +// ---------------------------------------------------------------------------- /* @@ -161,7 +206,7 @@ Algorithm: Each sizer has a Layout function. wxExpandSizer::Layout ; E.g. for resizeable windows - + - parent size must be known (i.e. called from OnSize or explicitly) - call Layout on each child to give it a chance to resize @@ -171,7 +216,7 @@ Algorithm: wxShrinkSizer::Layout ; E.g. fit-to-contents windows ; Perhaps 2 rowcols, one above other. - + - call Layout on each child to give it a chance to resize (e.g. child shrinks around its own children): stop when each returns TRUE, or no change @@ -190,120 +235,117 @@ Algorithm: How to relayout if a child sizer/window changes? Need to go all the way to the top of the hierarchy and call Layout() again. - + wxRowColSizer::Layout - Similar to wxShrinkSizer only instead of shrinking to fit contents, more sophisticated layout of contents, and THEN shrinking (possibly). - Do the same parent window check/setsize as for wxShrinkSizer. - + */ -typedef enum { - wxSizerShrink, - wxSizerExpand, - wxSizerNone -} wxSizerBehaviour; +class WXDLLEXPORT wxSizer : public wxWindow +{ + DECLARE_DYNAMIC_CLASS(wxSizer) -#define wxTYPE_SIZER 90 +protected: + wxSizerBehaviour sizerBehaviour; + int borderX; + int borderY; + int sizerWidth; + int sizerHeight; + int sizerX; + int sizerY; -class WXDLLEXPORT wxSizer: public wxWindow -{ - DECLARE_DYNAMIC_CLASS(wxSizer) - - private: - protected: - wxSizerBehaviour sizerBehaviour; - int borderX; - int borderY; - int sizerWidth; - int sizerHeight; - int sizerX; - int sizerY; - public: - wxSizer(); - wxSizer(wxWindow *parent, wxSizerBehaviour behav = wxSizerNone); - ~wxSizer(); - - bool Create(wxWindow *parent, wxSizerBehaviour behav = wxSizerNone); - virtual void SetSize(int x, int y, int w, int h, int flags = wxSIZE_AUTO); - // Avoid compiler warning - void SetSize(int w, int h) { wxWindow::SetSize(w, h); } - virtual void Move(int x, int y); - virtual void GetSize(int *w, int *h) const; - inline virtual void GetClientSize(int *w, int *h) const { GetSize(w, h); } - virtual void GetPosition(int *x, int *y) const; - - inline void SizerSetSize(int x, int y, int w, int h) - { SetSize(x, y, w, h); } - inline void SizerMove(int x, int y) - { Move(x, y); } - - virtual void SetBorder(int w, int h); - inline int GetBorderX() { return borderX ; } - inline int GetBorderY() { return borderY ; } - - virtual void AddSizerChild(wxWindow *child); - virtual void RemoveSizerChild(wxWindow *child); - - inline virtual void SetBehaviour(wxSizerBehaviour b) { sizerBehaviour = b; } - inline virtual wxSizerBehaviour GetBehaviour() { return sizerBehaviour; } - - virtual bool LayoutPhase1(int *); - virtual bool LayoutPhase2(int *); +public: + wxSizer(); + wxSizer(wxWindowBase *parent, wxSizerBehaviour behav = wxSizerNone); + ~wxSizer(); + + bool Create(wxWindowBase *parent, wxSizerBehaviour behav = wxSizerNone); + + virtual void DoGetSize(int *w, int *h) const; + virtual void DoGetClientSize(int *w, int *h) const { GetSize(w, h); } + virtual void DoGetPosition(int *x, int *y) const; + + void SizerSetSize(int x, int y, int w, int h) { SetSize(x, y, w, h); } + void SizerMove(int x, int y) { Move(x, y); } + + virtual void SetBorder(int w, int h); + int GetBorderX() { return borderX ; } + int GetBorderY() { return borderY ; } + + virtual void AddSizerChild(wxWindowBase *child); + virtual void RemoveSizerChild(wxWindowBase *child); + + virtual void SetBehaviour(wxSizerBehaviour b) { sizerBehaviour = b; } + virtual wxSizerBehaviour GetBehaviour() { return sizerBehaviour; } + + virtual bool LayoutPhase1(int *); + virtual bool LayoutPhase2(int *); + +protected: + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); }; #define wxSIZER_ROWS TRUE #define wxSIZER_COLS FALSE -class WXDLLEXPORT wxRowColSizer: public wxSizer +class WXDLLEXPORT wxRowColSizer : public wxSizer { - DECLARE_DYNAMIC_CLASS(wxRowColSizer) - - private: - protected: - bool rowOrCol; - int rowOrColSize; - int xSpacing; - int ySpacing; - public: - // rowOrCol = TRUE to be laid out in rows, otherwise in columns. - wxRowColSizer(); - wxRowColSizer(wxWindow *parent, bool rowOrCol = wxSIZER_ROWS, int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink); - ~wxRowColSizer(); - - bool Create(wxWindow *parent, bool rowOrCol = wxSIZER_ROWS, int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink); - void SetSize(int x, int y, int w, int h, int flags = wxSIZE_AUTO); - // Avoid compiler warning - void SetSize(int w, int h) { wxSizer::SetSize(w, h); } - - inline virtual void SetRowOrCol(bool rc) { rowOrCol = rc; } - inline virtual bool GetRowOrCol() { return rowOrCol; } - inline virtual void SetRowOrColSize(int n) { rowOrColSize = n; } - inline virtual int GetRowOrColSize() { return rowOrColSize; } - inline virtual void SetSpacing(int x, int y) { xSpacing = x; ySpacing = y; } - inline virtual void GetSpacing(int *x, int *y) { *x = xSpacing; *y = ySpacing; } - - bool LayoutPhase1(int *); - bool LayoutPhase2(int *); + DECLARE_DYNAMIC_CLASS(wxRowColSizer) + +protected: + bool rowOrCol; + int rowOrColSize; + int xSpacing; + int ySpacing; + +public: + // rowOrCol = TRUE to be laid out in rows, otherwise in columns. + wxRowColSizer(); + wxRowColSizer(wxWindowBase *parent, bool rowOrCol = wxSIZER_ROWS, + int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink); + ~wxRowColSizer(); + + bool Create(wxWindowBase *parent, bool rowOrCol = wxSIZER_ROWS, + int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink); + + virtual void SetRowOrCol(bool rc) { rowOrCol = rc; } + virtual bool GetRowOrCol() { return rowOrCol; } + virtual void SetRowOrColSize(int n) { rowOrColSize = n; } + virtual int GetRowOrColSize() { return rowOrColSize; } + virtual void SetSpacing(int x, int y) { xSpacing = x; ySpacing = y; } + virtual void GetSpacing(int *x, int *y) { *x = xSpacing; *y = ySpacing; } + + bool LayoutPhase1(int *); + bool LayoutPhase2(int *); }; -class WXDLLEXPORT wxSpacingSizer: public wxSizer +class WXDLLEXPORT wxSpacingSizer : public wxSizer { - DECLARE_DYNAMIC_CLASS(wxSpacingSizer) - - private: - protected: - public: - wxSpacingSizer(); - wxSpacingSizer(wxWindow *parent, wxRelationship rel, wxWindow *other, int spacing); - wxSpacingSizer(wxWindow *parent); - ~wxSpacingSizer(); - - bool Create(wxWindow *parent, wxRelationship rel, wxWindow *other, int sp); - bool Create(wxWindow *parent); + DECLARE_DYNAMIC_CLASS(wxSpacingSizer) + +public: + wxSpacingSizer(); + wxSpacingSizer(wxWindowBase *parent, wxRelationship rel, wxWindowBase *other, int spacing); + wxSpacingSizer(wxWindowBase *parent); + ~wxSpacingSizer(); + + bool Create(wxWindowBase *parent, wxRelationship rel, wxWindowBase *other, int sp); + bool Create(wxWindowBase *parent); }; +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY + extern bool WXDLLEXPORT wxOldDoLayout(wxWindowBase *win); +#endif // WXWIN_COMPATIBILITY + #endif - // __LAYOUTH__ + // _WX_LAYOUTH__