containers don't always accept focus (patch 718913)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20134 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-04-11 13:48:27 +00:00
parent bd4a25bc50
commit 3251b83466
2 changed files with 31 additions and 0 deletions

View File

@@ -69,6 +69,9 @@ public:
// the focus and the default processing should take place // the focus and the default processing should take place
bool DoSetFocus(); bool DoSetFocus();
// can our child get the focus?
bool AcceptsFocus() const;
// called from OnChildFocus() handler, i.e. when one of our (grand) // called from OnChildFocus() handler, i.e. when one of our (grand)
// children gets the focus // children gets the focus
void SetLastFocus(wxWindow *win); void SetLastFocus(wxWindow *win);
@@ -111,6 +114,7 @@ public: \
virtual wxWindow *GetDefaultItem() const; \ virtual wxWindow *GetDefaultItem() const; \
virtual wxWindow *SetDefaultItem(wxWindow *child); \ virtual wxWindow *SetDefaultItem(wxWindow *child); \
virtual void SetTmpDefaultItem(wxWindow *win); \ virtual void SetTmpDefaultItem(wxWindow *win); \
virtual bool AcceptsFocus() const; \
\ \
protected: \ protected: \
wxControlContainer m_container wxControlContainer m_container
@@ -164,6 +168,10 @@ void classname::OnChildFocus(wxChildFocusEvent& event) \
void classname::OnFocus(wxFocusEvent& event) \ void classname::OnFocus(wxFocusEvent& event) \
{ \ { \
m_container.HandleOnFocus(event); \ m_container.HandleOnFocus(event); \
} \
bool classname::AcceptsFocus() const \
{ \
return m_container.AcceptsFocus(); \
} }

View File

@@ -49,6 +49,28 @@ wxControlContainer::wxControlContainer(wxWindow *winParent)
m_winDefault = NULL; m_winDefault = NULL;
} }
bool wxControlContainer::AcceptsFocus() const
{
// We can accept focus only when at last one child will accept focus
if ( m_winParent->IsShown() && m_winParent->IsEnabled() )
{
wxWindowList::Node *node = m_winParent->GetChildren().GetFirst();
while ( node )
{
wxWindow *child = node->GetData();
if ( child->AcceptsFocus() )
{
return TRUE;
}
node = node->GetNext();
}
}
return FALSE;
}
void wxControlContainer::SetLastFocus(wxWindow *win) void wxControlContainer::SetLastFocus(wxWindow *win)
{ {
// the panel itself should never get the focus at all but if it does happen // the panel itself should never get the focus at all but if it does happen
@@ -386,3 +408,4 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
return FALSE; return FALSE;
} }