X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4a0dcc87af44792d5dc993daa5b20f10348233da..424da8bdb9f05243d8888d78a56ab0cc3f615a6c:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 1e9a26dbbf..4b3c6e0aee 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -122,7 +122,6 @@ static bool HasTroubleWithNonTopTabs() WX_DEFINE_LIST( wxNotebookPageInfoList ) BEGIN_EVENT_TABLE(wxNotebook, wxBookCtrlBase) - EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, wxNotebook::OnSelChange) EVT_SIZE(wxNotebook::OnSize) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) @@ -240,7 +239,6 @@ const wxNotebookPageInfoList& wxNotebook::GetPageInfos() const void wxNotebook::Init() { m_imageList = NULL; - m_nSelection = wxNOT_FOUND; #if wxUSE_UXTHEME m_hbrBackground = NULL; @@ -451,24 +449,28 @@ int wxNotebook::SetSelection(size_t nPage) { wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") ); - if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection ) + if ( m_selection == wxNOT_FOUND || nPage != (size_t)m_selection ) { if ( SendPageChangingEvent(nPage) ) { // program allows the page change - SendPageChangedEvent(m_nSelection, nPage); + const int selectionOld = m_selection; + + UpdateSelection(nPage); TabCtrl_SetCurSel(GetHwnd(), nPage); + + SendPageChangedEvent(selectionOld, nPage); } } - return m_nSelection; + return m_selection; } void wxNotebook::UpdateSelection(int selNew) { - if ( m_nSelection != wxNOT_FOUND ) - m_pages[m_nSelection]->Show(false); + if ( m_selection != wxNOT_FOUND ) + m_pages[m_selection]->Show(false); if ( selNew != wxNOT_FOUND ) { @@ -486,16 +488,16 @@ void wxNotebook::UpdateSelection(int selNew) if ( ::IsWindowVisible(GetHwnd()) ) SetFocus(); - m_nSelection = selNew; + m_selection = selNew; } int wxNotebook::ChangeSelection(size_t nPage) { wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") ); - const int selOld = m_nSelection; + const int selOld = m_selection; - if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection ) + if ( m_selection == wxNOT_FOUND || nPage != (size_t)m_selection ) { TabCtrl_SetCurSel(GetHwnd(), nPage); @@ -688,12 +690,16 @@ wxNotebookPage *wxNotebook::DoRemovePage(size_t nPage) if ( !pageRemoved ) return NULL; + // hide the removed page to maintain the invariant that only the + // selected page is visible and others are hidden: + pageRemoved->Show(false); + TabCtrl_DeleteItem(GetHwnd(), nPage); if ( m_pages.IsEmpty() ) { // no selection any more, the notebook becamse empty - m_nSelection = wxNOT_FOUND; + m_selection = wxNOT_FOUND; } else // notebook still not empty { @@ -704,22 +710,22 @@ wxNotebookPage *wxNotebook::DoRemovePage(size_t nPage) // Because it could be that the slection index changed // we need to update it. // Note: this does not mean the selection it self changed. - m_nSelection = selNew; - m_pages[m_nSelection]->Refresh(); + m_selection = selNew; + m_pages[m_selection]->Refresh(); } - else if (int(nPage) == m_nSelection) + else if (int(nPage) == m_selection) { // The selection was deleted. // Determine new selection. - if (m_nSelection == int(GetPageCount())) - selNew = m_nSelection - 1; + if (m_selection == int(GetPageCount())) + selNew = m_selection - 1; else - selNew = m_nSelection; + selNew = m_selection; - // m_nSelection must be always valid so reset it before calling + // m_selection must be always valid so reset it before calling // SetSelection() - m_nSelection = wxNOT_FOUND; + m_selection = wxNOT_FOUND; SetSelection(selNew); } else @@ -743,7 +749,7 @@ bool wxNotebook::DeleteAllPages() TabCtrl_DeleteAllItems(GetHwnd()); - m_nSelection = wxNOT_FOUND; + m_selection = wxNOT_FOUND; InvalidateBestSize(); return true; @@ -781,7 +787,7 @@ bool wxNotebook::InsertPage(size_t nPage, if ( !strText.empty() ) { tcItem.mask |= TCIF_TEXT; - tcItem.pszText = (wxChar *)strText.wx_str(); // const_cast + tcItem.pszText = const_cast(strText.wx_str()); } // hide the page: unless it is selected, it shouldn't be shown (and if it @@ -819,14 +825,6 @@ bool wxNotebook::InsertPage(size_t nPage, // succeeded: save the pointer to the page m_pages.Insert(pPage, nPage); - // also ensure that the notebook background is used for its pages by making - // them transparent: this ensures that MSWGetBgBrush() queries the notebook - // for the background brush to be used for erasing them - if ( wxPanel *panel = wxDynamicCast(pPage, wxPanel) ) - { - panel->MSWSetTransparentBackground(); - } - // we may need to adjust the size again if the notebook size changed: // normally this only happens for the first page we add (the tabs which // hadn't been there before are now shown) but for a multiline notebook it @@ -841,22 +839,13 @@ bool wxNotebook::InsertPage(size_t nPage, // if the inserted page is before the selected one, we must update the // index of the selected page - if ( int(nPage) <= m_nSelection ) + if ( int(nPage) <= m_selection ) { // one extra page added - m_nSelection++; + m_selection++; } - // some page should be selected: either this one or the first one if there - // is still no selection - int selNew = wxNOT_FOUND; - if ( bSelect ) - selNew = nPage; - else if ( m_nSelection == wxNOT_FOUND ) - selNew = 0; - - if ( selNew != wxNOT_FOUND ) - SetSelection(selNew); + DoSetSelectionAfterInsertion(nPage, bSelect); InvalidateBestSize(); @@ -1096,18 +1085,6 @@ void wxNotebook::OnSize(wxSizeEvent& event) event.Skip(); } -void wxNotebook::OnSelChange(wxBookCtrlEvent& event) -{ - // is it our tab control? - if ( event.GetEventObject() == this ) - { - UpdateSelection(event.GetSelection()); - } - - // we want to give others a chance to process this message as well - event.Skip(); -} - void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) { if ( event.IsWindowChange() ) { @@ -1153,14 +1130,14 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) // page but only if entering notebook page (i.e. direction is // backwards (Shift-TAB) comething from out-of-notebook, or // direction is forward (TAB) from ourselves), - if ( m_nSelection != wxNOT_FOUND && + if ( m_selection != wxNOT_FOUND && (!event.GetDirection() || isFromSelf) ) { // so that the page knows that the event comes from it's parent // and is being propagated downwards event.SetEventObject(this); - wxWindow *page = m_pages[m_nSelection]; + wxWindow *page = m_pages[m_selection]; if ( !page->HandleWindowEvent(event) ) { page->SetFocus(); @@ -1455,11 +1432,14 @@ bool wxNotebook::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result) } event.SetSelection(TabCtrl_GetCurSel(GetHwnd())); - event.SetOldSelection(m_nSelection); + event.SetOldSelection(m_selection); event.SetEventObject(this); event.SetInt(idCtrl); bool processed = HandleWindowEvent(event); + if ( hdr->code == TCN_SELCHANGE ) + UpdateSelection(event.GetSelection()); + *result = !event.IsAllowed(); return processed; }