X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b8797d96ca1d94443bd2201e9884fc9a16cb53bb..3d9bff2f13c7fe6a61b99de92c8283dcbb59b147:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 831680858f..0e1f8926d0 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -30,6 +30,7 @@ #include "wx/dcclient.h" #include "wx/dcmemory.h" #include "wx/control.h" + #include "wx/panel.h" #endif // WX_PRECOMP #include "wx/imaglist.h" @@ -492,6 +493,8 @@ 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; + if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection ) { TabCtrl_SetCurSel(GetHwnd(), nPage); @@ -499,7 +502,7 @@ int wxNotebook::ChangeSelection(size_t nPage) UpdateSelection(nPage); } - return m_nSelection; + return selOld; } bool wxNotebook::SetPageText(size_t nPage, const wxString& strText) @@ -685,6 +688,10 @@ 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() ) @@ -778,7 +785,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 @@ -1127,11 +1134,21 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) // the wxObject* casts are required to avoid MinGW GCC 2.95.3 ICE const bool isFromParent = event.GetEventObject() == (wxObject*) parent; const bool isFromSelf = event.GetEventObject() == (wxObject*) this; + const bool isForward = event.GetDirection(); - if ( isFromParent || isFromSelf ) + if ( isFromSelf && !isForward ) + { + // focus is currently on notebook tab and should leave + // it backwards (Shift-TAB) + event.SetCurrentFocus(this); + parent->HandleWindowEvent(event); + } + else if ( isFromParent || isFromSelf ) { // no, it doesn't come from child, case (b) or (c): forward to a - // page but only if direction is backwards (TAB) or from ourselves, + // 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 && (!event.GetDirection() || isFromSelf) ) { @@ -1157,7 +1174,7 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) // if the direction is forwards. Otherwise set the focus to the // notebook itself. The notebook is always the 'first' control of a // page. - if ( !event.GetDirection() ) + if ( !isForward ) { SetFocus(); }