1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/generic/laywin.h
3 // Purpose:     Implements a simple layout algorithm, plus
4 //              wxSashLayoutWindow which is an example of a window with
5 //              layout-awareness (via event handlers). This is suited to
6 //              IDE-style window layout.
7 // Author:      Julian Smart
8 // Modified by:
9 // Created:     04/01/98
10 // Copyright:   (c) Julian Smart
11 // Licence:     wxWindows licence
12 /////////////////////////////////////////////////////////////////////////////
13 
14 #ifndef _WX_LAYWIN_H_G_
15 #define _WX_LAYWIN_H_G_
16 
17 #if wxUSE_SASH
18     #include "wx/sashwin.h"
19 #endif // wxUSE_SASH
20 
21 #include "wx/event.h"
22 
23 class WXDLLIMPEXP_FWD_ADV wxQueryLayoutInfoEvent;
24 class WXDLLIMPEXP_FWD_ADV wxCalculateLayoutEvent;
25 
26 wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_QUERY_LAYOUT_INFO, wxQueryLayoutInfoEvent );
27 wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALCULATE_LAYOUT,  wxCalculateLayoutEvent );
28 
29 enum wxLayoutOrientation
30 {
31     wxLAYOUT_HORIZONTAL,
32     wxLAYOUT_VERTICAL
33 };
34 
35 enum wxLayoutAlignment
36 {
37     wxLAYOUT_NONE,
38     wxLAYOUT_TOP,
39     wxLAYOUT_LEFT,
40     wxLAYOUT_RIGHT,
41     wxLAYOUT_BOTTOM
42 };
43 
44 // Not sure this is necessary
45 // Tell window which dimension we're sizing on
46 #define wxLAYOUT_LENGTH_Y       0x0008
47 #define wxLAYOUT_LENGTH_X       0x0000
48 
49 // Use most recently used length
50 #define wxLAYOUT_MRU_LENGTH     0x0010
51 
52 // Only a query, so don't actually move it.
53 #define wxLAYOUT_QUERY          0x0100
54 
55 /*
56  * This event is used to get information about window alignment,
57  * orientation and size.
58  */
59 
60 class WXDLLIMPEXP_ADV wxQueryLayoutInfoEvent: public wxEvent
61 {
62 public:
63     wxQueryLayoutInfoEvent(wxWindowID id = 0)
64     {
65         SetEventType(wxEVT_QUERY_LAYOUT_INFO);
66         m_requestedLength = 0;
67         m_flags = 0;
68         m_id = id;
69         m_alignment = wxLAYOUT_TOP;
70         m_orientation = wxLAYOUT_HORIZONTAL;
71     }
72 
73     // Read by the app
SetRequestedLength(int length)74     void SetRequestedLength(int length) { m_requestedLength = length; }
GetRequestedLength()75     int GetRequestedLength() const { return m_requestedLength; }
76 
SetFlags(int flags)77     void SetFlags(int flags) { m_flags = flags; }
GetFlags()78     int GetFlags() const { return m_flags; }
79 
80     // Set by the app
SetSize(const wxSize & size)81     void SetSize(const wxSize& size) { m_size = size; }
GetSize()82     wxSize GetSize() const { return m_size; }
83 
SetOrientation(wxLayoutOrientation orient)84     void SetOrientation(wxLayoutOrientation orient) { m_orientation = orient; }
GetOrientation()85     wxLayoutOrientation GetOrientation() const { return m_orientation; }
86 
SetAlignment(wxLayoutAlignment align)87     void SetAlignment(wxLayoutAlignment align) { m_alignment = align; }
GetAlignment()88     wxLayoutAlignment GetAlignment() const { return m_alignment; }
89 
Clone()90     virtual wxEvent *Clone() const { return new wxQueryLayoutInfoEvent(*this); }
91 
92 protected:
93     int                     m_flags;
94     int                     m_requestedLength;
95     wxSize                  m_size;
96     wxLayoutOrientation     m_orientation;
97     wxLayoutAlignment       m_alignment;
98 
99 private:
100     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxQueryLayoutInfoEvent)
101 };
102 
103 typedef void (wxEvtHandler::*wxQueryLayoutInfoEventFunction)(wxQueryLayoutInfoEvent&);
104 
105 #define wxQueryLayoutInfoEventHandler( func ) \
106     wxEVENT_HANDLER_CAST( wxQueryLayoutInfoEventFunction, func )
107 
108 #define EVT_QUERY_LAYOUT_INFO(func) \
109     wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_QUERY_LAYOUT_INFO, wxID_ANY, wxID_ANY, wxQueryLayoutInfoEventHandler( func ), NULL ),
110 
111 /*
112  * This event is used to take a bite out of the available client area.
113  */
114 
115 class WXDLLIMPEXP_ADV wxCalculateLayoutEvent: public wxEvent
116 {
117 public:
118     wxCalculateLayoutEvent(wxWindowID id = 0)
119     {
120         SetEventType(wxEVT_CALCULATE_LAYOUT);
121         m_flags = 0;
122         m_id = id;
123     }
124 
125     // Read by the app
SetFlags(int flags)126     void SetFlags(int flags) { m_flags = flags; }
GetFlags()127     int GetFlags() const { return m_flags; }
128 
129     // Set by the app
SetRect(const wxRect & rect)130     void SetRect(const wxRect& rect) { m_rect = rect; }
GetRect()131     wxRect GetRect() const { return m_rect; }
132 
Clone()133     virtual wxEvent *Clone() const { return new wxCalculateLayoutEvent(*this); }
134 
135 protected:
136     int                     m_flags;
137     wxRect                  m_rect;
138 
139 private:
140     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCalculateLayoutEvent)
141 };
142 
143 typedef void (wxEvtHandler::*wxCalculateLayoutEventFunction)(wxCalculateLayoutEvent&);
144 
145 #define wxCalculateLayoutEventHandler( func ) wxEVENT_HANDLER_CAST(wxCalculateLayoutEventFunction, func)
146 
147 #define EVT_CALCULATE_LAYOUT(func) \
148     wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_CALCULATE_LAYOUT, wxID_ANY, wxID_ANY, wxCalculateLayoutEventHandler( func ), NULL ),
149 
150 #if wxUSE_SASH
151 
152 // This is window that can remember alignment/orientation, does its own layout,
153 // and can provide sashes too. Useful for implementing docked windows with sashes in
154 // an IDE-style interface.
155 class WXDLLIMPEXP_ADV wxSashLayoutWindow: public wxSashWindow
156 {
157 public:
wxSashLayoutWindow()158     wxSashLayoutWindow()
159     {
160         Init();
161     }
162 
163     wxSashLayoutWindow(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
164         const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("layoutWindow"))
165     {
166         Create(parent, id, pos, size, style, name);
167     }
168 
169     bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
170         const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("layoutWindow"));
171 
172 // Accessors
GetAlignment()173     inline wxLayoutAlignment GetAlignment() const { return m_alignment; }
GetOrientation()174     inline wxLayoutOrientation GetOrientation() const { return m_orientation; }
175 
SetAlignment(wxLayoutAlignment align)176     inline void SetAlignment(wxLayoutAlignment align) { m_alignment = align; }
SetOrientation(wxLayoutOrientation orient)177     inline void SetOrientation(wxLayoutOrientation orient) { m_orientation = orient; }
178 
179     // Give the window default dimensions
SetDefaultSize(const wxSize & size)180     inline void SetDefaultSize(const wxSize& size) { m_defaultSize = size; }
181 
182 // Event handlers
183     // Called by layout algorithm to allow window to take a bit out of the
184     // client rectangle, and size itself if not in wxLAYOUT_QUERY mode.
185     void OnCalculateLayout(wxCalculateLayoutEvent& event);
186 
187     // Called by layout algorithm to retrieve information about the window.
188     void OnQueryLayoutInfo(wxQueryLayoutInfoEvent& event);
189 
190 private:
191     void Init();
192 
193     wxLayoutAlignment           m_alignment;
194     wxLayoutOrientation         m_orientation;
195     wxSize                      m_defaultSize;
196 
197 private:
198     DECLARE_DYNAMIC_CLASS_NO_COPY(wxSashLayoutWindow)
199     DECLARE_EVENT_TABLE()
200 };
201 
202 #endif // wxUSE_SASH
203 
204 class WXDLLIMPEXP_FWD_CORE wxMDIParentFrame;
205 class WXDLLIMPEXP_FWD_CORE wxFrame;
206 
207 // This class implements the layout algorithm
208 class WXDLLIMPEXP_ADV wxLayoutAlgorithm: public wxObject
209 {
210 public:
wxLayoutAlgorithm()211     wxLayoutAlgorithm() {}
212 
213 #if wxUSE_MDI_ARCHITECTURE
214     // The MDI client window is sized to whatever's left over.
215     bool LayoutMDIFrame(wxMDIParentFrame* frame, wxRect* rect = NULL);
216 #endif // wxUSE_MDI_ARCHITECTURE
217 
218     // mainWindow is sized to whatever's left over. This function for backward
219     // compatibility; use LayoutWindow.
220     bool LayoutFrame(wxFrame* frame, wxWindow* mainWindow = NULL);
221 
222     // mainWindow is sized to whatever's left over.
223     bool LayoutWindow(wxWindow* frame, wxWindow* mainWindow = NULL);
224 };
225 
226 #endif
227     // _WX_LAYWIN_H_G_
228