]> git.saurik.com Git - wxWidgets.git/blob - src/common/docmdi.cpp
implement GetBestSize() (patch 1386199)
[wxWidgets.git] / src / common / docmdi.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: docmdi.cpp
3 // Purpose: Frame classes for MDI document/view applications
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 01/02/97
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
14
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18
19 #if wxUSE_MDI_ARCHITECTURE
20
21 #include "wx/docmdi.h"
22
23 /*
24 * Docview MDI parent frame
25 */
26
27 IMPLEMENT_CLASS(wxDocMDIParentFrame, wxMDIParentFrame)
28
29 BEGIN_EVENT_TABLE(wxDocMDIParentFrame, wxMDIParentFrame)
30 EVT_MENU(wxID_EXIT, wxDocMDIParentFrame::OnExit)
31 EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocMDIParentFrame::OnMRUFile)
32 EVT_CLOSE(wxDocMDIParentFrame::OnCloseWindow)
33 END_EVENT_TABLE()
34
35 wxDocMDIParentFrame::wxDocMDIParentFrame()
36 {
37 Init();
38 }
39
40 wxDocMDIParentFrame::wxDocMDIParentFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const wxString& title,
41 const wxPoint& pos, const wxSize& size, long style, const wxString& name)
42 {
43 Init();
44 Create(manager, frame, id, title, pos, size, style, name);
45 }
46
47 bool wxDocMDIParentFrame::Create(wxDocManager *manager, wxFrame *frame, wxWindowID id, const wxString& title,
48 const wxPoint& pos, const wxSize& size, long style, const wxString& name)
49 {
50 m_docManager = manager;
51 return wxMDIParentFrame::Create(frame, id, title, pos, size, style, name);
52 }
53
54 void wxDocMDIParentFrame::OnExit(wxCommandEvent& WXUNUSED(event))
55 {
56 Close();
57 }
58
59 void wxDocMDIParentFrame::Init()
60 {
61 m_docManager = NULL;
62 }
63
64 void wxDocMDIParentFrame::OnMRUFile(wxCommandEvent& event)
65 {
66 wxString f(m_docManager->GetHistoryFile(event.GetId() - wxID_FILE1));
67 if (!f.empty())
68 (void)m_docManager->CreateDocument(f, wxDOC_SILENT);
69 }
70
71 // Extend event processing to search the view's event table
72 bool wxDocMDIParentFrame::ProcessEvent(wxEvent& event)
73 {
74 // Try the document manager, then do default processing
75 if (!m_docManager || !m_docManager->ProcessEvent(event))
76 return wxEvtHandler::ProcessEvent(event);
77 else
78 return true;
79 }
80
81 void wxDocMDIParentFrame::OnCloseWindow(wxCloseEvent& event)
82 {
83 if (m_docManager->Clear(!event.CanVeto()))
84 {
85 this->Destroy();
86 }
87 else
88 event.Veto();
89 }
90
91
92 /*
93 * Default document child frame for MDI children
94 */
95
96 IMPLEMENT_CLASS(wxDocMDIChildFrame, wxMDIChildFrame)
97
98 BEGIN_EVENT_TABLE(wxDocMDIChildFrame, wxMDIChildFrame)
99 EVT_ACTIVATE(wxDocMDIChildFrame::OnActivate)
100 EVT_CLOSE(wxDocMDIChildFrame::OnCloseWindow)
101 END_EVENT_TABLE()
102
103 void wxDocMDIChildFrame::Init()
104 {
105 m_childDocument = (wxDocument*) NULL;
106 m_childView = (wxView*) NULL;
107 }
108
109 wxDocMDIChildFrame::wxDocMDIChildFrame()
110 {
111 Init();
112 }
113
114 wxDocMDIChildFrame::wxDocMDIChildFrame(wxDocument *doc, wxView *view, wxMDIParentFrame *frame, wxWindowID id,
115 const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name)
116 {
117 Init();
118 Create(doc, view, frame, id, title, pos, size, style, name);
119 }
120
121 bool wxDocMDIChildFrame::Create(wxDocument *doc, wxView *view, wxMDIParentFrame *frame, wxWindowID id,
122 const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name)
123 {
124 m_childDocument = doc;
125 m_childView = view;
126 if (wxMDIChildFrame::Create(frame, id, title, pos, size, style, name))
127 {
128 if (view)
129 view->SetFrame(this);
130 return true;
131 }
132
133 return false;
134 }
135
136 wxDocMDIChildFrame::~wxDocMDIChildFrame(void)
137 {
138 m_childView = (wxView *) NULL;
139 }
140
141 // Extend event processing to search the view's event table
142 bool wxDocMDIChildFrame::ProcessEvent(wxEvent& event)
143 {
144 static wxEvent *ActiveEvent = NULL;
145
146 // Break recursion loops
147 if (ActiveEvent == &event)
148 return false;
149
150 ActiveEvent = &event;
151
152 bool ret;
153 if ( !m_childView || ! m_childView->ProcessEvent(event) )
154 {
155 // Only hand up to the parent if it's a menu command
156 if (!event.IsKindOf(CLASSINFO(wxCommandEvent)) || !GetParent() || !GetParent()->ProcessEvent(event))
157 ret = wxEvtHandler::ProcessEvent(event);
158 else
159 ret = true;
160 }
161 else
162 ret = true;
163
164 ActiveEvent = NULL;
165 return ret;
166 }
167
168 void wxDocMDIChildFrame::OnActivate(wxActivateEvent& event)
169 {
170 wxMDIChildFrame::OnActivate(event);
171
172 if (event.GetActive() && m_childView)
173 m_childView->Activate(event.GetActive());
174 }
175
176 void wxDocMDIChildFrame::OnCloseWindow(wxCloseEvent& event)
177 {
178 // Close view but don't delete the frame while doing so!
179 // ...since it will be deleted by wxWidgets if we return true.
180 if (m_childView)
181 {
182 bool ans = event.CanVeto()
183 ? m_childView->Close(false) // false means don't delete associated window
184 : true; // Must delete.
185
186 if (ans)
187 {
188 m_childView->Activate(false);
189 delete m_childView;
190 m_childView = (wxView *) NULL;
191 m_childDocument = (wxDocument *) NULL;
192
193 this->Destroy();
194 }
195 else
196 event.Veto();
197 }
198 else
199 event.Veto();
200 }
201
202 #endif
203 // wxUSE_DOC_VIEW_ARCHITECTURE
204