From bba5e72ad3129a1c5660a7089c50865bc93be1a6 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 22 Sep 2008 00:33:11 +0000 Subject: [PATCH] hook the docview-specific customization of event handling logic at TryValidator() level instead of ProcessEvent(): this ensures that the events are not sent to wxApp before they're passed to all the handlers which might process them (before the events were passed to wxDocument and then immediately to wxApp) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55786 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/docmdi.h | 12 ++++++------ include/wx/docview.h | 24 ++++++++++++------------ src/common/docmdi.cpp | 35 ++++------------------------------- src/common/docview.cpp | 46 ++++++++++++++-------------------------------- 4 files changed, 36 insertions(+), 81 deletions(-) diff --git a/include/wx/docmdi.h b/include/wx/docmdi.h index a94a48c..b544b46 100644 --- a/include/wx/docmdi.h +++ b/include/wx/docmdi.h @@ -35,9 +35,6 @@ public: const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxT("frame")); - // Extend event processing to search the document manager's event table - virtual bool ProcessEvent(wxEvent& event); - wxDocManager *GetDocumentManager(void) const { return m_docManager; } void OnExit(wxCommandEvent& event); @@ -46,6 +43,9 @@ public: protected: void Init(); + + virtual bool TryValidator(wxEvent& event); + wxDocManager *m_docManager; private: @@ -77,9 +77,6 @@ public: long type = wxDEFAULT_FRAME_STYLE, const wxString& name = wxFrameNameStr); - // Extend event processing to search the view's event table - virtual bool ProcessEvent(wxEvent& event); - void OnActivate(wxActivateEvent& event); void OnCloseWindow(wxCloseEvent& event); @@ -91,6 +88,9 @@ public: protected: void Init(); + + virtual bool TryValidator(wxEvent& event); + wxDocument* m_childDocument; wxView* m_childView; diff --git a/include/wx/docview.h b/include/wx/docview.h index 7799f53..beac80f 100644 --- a/include/wx/docview.h +++ b/include/wx/docview.h @@ -213,9 +213,6 @@ public: // Override to do cleanup/veto close virtual bool OnClose(bool deleteWindow); - // Extend event processing to search the document's event table - virtual bool ProcessEvent(wxEvent& event); - // A view's window can call this to notify the view it is (in)active. // The function then notifies the document manager. virtual void Activate(bool activate); @@ -228,6 +225,9 @@ public: #endif protected: + // hook the document into event handlers chain here + virtual bool TryValidator(wxEvent& event); + wxDocument* m_viewDocument; wxString m_viewTypeName; wxWindow* m_viewFrame; @@ -349,9 +349,6 @@ public: void OnUpdateUndo(wxUpdateUIEvent& event); void OnUpdateRedo(wxUpdateUIEvent& event); - // Extend event processing to search the view's event table - virtual bool ProcessEvent(wxEvent& event); - // called when file format detection didn't work, can be overridden to do // something in this case virtual void OnOpenFileFailure() { } @@ -442,6 +439,9 @@ public: #endif // WXWIN_COMPATIBILITY_2_6 protected: + // hook the currently active view into event handlers chain here + virtual bool TryValidator(wxEvent& event); + int m_defaultDocumentNameCounter; int m_maxDocsOpen; wxList m_docs; @@ -481,9 +481,6 @@ public: const wxString& name = wxT("frame")); virtual ~wxDocChildFrame(){} - // Extend event processing to search the view's event table - virtual bool ProcessEvent(wxEvent& event); - void OnActivate(wxActivateEvent& event); void OnCloseWindow(wxCloseEvent& event); @@ -494,6 +491,9 @@ public: bool Destroy() { m_childView = NULL; return wxFrame::Destroy(); } protected: + // hook the child view into event handlers chain here + virtual bool TryValidator(wxEvent& event); + wxDocument* m_childDocument; wxView* m_childView; @@ -529,9 +529,6 @@ public: long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxFrameNameStr); - // Extend event processing to search the document manager's event table - virtual bool ProcessEvent(wxEvent& event); - wxDocManager *GetDocumentManager() const { return m_docManager; } void OnExit(wxCommandEvent& event); @@ -539,6 +536,9 @@ public: void OnCloseWindow(wxCloseEvent& event); protected: + // hook the document manager into event handling chain here + virtual bool TryValidator(wxEvent& event); + wxDocManager *m_docManager; private: diff --git a/src/common/docmdi.cpp b/src/common/docmdi.cpp index 29f8975..72930bb 100644 --- a/src/common/docmdi.cpp +++ b/src/common/docmdi.cpp @@ -68,14 +68,9 @@ void wxDocMDIParentFrame::OnMRUFile(wxCommandEvent& event) (void)m_docManager->CreateDocument(f, wxDOC_SILENT); } -// Extend event processing to search the view's event table -bool wxDocMDIParentFrame::ProcessEvent(wxEvent& event) +bool wxDocMDIParentFrame::TryValidator(wxEvent& event) { - // Try the document manager, then do default processing - if (!m_docManager || !m_docManager->ProcessEvent(event)) - return wxEvtHandler::ProcessEvent(event); - else - return true; + return m_docManager && m_docManager->ProcessEventHere(event); } void wxDocMDIParentFrame::OnCloseWindow(wxCloseEvent& event) @@ -138,31 +133,9 @@ wxDocMDIChildFrame::~wxDocMDIChildFrame(void) m_childView = (wxView *) NULL; } -// Extend event processing to search the view's event table -bool wxDocMDIChildFrame::ProcessEvent(wxEvent& event) +bool wxDocMDIChildFrame::TryValidator(wxEvent& event) { - static wxEvent *ActiveEvent = NULL; - - // Break recursion loops - if (ActiveEvent == &event) - return false; - - ActiveEvent = &event; - - bool ret; - if ( !m_childView || ! m_childView->ProcessEvent(event) ) - { - // Only hand up to the parent if it's a menu command - if (!event.IsKindOf(CLASSINFO(wxCommandEvent)) || !GetParent() || !GetParent()->ProcessEvent(event)) - ret = wxEvtHandler::ProcessEvent(event); - else - ret = true; - } - else - ret = true; - - ActiveEvent = NULL; - return ret; + return m_childView && m_childView->ProcessEventHere(event); } void wxDocMDIChildFrame::OnActivate(wxActivateEvent& event) diff --git a/src/common/docview.cpp b/src/common/docview.cpp index 5d53187..2fa45c7 100644 --- a/src/common/docview.cpp +++ b/src/common/docview.cpp @@ -652,13 +652,10 @@ wxView::~wxView() m_viewDocument->RemoveView(this); } -// Extend event processing to search the document's event table -bool wxView::ProcessEvent(wxEvent& event) +bool wxView::TryValidator(wxEvent& event) { - if ( !GetDocument() || !GetDocument()->ProcessEvent(event) ) - return wxEvtHandler::ProcessEvent(event); - - return true; + wxDocument * const doc = GetDocument(); + return doc && doc->ProcessEventHere(event); } void wxView::OnActivateView(bool WXUNUSED(activate), wxView *WXUNUSED(activeView), wxView *WXUNUSED(deactiveView)) @@ -1145,14 +1142,10 @@ wxView *wxDocManager::GetCurrentView() const return NULL; } -// Extend event processing to search the view's event table -bool wxDocManager::ProcessEvent(wxEvent& event) +bool wxDocManager::TryValidator(wxEvent& event) { wxView * const view = GetCurrentView(); - if ( view && view->ProcessEvent(event) ) - return true; - - return wxEvtHandler::ProcessEvent(event); + return view && view->ProcessEventHere(event); } namespace @@ -1782,22 +1775,15 @@ wxDocChildFrame::wxDocChildFrame(wxDocument *doc, view->SetFrame(this); } -// Extend event processing to search the view's event table -bool wxDocChildFrame::ProcessEvent(wxEvent& event) +bool wxDocChildFrame::TryValidator(wxEvent& event) { - if (m_childView) - m_childView->Activate(true); + if ( !m_childView ) + return false; - if ( !m_childView || ! m_childView->ProcessEvent(event) ) - { - // Only hand up to the parent if it's a menu command - if (!event.IsKindOf(CLASSINFO(wxCommandEvent)) || !GetParent() || !GetParent()->ProcessEvent(event)) - return wxEvtHandler::ProcessEvent(event); - else - return true; - } - else - return true; + // FIXME: why is this needed here? + m_childView->Activate(true); + + return m_childView->ProcessEventHere(event); } void wxDocChildFrame::OnActivate(wxActivateEvent& event) @@ -1912,13 +1898,9 @@ void wxDocParentFrame::OnMRUFile(wxCommandEvent& event) } // Extend event processing to search the view's event table -bool wxDocParentFrame::ProcessEvent(wxEvent& event) +bool wxDocParentFrame::TryValidator(wxEvent& event) { - // Try the document manager, then do default processing - if (!m_docManager || !m_docManager->ProcessEvent(event)) - return wxEvtHandler::ProcessEvent(event); - else - return true; + return m_docManager && m_docManager->ProcessEventHere(event); } // Define the behaviour for the frame closing -- 2.7.4