#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
// 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;
#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(); \
m_container.UpdateCanFocus(); \
} \
\
+ bool classname::AcceptsFocusRecursively() const \
+ { \
+ return m_container.AcceptsFocusRecursively(); \
+ } \
+ \
bool classname::AcceptsFocus() const \
{ \
return m_container.AcceptsFocus(); \
#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
// 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);
// ----------------------------------------------------------------------------
// 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) \