1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: interface of wxLayoutAlgorithm
4 // Author: wxWidgets team
6 // Licence: wxWindows license
7 /////////////////////////////////////////////////////////////////////////////
10 @class wxLayoutAlgorithm
12 wxLayoutAlgorithm implements layout of subwindows in MDI or SDI frames.
13 It sends a wxCalculateLayoutEvent event
14 to children of the frame, asking them for information about
15 their size. For MDI parent frames, the algorithm allocates
16 the remaining space to the MDI client window (which contains the MDI child
18 For SDI (normal) frames, a 'main' window is specified as taking up the
21 Because the event system is used, this technique can be applied to any windows,
22 which are not necessarily 'aware' of the layout classes (no virtual functions
23 in wxWindow refer to wxLayoutAlgorithm or its events). However, you
24 may wish to use wxSashLayoutWindow for your subwindows
25 since this class provides handlers for the required events, and accessors
26 to specify the desired size of the window. The sash behaviour in the base class
27 can be used, optionally, to make the windows user-resizable.
29 wxLayoutAlgorithm is typically used in IDE (integrated development environment)
31 where there are several resizable windows in addition to the MDI client window,
33 other primary editing window. Resizable windows might include toolbars, a
35 window, and a window for displaying error and warning messages.
37 When a window receives an OnCalculateLayout event, it should call SetRect in
38 the given event object, to be the old supplied rectangle minus whatever space
40 window takes up. It should also set its own size accordingly.
41 wxSashLayoutWindow::OnCalculateLayout generates an OnQueryLayoutInfo event
42 which it sends to itself to determine the orientation, alignment and size of
44 which it gets from internal member variables set by the application.
46 The algorithm works by starting off with a rectangle equal to the whole frame
48 It iterates through the frame children, generating OnCalculateLayout events
50 the window size and return the remaining rectangle for the next window to
52 is assumed (by wxSashLayoutWindow::OnCalculateLayout) that a window stretches
54 of the frame client, according to the orientation it specifies. For example, a
56 will stretch the full width of the remaining portion of the frame client area.
57 In the other orientation, the window will be fixed to whatever size was
59 OnQueryLayoutInfo. An alignment setting will make the window 'stick' to the
61 bottom of the remaining client area. This scheme implies that order of window
62 creation is important.
63 Say you wish to have an extra toolbar at the top of the frame, a project window
65 the MDI client window, and an output window above the status bar. You should
67 the windows in this order: toolbar, output window, project window. This ensures
69 output window take up space at the top and bottom, and then the remaining
70 height in-between is used for
73 wxLayoutAlgorithm is quite independent of the way in which
74 OnCalculateLayout chooses to interpret a window's size and alignment. Therefore
76 could implement a different window class with a new OnCalculateLayout event
78 that has a more sophisticated way of laying out the windows. It might allow
79 specification of whether stretching occurs in the specified orientation, for
81 rather than always assuming stretching. (This could, and probably should, be
85 @e Note: wxLayoutAlgorithm has nothing to do with wxLayoutConstraints. It is an
87 way of specifying layouts for which the normal constraint system is unsuitable.
92 @see wxSashEvent, wxSashLayoutWindow, @ref overview_eventhandlingoverview
94 class wxLayoutAlgorithm
: public wxObject
105 virtual ~wxLayoutAlgorithm();
108 Lays out the children of a normal frame. @a mainWindow is set to occupy the
110 This function simply calls LayoutWindow().
112 bool LayoutFrame(wxFrame
* frame
, wxWindow
* mainWindow
= NULL
);
115 Lays out the children of an MDI parent frame. If @a rect is non-@NULL, the
116 given rectangle will be used as a starting point instead of the frame's client
118 The MDI client window is set to occupy the remaining space.
120 bool LayoutMDIFrame(wxMDIParentFrame
* frame
, wxRect
* rect
= NULL
);
123 Lays out the children of a normal frame or other window.
124 @a mainWindow is set to occupy the remaining space. If this is not specified,
126 the last window that responds to a calculate layout event in query mode will
127 get the remaining space
128 (that is, a non-query OnCalculateLayout event will not be sent to this window
129 and the window will be set
130 to the remaining size).
132 bool LayoutWindow(wxWindow
* parent
, wxWindow
* mainWindow
= NULL
);
138 @class wxSashLayoutWindow
140 wxSashLayoutWindow responds to OnCalculateLayout events generated
141 by wxLayoutAlgorithm. It allows the
142 application to use simple accessors to specify how the window should be
143 laid out, rather than having to respond to events. The fact that
144 the class derives from wxSashWindow allows sashes to be used if required,
145 to allow the windows to be user-resizable.
147 The documentation for wxLayoutAlgorithm explains
148 the purpose of this class in more detail.
153 @see wxLayoutAlgorithm, wxSashWindow, @ref overview_eventhandlingoverview
155 class wxSashLayoutWindow
: public wxSashWindow
160 Constructs a sash layout window, which can be a child of a frame, dialog or any
161 other non-control window.
164 Pointer to a parent window.
166 Window identifier. If -1, will automatically create an identifier.
168 Window position. wxDefaultPosition is (-1, -1) which indicates that
170 should generate a default position for the window. If using the
171 wxSashLayoutWindow class directly, supply
174 Window size. wxDefaultSize is (-1, -1) which indicates that
176 should generate a default size for the window.
178 Window style. For window styles, please see wxSashLayoutWindow.
182 wxSashLayoutWindow();
183 wxSashLayoutWindow(wxSashLayoutWindow
* parent
, wxWindowID id
,
184 const wxPoint
& pos
= wxDefaultPosition
,
185 const wxSize
& size
= wxDefaultSize
,
186 long style
= wxCLIP_CHILDREN
| wxSW_3D
,
187 const wxString
& name
= "layoutWindow");
191 Initializes a sash layout window, which can be a child of a frame, dialog or
192 any other non-control window.
195 Pointer to a parent window.
197 Window identifier. If -1, will automatically create an identifier.
199 Window position. wxDefaultPosition is (-1, -1) which indicates that
201 should generate a default position for the window. If using the
202 wxSashLayoutWindow class directly, supply
205 Window size. wxDefaultSize is (-1, -1) which indicates that
207 should generate a default size for the window.
209 Window style. For window styles, please see wxSashLayoutWindow.
213 bool Create(wxSashLayoutWindow
* parent
, wxWindowID id
,
214 const wxPoint
& pos
= wxDefaultPosition
,
215 const wxSize
& size
= wxDefaultSize
,
216 long style
= wxCLIP_CHILDREN
| wxSW_3D
,
217 const wxString
& name
= "layoutWindow");
220 Returns the alignment of the window: one of wxLAYOUT_TOP, wxLAYOUT_LEFT,
221 wxLAYOUT_RIGHT, wxLAYOUT_BOTTOM.
223 wxLayoutAlignment
GetAlignment() const;
226 Returns the orientation of the window: one of wxLAYOUT_HORIZONTAL,
229 wxLayoutOrientation
GetOrientation() const;
232 The default handler for the event that is generated by wxLayoutAlgorithm. The
234 of this function calls wxCalculateLayoutEvent::SetRect to shrink the provided
236 how much space this window takes up. For further details,
237 see wxLayoutAlgorithm and wxCalculateLayoutEvent.
239 void OnCalculateLayout(wxCalculateLayoutEvent
& event
);
242 The default handler for the event that is generated by OnCalculateLayout to get
243 size, alignment and orientation information for the window. The implementation
244 of this function uses member variables as set by accessors called by the
246 For further details, see wxLayoutAlgorithm and wxQueryLayoutInfoEvent.
248 void OnQueryLayoutInfo(wxQueryLayoutInfoEvent
& event
);
251 Sets the alignment of the window (which edge of the available parent client
253 is attached to). @a alignment is one of wxLAYOUT_TOP, wxLAYOUT_LEFT,
254 wxLAYOUT_RIGHT, wxLAYOUT_BOTTOM.
256 void SetAlignment(wxLayoutAlignment alignment
);
259 Sets the default dimensions of the window. The dimension other than the
260 orientation will be fixed to this
261 value, and the orientation dimension will be ignored and the window stretched
262 to fit the available space.
264 void SetDefaultSize(const wxSize
& size
);
267 Sets the orientation of the window (the direction the window will stretch in,
268 to fill the available
269 parent client area). @a orientation is one of wxLAYOUT_HORIZONTAL,
272 void SetOrientation(wxLayoutOrientation orientation
);
278 @class wxQueryLayoutInfoEvent
280 This event is sent when wxLayoutAlgorithm wishes to get
281 the size, orientation and alignment of a window. More precisely, the event is
283 by the OnCalculateLayout handler which is itself invoked by wxLayoutAlgorithm.
288 @see wxCalculateLayoutEvent, wxSashLayoutWindow, wxLayoutAlgorithm.
290 class wxQueryLayoutInfoEvent
: public wxEvent
296 wxQueryLayoutInfoEvent(wxWindowID id
= 0);
299 Specifies the alignment of the window (which side of the remaining parent
301 the window sticks to). One of wxLAYOUT_TOP, wxLAYOUT_LEFT, wxLAYOUT_RIGHT,
304 void GetAlignment() const;
307 Returns the flags associated with this event. Not currently used.
309 int GetFlags() const;
312 Returns the orientation that the event handler specified to the event object.
313 May be one of wxLAYOUT_HORIZONTAL,
316 wxLayoutOrientation
GetOrientation() const;
319 Returns the requested length of the window in the direction of the window
320 orientation. This information
323 int GetRequestedLength() const;
326 Returns the size that the event handler specified to the event object as being
327 the requested size of the window.
329 wxSize
GetSize() const;
332 Call this to specify the alignment of the window (which side of the remaining
334 the window sticks to). May be one of wxLAYOUT_TOP, wxLAYOUT_LEFT,
335 wxLAYOUT_RIGHT, wxLAYOUT_BOTTOM.
337 void SetAlignment(wxLayoutAlignment alignment
);
340 Sets the flags associated with this event. Not currently used.
342 void SetFlags(int flags
);
345 Call this to specify the orientation of the window. May be one of
349 void SetOrientation(wxLayoutOrientation orientation
);
352 Sets the requested length of the window in the direction of the window
353 orientation. This information
356 void SetRequestedLength(int length
);
359 Call this to let the calling code know what the size of the window is.
361 void SetSize(const wxSize
& size
);
367 @class wxCalculateLayoutEvent
369 This event is sent by wxLayoutAlgorithm to
370 calculate the amount of the remaining client area that the window should
376 @see wxQueryLayoutInfoEvent, wxSashLayoutWindow, wxLayoutAlgorithm.
378 class wxCalculateLayoutEvent
: public wxEvent
384 wxCalculateLayoutEvent(wxWindowID id
= 0);
387 Returns the flags associated with this event. Not currently used.
389 int GetFlags() const;
392 Before the event handler is entered, returns the remaining parent client area
394 could occupy. When the event handler returns, this should contain the remaining
395 parent client rectangle,
396 after the event handler has subtracted the area that its window occupies.
398 wxRect
GetRect() const;
401 Sets the flags associated with this event. Not currently used.
403 void SetFlags(int flags
);
406 Call this to specify the new remaining parent client area, after the space
408 window has been subtracted.
410 void SetRect(const wxRect
& rect
);