From c5e2ca7c529320e42d14d3a37450237a53553038 Mon Sep 17 00:00:00 2001 From: Benjamin Williams Date: Thu, 9 Nov 2006 22:06:40 +0000 Subject: [PATCH] wxAuiMDI* now more accurately respects normal mdi event sequence git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43245 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/aui/tabmdi.h | 1 + src/aui/tabmdi.cpp | 38 ++++++++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/include/wx/aui/tabmdi.h b/include/wx/aui/tabmdi.h index f7a1534074..48275eba39 100644 --- a/include/wx/aui/tabmdi.h +++ b/include/wx/aui/tabmdi.h @@ -255,6 +255,7 @@ public: protected: void PageChanged(int old_selection, int new_selection); + void OnPageClose(wxAuiNotebookEvent& event); void OnPageChanged(wxAuiNotebookEvent& event); void OnSize(wxSizeEvent& evt); diff --git a/src/aui/tabmdi.cpp b/src/aui/tabmdi.cpp index f4e2eaacac..cacd76d01a 100644 --- a/src/aui/tabmdi.cpp +++ b/src/aui/tabmdi.cpp @@ -433,11 +433,16 @@ bool wxAuiMDIChildFrame::Destroy() if (pParentFrame->GetActiveChild() == this) { + // deactivate ourself + wxActivateEvent event(wxEVT_ACTIVATE, false, GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + pParentFrame->SetActiveChild(NULL); pParentFrame->SetChildMenuBar(NULL); } - const size_t page_count = pClientWindow->GetPageCount(); + size_t page_count = pClientWindow->GetPageCount(); for (size_t pos = 0; pos < page_count; pos++) { if (pClientWindow->GetPage(pos) == this) @@ -650,6 +655,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxAuiMDIClientWindow, wxAuiNotebook) BEGIN_EVENT_TABLE(wxAuiMDIClientWindow, wxAuiNotebook) EVT_AUINOTEBOOK_PAGE_CHANGED(wxID_ANY, wxAuiMDIClientWindow::OnPageChanged) + EVT_AUINOTEBOOK_PAGE_CLOSE(wxID_ANY, wxAuiMDIClientWindow::OnPageClose) EVT_SIZE(wxAuiMDIClientWindow::OnSize) END_EVENT_TABLE() @@ -698,15 +704,17 @@ void wxAuiMDIClientWindow::PageChanged(int old_selection, int new_selection) // don't do anything if the page doesn't actually change if (old_selection == new_selection) return; - + + /* // don't do anything if the new page is already active if (new_selection != -1) { wxAuiMDIChildFrame* child = (wxAuiMDIChildFrame*)GetPage(new_selection); if (child->GetMDIParentFrame()->GetActiveChild() == child) return; - } - + }*/ + + // notify old active child that it has been deactivated if (old_selection != -1) { @@ -717,29 +725,43 @@ void wxAuiMDIClientWindow::PageChanged(int old_selection, int new_selection) event.SetEventObject(old_child); old_child->GetEventHandler()->ProcessEvent(event); } - + // notify new active child that it has been activated if (new_selection != -1) { wxAuiMDIChildFrame* active_child = (wxAuiMDIChildFrame*)GetPage(new_selection); wxASSERT_MSG(active_child, wxT("wxAuiMDIClientWindow::PageChanged - null page pointer")); - + wxActivateEvent event(wxEVT_ACTIVATE, true, active_child->GetId()); event.SetEventObject(active_child); active_child->GetEventHandler()->ProcessEvent(event); - + if (active_child->GetMDIParentFrame()) { active_child->GetMDIParentFrame()->SetActiveChild(active_child); active_child->GetMDIParentFrame()->SetChildMenuBar(active_child); } } + + +} + +void wxAuiMDIClientWindow::OnPageClose(wxAuiNotebookEvent& evt) +{ + wxAuiMDIChildFrame* wnd; + wnd = static_cast(GetPage(evt.GetSelection())); + + wnd->Close(); + + // regardless of the result of wnd->Close(), we've + // already taken care of the close operations, so + // suppress further processing + evt.Veto(); } void wxAuiMDIClientWindow::OnPageChanged(wxAuiNotebookEvent& evt) { PageChanged(evt.GetOldSelection(), evt.GetSelection()); - evt.Skip(); } void wxAuiMDIClientWindow::OnSize(wxSizeEvent& evt) -- 2.45.2