1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: MDI (Multiple Document Interface) classes.
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
16 #pragma interface "mdi.h"
20 New MDI scheme using tabs. We can use a wxNotebook to implement the client
21 window. wxMDIChildFrame can be implemented as an XmMainWindow widget
22 as before, and is a child of the notebook _and_ of the parent frame...
23 but wxMDIChildFrame::GetParent should return the parent frame.
28 #include "wx/notebook.h"
30 WXDLLEXPORT_DATA(extern const char*) wxFrameNameStr
;
31 WXDLLEXPORT_DATA(extern const char*) wxStatusLineNameStr
;
33 class WXDLLEXPORT wxMDIClientWindow
;
34 class WXDLLEXPORT wxMDIChildFrame
;
36 class WXDLLEXPORT wxMDIParentFrame
: public wxFrame
38 DECLARE_DYNAMIC_CLASS(wxMDIParentFrame
)
40 friend class WXDLLEXPORT wxMDIChildFrame
;
44 inline wxMDIParentFrame(wxWindow
*parent
,
46 const wxString
& title
,
47 const wxPoint
& pos
= wxDefaultPosition
,
48 const wxSize
& size
= wxDefaultSize
,
49 long style
= wxDEFAULT_FRAME_STYLE
| wxVSCROLL
| wxHSCROLL
, // Scrolling refers to client window
50 const wxString
& name
= wxFrameNameStr
)
52 Create(parent
, id
, title
, pos
, size
, style
, name
);
57 bool Create(wxWindow
*parent
,
59 const wxString
& title
,
60 const wxPoint
& pos
= wxDefaultPosition
,
61 const wxSize
& size
= wxDefaultSize
,
62 long style
= wxDEFAULT_FRAME_STYLE
| wxVSCROLL
| wxHSCROLL
,
63 const wxString
& name
= wxFrameNameStr
);
65 void OnSize(wxSizeEvent
& event
);
66 void OnActivate(wxActivateEvent
& event
);
67 void OnSysColourChanged(wxSysColourChangedEvent
& event
);
69 void SetMenuBar(wxMenuBar
*menu_bar
);
71 // Gets the size available for subwindows after menu size, toolbar size
72 // and status bar size have been subtracted. If you want to manage your own
73 // toolbar(s), don't call SetToolBar.
74 void GetClientSize(int *width
, int *height
) const;
75 wxSize
GetClientSize() const { return wxWindow::GetClientSize(); }
77 // Get the active MDI child window
78 wxMDIChildFrame
*GetActiveChild() const ;
80 // Get the client window
81 inline wxMDIClientWindow
*GetClientWindow() const { return m_clientWindow
; };
83 // Create the client window class (don't Create the window,
84 // just return a new class)
85 virtual wxMDIClientWindow
*OnCreateClient() ;
88 virtual void Cascade();
90 virtual void ArrangeIcons();
91 virtual void ActivateNext();
92 virtual void ActivatePrevious();
96 // Set the active child
97 inline void SetActiveChild(wxMDIChildFrame
* child
) { m_activeChild
= child
; }
99 // Set the child's menubar into the parent frame
100 void SetChildMenuBar(wxMDIChildFrame
* frame
);
102 inline wxMenuBar
* GetActiveMenuBar() const { return m_activeMenuBar
; }
104 // Redirect events to active child first
105 virtual bool ProcessEvent(wxEvent
& event
);
110 wxMDIClientWindow
* m_clientWindow
;
111 wxMDIChildFrame
* m_activeChild
;
112 wxMenuBar
* m_activeMenuBar
;
114 DECLARE_EVENT_TABLE()
117 class WXDLLEXPORT wxMDIChildFrame
: public wxFrame
119 DECLARE_DYNAMIC_CLASS(wxMDIChildFrame
)
123 inline wxMDIChildFrame(wxMDIParentFrame
*parent
,
125 const wxString
& title
,
126 const wxPoint
& pos
= wxDefaultPosition
,
127 const wxSize
& size
= wxDefaultSize
,
128 long style
= wxDEFAULT_FRAME_STYLE
,
129 const wxString
& name
= wxFrameNameStr
)
131 Create(parent
, id
, title
, pos
, size
, style
, name
);
136 bool Create(wxMDIParentFrame
*parent
,
138 const wxString
& title
,
139 const wxPoint
& pos
= wxDefaultPosition
,
140 const wxSize
& size
= wxDefaultSize
,
141 long style
= wxDEFAULT_FRAME_STYLE
,
142 const wxString
& name
= wxFrameNameStr
);
145 void SetMenuBar(wxMenuBar
*menu_bar
);
146 void SetTitle(const wxString
& title
);
148 void SetClientSize(int width
, int height
);
149 void SetClientSize(const wxSize
& size
) { wxWindow::SetClientSize(size
); }
151 void GetClientSize(int *width
, int *height
) const;
152 wxSize
GetClientSize() const { return wxWindow::GetClientSize(); }
154 void SetSize(int x
, int y
, int width
, int height
, int sizeFlags
= wxSIZE_AUTO
);
155 virtual void SetSize(const wxRect
& rect
, int sizeFlags
= wxSIZE_AUTO
)
156 { wxWindow::SetSize(rect
, sizeFlags
); }
157 virtual void SetSize(const wxSize
& size
) { wxWindow::SetSize(size
); }
158 virtual void SetSize(int width
, int height
) { SetSize(-1, -1, width
, height
, wxSIZE_USE_EXISTING
); }
160 void GetSize(int *width
, int *height
) const;
161 wxSize
GetSize() const { return wxWindow::GetSize(); }
163 void GetPosition(int *x
, int *y
) const ;
164 wxPoint
GetPosition() const { return wxWindow::GetPosition(); }
167 virtual void SetIcon(const wxIcon
& icon
);
169 // Override wxFrame operations
174 void SetSizeHints(int minW
= -1, int minH
= -1, int maxW
= -1, int maxH
= -1, int incW
= -1, int incH
= -1);
177 virtual void Maximize();
178 inline void Minimize() { Iconize(TRUE
); };
179 virtual void Iconize(bool iconize
);
180 virtual void Restore();
181 virtual void Activate();
182 virtual bool IsIconized() const ;
184 // Is the frame maximized? Returns TRUE for
185 // wxMDIChildFrame due to the tabbed implementation.
186 virtual bool IsMaximized(void) const ;
188 bool Show(bool show
);
190 inline WXWidget
GetMainWidget() const { return m_mainWidget
; };
191 inline WXWidget
GetTopWidget() const { return m_mainWidget
; };
192 inline WXWidget
GetClientWidget() const { return m_mainWidget
; };
195 virtual void OnRaise();
196 virtual void OnLower();
199 inline void SetMDIParentFrame(wxMDIParentFrame
* parentFrame
) { m_mdiParentFrame
= parentFrame
; }
200 inline wxMDIParentFrame
* GetMDIParentFrame() const { return m_mdiParentFrame
; }
203 wxMDIParentFrame
* m_mdiParentFrame
;
206 /* The client window is a child of the parent MDI frame, and itself
207 * contains the child MDI frames.
208 * However, you create the MDI children as children of the MDI parent:
209 * only in the implementation does the client window become the parent
210 * of the children. Phew! So the children are sort of 'adopted'...
213 class WXDLLEXPORT wxMDIClientWindow
: public wxNotebook
215 DECLARE_DYNAMIC_CLASS(wxMDIClientWindow
)
218 wxMDIClientWindow() ;
219 inline wxMDIClientWindow(wxMDIParentFrame
*parent
, long style
= 0)
221 CreateClient(parent
, style
);
224 ~wxMDIClientWindow();
226 void SetSize(int x
, int y
, int width
, int height
, int sizeFlags
= wxSIZE_AUTO
);
227 void SetSize(const wxRect
& rect
, int sizeFlags
= wxSIZE_AUTO
)
228 { wxWindow::SetSize(rect
, sizeFlags
); }
229 void SetSize(const wxSize
& size
) { wxWindow::SetSize(size
); }
230 virtual void SetSize(int width
, int height
) { SetSize(-1, -1, width
, height
, wxSIZE_USE_EXISTING
); }
232 void SetClientSize(int width
, int height
);
233 void SetClientSize(const wxSize
& size
) { wxWindow::SetClientSize(size
); }
235 void GetClientSize(int *width
, int *height
) const;
236 wxSize
GetClientSize() const { return wxWindow::GetClientSize(); }
238 void GetSize(int *width
, int *height
) const ;
239 wxSize
GetSize() const { return wxWindow::GetSize(); }
241 void GetPosition(int *x
, int *y
) const ;
242 wxPoint
GetPosition() const { return wxWindow::GetPosition(); }
244 // Note: this is virtual, to allow overridden behaviour.
245 virtual bool CreateClient(wxMDIParentFrame
*parent
, long style
= wxVSCROLL
| wxHSCROLL
);
247 // Explicitly call default scroll behaviour
248 void OnScroll(wxScrollEvent
& event
);
251 void OnPageChanged(wxNotebookEvent
& event
);
255 DECLARE_EVENT_TABLE()