X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/abfdefede3209ac777bdac8a65bae8bf008f327b..43c42c18d36c703a88b1b7b697bac27fe5608eca:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index e69fd60c43..6b171c7a74 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -144,6 +144,7 @@ void wxNotebook::Init() #if USE_NOTEBOOK_ANTIFLICKER m_hasSubclassedUpdown = false; + m_doneUpdateHack = false; #endif // USE_NOTEBOOK_ANTIFLICKER } @@ -374,17 +375,22 @@ void wxNotebook::UpdateSelection(int selNew) { wxNotebookPage *pPage = m_pages[selNew]; pPage->Show(true); - } - - // Changing the page should give the focus to it but, as per bug report - // http://sf.net/tracker/index.php?func=detail&aid=1150659&group_id=9863&atid=109863, - // we should not set the focus to it directly since it erroneously - // selects radio buttons and breaks keyboard handling for a notebook's - // scroll buttons. So give focus to the notebook and not the page. - // but don't do this is the notebook is hidden - if ( ::IsWindowVisible(GetHwnd()) ) - SetFocus(); + // In addition to showing the page, we also want to give focus to it to + // make it possible to work with it from keyboard easily. However there + // are two exceptions: first, don't touch the focus at all if the + // notebook itself is not currently shown. + if ( ::IsWindowVisible(GetHwnd()) ) + { + // And second, don't give focus away if the tab control itself has + // it, as this is how the native property sheets behave: if you + // explicitly click on the tab label giving it focus, it will + // remain after switching to another page. But if the focus was + // inside the notebook page, it switches to the new page. + if ( !HasFocus() ) + pPage->SetFocus(); + } + } m_selection = selNew; } @@ -411,7 +417,7 @@ bool wxNotebook::SetPageText(size_t nPage, const wxString& strText) TC_ITEM tcItem; tcItem.mask = TCIF_TEXT; - tcItem.pszText = (wxChar *)strText.wx_str(); + tcItem.pszText = wxMSW_CONV_LPTSTR(strText); if ( !HasFlag(wxNB_MULTILINE) ) return TabCtrl_SetItem(GetHwnd(), nPage, &tcItem) != 0; @@ -685,7 +691,7 @@ bool wxNotebook::InsertPage(size_t nPage, if ( !strText.empty() ) { tcItem.mask |= TCIF_TEXT; - tcItem.pszText = const_cast(strText.wx_str()); + tcItem.pszText = wxMSW_CONV_LPTSTR(strText); } // hide the page: unless it is selected, it shouldn't be shown (and if it @@ -730,6 +736,14 @@ bool wxNotebook::InsertPage(size_t nPage, if ( m_pages.GetCount() == 1 || HasFlag(wxNB_MULTILINE) ) { AdjustPageSize(pPage); + + // Additionally, force the layout of the notebook itself by posting a + // size event to it. If we don't do it, notebooks with pages on the + // left or the right side may fail to account for the fact that they + // are now big enough to fit all all of their pages on one row and + // still reserve space for the second row of tabs, see #1792. + const wxSize s = GetSize(); + ::PostMessage(GetHwnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(s.x, s.y)); } // now deal with the selection @@ -978,6 +992,21 @@ void wxNotebook::OnSize(wxSizeEvent& event) } } } + + // Probably because of the games we play above to avoid flicker sometimes + // the text controls inside notebook pages are not shown correctly (they + // don't have their borders) when the notebook is shown for the first time. + // It's not really clear why does this happen and maybe the bug is in + // wxTextCtrl itself and not here but updating the page when it's about to + // be shown doesn't cost much and works around the problem so do it here + // for now. + if ( !m_doneUpdateHack && IsShownOnScreen() ) + { + m_doneUpdateHack = true; + wxWindow* const page = GetCurrentPage(); + if ( page ) + page->Update(); + } #endif // USE_NOTEBOOK_ANTIFLICKER event.Skip(); @@ -1296,11 +1325,11 @@ bool wxNotebook::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result) NMHDR* hdr = (NMHDR *)lParam; switch ( hdr->code ) { case TCN_SELCHANGE: - event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED); + event.SetEventType(wxEVT_NOTEBOOK_PAGE_CHANGED); break; case TCN_SELCHANGING: - event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING); + event.SetEventType(wxEVT_NOTEBOOK_PAGE_CHANGING); break; default: