1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     interface of wxLayoutAlgorithm 
   4 // Author:      wxWidgets team 
   6 // Licence:     wxWindows license 
   7 ///////////////////////////////////////////////////////////////////////////// 
  10     Enumeration used by wxLayoutAlgorithm. 
  12 enum wxLayoutOrientation
 
  19     Enumeration used by wxLayoutAlgorithm. 
  21 enum wxLayoutAlignment
 
  31     @class wxLayoutAlgorithm 
  33     wxLayoutAlgorithm implements layout of subwindows in MDI or SDI frames. 
  34     It sends a wxCalculateLayoutEvent event to children of the frame, asking them 
  35     for information about their size. For MDI parent frames, the algorithm allocates 
  36     the remaining space to the MDI client window (which contains the MDI child frames). 
  38     For SDI (normal) frames, a 'main' window is specified as taking up the 
  41     Because the event system is used, this technique can be applied to any windows, 
  42     which are not necessarily 'aware' of the layout classes (no virtual functions 
  43     in wxWindow refer to wxLayoutAlgorithm or its events). 
  44     However, you may wish to use wxSashLayoutWindow for your subwindows since this 
  45     class provides handlers for the required events, and accessors to specify the 
  46     desired size of the window. The sash behaviour in the base class can be used, 
  47     optionally, to make the windows user-resizable. 
  49     wxLayoutAlgorithm is typically used in IDE (integrated development environment) 
  50     applications, where there are several resizable windows in addition to the MDI 
  51     client window, or other primary editing window. Resizable windows might include 
  52     toolbars, a project window, and a window for displaying error and warning messages. 
  54     When a window receives an OnCalculateLayout event, it should call SetRect in 
  55     the given event object, to be the old supplied rectangle minus whatever space 
  56     the window takes up. It should also set its own size accordingly. 
  57     wxSashLayoutWindow::OnCalculateLayout generates an OnQueryLayoutInfo event 
  58     which it sends to itself to determine the orientation, alignment and size of 
  59     the window, which it gets from internal member variables set by the application. 
  61     The algorithm works by starting off with a rectangle equal to the whole frame 
  62     client area. It iterates through the frame children, generating 
  63     wxLayoutAlgorithm::OnCalculateLayout events which subtract the window size and 
  64     return the remaining rectangle for the next window to process. 
  65     It is assumed (by wxSashLayoutWindow::OnCalculateLayout) that a window stretches 
  66     the full dimension of the frame client, according to the orientation it specifies. 
  67     For example, a horizontal window will stretch the full width of the remaining 
  68     portion of the frame client area. 
  69     In the other orientation, the window will be fixed to whatever size was 
  70     specified by wxLayoutAlgorithm::OnQueryLayoutInfo. An alignment setting will 
  71     make the window 'stick' to the left, top, right or bottom of the remaining 
  72     client area. This scheme implies that order of window creation is important. 
  73     Say you wish to have an extra toolbar at the top of the frame, a project window 
  74     to the left of the MDI client window, and an output window above the status bar. 
  75     You should therefore create the windows in this order: toolbar, output window, 
  76     project window. This ensures that the toolbar and output window take up space 
  77     at the top and bottom, and then the remaining height in-between is used for 
  80     wxLayoutAlgorithm is quite independent of the way in which 
  81     wxLayoutAlgorithm::OnCalculateLayout chooses to interpret a window's size and 
  82     alignment. Therefore you could implement a different window class with a new 
  83     wxLayoutAlgorithm::OnCalculateLayout event handler, that has a more sophisticated 
  84     way of laying out the windows. It might allow specification of whether stretching 
  85     occurs in the specified orientation, for example, rather than always assuming 
  87     (This could, and probably should, be added to the existing implementation). 
  89     @note wxLayoutAlgorithm has nothing to do with wxLayoutConstraints. 
  90           It is an alternative way of specifying layouts for which the normal 
  91           constraint system is unsuitable. 
  93     @beginEventTable{wxQueryLayoutInfoEvent,wxCalculateLayoutEvent} 
  94     @event{EVT_QUERY_LAYOUT_INFO(func)} 
  95         Process a wxEVT_QUERY_LAYOUT_INFO event, to get size, orientation and 
  96         alignment from a window. See wxQueryLayoutInfoEvent. 
  97     @event{EVT_CALCULATE_LAYOUT(func)} 
  98         Process a wxEVT_CALCULATE_LAYOUT event, which asks the window to take a 
  99         'bite' out of a rectangle provided by the algorithm. See wxCalculateLayoutEvent. 
 102     Note that the algorithm object does not respond to events, but itself generates the 
 103     previous events in order to calculate window sizes. 
 109     @see wxSashEvent, wxSashLayoutWindow, @ref overview_eventhandling 
 111 class wxLayoutAlgorithm 
