X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dad5f99acb6b3400ff73562c03db2f3f21b658cd..538f3830191e25eaf0edb0a379e08d4f85ee49bc:/include/wx/containr.h diff --git a/include/wx/containr.h b/include/wx/containr.h index a545da3929..1bf91cfef5 100644 --- a/include/wx/containr.h +++ b/include/wx/containr.h @@ -13,13 +13,10 @@ #ifndef _WX_CONTAINR_H_ #define _WX_CONTAINR_H_ -#ifdef __GNUG__ - #pragma interface "containr.h" -#endif - class WXDLLEXPORT wxFocusEvent; class WXDLLEXPORT wxNavigationKeyEvent; class WXDLLEXPORT wxWindow; +class WXDLLEXPORT wxWindowBase; /* Implementation note: wxControlContainer is not a real mix-in but rather @@ -38,21 +35,24 @@ class WXDLLEXPORT wxControlContainer { public: // ctors and such - wxControlContainer(wxWindow *winParent); - - wxWindow *GetDefaultItem() const { return m_winDefault; } - wxWindow *SetDefaultItem(wxWindow *win) - { wxWindow *winOld = m_winDefault; m_winDefault = win; return winOld; } - - void SetLastFocus(wxWindow *win); + wxControlContainer(wxWindow *winParent = NULL); + void SetContainerWindow(wxWindow *winParent) { m_winParent = winParent; } // the methods to be called from the window event handlers void HandleOnNavigationKey(wxNavigationKeyEvent& event); void HandleOnFocus(wxFocusEvent& event); void HandleOnWindowDestroy(wxWindowBase *child); - // should be called from SetFocus() - void DoSetFocus(); + // should be called from SetFocus(), returns false if we did nothing with + // the focus and the default processing should take place + bool DoSetFocus(); + + // can our child get the focus? + bool AcceptsFocus() const; + + // called from OnChildFocus() handler, i.e. when one of our (grand) + // children gets the focus + void SetLastFocus(wxWindow *win); protected: // set the focus to the child which had it the last time @@ -64,11 +64,13 @@ protected: // the child which had the focus last time this panel was activated wxWindow *m_winLastFocused; - // a default window (e.g. a button) or NULL - wxWindow *m_winDefault; + // a guard against infinite recursion + bool m_inSetFocus; + + DECLARE_NO_COPY_CLASS(wxControlContainer) }; -// this function is for wxWindows internal use only +// this function is for wxWidgets internal use only extern bool wxSetFocusToChild(wxWindow *win, wxWindow **child); // ---------------------------------------------------------------------------- @@ -78,13 +80,17 @@ extern bool wxSetFocusToChild(wxWindow *win, wxWindow **child); // declare the methods to be forwarded #define WX_DECLARE_CONTROL_CONTAINER() \ +public: \ void OnNavigationKey(wxNavigationKeyEvent& event); \ void OnFocus(wxFocusEvent& event); \ virtual void OnChildFocus(wxChildFocusEvent& event); \ virtual void SetFocus(); \ + virtual void SetFocusIgnoringChildren(); \ virtual void RemoveChild(wxWindowBase *child); \ - virtual wxWindow *GetDefaultItem() const; \ - virtual wxWindow *SetDefaultItem(wxWindow *child) \ + virtual bool AcceptsFocus() const; \ +\ +protected: \ + wxControlContainer m_container // implement the event table entries for wxControlContainer #define WX_EVENT_TABLE_CONTROL_CONTAINER(classname) \ @@ -93,42 +99,42 @@ extern bool wxSetFocusToChild(wxWindow *win, wxWindow **child); EVT_NAVIGATION_KEY(classname::OnNavigationKey) // implement the methods forwarding to the wxControlContainer -#define WX_DELEGATE_TO_CONTROL_CONTAINER(classname, container) \ -wxWindow *classname::SetDefaultItem(wxWindow *child) \ -{ \ - return container->SetDefaultItem(child); \ -} \ - \ -wxWindow *classname::GetDefaultItem() const \ -{ \ - return container->GetDefaultItem(); \ -} \ - \ +#define WX_DELEGATE_TO_CONTROL_CONTAINER(classname, basename) \ void classname::OnNavigationKey( wxNavigationKeyEvent& event ) \ { \ - container->HandleOnNavigationKey(event); \ + m_container.HandleOnNavigationKey(event); \ } \ \ void classname::RemoveChild(wxWindowBase *child) \ { \ - container->HandleOnWindowDestroy(child); \ + m_container.HandleOnWindowDestroy(child); \ \ - wxWindow::RemoveChild(child); \ + basename::RemoveChild(child); \ } \ \ void classname::SetFocus() \ { \ - container->DoSetFocus(); \ + if ( !m_container.DoSetFocus() ) \ + basename::SetFocus(); \ +} \ + \ +void classname::SetFocusIgnoringChildren() \ +{ \ + basename::SetFocus(); \ } \ \ void classname::OnChildFocus(wxChildFocusEvent& event) \ { \ - container->SetLastFocus(event.GetWindow()); \ + m_container.SetLastFocus(event.GetWindow()); \ } \ \ void classname::OnFocus(wxFocusEvent& event) \ { \ - container->HandleOnFocus(event); \ + m_container.HandleOnFocus(event); \ +} \ +bool classname::AcceptsFocus() const \ +{ \ + return m_container.AcceptsFocus(); \ }