{
m_winParent = NULL;
- // do accept focus initially, we'll stop doing it if/when any children
- // are added
- m_acceptsFocus = true;
+ // By default, we accept focus ourselves.
+ m_acceptsFocusSelf = true;
+
+ // But we don't have any children accepting it yet.
+ m_acceptsFocusChildren = false;
+
m_inSetFocus = false;
m_winLastFocused = NULL;
}
m_winParent = winParent;
}
+ // This can be called by the window to indicate that it never wants to have
+ // the focus for itself.
+ void DisableSelfFocus() { m_acceptsFocusSelf = false; }
+
// should be called from SetFocus(), returns false if we did nothing with
// the focus and the default processing should take place
bool DoSetFocus();
- // 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; }
+ bool AcceptsFocus() const { return m_acceptsFocusSelf; }
- // 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; }
+ // Returns whether we or one of our children accepts focus.
+ bool AcceptsFocusRecursively() const
+ bool AcceptsFocus() const { return m_acceptsFocus; }
- // this is used to determine whether we can accept focus when Tab or
- // another navigation key is pressed -- we alsways can, for the same reason
- // as mentioned above for AcceptsFocusRecursively()
- bool AcceptsFocusFromKeyboard() const { return true; }
+ // We accept focus from keyboard if we accept it at all.
+ bool AcceptsFocusFromKeyboard() const { return AcceptsFocusRecursively(); }
// Call this when the number of children of the window changes.
- // If we have any children, this panel (used just as container for
- // them) shouldn't get focus for itself.
- void UpdateCanFocus() { SetCanFocus(!HasAnyFocusableChildren()); }
+ //
+ // Returns true if we have any focusable children, false otherwise.
+ bool UpdateCanFocusChildren();
protected:
// set the focus to the child which had it the last time
wxWindow *m_winLastFocused;
private:
- // value returned by AcceptsFocus(), should be changed using SetCanFocus()
- // only
- bool m_acceptsFocus;
+ // Indicates whether the associated window can ever have focus itself.
+ //
+ // Usually this is the case, e.g. a wxPanel can be used either as a
+ // container for its children or just as a normal window which can be
+ // focused. But sometimes, e.g. for wxStaticBox, we can never have focus
+ // ourselves and can only get it if we have any focusable children.
+ bool m_acceptsFocusSelf;
+
+ // Cached value remembering whether we have any children accepting focus.
+ bool m_acceptsFocusChildren;
// a guard against infinite recursion
bool m_inSetFocus;
{
BaseWindowClass::AddChild(child);
- m_container.UpdateCanFocus();
+ m_container.UpdateCanFocusChildren();
}
WXDLLIMPEXP_INLINE_CORE virtual void RemoveChild(wxWindowBase *child)
BaseWindowClass::RemoveChild(child);
- m_container.UpdateCanFocus();
+ m_container.UpdateCanFocusChildren();
}
WXDLLIMPEXP_INLINE_CORE virtual void SetFocus()
{ \
basename::AddChild(child); \
\
- m_container.UpdateCanFocus(); \
+ m_container.UpdateCanFocusChildren(); \
} \
\
bool classname::AcceptsFocusRecursively() const \
{ \
basename::RemoveChild(child); \
\
- m_container.UpdateCanFocus(); \
+ m_container.UpdateCanFocusChildren(); \
} \
\
void classname::SetFocusIgnoringChildren() \
\
basename::RemoveChild(child); \
\
- m_container.UpdateCanFocus(); \
+ m_container.UpdateCanFocusChildren(); \
} \
\
void classname::OnNavigationKey( wxNavigationKeyEvent& event ) \