: public wxObject
 
 122     virtual ~wxLayoutAlgorithm(); 
 125         Lays out the children of a normal frame. @a mainWindow is set to occupy the 
 126         remaining space. This function simply calls LayoutWindow(). 
 128     bool LayoutFrame(wxFrame
* frame
, wxWindow
* mainWindow 
= NULL
); 
 131         Lays out the children of an MDI parent frame. If @a rect is non-@NULL, the 
 132         given rectangle will be used as a starting point instead of the frame's client 
 133         area. The MDI client window is set to occupy the remaining space. 
 135     bool LayoutMDIFrame(wxMDIParentFrame
* frame
, wxRect
* rect 
= NULL
); 
 138         Lays out the children of a normal frame or other window. 
 140         @a mainWindow is set to occupy the remaining space. If this is not specified, 
 141         then the last window that responds to a calculate layout event in query mode will 
 142         get the remaining space (that is, a non-query OnCalculateLayout event will 
 143         not be sent to this window and the window will be set to the remaining size). 
 145     bool LayoutWindow(wxWindow
* parent
, wxWindow
* mainWindow 
= NULL
); 
 151     @class wxSashLayoutWindow 
 153     wxSashLayoutWindow responds to OnCalculateLayout events generated by wxLayoutAlgorithm. 
 154     It allows the  application to use simple accessors to specify how the window 
 155     should be laid out, rather than having to respond to events. 
 157     The fact that the class derives from wxSashWindow allows sashes to be used if 
 158     required, to allow the windows to be user-resizable. 
 160     The documentation for wxLayoutAlgorithm explains the purpose of this class in 
 163     For the window styles see wxSashWindow. 
 165     This class handles the EVT_QUERY_LAYOUT_INFO and EVT_CALCULATE_LAYOUT events 
 166     for you. However, if you use sashes, see wxSashWindow for relevant event information. 
 167     See also wxLayoutAlgorithm for information about the layout events. 
 172     @see wxLayoutAlgorithm, wxSashWindow, @ref overview_eventhandling 
 174 class wxSashLayoutWindow 
: public wxSashWindow
 
 180     wxSashLayoutWindow(); 
 183         Constructs a sash layout window, which can be a child of a frame, dialog or any 
 184         other non-control window. 
 187             Pointer to a parent window. 
 189             Window identifier. If -1, will automatically create an identifier. 
 191             Window position. wxDefaultPosition is (-1, -1) which indicates that 
 192             wxSashLayoutWindows should generate a default position for the window. 
 193             If using the wxSashLayoutWindow class directly, supply an actual position. 
 195             Window size. wxDefaultSize is (-1, -1) which indicates that 
 196             wxSashLayoutWindows should generate a default size for the window. 
 198             Window style. For window styles, please see wxSashLayoutWindow. 
 202     wxSashLayoutWindow(wxSashLayoutWindow
* parent
, wxWindowID id
, 
 203                        const wxPoint
& pos 
= wxDefaultPosition
, 
 204                        const wxSize
& size 
= wxDefaultSize
, 
 205                        long style 
= wxCLIP_CHILDREN 
| wxSW_3D
, 
 206                        const wxString
& name 
= "layoutWindow"); 
 209         Initializes a sash layout window, which can be a child of a frame, dialog or 
 210         any other non-control window. 
 213             Pointer to a parent window. 
 215             Window identifier. If -1, will automatically create an identifier. 
 217             Window position. wxDefaultPosition is (-1, -1) which indicates that 
 218             wxSashLayoutWindows should generate a default position for the window. 
 219             If using the wxSashLayoutWindow class directly, supply an actual position. 
 221             Window size. wxDefaultSize is (-1, -1) which indicates that 
 222             wxSashLayoutWindows should generate a default size for the window. 
 224             Window style. For window styles, please see wxSashLayoutWindow. 
 228     bool Create(wxWindow
* parent
, wxWindowID id 
= wxID_ANY
, 
 229                 const wxPoint
& pos 
= wxDefaultPosition
, 
 230                 const wxSize
& size 
= wxDefaultSize
, 
 231                 long style 
= wxCLIP_CHILDREN 
| wxSW_3D
, 
 232                 const wxString
& name 
= "layoutWindow"); 
 235         Returns the alignment of the window: one of wxLAYOUT_TOP, wxLAYOUT_LEFT, 
 236         wxLAYOUT_RIGHT, wxLAYOUT_BOTTOM. 
 238     wxLayoutAlignment 
GetAlignment() const; 
 241         Returns the orientation of the window: one of wxLAYOUT_HORIZONTAL, 
 244     wxLayoutOrientation 
