X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/80332672ab36153aa2424cff2a06b434287488c8..434e29032fdbff103182aa97bb66af48332f9dc8:/include/wx/containr.h diff --git a/include/wx/containr.h b/include/wx/containr.h index e44b507a33..6ac64a4616 100644 --- a/include/wx/containr.h +++ b/include/wx/containr.h @@ -15,6 +15,9 @@ #include "wx/defs.h" +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; + /* Implementation note: wxControlContainer is not a real mix-in but rather a class meant to be aggregated with (and not inherited from). Although @@ -54,17 +57,26 @@ public: // returns whether we should accept focus ourselves or not bool AcceptsFocus() const { return m_acceptsFocus; } + // returns whether we or one of our children accepts focus: we always do + // because if we don't have any focusable children it probably means that + // we're not being used as a container at all (think of wxGrid or generic + // wxListCtrl) and so should get focus for ourselves + bool AcceptsFocusRecursively() const { return true; } + // call this when the number of children of the window changes - void UpdateCanFocus() { SetCanFocus(ShouldAcceptFocus()); } + // + // note that we have any children, this panel (used just as container for + // them) shouldn't get focus for itself + void UpdateCanFocus() { SetCanFocus(!HasAnyFocusableChildren()); } protected: - // return true if we should be focusable - bool ShouldAcceptFocus() const; + // return true if we have any children accepting focus + bool HasAnyFocusableChildren() const; -private: // the parent window we manage the children for wxWindow *m_winParent; +private: // value returned by AcceptsFocus(), should be changed using SetCanFocus() // only bool m_acceptsFocus; @@ -75,6 +87,7 @@ private: #define WX_DECLARE_CONTROL_CONTAINER_BASE() \ public: \ virtual bool AcceptsFocus() const; \ + virtual bool AcceptsFocusRecursively() const; \ virtual void AddChild(wxWindowBase *child); \ virtual void RemoveChild(wxWindowBase *child); \ void SetFocusIgnoringChildren(); \ @@ -100,6 +113,11 @@ protected: \ m_container.UpdateCanFocus(); \ } \ \ + bool classname::AcceptsFocusRecursively() const \ + { \ + return m_container.AcceptsFocusRecursively(); \ + } \ + \ bool classname::AcceptsFocus() const \ { \ return m_container.AcceptsFocus(); \ @@ -138,10 +156,8 @@ class WXDLLEXPORT wxControlContainer : public wxControlContainerBase #else // !wxHAS_NATIVE_TAB_TRAVERSAL -class WXDLLEXPORT wxFocusEvent; -class WXDLLEXPORT wxNavigationKeyEvent; -class WXDLLEXPORT wxWindow; -class WXDLLEXPORT wxWindowBase; +class WXDLLIMPEXP_FWD_CORE wxFocusEvent; +class WXDLLIMPEXP_FWD_CORE wxNavigationKeyEvent; // ---------------------------------------------------------------------------- // wxControlContainer for TAB navigation implemented in wx itself @@ -162,9 +178,6 @@ public: // 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); @@ -191,18 +204,14 @@ 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); \ - void SetFocusIgnoringChildren(); \ - virtual void OnChildFocus(wxChildFocusEvent& event); \ - virtual void SetFocus(); \ - virtual void RemoveChild(wxWindowBase *child); \ - virtual bool AcceptsFocus() const; \ -\ -protected: \ - wxControlContainer m_container +#define WX_DECLARE_CONTROL_CONTAINER() \ + WX_DECLARE_CONTROL_CONTAINER_BASE(); \ + \ +public: \ + void OnNavigationKey(wxNavigationKeyEvent& event); \ + void OnFocus(wxFocusEvent& event); \ + virtual void OnChildFocus(wxChildFocusEvent& event); \ + virtual void SetFocus() // implement the event table entries for wxControlContainer #define WX_EVENT_TABLE_CONTROL_CONTAINER(classname) \