+ // default ctor, SetContainerWindow() must be called later
+ wxControlContainerBase()
+ {
+ m_winParent = NULL;
+
+ // do accept focus initially, we'll stop doing it if/when any children
+ // are added
+ m_acceptsFocus = true;
+ }
+
+ void SetContainerWindow(wxWindow *winParent)
+ {
+ wxASSERT_MSG( !m_winParent, _T("shouldn't be called twice") );
+
+ m_winParent = winParent;
+ }
+
+ // should be called when we decide that we should [stop] accepting focus
+ void SetCanFocus(bool acceptsFocus);
+
+ // returns whether we should accept focus ourselves or not
+ bool AcceptsFocus() const { return m_acceptsFocus; }
+
+ // call this when the number of children of the window changes
+ void UpdateCanFocus() { SetCanFocus(ShouldAcceptFocus()); }
+
+protected:
+ // return true if we should be focusable
+ bool ShouldAcceptFocus() const;
+
+ // 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;
+};
+
+// common part of WX_DECLARE_CONTROL_CONTAINER in the native and generic cases,
+// it should be used in the wxWindow-derived class declaration
+#define WX_DECLARE_CONTROL_CONTAINER_BASE() \
+public: \
+ virtual bool AcceptsFocus() const; \
+ virtual void AddChild(wxWindowBase *child); \
+ virtual void RemoveChild(wxWindowBase *child); \
+ void SetFocusIgnoringChildren(); \
+ void AcceptFocus(bool acceptFocus) \
+ { \
+ m_container.SetCanFocus(acceptFocus); \
+ } \
+ \
+protected: \
+ wxControlContainer m_container
+
+// this macro must be used in the derived class ctor
+#define WX_INIT_CONTROL_CONTAINER() \
+ m_container.SetContainerWindow(this)
+
+// common part of WX_DELEGATE_TO_CONTROL_CONTAINER in the native and generic
+// cases, must be used in the wxWindow-derived class implementation
+#define WX_DELEGATE_TO_CONTROL_CONTAINER_BASE(classname, basename) \
+ void classname::AddChild(wxWindowBase *child) \
+ { \
+ basename::AddChild(child); \
+ \
+ m_container.UpdateCanFocus(); \
+ } \
+ \
+ bool classname::AcceptsFocus() const \
+ { \
+ return m_container.AcceptsFocus(); \
+ }
+
+
+#ifdef wxHAS_NATIVE_TAB_TRAVERSAL
+
+// ----------------------------------------------------------------------------
+// wxControlContainer for native TAB navigation
+// ----------------------------------------------------------------------------
+
+// this must be a real class as we forward-declare it elsewhere
+class WXDLLEXPORT wxControlContainer : public wxControlContainerBase
+{
+};
+
+#define WX_EVENT_TABLE_CONTROL_CONTAINER(classname)