GetOrientation() const; 
 247         The default handler for the event that is generated by wxLayoutAlgorithm. 
 248         The implementation of this function calls wxCalculateLayoutEvent::SetRect 
 249         to shrink the provided size according to how much space this window takes up. 
 250         For further details, see wxLayoutAlgorithm and wxCalculateLayoutEvent. 
 252     void OnCalculateLayout(wxCalculateLayoutEvent
& event
); 
 255         The default handler for the event that is generated by OnCalculateLayout to get 
 256         size, alignment and orientation information for the window. 
 257         The implementation of this function uses member variables as set by accessors 
 258         called by the application. 
 260         For further details, see wxLayoutAlgorithm and wxQueryLayoutInfoEvent. 
 262     void OnQueryLayoutInfo(wxQueryLayoutInfoEvent
& event
); 
 265         Sets the alignment of the window (which edge of the available parent client 
 266         area the window is attached to). @a alignment is one of wxLAYOUT_TOP, wxLAYOUT_LEFT, 
 267         wxLAYOUT_RIGHT, wxLAYOUT_BOTTOM. 
 269     void SetAlignment(wxLayoutAlignment alignment
); 
 272         Sets the default dimensions of the window. The dimension other than the 
 273         orientation will be fixed to this value, and the orientation dimension 
 274         will be ignored and the window stretched to fit the available space. 
 276     void SetDefaultSize(const wxSize
& size
); 
 279         Sets the orientation of the window (the direction the window will stretch in, 
 280         to fill the available parent client area). @a orientation is one of 
 281         wxLAYOUT_HORIZONTAL, wxLAYOUT_VERTICAL. 
 283     void SetOrientation(wxLayoutOrientation orientation
); 
 289     @class wxQueryLayoutInfoEvent 
 291     This event is sent when wxLayoutAlgorithm wishes to get the size, orientation 
 292     and alignment of a window. More precisely, the event is sent by the 
 293     OnCalculateLayout handler which is itself invoked by wxLayoutAlgorithm. 
 295     @beginEventTable{wxQueryLayoutInfoEvent} 
 296     @event{EVT_QUERY_LAYOUT_INFO(func)} 
 297         Process a wxEVT_QUERY_LAYOUT_INFO event, to get size, orientation and alignment 
 304     @see wxCalculateLayoutEvent, wxSashLayoutWindow, wxLayoutAlgorithm. 
 306 class wxQueryLayoutInfoEvent 
: public wxEvent
 
 312     wxQueryLayoutInfoEvent(wxWindowID id 
= 0); 
 315         Specifies the alignment of the window (which side of the remaining parent 
 316         client area the window sticks to). 
 317         One of wxLAYOUT_TOP, wxLAYOUT_LEFT, wxLAYOUT_RIGHT, wxLAYOUT_BOTTOM. 
 319     wxLayoutAlignment 
GetAlignment() const; 
 322         Returns the flags associated with this event. Not currently used. 
 324     int GetFlags() const; 
 327         Returns the orientation that the event handler specified to the event object. 
 328         May be one of wxLAYOUT_HORIZONTAL, wxLAYOUT_VERTICAL. 
 330     wxLayoutOrientation 
GetOrientation() const; 
 333         Returns the requested length of the window in the direction of the window 
 334         orientation. This information is not yet used. 
 336     int GetRequestedLength() const; 
 339         Returns the size that the event handler specified to the event object as being 
 340         the requested size of the window. 
 342     wxSize 
GetSize() const; 
 345         Call this to specify the alignment of the window (which side of the remaining 
 346         parent client area the window sticks to). 
 347         May be one of wxLAYOUT_TOP, wxLAYOUT_LEFT, wxLAYOUT_RIGHT, wxLAYOUT_BOTTOM. 
 349     void SetAlignment(wxLayoutAlignment alignment
); 
 352         Sets the flags associated with this event. Not currently used. 
 354     void SetFlags(int flags
); 
 357         Call this to specify the orientation of the window. 
 358         May be one of wxLAYOUT_HORIZONTAL, wxLAYOUT_VERTICAL. 
 360     void SetOrientation(wxLayoutOrientation orientation
); 
 363         Sets the requested length of the window in the direction of the window 
 364         orientation. This information is not yet used. 
 366     void SetRequestedLength(int length
); 
 369         Call this to let the calling code know what the size of the window is. 
 371     void SetSize(const wxSize
& size
); 
 377     @class wxCalculateLayoutEvent 
 379     This event is sent by wxLayoutAlgorithm to calculate the amount of the 
 380     remaining client area that the window should occupy. 
 382     @beginEventTable{wxCalculateLayoutEvent} 
 383     @event{EVT_CALCULATE_LAYOUT(func)} 
 384         Process a wxEVT_CALCULATE_LAYOUT event, which asks the window to take a 
 385         'bite' out of a rectangle provided by the algorithm. 
 391     @see wxQueryLayoutInfoEvent, wxSashLayoutWindow, wxLayoutAlgorithm. 
 393 class wxCalculateLayoutEvent 
: public wxEvent
 
 399     wxCalculateLayoutEvent(wxWindowID id 
= 0); 
 402         Returns the flags associated with this event. Not currently used. 
 404     int GetFlags() const; 
 407         Before the event handler is entered, returns the remaining parent client area 
 408         that the window could occupy. 
 410         When the event handler returns, this should contain the remaining parent 
 411         client rectangle, after the event handler has subtracted the area that its 
 414     wxRect 
GetRect() const; 
 417         Sets the flags associated with this event. Not currently used. 
 419     void SetFlags(int flags
); 
 422         Call this to specify the new remaining parent client area, after the space 
 423         occupied by the window has been subtracted. 
 425     void SetRect(const wxRect
& rect
);