refactor wxDocChildFrame and wxDocMDIChildFrame to use wxDocChildFrameAny intead of duplicating its code (with subtle differences, as usual); also added wxDocChildFrameAnyBase and store a pointer to it in wxView to reset the frame view if the view is being deleted because its creation fails to avoid crashes in this case
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59185 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -87,97 +87,7 @@ void wxDocMDIParentFrame::OnCloseWindow(wxCloseEvent& event)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Default document child frame for MDI children
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(wxDocMDIChildFrame, wxMDIChildFrame)
|
||||
|
||||
BEGIN_EVENT_TABLE(wxDocMDIChildFrame, wxMDIChildFrame)
|
||||
EVT_ACTIVATE(wxDocMDIChildFrame::OnActivate)
|
||||
EVT_CLOSE(wxDocMDIChildFrame::OnCloseWindow)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
void wxDocMDIChildFrame::Init()
|
||||
{
|
||||
m_childDocument = NULL;
|
||||
m_childView = NULL;
|
||||
}
|
||||
|
||||
wxDocMDIChildFrame::wxDocMDIChildFrame()
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
wxDocMDIChildFrame::wxDocMDIChildFrame(wxDocument *doc, wxView *view, wxMDIParentFrame *frame, wxWindowID id,
|
||||
const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name)
|
||||
{
|
||||
Init();
|
||||
Create(doc, view, frame, id, title, pos, size, style, name);
|
||||
}
|
||||
|
||||
bool wxDocMDIChildFrame::Create(wxDocument *doc, wxView *view, wxMDIParentFrame *frame, wxWindowID id,
|
||||
const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name)
|
||||
{
|
||||
m_childDocument = doc;
|
||||
m_childView = view;
|
||||
if (wxMDIChildFrame::Create(frame, id, title, pos, size, style, name))
|
||||
{
|
||||
if (view)
|
||||
view->SetFrame(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
wxDocMDIChildFrame::~wxDocMDIChildFrame(void)
|
||||
{
|
||||
m_childView = NULL;
|
||||
}
|
||||
|
||||
bool wxDocMDIChildFrame::TryBefore(wxEvent& event)
|
||||
{
|
||||
if ( m_childView && m_childView->ProcessEventHere(event) )
|
||||
return true;
|
||||
|
||||
return wxMDIChildFrame::TryBefore(event);
|
||||
}
|
||||
|
||||
void wxDocMDIChildFrame::OnActivate(wxActivateEvent& event)
|
||||
{
|
||||
wxMDIChildFrame::OnActivate(event);
|
||||
|
||||
if (event.GetActive() && m_childView)
|
||||
m_childView->Activate(event.GetActive());
|
||||
}
|
||||
|
||||
void wxDocMDIChildFrame::OnCloseWindow(wxCloseEvent& event)
|
||||
{
|
||||
// Close view but don't delete the frame while doing so!
|
||||
// ...since it will be deleted by wxWidgets if we return true.
|
||||
if (m_childView)
|
||||
{
|
||||
bool ans = event.CanVeto()
|
||||
? m_childView->Close(false) // false means don't delete associated window
|
||||
: true; // Must delete.
|
||||
|
||||
if (ans)
|
||||
{
|
||||
m_childView->Activate(false);
|
||||
delete m_childView;
|
||||
m_childView = NULL;
|
||||
m_childDocument = NULL;
|
||||
|
||||
this->Destroy();
|
||||
}
|
||||
else
|
||||
event.Veto();
|
||||
}
|
||||
else
|
||||
event.Veto();
|
||||
}
|
||||
|
||||
#endif
|
||||
// wxUSE_DOC_VIEW_ARCHITECTURE
|
||||
#endif // wxUSE_DOC_VIEW_ARCHITECTURE
|
||||
|
||||
|
||||
Reference in New Issue
Block a user