X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/621793f45e003588e32f7a6ca10cd238f7c96fe6..cd2df130f8162dc2cf9794c1507cd4bddce53910:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index e58af84b52..28577f7992 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -69,7 +69,7 @@ END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl) - IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent) #endif // ============================================================================ @@ -437,7 +437,7 @@ void wxNotebook::Command(wxCommandEvent& event) wxFAIL_MSG("wxNotebook::Command not implemented"); } -bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) +bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam, WXLPARAM* result) { wxNotebookEvent event(wxEVT_NULL, m_windowId); @@ -451,21 +451,18 @@ bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING); break; - // prevent this msg from being passed to wxControl::MSWNotify which would - // retrun FALSE disabling the change of page - case UDN_DELTAPOS: - return TRUE; - - default : - return wxControl::MSWNotify(wParam, lParam); + default: + return wxControl::MSWNotify(wParam, lParam, result); } event.SetSelection(TabCtrl_GetCurSel(m_hwnd)); event.SetOldSelection(m_nSelection); event.SetEventObject(this); - event.SetInt(LOWORD(wParam)); + event.SetInt(LOWORD(wParam)); // ctrl id - return GetEventHandler()->ProcessEvent(event); + bool processed = GetEventHandler()->ProcessEvent(event); + *result = !event.IsAllowed(); + return processed; } // ---------------------------------------------------------------------------- @@ -475,11 +472,32 @@ bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) // hide the currently active panel and show the new one void wxNotebook::ChangePage(int nOldSel, int nSel) { + // MT-FIXME should use a real semaphore + static bool s_bInsideChangePage = FALSE; + + // when we call ProcessEvent(), our own OnSelChange() is called which calls + // this function - break the infinite loop + if ( s_bInsideChangePage ) + return; + // it's not an error (the message may be generated by the tab control itself) // and it may happen - just do nothing if ( nSel == nOldSel ) return; + s_bInsideChangePage = TRUE; + + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId); + event.SetSelection(nSel); + event.SetOldSelection(nOldSel); + event.SetEventObject(this); + if ( ProcessEvent(event) && !event.IsAllowed() ) + { + // program doesn't allow the page change + s_bInsideChangePage = FALSE; + return; + } + if ( nOldSel != -1 ) m_aPages[nOldSel]->Show(FALSE); @@ -487,7 +505,11 @@ void wxNotebook::ChangePage(int nOldSel, int nSel) pPage->Show(TRUE); pPage->SetFocus(); + event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED); + ProcessEvent(event); + m_nSelection = nSel; + s_bInsideChangePage = FALSE; } void wxNotebook::OnEraseBackground(wxEraseEvent& event)