X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/27d77a5990d815f5cd7a31ee4c7cb680eec64d54..4f73f25cc81a95cbfff4f1afa850aae5976a423c:/include/wx/docview.h diff --git a/include/wx/docview.h b/include/wx/docview.h index e008bfe036..55fa2c7920 100644 --- a/include/wx/docview.h +++ b/include/wx/docview.h @@ -248,10 +248,7 @@ public: // set the associated frame, it is used to reset its view when we're // destroyed - void SetDocChildFrame(wxDocChildFrameAnyBase *docChildFrame) - { - m_docChildFrame = docChildFrame; - } + void SetDocChildFrame(wxDocChildFrameAnyBase *docChildFrame); protected: // hook the document into event handlers chain here @@ -520,10 +517,11 @@ inline size_t wxDocManager::GetNoHistoryFiles() const // wxDocChildFrameAny does // ---------------------------------------------------------------------------- -class wxDocChildFrameAnyBase +class WXDLLIMPEXP_CORE wxDocChildFrameAnyBase { public: - wxDocChildFrameAnyBase(wxDocument *doc, wxView *view) + wxDocChildFrameAnyBase(wxDocument *doc, wxView *view, wxWindow *win) + : m_win(win) { m_childDocument = doc; m_childView = view; @@ -532,11 +530,21 @@ public: view->SetDocChildFrame(this); } + ~wxDocChildFrameAnyBase() + { + // prevent the view from deleting us if we're being deleted directly + // (and not via Close() + Destroy()) + if ( m_childView ) + m_childView->SetDocChildFrame(NULL); + } + wxDocument *GetDocument() const { return m_childDocument; } wxView *GetView() const { return m_childView; } void SetDocument(wxDocument *doc) { m_childDocument = doc; } void SetView(wxView *view) { m_childView = view; } + wxWindow *GetWindow() const { return m_win; } + protected: // we're not a wxEvtHandler but we provide this wxEvtHandler-like function // which is called from TryBefore() of the derived classes to give our view @@ -554,6 +562,11 @@ protected: wxDocument* m_childDocument; wxView* m_childView; + // the associated window: having it here is not terribly elegant but it + // allows us to avoid having any virtual functions in this class + wxWindow * const m_win; + + wxDECLARE_NO_COPY_CLASS(wxDocChildFrameAnyBase); }; @@ -585,11 +598,8 @@ public: long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxFrameNameStr) : BaseClass(parent, id, title, pos, size, style, name), - wxDocChildFrameAnyBase(doc, view) + wxDocChildFrameAnyBase(doc, view, this) { - if ( view ) - view->SetFrame(this); - this->Connect(wxEVT_ACTIVATE, wxActivateEventHandler(wxDocChildFrameAny::OnActivate)); this->Connect(wxEVT_CLOSE_WINDOW,