From b8bdaa7c2b5050ed81ae6ec4f2f2557554e465f2 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 26 Sep 2003 21:36:33 +0000 Subject: [PATCH] make it possible to give focus to the notebook itself (patch 811013) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23952 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/notebook.h | 2 +- src/msw/notebook.cpp | 113 ++++++++++++++++++++++---------------- 2 files changed, 66 insertions(+), 49 deletions(-) diff --git a/include/wx/msw/notebook.h b/include/wx/msw/notebook.h index 29c85cc057..86f6458956 100644 --- a/include/wx/msw/notebook.h +++ b/include/wx/msw/notebook.h @@ -147,7 +147,6 @@ public: // --------- void OnSize(wxSizeEvent& event); void OnSelChange(wxNotebookEvent& event); - void OnSetFocus(wxFocusEvent& event); void OnNavigationKey(wxNavigationKeyEvent& event); // base class virtuals @@ -156,6 +155,7 @@ public: virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); virtual bool MSWOnScroll(int orientation, WXWORD nSBCode, WXWORD pos, WXHWND control); + virtual bool MSWTranslateMessage(WXMSG *wxmsg); #if wxUSE_CONSTRAINTS virtual void SetConstraintSizes(bool recurse = TRUE); diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 79031889e2..f79742abe6 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -111,8 +111,6 @@ BEGIN_EVENT_TABLE(wxNotebook, wxControl) EVT_SIZE(wxNotebook::OnSize) - EVT_SET_FOCUS(wxNotebook::OnSetFocus) - EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) END_EVENT_TABLE() @@ -267,14 +265,14 @@ bool wxNotebook::Create(wxWindow *parent, if ( !CreateControl(parent, id, pos, size, style | wxTAB_TRAVERSAL, wxDefaultValidator, name) ) - return FALSE; + return false; if ( !MSWCreateControl(WC_TABCONTROL, wxEmptyString, pos, size) ) - return FALSE; + return false; SetBackgroundColour(wxColour(::GetSysColor(COLOR_BTNFACE))); - return TRUE; + return true; } WXDWORD wxNotebook::MSWGetStyle(long style, WXDWORD *exstyle) const @@ -348,7 +346,7 @@ int wxNotebook::SetSelection(size_t nPage) bool wxNotebook::SetPageText(size_t nPage, const wxString& strText) { - wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), false, wxT("notebook page out of range") ); TC_ITEM tcItem; tcItem.mask = TCIF_TEXT; @@ -386,7 +384,7 @@ int wxNotebook::GetPageImage(size_t nPage) const bool wxNotebook::SetPageImage(size_t nPage, int nImage) { - wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), false, wxT("notebook page out of range") ); TC_ITEM tcItem; tcItem.mask = TCIF_IMAGE; @@ -418,7 +416,7 @@ void wxNotebook::SetPageSize(const wxSize& size) rc.right = size.x; rc.bottom = size.y; - TabCtrl_AdjustRect(GetHwnd(), TRUE, &rc); + TabCtrl_AdjustRect(GetHwnd(), true, &rc); // and now set it SetSize(rc.right - rc.left, rc.bottom - rc.top); @@ -473,7 +471,7 @@ void wxNotebook::AdjustPageSize(wxNotebookPage *page) // get the page size from the notebook size GetSize((int *)&rc.right, (int *)&rc.bottom); - TabCtrl_AdjustRect(m_hwnd, FALSE, &rc); + TabCtrl_AdjustRect(m_hwnd, false, &rc); page->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); } @@ -548,7 +546,7 @@ bool wxNotebook::DeleteAllPages() m_nSelection = -1; - return TRUE; + return true; } // same as AddPage() but does it at given position @@ -558,22 +556,22 @@ bool wxNotebook::InsertPage(size_t nPage, bool bSelect, int imageId) { - wxCHECK_MSG( pPage != NULL, FALSE, _T("NULL page in wxNotebook::InsertPage") ); - wxCHECK_MSG( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE, + wxCHECK_MSG( pPage != NULL, false, _T("NULL page in wxNotebook::InsertPage") ); + wxCHECK_MSG( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), false, _T("invalid index in wxNotebook::InsertPage") ); wxASSERT_MSG( pPage->GetParent() == this, _T("notebook pages must have notebook as parent") ); #if wxUSE_UXTHEME && wxUSE_UXTHEME_AUTO - static bool g_TestedForTheme = FALSE; - static bool g_UseTheme = FALSE; + static bool g_TestedForTheme = false; + static bool g_UseTheme = false; if (!g_TestedForTheme) { int commCtrlVersion = wxTheApp->GetComCtl32Version() ; g_UseTheme = (commCtrlVersion >= 600); - g_TestedForTheme = TRUE; + g_TestedForTheme = true; } // Automatically apply the theme background, @@ -617,7 +615,7 @@ bool wxNotebook::InsertPage(size_t nPage, { wxLogError(wxT("Can't create the notebook page '%s'."), strText.c_str()); - return FALSE; + return false; } // succeeded: save the pointer to the page @@ -638,7 +636,7 @@ bool wxNotebook::InsertPage(size_t nPage, // this updates internal flag too -- otherwise it would get out of sync // with the real state - pPage->Show(FALSE); + pPage->Show(false); // now deal with the selection @@ -663,7 +661,7 @@ bool wxNotebook::InsertPage(size_t nPage, if ( selNew != -1 ) SetSelection(selNew); - return TRUE; + return true; } int wxNotebook::HitTest(const wxPoint& pt, long *flags) const @@ -702,7 +700,7 @@ void wxNotebook::OnSize(wxSizeEvent& event) rc.left = rc.top = 0; GetSize((int *)&rc.right, (int *)&rc.bottom); - TabCtrl_AdjustRect(m_hwnd, FALSE, &rc); + TabCtrl_AdjustRect(m_hwnd, false, &rc); int width = rc.right - rc.left, height = rc.bottom - rc.top; @@ -722,14 +720,13 @@ void wxNotebook::OnSelChange(wxNotebookEvent& event) { int sel = event.GetOldSelection(); if ( sel != -1 ) - m_pages[sel]->Show(FALSE); + m_pages[sel]->Show(false); sel = event.GetSelection(); if ( sel != -1 ) { wxNotebookPage *pPage = m_pages[sel]; - pPage->Show(TRUE); - pPage->SetFocus(); + pPage->Show(true); } m_nSelection = sel; @@ -739,18 +736,21 @@ void wxNotebook::OnSelChange(wxNotebookEvent& event) event.Skip(); } -void wxNotebook::OnSetFocus(wxFocusEvent& event) +bool wxNotebook::MSWTranslateMessage(WXMSG *wxmsg) { - // this function is only called when the focus is explicitly set (i.e. from - // the program) to the notebook - in this case we don't need the - // complicated OnNavigationKey() logic because the programmer knows better - // what [s]he wants + const MSG * const msg = (MSG *)wxmsg; - // set focus to the currently selected page if any - if ( m_nSelection != -1 ) - m_pages[m_nSelection]->SetFocus(); + // we want to process (simple, i.e. without Shift or Ctrl) TAB to pass it + // to our page for keyboard navigation + if ( msg->message == WM_KEYDOWN && msg->wParam == VK_TAB && + msg->hwnd == m_hwnd && + !wxIsCtrlDown() && !wxIsShiftDown() && + m_nSelection != -1 ) + { + return MSWProcessMessage(wxmsg); + } - event.Skip(); + return false; } void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) @@ -760,7 +760,7 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) AdvanceSelection(event.GetDirection()); } else { - // we get this event in 2 cases + // we get this event in 3 cases // // a) one of our pages might have generated it because the user TABbed // out from it in which case we should propagate the event upwards and @@ -773,12 +773,22 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) // OnSetFocus() because we don't know which direction the focus came // from in this case and so can't choose between setting the focus to // first or last panel child - wxWindow *parent = GetParent(); - // the cast is here to fic a GCC ICE - if ( ((wxWindow*)event.GetEventObject()) == parent ) + // + // or + // + // c) we ourselves (see MSWTranslateMessage) generated the event + // + wxWindow * const parent = GetParent(); + + const bool isFromParent = event.GetEventObject() == parent; + const bool isFromSelf = event.GetEventObject() == this; + + if ( isFromParent || isFromSelf ) { - // no, it doesn't come from child, case (b): forward to a page - if ( m_nSelection != -1 ) + // 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, + if ( m_nSelection != -1 && + (!event.GetDirection() || isFromSelf) ) { // so that the page knows that the event comes from it's parent // and is being propagated downwards @@ -791,16 +801,23 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) } //else: page manages focus inside it itself } - else + else // otherwise set the focus to the notebook itself { - // we have no pages - still have to give focus to _something_ SetFocus(); } } else { - // it comes from our child, case (a), pass to the parent - if ( parent ) { + // it comes from our child, case (a), pass to the parent, but only + // 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() ) + { + SetFocus(); + } + else if ( parent ) + { event.SetCurrentFocus(this); parent->GetEventHandler()->ProcessEvent(event); } @@ -819,12 +836,12 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) void wxNotebook::SetConstraintSizes(bool WXUNUSED(recurse)) { // don't set the sizes of the pages - their correct size is not yet known - wxControl::SetConstraintSizes(FALSE); + wxControl::SetConstraintSizes(false); } bool wxNotebook::DoPhase(int WXUNUSED(nPhase)) { - return TRUE; + return true; } #endif // wxUSE_CONSTRAINTS @@ -839,7 +856,7 @@ bool wxNotebook::MSWOnScroll(int orientation, WXWORD nSBCode, // don't generate EVT_SCROLLWIN events for the WM_SCROLLs coming from the // up-down control if ( control ) - return FALSE; + return false; return wxNotebookBase::MSWOnScroll(orientation, nSBCode, pos, control); } @@ -942,8 +959,8 @@ void wxNotebook::ApplyThemeBackground(wxWindow*, const wxColour&) long wxNotebook::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { - static bool g_TestedForTheme = FALSE; - static bool g_UseTheme = FALSE; + static bool g_TestedForTheme = false; + static bool g_UseTheme = false; switch ( nMsg ) { case WM_ERASEBKGND: @@ -953,13 +970,13 @@ long wxNotebook::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) int commCtrlVersion = wxTheApp->GetComCtl32Version() ; g_UseTheme = (commCtrlVersion >= 600); - g_TestedForTheme = TRUE; + g_TestedForTheme = true; } // If using XP themes, it seems we can get away // with not drawing a background, which reduces flicker. if (g_UseTheme) - return TRUE; + return true; } }