1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Layout classes
4 // Author: Julian Smart
8 // Copyright: (c) 1998 Julian Smart
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
16 #pragma interface "layout.h"
21 class WXDLLEXPORT wxWindow
;
23 // X stupidly defines these in X.h
31 #define wxLAYOUT_DEFAULT_MARGIN 0
33 enum wxEdge
{ wxLeft
, wxTop
, wxRight
, wxBottom
, wxWidth
, wxHeight
,
34 wxCentre
, wxCenter
= wxCentre
, wxCentreX
, wxCentreY
};
35 enum wxRelationship
{ wxUnconstrained
= 0,
45 class WXDLLEXPORT wxLayoutConstraints
;
46 class WXDLLEXPORT wxIndividualLayoutConstraint
: public wxObject
48 DECLARE_DYNAMIC_CLASS(wxIndividualLayoutConstraint
)
51 // 'This' window is the parent or sibling of otherWin
55 wxRelationship relationship
;
63 wxIndividualLayoutConstraint(void);
64 ~wxIndividualLayoutConstraint(void);
66 void Set(wxRelationship rel
, wxWindow
*otherW
, wxEdge otherE
, int val
= 0, int marg
= wxLAYOUT_DEFAULT_MARGIN
);
69 // Sibling relationships
71 void LeftOf(wxWindow
*sibling
, int marg
= wxLAYOUT_DEFAULT_MARGIN
);
72 void RightOf(wxWindow
*sibling
, int marg
= wxLAYOUT_DEFAULT_MARGIN
);
73 void Above(wxWindow
*sibling
, int marg
= wxLAYOUT_DEFAULT_MARGIN
);
74 void Below(wxWindow
*sibling
, int marg
= wxLAYOUT_DEFAULT_MARGIN
);
77 // 'Same edge' alignment
79 void SameAs(wxWindow
*otherW
, wxEdge edge
, int marg
= wxLAYOUT_DEFAULT_MARGIN
);
81 // The edge is a percentage of the other window's edge
82 void PercentOf(wxWindow
*otherW
, wxEdge wh
, int per
);
85 // Edge has absolute value
87 void Absolute(int val
);
90 // Dimension is unconstrained
92 inline void Unconstrained(void) { relationship
= wxUnconstrained
; }
95 // Dimension is 'as is' (use current size settings)
97 inline void AsIs(void) { relationship
= wxAsIs
; }
102 inline wxWindow
*GetOtherWindow(void) { return otherWin
; }
103 inline wxEdge
GetMyEdge(void) { return myEdge
; }
104 inline void SetEdge(wxEdge which
) { myEdge
= which
; }
105 inline void SetValue(int v
) { value
= v
; }
106 inline int GetMargin(void) { return margin
; }
107 inline void SetMargin(int m
) { margin
= m
; }
108 inline int GetValue(void) { return value
; }
109 inline int GetPercent(void) { return percent
; }
110 inline int GetOtherEdge(void) { return otherEdge
; }
111 inline bool GetDone(void) { return done
; }
112 inline void SetDone(bool d
) { done
= d
; }
113 inline wxRelationship
GetRelationship(void) { return relationship
; }
114 inline void SetRelationship(wxRelationship r
) { relationship
= r
; }
116 // Reset constraint if it mentions otherWin
117 bool ResetIfWin(wxWindow
*otherW
);
119 // Try to satisfy constraint
120 bool SatisfyConstraint(wxLayoutConstraints
*constraints
, wxWindow
*win
);
122 // Get the value of this edge or dimension, or if this
123 // is not determinable, -1.
124 int GetEdge(wxEdge which
, wxWindow
*thisWin
, wxWindow
*other
);
127 class WXDLLEXPORT wxLayoutConstraints
: public wxObject
129 DECLARE_DYNAMIC_CLASS(wxLayoutConstraints
)
133 wxIndividualLayoutConstraint left
;
134 wxIndividualLayoutConstraint top
;
135 wxIndividualLayoutConstraint right
;
136 wxIndividualLayoutConstraint bottom
;
138 wxIndividualLayoutConstraint width
;
139 wxIndividualLayoutConstraint height
;
140 // Centre constraints
141 wxIndividualLayoutConstraint centreX
;
142 wxIndividualLayoutConstraint centreY
;
144 wxLayoutConstraints(void);
145 ~wxLayoutConstraints(void);
147 bool SatisfyConstraints(wxWindow
*win
, int *noChanges
);
150 bool WXDLLEXPORT
wxOldDoLayout(wxWindow
*win
);
156 Each sizer has a Layout function.
158 wxExpandSizer::Layout ; E.g. for resizeable windows
160 - parent size must be known (i.e. called
161 from OnSize or explicitly)
162 - call Layout on each child to give it a chance to resize
163 (e.g. child shrinks around its own children):
164 stop when all children return TRUE, or no change
165 - evaluate constraints on self to set size
167 wxShrinkSizer::Layout ; E.g. fit-to-contents windows
168 ; Perhaps 2 rowcols, one above other.
170 - call Layout on each child to give it a chance to resize
171 (e.g. child shrinks around its own children):
172 stop when each returns TRUE, or no change
173 - fit around children
174 (what if some want to be centred? E.g. OK/Cancel rowcol.
175 - done by centring e.g. bottom sizer w.r.t. top sizer.
176 (sibling relationship only))
177 - evaluate own constraints (e.g. may be below another window)
178 - IF parent is a real window (remember: a real window can
179 have only one child sizer, although a sizer can have several child
180 (real) windows), then resize this parent WITHOUT invoking Layout
182 Frame and dialog box OnSizes can check if the sizer is a shrink
183 sizer; if not, can call layout. Maybe have virtual bool AutoSizeLayout()
186 How to relayout if a child sizer/window changes? Need to go all the way
187 to the top of the hierarchy and call Layout() again.
189 wxRowColSizer::Layout
191 - Similar to wxShrinkSizer only instead of shrinking to fit
192 contents, more sophisticated layout of contents, and THEN
193 shrinking (possibly).
194 - Do the same parent window check/setsize as for wxShrinkSizer.
204 #define wxTYPE_SIZER 90
206 class WXDLLEXPORT wxSizer
: public wxWindow
208 DECLARE_DYNAMIC_CLASS(wxSizer
)
212 wxSizerBehaviour sizerBehaviour
;
221 wxSizer(wxWindow
*parent
, wxSizerBehaviour behav
= wxSizerNone
);
224 bool Create(wxWindow
*parent
, wxSizerBehaviour behav
= wxSizerNone
);
225 virtual void SetSize(int x
, int y
, int w
, int h
, int flags
= wxSIZE_AUTO
);
226 // Avoid compiler warning
227 void SetSize(int w
, int h
) { wxWindow::SetSize(w
, h
); }
228 virtual void Move(int x
, int y
);
229 virtual void GetSize(int *w
, int *h
) const;
230 inline virtual void GetClientSize(int *w
, int *h
) const { GetSize(w
, h
); }
231 virtual void GetPosition(int *x
, int *y
) const;
233 inline void SizerSetSize(int x
, int y
, int w
, int h
)
234 { SetSize(x
, y
, w
, h
); }
235 inline void SizerMove(int x
, int y
)
238 virtual void SetBorder(int w
, int h
);
239 inline int GetBorderX(void) { return borderX
; }
240 inline int GetBorderY(void) { return borderY
; }
242 virtual void AddSizerChild(wxWindow
*child
);
243 virtual void RemoveSizerChild(wxWindow
*child
);
245 inline virtual void SetBehaviour(wxSizerBehaviour b
) { sizerBehaviour
= b
; }
246 inline virtual wxSizerBehaviour
GetBehaviour(void) { return sizerBehaviour
; }
248 virtual bool LayoutPhase1(int *);
249 virtual bool LayoutPhase2(int *);
252 #define wxSIZER_ROWS TRUE
253 #define wxSIZER_COLS FALSE
255 class WXDLLEXPORT wxRowColSizer
: public wxSizer
257 DECLARE_DYNAMIC_CLASS(wxRowColSizer
)
266 // rowOrCol = TRUE to be laid out in rows, otherwise in columns.
268 wxRowColSizer(wxWindow
*parent
, bool rowOrCol
= wxSIZER_ROWS
, int rowsOrColSize
= 20, wxSizerBehaviour
= wxSizerShrink
);
269 ~wxRowColSizer(void);
271 bool Create(wxWindow
*parent
, bool rowOrCol
= wxSIZER_ROWS
, int rowsOrColSize
= 20, wxSizerBehaviour
= wxSizerShrink
);
272 void SetSize(int x
, int y
, int w
, int h
, int flags
= wxSIZE_AUTO
);
273 // Avoid compiler warning
274 void SetSize(int w
, int h
) { wxSizer::SetSize(w
, h
); }
276 inline virtual void SetRowOrCol(bool rc
) { rowOrCol
= rc
; }
277 inline virtual bool GetRowOrCol(void) { return rowOrCol
; }
278 inline virtual void SetRowOrColSize(int n
) { rowOrColSize
= n
; }
279 inline virtual int GetRowOrColSize(void) { return rowOrColSize
; }
280 inline virtual void SetSpacing(int x
, int y
) { xSpacing
= x
; ySpacing
= y
; }
281 inline virtual void GetSpacing(int *x
, int *y
) { *x
= xSpacing
; *y
= ySpacing
; }
283 bool LayoutPhase1(int *);
284 bool LayoutPhase2(int *);
287 class WXDLLEXPORT wxSpacingSizer
: public wxSizer
289 DECLARE_DYNAMIC_CLASS(wxSpacingSizer
)
294 wxSpacingSizer(void);
295 wxSpacingSizer(wxWindow
*parent
, wxRelationship rel
, wxWindow
*other
, int spacing
);
296 wxSpacingSizer(wxWindow
*parent
);
297 ~wxSpacingSizer(void);
299 bool Create(wxWindow
*parent
, wxRelationship rel
, wxWindow
*other
, int sp
);
300 bool Create(wxWindow
*parent
);