X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6b55490abdb56cd66acf9d965981c4bb4b5f2abb..1146983c7be03c3b0d617b983625b11f693cefdb:/include/wx/containr.h diff --git a/include/wx/containr.h b/include/wx/containr.h index 3e84da9384..00edc5861e 100644 --- a/include/wx/containr.h +++ b/include/wx/containr.h @@ -13,7 +13,7 @@ #ifndef _WX_CONTAINR_H_ #define _WX_CONTAINR_H_ -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma interface "containr.h" #endif @@ -39,23 +39,43 @@ class WXDLLEXPORT wxControlContainer { public: // ctors and such - wxControlContainer(wxWindow *winParent); + wxControlContainer(wxWindow *winParent = NULL); + void SetContainerWindow(wxWindow *winParent) { m_winParent = winParent; } - wxWindow *GetDefaultItem() const { return m_winDefault; } + // default item access: we have a permanent default item which is the one + // set by the user code but we may also have a temporary default item which + // would be chosen if the user pressed "Enter" now but the default action + // reverts to the "permanent" default as soon as this temporary default + // item lsoes focus + + // get the default item, temporary or permanent + wxWindow *GetDefaultItem() const + { return m_winTmpDefault ? m_winTmpDefault : m_winDefault; } + + // set the permanent default item, return its old value wxWindow *SetDefaultItem(wxWindow *win) { wxWindow *winOld = m_winDefault; m_winDefault = win; return winOld; } - void SetLastFocus(wxWindow *win); + // set a temporary default item, SetTmpDefaultItem(NULL) should be called + // soon after a call to SetTmpDefaultItem(window) + void SetTmpDefaultItem(wxWindow *win) { m_winTmpDefault = win; } // the methods to be called from the window event handlers void HandleOnNavigationKey(wxNavigationKeyEvent& event); void HandleOnFocus(wxFocusEvent& event); void HandleOnWindowDestroy(wxWindowBase *child); - // should be called from SetFocus(), returns FALSE if we did nothing with + // should be called from SetFocus(), returns false if we did nothing with // 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); + protected: // set the focus to the child which had it the last time bool SetFocusToChild(); @@ -66,11 +86,19 @@ protected: // the child which had the focus last time this panel was activated wxWindow *m_winLastFocused; - // a default window (e.g. a button) or NULL + // a default window (usually a button) or NULL wxWindow *m_winDefault; + + // a temporary override of m_winDefault, use the latter if NULL + wxWindow *m_winTmpDefault; + + // a guard against infinite recursion + bool m_inSetFocus; + + DECLARE_NO_COPY_CLASS(wxControlContainer) }; -// this function is for wxWindows internal use only +// this function is for wxWidgets internal use only extern bool wxSetFocusToChild(wxWindow *win, wxWindow **child); // ---------------------------------------------------------------------------- @@ -85,9 +113,12 @@ public: \ void OnFocus(wxFocusEvent& event); \ virtual void OnChildFocus(wxChildFocusEvent& event); \ virtual void SetFocus(); \ + virtual void SetFocusIgnoringChildren(); \ virtual void RemoveChild(wxWindowBase *child); \ virtual wxWindow *GetDefaultItem() const; \ virtual wxWindow *SetDefaultItem(wxWindow *child); \ + virtual void SetTmpDefaultItem(wxWindow *win); \ + virtual bool AcceptsFocus() const; \ \ protected: \ wxControlContainer m_container @@ -105,6 +136,11 @@ wxWindow *classname::SetDefaultItem(wxWindow *child) \ return m_container.SetDefaultItem(child); \ } \ \ +void classname::SetTmpDefaultItem(wxWindow *child) \ +{ \ + m_container.SetTmpDefaultItem(child); \ +} \ + \ wxWindow *classname::GetDefaultItem() const \ { \ return m_container.GetDefaultItem(); \ @@ -128,6 +164,11 @@ void classname::SetFocus() \ wxWindow::SetFocus(); \ } \ \ +void classname::SetFocusIgnoringChildren() \ +{ \ + wxWindow::SetFocus(); \ +} \ + \ void classname::OnChildFocus(wxChildFocusEvent& event) \ { \ m_container.SetLastFocus(event.GetWindow()); \ @@ -136,6 +177,10 @@ void classname::OnChildFocus(wxChildFocusEvent& event) \ void classname::OnFocus(wxFocusEvent& event) \ { \ m_container.HandleOnFocus(event); \ +} \ +bool classname::AcceptsFocus() const \ +{ \ + return m_container.AcceptsFocus(); \ }