]> git.saurik.com Git - wxWidgets.git/blame - docs/latex/wx/tconstr.tex
ugh. Nesting the (per class) plugin sentries can require them to
[wxWidgets.git] / docs / latex / wx / tconstr.tex
CommitLineData
a660d684
KB
1\section{Constraints overview}\label{constraintsoverview}
2
3Classes: \helpref{wxLayoutConstraints}{wxlayoutconstraints}, \helpref{wxIndividualLayoutConstraint}{wxindividuallayoutconstraint}.
4
3ca6a5f0
BP
5Objects of class wxLayoutConstraint can be associated with a window to define
6the way it is laid out, with respect to its siblings or the parent.
a660d684
KB
7
8The class consists of the following eight constraints of class wxIndividualLayoutConstraint,
9some or all of which should be accessed directly to set the appropriate
10constraints.
11
12\begin{itemize}\itemsep=0pt
13\item {\bf left:} represents the left hand edge of the window
14\item {\bf right:} represents the right hand edge of the window
15\item {\bf top:} represents the top edge of the window
16\item {\bf bottom:} represents the bottom edge of the window
17\item {\bf width:} represents the width of the window
18\item {\bf height:} represents the height of the window
19\item {\bf centreX:} represents the horizontal centre point of the window
20\item {\bf centreY:} represents the vertical centre point of the window
21\end{itemize}
22
945bda7d 23The constraints are initially set to have the relationship wxUnconstrained,
a660d684 24which means that their values should be calculated by looking at known constraints.
945bda7d
VZ
25To calculate the position and size of the control, the layout algorithm needs to
26know exactly 4 constraints (as it has 4 numbers to calculate from them), so you
27should always set exactly 4 of the constraints from the above table.
28
29If you want the controls height or width to have the default value, you may use
30a special value for the constraint: wxAsIs. If the constraint is wxAsIs, the
31dimension will not be changed which is useful for the dialog controls which
32often have the default size (e.g. the buttons whose size is determined by their
33label).
34
35The constrains calculation is done in \helpref{wxWindow::Layout}{wxwindowlayout}
36function which evaluates constraints. To call it you can either call
3ca6a5f0
BP
37\helpref{wxWindow::SetAutoLayout}{wxwindowsetautolayout} if the parent window
38is a frame, panel or a dialog to tell default OnSize handlers to call Layout
39automatically whenever the window size changes, or override OnSize and call
40Layout yourself (note that you do have to call
41\helpref{Layout}{wxwindowlayout} yourself if the parent window is not a
42frame, panel or dialog).
a660d684
KB
43
44\subsection{Constraint layout: more detail}
45
46By default, windows do not have a wxLayoutConstraints object. In this case, much layout
47must be done explicitly, by performing calculations in OnSize members, except
945bda7d
VZ
48for the case of frames that have exactly one subwindow (not counting toolbar and
49statusbar which are also positioned by the frame automatically), where wxFrame::OnSize
50takes care of resizing the child to always fill the frame.
a660d684
KB
51
52To avoid the need for these rather awkward calculations, the user can create
53a wxLayoutConstraints object and associate it with a window with wxWindow::SetConstraints.
54This object contains a constraint for each of the window edges, two for the centre point,
55and two for the window size. By setting some or all of these constraints appropriately,
56the user can achieve quite complex layout by defining relationships between windows.
57
58In wxWindows, each window can be constrained relative to either its {\it
59siblings} on the same window, or the {\it parent}. The layout algorithm
60therefore operates in a top-down manner, finding the correct layout for
61the children of a window, then the layout for the grandchildren, and so
62on. Note that this differs markedly from native Motif layout, where
63constraints can ripple upwards and can eventually change the frame
64window or dialog box size. We assume in wxWindows that the {\it user} is
65always `boss' and specifies the size of the outer window, to which
66subwindows must conform. Obviously, this might be a limitation in some
67circumstances, but it suffices for most situations, and the
68simplification avoids some of the nightmarish problems associated with
69programming Motif.
70
71When the user sets constraints, many of the constraints for windows
72edges and dimensions remain unconstrained. For a given window,
73the wxWindow::Layout algorithm first resets all constraints
74in all children to have unknown edge or dimension values, and then iterates through the constraints,
f6bcfd97 75evaluating them. For unconstrained edges and dimensions, it
a660d684
KB
76tries to find the value using known relationships that always hold. For example,
77an unconstrained {\it width} may be calculated from the {\it left} and {\it right edges}, if
78both are currently known. For edges and dimensions with user-supplied constraints, these
f6bcfd97 79constraints are evaluated if the inputs of the constraint are known.
a660d684 80
f6bcfd97 81The algorithm stops when all child edges and dimension are known (success), or
a660d684
KB
82there are unknown edges or dimensions but there has been no change in this cycle (failure).
83
84It then sets all the window positions and sizes according to the values it has found.
85
86Because the algorithm is iterative, the order in which constraints are considered is
945bda7d
VZ
87irrelevant, however you may reduce the number of iterations (and thus speed up
88the layout calculations) by creating the controls in such order that as many
89constraints as possible can be calculated during the first iteration. For example, if
90you have 2 buttons which you'd like to position in the lower right corner, it is
f6bcfd97 91slightly more efficient to first create the second button and specify that its
945bda7d
VZ
92right border IsSameAs(parent, wxRight) and then create the first one by
93specifying that it should be LeftOf() the second one than to do in a more
94natural left-to-right order.
a660d684
KB
95
96\subsection{Window layout examples}\label{layoutexamples}
97
98\subsubsection{Example 1: subwindow layout}
99
fe604ccd 100This example specifies a panel and a window side by side,
945bda7d 101with a text subwindow below it.
a660d684
KB
102
103\begin{verbatim}
fe604ccd
JS
104 frame->panel = new wxPanel(frame, -1, wxPoint(0, 0), wxSize(1000, 500), 0);
105 frame->scrollWindow = new MyScrolledWindow(frame, -1, wxPoint(0, 0), wxSize(400, 400), wxRETAINED);
106 frame->text_window = new MyTextWindow(frame, -1, wxPoint(0, 250), wxSize(400, 250));
a660d684
KB
107
108 // Set constraints for panel subwindow
109 wxLayoutConstraints *c1 = new wxLayoutConstraints;
110
111 c1->left.SameAs (frame, wxLeft);
112 c1->top.SameAs (frame, wxTop);
113 c1->right.PercentOf (frame, wxWidth, 50);
114 c1->height.PercentOf (frame, wxHeight, 50);
115
116 frame->panel->SetConstraints(c1);
117
fe604ccd 118 // Set constraints for scrollWindow subwindow
a660d684
KB
119 wxLayoutConstraints *c2 = new wxLayoutConstraints;
120
121 c2->left.SameAs (frame->panel, wxRight);
122 c2->top.SameAs (frame, wxTop);
123 c2->right.SameAs (frame, wxRight);
124 c2->height.PercentOf (frame, wxHeight, 50);
125
fe604ccd 126 frame->scrollWindow->SetConstraints(c2);
a660d684
KB
127
128 // Set constraints for text subwindow
129 wxLayoutConstraints *c3 = new wxLayoutConstraints;
130 c3->left.SameAs (frame, wxLeft);
131 c3->top.Below (frame->panel);
132 c3->right.SameAs (frame, wxRight);
133 c3->bottom.SameAs (frame, wxBottom);
134
135 frame->text_window->SetConstraints(c3);
136\end{verbatim}
137
138\subsubsection{Example 2: panel item layout}
139
140This example sizes a button width to 80 percent of the panel width, and centres
141it horizontally. A listbox and multitext item are placed below it. The listbox
142takes up 40 percent of the panel width, and the multitext item takes up
143the remainder of the width. Margins of 5 pixels are used.
144
145\begin{verbatim}
146 // Create some panel items
fe604ccd 147 wxButton *btn1 = new wxButton(frame->panel, -1, "A button") ;
a660d684
KB
148
149 wxLayoutConstraints *b1 = new wxLayoutConstraints;
150 b1->centreX.SameAs (frame->panel, wxCentreX);
151 b1->top.SameAs (frame->panel, wxTop, 5);
152 b1->width.PercentOf (frame->panel, wxWidth, 80);
153 b1->height.PercentOf (frame->panel, wxHeight, 10);
154 btn1->SetConstraints(b1);
155
fe604ccd
JS
156 wxListBox *list = new wxListBox(frame->panel, -1, "A list",
157 wxPoint(-1, -1), wxSize(200, 100));
a660d684
KB
158
159 wxLayoutConstraints *b2 = new wxLayoutConstraints;
160 b2->top.Below (btn1, 5);
161 b2->left.SameAs (frame->panel, wxLeft, 5);
162 b2->width.PercentOf (frame->panel, wxWidth, 40);
163 b2->bottom.SameAs (frame->panel, wxBottom, 5);
164 list->SetConstraints(b2);
165
fe604ccd
JS
166 wxTextCtrl *mtext = new wxTextCtrl(frame->panel, -1, "Multiline text", "Some text",
167 wxPoint(-1, -1), wxSize(150, 100), wxTE_MULTILINE);
945bda7d 168
a660d684
KB
169 wxLayoutConstraints *b3 = new wxLayoutConstraints;
170 b3->top.Below (btn1, 5);
171 b3->left.RightOf (list, 5);
172 b3->right.SameAs (frame->panel, wxRight, 5);
173 b3->bottom.SameAs (frame->panel, wxBottom, 5);
174 mtext->SetConstraints(b3);
175\end{verbatim}
176
177