1/////////////////////////////////////////////////////////////////////////////
2// Name:        wx/motif/mdi.h
3// Purpose:     MDI (Multiple Document Interface) classes.
4// Author:      Julian Smart
5// Modified by:
6// Created:     17/09/98
7// RCS-ID:      $Id: mdi.h 41020 2006-09-05 20:47:48Z VZ $
8// Copyright:   (c) Julian Smart
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_MDI_H_
13#define _WX_MDI_H_
14
15/*
16New MDI scheme using tabs. We can use a wxNotebook to implement the client
17window. wxMDIChildFrame can be implemented as an XmMainWindow widget
18as before, and is a child of the notebook _and_ of the parent frame...
19but wxMDIChildFrame::GetParent should return the parent frame.
20
21*/
22
23#include "wx/frame.h"
24#include "wx/notebook.h"
25
26class WXDLLEXPORT wxMDIClientWindow;
27class WXDLLEXPORT wxMDIChildFrame;
28
29class WXDLLEXPORT wxMDIParentFrame: public wxFrame
30{
31    DECLARE_DYNAMIC_CLASS(wxMDIParentFrame)
32
33        friend class WXDLLEXPORT wxMDIChildFrame;
34public:
35
36    wxMDIParentFrame();
37    inline wxMDIParentFrame(wxWindow *parent,
38        wxWindowID id,
39        const wxString& title,
40        const wxPoint& pos = wxDefaultPosition,
41        const wxSize& size = wxDefaultSize,
42        long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,  // Scrolling refers to client window
43        const wxString& name = wxFrameNameStr)
44    {
45        Create(parent, id, title, pos, size, style, name);
46    }
47
48    virtual ~wxMDIParentFrame();
49
50    bool Create(wxWindow *parent,
51        wxWindowID id,
52        const wxString& title,
53        const wxPoint& pos = wxDefaultPosition,
54        const wxSize& size = wxDefaultSize,
55        long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
56        const wxString& name = wxFrameNameStr);
57
58    void OnSize(wxSizeEvent& event);
59    void OnActivate(wxActivateEvent& event);
60    void OnSysColourChanged(wxSysColourChangedEvent& event);
61    void OnMenuHighlight(wxMenuEvent& event);
62
63    void SetMenuBar(wxMenuBar *menu_bar);
64
65    // Get the active MDI child window
66    wxMDIChildFrame *GetActiveChild() const ;
67
68    // Get the client window
69    wxMDIClientWindow *GetClientWindow() const { return m_clientWindow; };
70
71    // Create the client window class (don't Create the window,
72    // just return a new class)
73    virtual wxMDIClientWindow *OnCreateClient() ;
74
75    // MDI operations
76    virtual void Cascade();
77    virtual void Tile(wxOrientation WXUNUSED(orient) = wxHORIZONTAL);
78    virtual void ArrangeIcons();
79    virtual void ActivateNext();
80    virtual void ActivatePrevious();
81
82    // Implementation
83
84    // Set the active child
85    inline void SetActiveChild(wxMDIChildFrame* child) { m_activeChild = child; }
86
87    // Set the child's menubar into the parent frame
88    void SetChildMenuBar(wxMDIChildFrame* frame);
89
90    inline wxMenuBar* GetActiveMenuBar() const { return m_activeMenuBar; }
91
92    // Redirect events to active child first
93    virtual bool ProcessEvent(wxEvent& event);
94
95protected:
96    virtual void DoSetSize(int x, int y,
97        int width, int height,
98        int sizeFlags = wxSIZE_AUTO);
99    virtual void DoSetClientSize(int width, int height);
100
101    // Gets the size available for subwindows after menu size, toolbar size
102    // and status bar size have been subtracted. If you want to manage your own
103    // toolbar(s), don't call SetToolBar.
104    void DoGetClientSize(int *width, int *height) const;
105
106protected:
107
108    wxMDIClientWindow*    m_clientWindow;
109    wxMDIChildFrame*      m_activeChild;
110    wxMenuBar*            m_activeMenuBar;
111
112    DECLARE_EVENT_TABLE()
113};
114
115class WXDLLEXPORT wxMDIChildFrame: public wxFrame
116{
117    DECLARE_DYNAMIC_CLASS(wxMDIChildFrame)
118
119public:
120    wxMDIChildFrame();
121    wxMDIChildFrame(wxMDIParentFrame *parent,
122        wxWindowID id,
123        const wxString& title,
124        const wxPoint& pos = wxDefaultPosition,
125        const wxSize& size = wxDefaultSize,
126        long style = wxDEFAULT_FRAME_STYLE,
127        const wxString& name = wxFrameNameStr)
128    {
129        Create(parent, id, title, pos, size, style, name);
130    }
131
132    virtual ~wxMDIChildFrame();
133
134    bool Create(wxMDIParentFrame *parent,
135        wxWindowID id,
136        const wxString& title,
137        const wxPoint& pos = wxDefaultPosition,
138        const wxSize& size = wxDefaultSize,
139        long style = wxDEFAULT_FRAME_STYLE,
140        const wxString& name = wxFrameNameStr);
141
142    // Set menu bar
143    void SetMenuBar(wxMenuBar *menu_bar);
144    void SetTitle(const wxString& title);
145
146    // Set icon
147    virtual void SetIcon(const wxIcon& icon);
148    virtual void SetIcons(const wxIconBundle& icons );
149
150    // Override wxFrame operations
151    void CaptureMouse();
152    void ReleaseMouse();
153    void Raise();
154    void Lower(void);
155    void DoSetSizeHints(int minW = wxDefaultCoord,
156                        int minH = wxDefaultCoord,
157                        int maxW = wxDefaultCoord,
158                        int maxH = wxDefaultCoord,
159                        int incW = wxDefaultCoord,
160                        int incH = wxDefaultCoord);
161
162    // MDI operations
163    virtual void Maximize();
164    virtual void Maximize(bool WXUNUSED(maximize)) { };
165    inline void Minimize() { Iconize(true); };
166    virtual void Iconize(bool iconize);
167    virtual void Restore();
168    virtual void Activate();
169    virtual bool IsIconized() const ;
170
171    virtual bool IsTopLevel() const { return false; }
172
173    // Is the frame maximized? Returns true for
174    // wxMDIChildFrame due to the tabbed implementation.
175    virtual bool IsMaximized(void) const ;
176
177    bool Show(bool show);
178
179    WXWidget GetMainWidget() const { return m_mainWidget; };
180    WXWidget GetTopWidget() const { return m_mainWidget; };
181    WXWidget GetClientWidget() const { return m_mainWidget; };
182
183    /*
184    virtual void OnRaise();
185    virtual void OnLower();
186    */
187
188    void SetMDIParentFrame(wxMDIParentFrame* parentFrame) { m_mdiParentFrame = parentFrame; }
189    wxMDIParentFrame* GetMDIParentFrame() const { return m_mdiParentFrame; }
190
191protected:
192    wxMDIParentFrame* m_mdiParentFrame;
193
194    virtual void DoSetSize(int x, int y,
195        int width, int height,
196        int sizeFlags = wxSIZE_AUTO);
197    virtual void DoSetClientSize(int width, int height);
198
199    void DoGetClientSize(int *width, int *height) const;
200    void DoGetSize(int *width, int *height) const;
201    void DoGetPosition(int *x, int *y) const ;
202};
203
204/* The client window is a child of the parent MDI frame, and itself
205* contains the child MDI frames.
206* However, you create the MDI children as children of the MDI parent:
207* only in the implementation does the client window become the parent
208* of the children. Phew! So the children are sort of 'adopted'...
209*/
210
211class WXDLLEXPORT wxMDIClientWindow: public wxNotebook
212{
213    DECLARE_DYNAMIC_CLASS(wxMDIClientWindow)
214
215public:
216    wxMDIClientWindow() ;
217    wxMDIClientWindow(wxMDIParentFrame *parent, long style = 0)
218    {
219        CreateClient(parent, style);
220    }
221
222    virtual ~wxMDIClientWindow();
223
224    // Note: this is virtual, to allow overridden behaviour.
225    virtual bool CreateClient(wxMDIParentFrame *parent, long style = wxVSCROLL | wxHSCROLL);
226
227    // Explicitly call default scroll behaviour
228    void OnScroll(wxScrollEvent& event);
229
230    // Implementation
231    void OnPageChanged(wxNotebookEvent& event);
232
233    int FindPage(const wxNotebookPage* page);
234
235protected:
236    virtual void DoSetSize(int x, int y,
237        int width, int height,
238        int sizeFlags = wxSIZE_AUTO);
239    virtual void DoSetClientSize(int width, int height);
240
241    void DoGetClientSize(int *width, int *height) const;
242    void DoGetSize(int *width, int *height) const ;
243    void DoGetPosition(int *x, int *y) const ;
244
245private:
246    DECLARE_EVENT_TABLE()
247};
248
249#endif
250// _WX_MDI_H_
251