1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/generic/mdig.h
3 // Purpose:     Generic MDI (Multiple Document Interface) classes
4 // Author:      Hans Van Leemputten
5 // Modified by:
6 // Created:     29/07/2002
7 // RCS-ID:      $Id: mdig.h 41223 2006-09-14 17:36:18Z PC $
8 // Copyright:   (c) Hans Van Leemputten
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_MDIG_H_
13 #define _WX_MDIG_H_
14 
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18 
19 #include "wx/frame.h"
20 #include "wx/panel.h"
21 #include "wx/notebook.h"
22 
23 extern WXDLLEXPORT_DATA(const wxChar) wxStatusLineNameStr[];
24 
25 
26 //-----------------------------------------------------------------------------
27 // classes
28 //-----------------------------------------------------------------------------
29 
30 class WXDLLEXPORT wxGenericMDIParentFrame;
31 class WXDLLEXPORT wxGenericMDIClientWindow;
32 class WXDLLEXPORT wxGenericMDIChildFrame;
33 
34 //-----------------------------------------------------------------------------
35 // wxGenericMDIParentFrame
36 //-----------------------------------------------------------------------------
37 
38 class WXDLLEXPORT wxGenericMDIParentFrame: public wxFrame
39 {
40 public:
41     wxGenericMDIParentFrame();
42     wxGenericMDIParentFrame(wxWindow *parent,
43                      wxWindowID winid,
44                      const wxString& title,
45                      const wxPoint& pos = wxDefaultPosition,
46                      const wxSize& size = wxDefaultSize,
47                      long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
48                      const wxString& name = wxFrameNameStr);
49 
50     virtual ~wxGenericMDIParentFrame();
51     bool Create( wxWindow *parent,
52                  wxWindowID winid,
53                  const wxString& title,
54                  const wxPoint& pos = wxDefaultPosition,
55                  const wxSize& size = wxDefaultSize,
56                  long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
57                  const wxString& name = wxFrameNameStr );
58 
59 #if wxUSE_MENUS
GetWindowMenu()60     wxMenu* GetWindowMenu() const { return m_pWindowMenu; };
61     void SetWindowMenu(wxMenu* pMenu);
62 
63     virtual void SetMenuBar(wxMenuBar *pMenuBar);
64 #endif // wxUSE_MENUS
65 
66     void SetChildMenuBar(wxGenericMDIChildFrame *pChild);
67 
68     virtual bool ProcessEvent(wxEvent& event);
69 
70     wxGenericMDIChildFrame *GetActiveChild() const;
71     inline void SetActiveChild(wxGenericMDIChildFrame* pChildFrame);
72 
73     wxGenericMDIClientWindow *GetClientWindow() const;
74     virtual wxGenericMDIClientWindow *OnCreateClient();
75 
Cascade()76     virtual void Cascade() { /* Has no effect */ }
77     virtual void Tile(wxOrientation WXUNUSED(orient) = wxHORIZONTAL) { }
ArrangeIcons()78     virtual void ArrangeIcons() { /* Has no effect */ }
79     virtual void ActivateNext();
80     virtual void ActivatePrevious();
81 
82 protected:
83     wxGenericMDIClientWindow   *m_pClientWindow;
84     wxGenericMDIChildFrame     *m_pActiveChild;
85 #if wxUSE_MENUS
86     wxMenu              *m_pWindowMenu;
87     wxMenuBar           *m_pMyMenuBar;
88 #endif // wxUSE_MENUS
89 
90 protected:
91     void Init();
92 
93 #if wxUSE_MENUS
94     void RemoveWindowMenu(wxMenuBar *pMenuBar);
95     void AddWindowMenu(wxMenuBar *pMenuBar);
96 
97     void DoHandleMenu(wxCommandEvent &event);
98 #endif // wxUSE_MENUS
99 
100     virtual void DoGetClientSize(int *width, int *height) const;
101 
102 private:
103     DECLARE_EVENT_TABLE()
104     DECLARE_DYNAMIC_CLASS(wxGenericMDIParentFrame)
105 };
106 
107 //-----------------------------------------------------------------------------
108 // wxGenericMDIChildFrame
109 //-----------------------------------------------------------------------------
110 
111 class WXDLLEXPORT wxGenericMDIChildFrame: public wxPanel
112 {
113 public:
114     wxGenericMDIChildFrame();
115     wxGenericMDIChildFrame( wxGenericMDIParentFrame *parent,
116                      wxWindowID winid,
117                      const wxString& title,
118                      const wxPoint& pos = wxDefaultPosition,
119                      const wxSize& size = wxDefaultSize,
120                      long style = wxDEFAULT_FRAME_STYLE,
121                      const wxString& name = wxFrameNameStr );
122 
123     virtual ~wxGenericMDIChildFrame();
124     bool Create( wxGenericMDIParentFrame *parent,
125                  wxWindowID winid,
126                  const wxString& title,
127                  const wxPoint& pos = wxDefaultPosition,
128                  const wxSize& size = wxDefaultSize,
129                  long style = wxDEFAULT_FRAME_STYLE,
130                  const wxString& name = wxFrameNameStr );
131 
132 #if wxUSE_MENUS
133     virtual void SetMenuBar( wxMenuBar *menu_bar );
134     virtual wxMenuBar *GetMenuBar() const;
135 #endif // wxUSE_MENUS
136 
137     virtual void SetTitle(const wxString& title);
138     virtual wxString GetTitle() const;
139 
140     virtual void Activate();
141 
142 #if wxUSE_STATUSBAR
143     // no status bars
WXUNUSED(number)144     virtual wxStatusBar* CreateStatusBar( int WXUNUSED(number) = 1,
145                                         long WXUNUSED(style) = 1,
146                                         wxWindowID WXUNUSED(winid) = 1,
147                                         const wxString& WXUNUSED(name) = wxEmptyString)
148       { return (wxStatusBar*)NULL; }
149 
GetStatusBar()150     virtual wxStatusBar *GetStatusBar() const { return (wxStatusBar*)NULL; }
151     virtual void SetStatusText( const wxString &WXUNUSED(text), int WXUNUSED(number)=0 ) {}
SetStatusWidths(int WXUNUSED (n),const int WXUNUSED (widths_field)[])152     virtual void SetStatusWidths( int WXUNUSED(n), const int WXUNUSED(widths_field)[] ) {}
153 #endif
154 
155     // no size hints
WXUNUSED(minW)156     virtual void DoSetSizeHints( int WXUNUSED(minW),
157                                int WXUNUSED(minH),
158                                int WXUNUSED(maxW) = wxDefaultCoord,
159                                int WXUNUSED(maxH) = wxDefaultCoord,
160                                int WXUNUSED(incW) = wxDefaultCoord,
161                                int WXUNUSED(incH) = wxDefaultCoord) {}
162 
163 #if wxUSE_TOOLBAR
164     // no toolbar bars
CreateToolBar(long WXUNUSED (style),wxWindowID WXUNUSED (winid),const wxString & WXUNUSED (name))165     virtual wxToolBar* CreateToolBar( long WXUNUSED(style),
166                                        wxWindowID WXUNUSED(winid),
167                                        const wxString& WXUNUSED(name) )
168         { return (wxToolBar*)NULL; }
GetToolBar()169     virtual wxToolBar *GetToolBar() const { return (wxToolBar*)NULL; }
170 #endif
171 
172     // no icon
SetIcon(const wxIcon & WXUNUSED (icon))173     void SetIcon( const wxIcon& WXUNUSED(icon) ) { }
SetIcons(const wxIconBundle & WXUNUSED (icons))174     void SetIcons( const wxIconBundle& WXUNUSED(icons) ) { }
175 
176     // no maximize etc
WXUNUSED(maximize)177     virtual void Maximize( bool WXUNUSED(maximize) = true) { /* Has no effect */ }
Restore()178     virtual void Restore() { /* Has no effect */ }
WXUNUSED(iconize)179     virtual void Iconize(bool WXUNUSED(iconize)  = true) { /* Has no effect */ }
IsMaximized()180     virtual bool IsMaximized() const { return true; }
IsIconized()181     virtual bool IsIconized() const { return false; }
ShowFullScreen(bool WXUNUSED (show),long WXUNUSED (style))182     virtual bool ShowFullScreen(bool WXUNUSED(show), long WXUNUSED(style)) { return false; }
IsFullScreen()183     virtual bool IsFullScreen() const { return false; }
184 
IsTopLevel()185     virtual bool IsTopLevel() const { return false; }
186 
187     void OnMenuHighlight(wxMenuEvent& event);
188     void OnActivate(wxActivateEvent& event);
189 
190     // The next 2 are copied from top level...
191     void OnCloseWindow(wxCloseEvent& event);
192     void OnSize(wxSizeEvent& event);
193 
194     void SetMDIParentFrame(wxGenericMDIParentFrame* parentFrame);
195     wxGenericMDIParentFrame* GetMDIParentFrame() const;
196 
197 protected:
198     wxGenericMDIParentFrame *m_pMDIParentFrame;
199     wxRect            m_MDIRect;
200     wxString          m_Title;
201 
202 #if wxUSE_MENUS
203     wxMenuBar        *m_pMenuBar;
204 #endif // wxUSE_MENUS
205 
206 protected:
207     void Init();
208 
209     virtual void DoMoveWindow(int x, int y, int width, int height);
210 
211     // This function needs to be called when a size change is confirmed,
212     // we needed this function to prevent any body from the outside
213     // changing the panel... it messes the UI layout when we would allow it.
214     void ApplyMDIChildFrameRect();
215 
216 private:
217     DECLARE_DYNAMIC_CLASS(wxGenericMDIChildFrame)
218     DECLARE_EVENT_TABLE()
219 
220     friend class wxGenericMDIClientWindow;
221 };
222 
223 //-----------------------------------------------------------------------------
224 // wxGenericMDIClientWindow
225 //-----------------------------------------------------------------------------
226 
227 class WXDLLEXPORT wxGenericMDIClientWindow: public wxNotebook
228 {
229 public:
230     wxGenericMDIClientWindow();
231     wxGenericMDIClientWindow( wxGenericMDIParentFrame *parent, long style = 0 );
232     virtual ~wxGenericMDIClientWindow();
233     virtual bool CreateClient( wxGenericMDIParentFrame *parent, long style = wxVSCROLL | wxHSCROLL );
234 
235     virtual int SetSelection(size_t nPage);
236 
237 protected:
238     void PageChanged(int OldSelection, int newSelection);
239 
240     void OnPageChanged(wxNotebookEvent& event);
241     void OnSize(wxSizeEvent& event);
242 
243 private:
244     DECLARE_DYNAMIC_CLASS(wxGenericMDIClientWindow)
245     DECLARE_EVENT_TABLE()
246 };
247 
248 
249 /*
250  * Define normal wxMDI classes based on wxGenericMDI
251  */
252 
253 #ifndef wxUSE_GENERIC_MDI_AS_NATIVE
254 #if defined(__WXUNIVERSAL__) || defined(__WXPM__) || defined(__WXCOCOA__)
255 #define wxUSE_GENERIC_MDI_AS_NATIVE   1
256 #else
257 #define wxUSE_GENERIC_MDI_AS_NATIVE   0
258 #endif
259 #endif // wxUSE_GENERIC_MDI_AS_NATIVE
260 
261 #if wxUSE_GENERIC_MDI_AS_NATIVE
262 
263 class wxMDIChildFrame ;
264 
265 //-----------------------------------------------------------------------------
266 // wxMDIParentFrame
267 //-----------------------------------------------------------------------------
268 
269 class WXDLLEXPORT wxMDIParentFrame: public wxGenericMDIParentFrame
270 {
271 public:
wxMDIParentFrame()272     wxMDIParentFrame() {}
273     wxMDIParentFrame(wxWindow *parent,
274                      wxWindowID winid,
275                      const wxString& title,
276                      const wxPoint& pos = wxDefaultPosition,
277                      const wxSize& size = wxDefaultSize,
278                      long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
279                      const wxString& name = wxFrameNameStr)
wxGenericMDIParentFrame(parent,winid,title,pos,size,style,name)280          :wxGenericMDIParentFrame(parent, winid, title, pos, size, style, name)
281      {
282      }
283 
284     wxMDIChildFrame * GetActiveChild() const ;
285 
286 
287 private:
288     DECLARE_DYNAMIC_CLASS(wxMDIParentFrame)
289 };
290 
291 //-----------------------------------------------------------------------------
292 // wxMDIChildFrame
293 //-----------------------------------------------------------------------------
294 
295 class WXDLLEXPORT wxMDIChildFrame: public wxGenericMDIChildFrame
296 {
297 public:
wxMDIChildFrame()298     wxMDIChildFrame() {}
299 
300     wxMDIChildFrame( wxGenericMDIParentFrame *parent,
301                      wxWindowID winid,
302                      const wxString& title,
303                      const wxPoint& pos = wxDefaultPosition,
304                      const wxSize& size = wxDefaultSize,
305                      long style = wxDEFAULT_FRAME_STYLE,
306                      const wxString& name = wxFrameNameStr )
wxGenericMDIChildFrame(parent,winid,title,pos,size,style,name)307          :wxGenericMDIChildFrame(parent, winid, title, pos, size, style, name)
308      {
309      }
310 private:
311     DECLARE_DYNAMIC_CLASS(wxMDIChildFrame)
312 };
313 
314 //-----------------------------------------------------------------------------
315 // wxMDIClientWindow
316 //-----------------------------------------------------------------------------
317 
318 class WXDLLEXPORT wxMDIClientWindow: public wxGenericMDIClientWindow
319 {
320 public:
wxMDIClientWindow()321     wxMDIClientWindow() {}
322 
323     wxMDIClientWindow( wxGenericMDIParentFrame *parent, long style = 0 )
wxGenericMDIClientWindow(parent,style)324         :wxGenericMDIClientWindow(parent, style)
325     {
326     }
327 
328 private:
329     DECLARE_DYNAMIC_CLASS(wxMDIClientWindow)
330 };
331 
332 #endif
333 
334 #endif
335     // _WX_MDIG_H_
336