]> git.saurik.com Git - wxWidgets.git/blob - include/wx/layout.h
2nd attempt at MDI in wxMotif, using wxNotebook this time (still some probs).
[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 // Avoid compiler warning
235 void SetSize(int w, int h) { wxWindow::SetSize(w, h); }
236 virtual void Move(int x, int y);
237 virtual void GetSize(int *w, int *h) const;
238 inline virtual void GetClientSize(int *w, int *h) const { GetSize(w, h); }
239 virtual void GetPosition(int *x, int *y) const;
240
241 inline void SizerSetSize(int x, int y, int w, int h)
242 { SetSize(x, y, w, h); }
243 inline void SizerMove(int x, int y)
244 { Move(x, y); }
245
246 virtual void SetBorder(int w, int h);
247 inline int GetBorderX() { return borderX ; }
248 inline int GetBorderY() { return borderY ; }
249
250 virtual void AddSizerChild(wxWindow *child);
251 virtual void RemoveSizerChild(wxWindow *child);
252
253 inline virtual void SetBehaviour(wxSizerBehaviour b) { sizerBehaviour = b; }
254 inline virtual wxSizerBehaviour GetBehaviour() { return sizerBehaviour; }
255
256 virtual bool LayoutPhase1(int *);
257 virtual bool LayoutPhase2(int *);
258 };
259
260 #define wxSIZER_ROWS TRUE
261 #define wxSIZER_COLS FALSE
262
263 class WXDLLEXPORT wxRowColSizer: public wxSizer
264 {
265 DECLARE_DYNAMIC_CLASS(wxRowColSizer)
266
267 private:
268 protected:
269 bool rowOrCol;
270 int rowOrColSize;
271 int xSpacing;
272 int ySpacing;
273 public:
274 // rowOrCol = TRUE to be laid out in rows, otherwise in columns.
275 wxRowColSizer();
276 wxRowColSizer(wxWindow *parent, bool rowOrCol = wxSIZER_ROWS, int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink);
277 ~wxRowColSizer();
278
279 bool Create(wxWindow *parent, bool rowOrCol = wxSIZER_ROWS, int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink);
280 void SetSize(int x, int y, int w, int h, int flags = wxSIZE_AUTO);
281 // Avoid compiler warning
282 void SetSize(int w, int h) { wxSizer::SetSize(w, h); }
283
284 inline virtual void SetRowOrCol(bool rc) { rowOrCol = rc; }
285 inline virtual bool GetRowOrCol() { return rowOrCol; }
286 inline virtual void SetRowOrColSize(int n) { rowOrColSize = n; }
287 inline virtual int GetRowOrColSize() { return rowOrColSize; }
288 inline virtual void SetSpacing(int x, int y) { xSpacing = x; ySpacing = y; }
289 inline virtual void GetSpacing(int *x, int *y) { *x = xSpacing; *y = ySpacing; }
290
291 bool LayoutPhase1(int *);
292 bool LayoutPhase2(int *);
293 };
294
295 class WXDLLEXPORT wxSpacingSizer: public wxSizer
296 {
297 DECLARE_DYNAMIC_CLASS(wxSpacingSizer)
298
299 private:
300 protected:
301 public:
302 wxSpacingSizer();
303 wxSpacingSizer(wxWindow *parent, wxRelationship rel, wxWindow *other, int spacing);
304 wxSpacingSizer(wxWindow *parent);
305 ~wxSpacingSizer();
306
307 bool Create(wxWindow *parent, wxRelationship rel, wxWindow *other, int sp);
308 bool Create(wxWindow *parent);
309 };
310
311 #endif
312 // _WX_LAYOUTH__