]> git.saurik.com Git - wxWidgets.git/blob - include/wx/layout.h
wxTextFile::Type changed to ::wxTextFileType (portability)
[wxWidgets.git] / include / wx / layout.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: layout.h
3 // Purpose: Layout classes
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 29/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) 1998 Julian Smart
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_LAYOUTH__
13 #define _WX_LAYOUTH__
14
15 #ifdef __GNUG__
16 #pragma interface "layout.h"
17 #endif
18
19 #include "wx/defs.h"
20
21 class WXDLLEXPORT wxWindow;
22
23 // X stupidly defines these in X.h
24 #ifdef Above
25 #undef Above
26 #endif
27 #ifdef Below
28 #undef Below
29 #endif
30
31 #define wxLAYOUT_DEFAULT_MARGIN 0
32
33 enum wxEdge { wxLeft, wxTop, wxRight, wxBottom, wxWidth, wxHeight,
34 wxCentre, wxCenter = wxCentre, wxCentreX, wxCentreY };
35 enum wxRelationship { wxUnconstrained = 0,
36 wxAsIs,
37 wxPercentOf,
38 wxAbove,
39 wxBelow,
40 wxLeftOf,
41 wxRightOf,
42 wxSameAs,
43 wxAbsolute };
44
45 class WXDLLEXPORT wxLayoutConstraints;
46 class WXDLLEXPORT wxIndividualLayoutConstraint: public wxObject
47 {
48 DECLARE_DYNAMIC_CLASS(wxIndividualLayoutConstraint)
49
50 protected:
51 // To be allowed to modify the internal variables
52 friend class wxIndividualLayoutConstraint_Serialize;
53
54 // 'This' window is the parent or sibling of otherWin
55 wxWindow *otherWin;
56
57 wxEdge myEdge;
58 wxRelationship relationship;
59 int margin;
60 int value;
61 int percent;
62 wxEdge otherEdge;
63 bool done;
64
65 public:
66 wxIndividualLayoutConstraint();
67 ~wxIndividualLayoutConstraint();
68
69 void Set(wxRelationship rel, wxWindow *otherW, wxEdge otherE, int val = 0, int marg = wxLAYOUT_DEFAULT_MARGIN);
70
71 //
72 // Sibling relationships
73 //
74 void LeftOf(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
75 void RightOf(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
76 void Above(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
77 void Below(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
78
79 //
80 // 'Same edge' alignment
81 //
82 void SameAs(wxWindow *otherW, wxEdge edge, int marg = wxLAYOUT_DEFAULT_MARGIN);
83
84 // The edge is a percentage of the other window's edge
85 void PercentOf(wxWindow *otherW, wxEdge wh, int per);
86
87 //
88 // Edge has absolute value
89 //
90 void Absolute(int val);
91
92 //
93 // Dimension is unconstrained
94 //
95 inline void Unconstrained() { relationship = wxUnconstrained; }
96
97 //
98 // Dimension is 'as is' (use current size settings)
99 //
100 inline void AsIs() { relationship = wxAsIs; }
101
102 //
103 // Accessors
104 //
105 inline wxWindow *GetOtherWindow() { return otherWin; }
106 inline wxEdge GetMyEdge() const { return myEdge; }
107 inline void SetEdge(wxEdge which) { myEdge = which; }
108 inline void SetValue(int v) { value = v; }
109 inline int GetMargin() { return margin; }
110 inline void SetMargin(int m) { margin = m; }
111 inline int GetValue() const { return value; }
112 inline int GetPercent() const { return percent; }
113 inline int GetOtherEdge() const { return otherEdge; }
114 inline bool GetDone() const { return done; }
115 inline void SetDone(bool d) { done = d; }
116 inline wxRelationship GetRelationship() { return relationship; }
117 inline void SetRelationship(wxRelationship r) { relationship = r; }
118
119 // Reset constraint if it mentions otherWin
120 bool ResetIfWin(wxWindow *otherW);
121
122 // Try to satisfy constraint
123 bool SatisfyConstraint(wxLayoutConstraints *constraints, wxWindow *win);
124
125 // Get the value of this edge or dimension, or if this
126 // is not determinable, -1.
127 int GetEdge(wxEdge which, wxWindow *thisWin, wxWindow *other) const;
128 };
129
130 class WXDLLEXPORT wxLayoutConstraints: public wxObject
131 {
132 DECLARE_DYNAMIC_CLASS(wxLayoutConstraints)
133
134 public:
135 // Edge constraints
136 wxIndividualLayoutConstraint left;
137 wxIndividualLayoutConstraint top;
138 wxIndividualLayoutConstraint right;
139 wxIndividualLayoutConstraint bottom;
140 // Size constraints
141 wxIndividualLayoutConstraint width;
142 wxIndividualLayoutConstraint height;
143 // Centre constraints
144 wxIndividualLayoutConstraint centreX;
145 wxIndividualLayoutConstraint centreY;
146
147 wxLayoutConstraints();
148 ~wxLayoutConstraints();
149
150 bool SatisfyConstraints(wxWindow *win, int *noChanges);
151 bool AreSatisfied() const
152 {
153 return left.GetDone() && top.GetDone() && right.GetDone() &&
154 bottom.GetDone() && centreX.GetDone() && centreY.GetDone();
155 }
156 };
157
158 bool WXDLLEXPORT wxOldDoLayout(wxWindow *win);
159
160 /*
161
162 Algorithm:
163
164 Each sizer has a Layout function.
165
166 wxExpandSizer::Layout ; E.g. for resizeable windows
167
168 - parent size must be known (i.e. called
169 from OnSize or explicitly)
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 all children return TRUE, or no change
173 - evaluate constraints on self to set size
174
175 wxShrinkSizer::Layout ; E.g. fit-to-contents windows
176 ; Perhaps 2 rowcols, one above other.
177
178 - call Layout on each child to give it a chance to resize
179 (e.g. child shrinks around its own children):
180 stop when each returns TRUE, or no change
181 - fit around children
182 (what if some want to be centred? E.g. OK/Cancel rowcol.
183 - done by centring e.g. bottom sizer w.r.t. top sizer.
184 (sibling relationship only))
185 - evaluate own constraints (e.g. may be below another window)
186 - IF parent is a real window (remember: a real window can
187 have only one child sizer, although a sizer can have several child
188 (real) windows), then resize this parent WITHOUT invoking Layout
189 again.
190 Frame and dialog box OnSizes can check if the sizer is a shrink
191 sizer; if not, can call layout. Maybe have virtual bool AutoSizeLayout()
192 to determine this.
193
194 How to relayout if a child sizer/window changes? Need to go all the way
195 to the top of the hierarchy and call Layout() again.
196
197 wxRowColSizer::Layout
198
199 - Similar to wxShrinkSizer only instead of shrinking to fit
200 contents, more sophisticated layout of contents, and THEN
201 shrinking (possibly).
202 - Do the same parent window check/setsize as for wxShrinkSizer.
203
204 */
205
206 typedef enum {
207 wxSizerShrink,
208 wxSizerExpand,
209 wxSizerNone
210 } wxSizerBehaviour;
211
212 #define wxTYPE_SIZER 90
213
214 class WXDLLEXPORT wxSizer: public wxWindow
215 {
216 DECLARE_DYNAMIC_CLASS(wxSizer)
217
218 private:
219 protected:
220 wxSizerBehaviour sizerBehaviour;
221 int borderX;
222 int borderY;
223 int sizerWidth;
224 int sizerHeight;
225 int sizerX;
226 int sizerY;
227 public:
228 wxSizer();
229 wxSizer(wxWindow *parent, wxSizerBehaviour behav = wxSizerNone);
230 ~wxSizer();
231
232 bool Create(wxWindow *parent, wxSizerBehaviour behav = wxSizerNone);
233 virtual void SetSize(int x, int y, int w, int h, int flags = wxSIZE_AUTO);
234 virtual void GetSize(int *w, int *h) const;
235
236 virtual void GetClientSize(int *w, int *h) const { GetSize(w, h); }
237 virtual void GetPosition(int *x, int *y) const;
238
239 inline void SizerSetSize(int x, int y, int w, int h)
240 { SetSize(x, y, w, h); }
241 inline void SizerMove(int x, int y)
242 { Move(x, y); }
243
244 virtual void SetBorder(int w, int h);
245 inline int GetBorderX() { return borderX ; }
246 inline int GetBorderY() { return borderY ; }
247
248 virtual void AddSizerChild(wxWindow *child);
249 virtual void RemoveSizerChild(wxWindow *child);
250
251 inline virtual void SetBehaviour(wxSizerBehaviour b) { sizerBehaviour = b; }
252 inline virtual wxSizerBehaviour GetBehaviour() { return sizerBehaviour; }
253
254 virtual bool LayoutPhase1(int *);
255 virtual bool LayoutPhase2(int *);
256 };
257
258 #define wxSIZER_ROWS TRUE
259 #define wxSIZER_COLS FALSE
260
261 class WXDLLEXPORT wxRowColSizer: public wxSizer
262 {
263 DECLARE_DYNAMIC_CLASS(wxRowColSizer)
264
265 private:
266 protected:
267 bool rowOrCol;
268 int rowOrColSize;
269 int xSpacing;
270 int ySpacing;
271 public:
272 // rowOrCol = TRUE to be laid out in rows, otherwise in columns.
273 wxRowColSizer();
274 wxRowColSizer(wxWindow *parent, bool rowOrCol = wxSIZER_ROWS, int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink);
275 ~wxRowColSizer();
276
277 bool Create(wxWindow *parent, bool rowOrCol = wxSIZER_ROWS, int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink);
278 virtual void SetSize(int x, int y, int w, int h, int flags = wxSIZE_AUTO);
279
280 inline virtual void SetRowOrCol(bool rc) { rowOrCol = rc; }
281 inline virtual bool GetRowOrCol() { return rowOrCol; }
282 inline virtual void SetRowOrColSize(int n) { rowOrColSize = n; }
283 inline virtual int GetRowOrColSize() { return rowOrColSize; }
284 inline virtual void SetSpacing(int x, int y) { xSpacing = x; ySpacing = y; }
285 inline virtual void GetSpacing(int *x, int *y) { *x = xSpacing; *y = ySpacing; }
286
287 bool LayoutPhase1(int *);
288 bool LayoutPhase2(int *);
289 };
290
291 class WXDLLEXPORT wxSpacingSizer: public wxSizer
292 {
293 DECLARE_DYNAMIC_CLASS(wxSpacingSizer)
294
295 private:
296 protected:
297 public:
298 wxSpacingSizer();
299 wxSpacingSizer(wxWindow *parent, wxRelationship rel, wxWindow *other, int spacing);
300 wxSpacingSizer(wxWindow *parent);
301 ~wxSpacingSizer();
302
303 bool Create(wxWindow *parent, wxRelationship rel, wxWindow *other, int sp);
304 bool Create(wxWindow *parent);
305 };
306
307 #endif
308 // _WX_LAYOUTH__