disable children when the parent is disabled
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16857 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -266,6 +266,7 @@ wxMSW:
|
|||||||
- fixed bugs in multiple selection wxCheckListBox
|
- fixed bugs in multiple selection wxCheckListBox
|
||||||
- default button handling is now closer to expected
|
- default button handling is now closer to expected
|
||||||
- setting tooltips for wxSlider now works
|
- setting tooltips for wxSlider now works
|
||||||
|
- disabling a parent window also disables all of its children (as in wxGTK)
|
||||||
- multiple events avoided in wxComboBox
|
- multiple events avoided in wxComboBox
|
||||||
- tooltip asserts avoided for read-only wxComboBox
|
- tooltip asserts avoided for read-only wxComboBox
|
||||||
- fixed a race condition during a thread exit and a join
|
- fixed a race condition during a thread exit and a join
|
||||||
|
@@ -421,7 +421,9 @@ Windows only.
|
|||||||
|
|
||||||
\func{virtual bool}{Enable}{\param{bool}{ enable = {\tt TRUE}}}
|
\func{virtual bool}{Enable}{\param{bool}{ enable = {\tt TRUE}}}
|
||||||
|
|
||||||
Enable or disable the window for user input.
|
Enable or disable the window for user input. Note that when a parent window is
|
||||||
|
disabled, all of its children are disabled as well and they are reenabled again
|
||||||
|
when the parent is.
|
||||||
|
|
||||||
\wxheading{Parameters}
|
\wxheading{Parameters}
|
||||||
|
|
||||||
|
@@ -488,6 +488,9 @@ private:
|
|||||||
bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
|
bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
|
||||||
#endif // __WIN95__
|
#endif // __WIN95__
|
||||||
|
|
||||||
|
// list of disabled children before last call to our Disable()
|
||||||
|
wxWindowList *m_childrenDisabled;
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxWindowMSW)
|
DECLARE_DYNAMIC_CLASS(wxWindowMSW)
|
||||||
DECLARE_NO_COPY_CLASS(wxWindowMSW)
|
DECLARE_NO_COPY_CLASS(wxWindowMSW)
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
|
@@ -318,6 +318,8 @@ void wxWindowMSW::Init()
|
|||||||
m_mouseInWindow = FALSE;
|
m_mouseInWindow = FALSE;
|
||||||
m_lastKeydownProcessed = FALSE;
|
m_lastKeydownProcessed = FALSE;
|
||||||
|
|
||||||
|
m_childrenDisabled = NULL;
|
||||||
|
|
||||||
// wxWnd
|
// wxWnd
|
||||||
m_hMenu = 0;
|
m_hMenu = 0;
|
||||||
|
|
||||||
@@ -378,6 +380,8 @@ wxWindowMSW::~wxWindowMSW()
|
|||||||
// remove hWnd <-> wxWindow association
|
// remove hWnd <-> wxWindow association
|
||||||
wxRemoveHandleAssociation(this);
|
wxRemoveHandleAssociation(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete m_childrenDisabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
// real construction (Init() must have been called before!)
|
// real construction (Init() must have been called before!)
|
||||||
@@ -498,19 +502,48 @@ bool wxWindowMSW::Enable(bool enable)
|
|||||||
if ( hWnd )
|
if ( hWnd )
|
||||||
::EnableWindow(hWnd, (BOOL)enable);
|
::EnableWindow(hWnd, (BOOL)enable);
|
||||||
|
|
||||||
// VZ: no, this is a bad idea: imagine that you have a dialog with some
|
// when the parent is disabled, all of its children should be disabled as
|
||||||
// disabled controls and disable it - you really wouldn't like the
|
// well but when it is enabled back, only those of the children which
|
||||||
// disabled controls be reenabled too when you reenable the dialog!
|
// hadn't been already disabled in the beginning should be enabled again,
|
||||||
#if 0
|
// so we have to keep the list of those children
|
||||||
wxWindowList::Node *node = GetChildren().GetFirst();
|
wxWindowList::Node *node = GetChildren().GetFirst();
|
||||||
while ( node )
|
while ( node )
|
||||||
{
|
{
|
||||||
wxWindow *child = node->GetData();
|
wxWindow *child = node->GetData();
|
||||||
child->Enable(enable);
|
|
||||||
|
if ( enable )
|
||||||
|
{
|
||||||
|
// enable the child back unless it had been disabled before us
|
||||||
|
if ( !m_childrenDisabled || !m_childrenDisabled->Find(child) )
|
||||||
|
child->Enable();
|
||||||
|
}
|
||||||
|
else // we're being disabled
|
||||||
|
{
|
||||||
|
if ( child->IsEnabled() )
|
||||||
|
{
|
||||||
|
// disable it as children shouldn't stay enabled while the
|
||||||
|
// parent is not
|
||||||
|
child->Disable();
|
||||||
|
}
|
||||||
|
else // child already disabled, remember it
|
||||||
|
{
|
||||||
|
// have we created the list of disabled children already?
|
||||||
|
if ( !m_childrenDisabled )
|
||||||
|
m_childrenDisabled = new wxWindowList;
|
||||||
|
|
||||||
|
m_childrenDisabled->Append(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
node = node->GetNext();
|
node = node->GetNext();
|
||||||
}
|
}
|
||||||
#endif // 0
|
|
||||||
|
if ( enable && m_childrenDisabled )
|
||||||
|
{
|
||||||
|
// we don't need this list any more, don't keep unused memory
|
||||||
|
delete m_childrenDisabled;
|
||||||
|
m_childrenDisabled = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user