- Default location of wxFileConfig files has changed under Windows, you will
need to update your code if you access these files directly.
+- wxWindow::IsEnabled() now returns false if a window parent (and not
+ necessarily the window itself) is disabled, new function IsThisEnabled()
+ with the same behaviour as old IsEnabled() was added.
+
Changes in behaviour which may result in compilation errors
-----------------------------------------------------------
\constfunc{virtual bool}{IsEnabled}{\void}
-Returns {\tt true} if the window is enabled for input, {\tt false} otherwise.
+Returns \true if the window is enabled, i.e. if it accepts user input, \false
+otherwise.
+
+Notice that this method can return \false even if this window itself hadn't
+been explicitly disabled when one of its parent windows is disabled. To get the
+intrinsic status of this window, use
+\helpref{IsThisEnabled}{wxwindowisthisenabled}
\wxheading{See also}
\helpref{wxWindow::IsShown}{wxwindowisshown}
+\membersection{wxWindow::IsThisEnabled}\label{wxwindowisthisenabled}
+
+\constfunc{bool}{IsThisEnabled}{\void}
+
+Returns \true if this window is intrinsically enabled, \false otherwise, i.e.
+if \helpref{Enable(false)}{wxwindowenable} had been called. This method is
+mostly used for wxWidgets itself, user code should normally use
+\helpref{IsEnabled}{wxwindowisenabled} instead.
+
+
\membersection{wxWindow::IsTopLevel}\label{wxwindowistoplevel}
\constfunc{bool}{IsTopLevel}{\void}
WX_NSAffineTransform CocoaGetWxToBoundsTransform();
#endif //def __OBJC__
protected:
- // enable==false: disables the control
- // enable==true: enables the control IF it should be enabled
- bool EnableSelfAndChildren(bool enable);
// actually enable/disable the cocoa control, overridden by subclasses
virtual void CocoaSetEnabled(bool enable) { }
- // Reflects the state for THIS window (ignoring disables by parents)
- bool m_shouldBeEnabled;
void CocoaCreateNSScrollView();
void InitMouseEvent(wxMouseEvent &event, WX_NSEvent cocoaEvent);
// NOTE: typically Close() is not virtual, but we want this for Cocoa
virtual bool Close( bool force = false );
virtual bool Show( bool show = true );
- virtual bool Enable( bool enable = true );
+ virtual void DoEnable( bool enable );
virtual bool IsDoubleBuffered() const { return true; }
};
// wxGTK-specific: called recursively by Enable,
// to give widgets an oppprtunity to correct their colours after they
// have been changed by Enable
- virtual void OnParentEnable( bool enable ) ;
+ virtual void OnEnabled( bool enable ) ;
// tell the control to ignore next text changed signal
void IgnoreNextTextUpdate(int n = 1) { m_countUpdatesToIgnore = n; }
virtual void Lower();
virtual bool Show( bool show = true );
- virtual bool Enable( bool enable = true );
+ virtual void DoEnable( bool enable );
virtual void SetWindowStyleFlag( long style );
// For compatibility across platforms (not in event table)
void OnIdle(wxIdleEvent& WXUNUSED(event)) {}
- // wxGTK-specific: called recursively by Enable,
- // to give widgets an opportunity to correct their colours after they
- // have been changed by Enable
- virtual void OnParentEnable( bool WXUNUSED(enable) ) {}
-
// Used by all window classes in the widget creation process.
bool PreCreation( wxWindowGTK *parent, const wxPoint &pos, const wxSize &size );
void PostCreation();
virtual void SetSelection(long from, long to);
virtual void SetEditable(bool editable);
- virtual bool Enable( bool enable = true );
+ virtual void DoEnable( bool enable );
// Implementation from now on
void OnDropFiles( wxDropFilesEvent &event );
// wxGTK-specific: called recursively by Enable,
// to give widgets an oppprtunity to correct their colours after they
// have been changed by Enable
- virtual void OnParentEnable( bool enable ) ;
+ virtual void OnEnabled( bool enabled ) ;
// tell the control to ignore next text changed signal
void IgnoreNextTextUpdate();
virtual void Lower();
virtual bool Show( bool show = true );
- virtual bool Enable( bool enable = true );
+ virtual void DoEnable( bool enable );
virtual void SetWindowStyleFlag( long style );
// For compatibility across platforms (not in event table)
void OnIdle(wxIdleEvent& WXUNUSED(event)) {}
- // wxGTK-specific: called recursively by Enable,
- // to give widgets an opportunity to correct their colours after they
- // have been changed by Enable
- virtual void OnParentEnable( bool WXUNUSED(enable) ) {}
-
// Used by all window classes in the widget creation process.
bool PreCreation( wxWindowGTK *parent, const wxPoint &pos, const wxSize &size );
void PostCreation();
virtual void Lower();
virtual bool Show( bool show = true );
- virtual bool Enable( bool enable = true );
+ virtual void DoEnable( bool enable );
+ virtual void OnEnabled( bool enabled );
virtual void SetFocus();
void MacUpdateControlFont() ;
void MacPropagateVisibilityChanged() ;
- void MacPropagateEnabledStateChanged() ;
void MacPropagateHiliteChanged() ;
// implement the base class pure virtuals
virtual void Lower();
virtual bool Show( bool show = true );
- virtual bool Enable( bool enable = true );
+ virtual void DoEnable( bool enable );
virtual void SetFocus();
virtual void SetFocusFromKbd();
bool HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags);
bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
- // list of disabled children before last call to our Disable()
- wxWindowList *m_childrenDisabled;
// number of calls to Freeze() minus number of calls to Thaw()
unsigned int m_frozenness;
virtual void Raise(void);
virtual void Lower(void);
virtual bool Show(bool bShow = true);
- virtual bool Enable(bool bEnable = true);
+ virtual void DoEnable(bool bEnable);
virtual void SetFocus(void);
virtual void SetFocusFromKbd(void);
virtual bool Reparent(wxWindow* pNewParent);
,WXWPARAM wParam = 0
) const;
- wxWindowList* m_pChildrenDisabled;
HWND m_hWndScrollBarHorz;
HWND m_hWndScrollBarVert;
SWP m_vWinSwp;
bool HandleMoving(wxRect& rect);
bool HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags);
- // list of disabled children before last call to our Disable()
- wxWindowList *m_childrenDisabled;
-
// number of calls to Freeze() minus number of calls to Thaw()
unsigned int m_frozenness;
#define wxUSE_MENUS_NATIVE wxUSE_MENUS
#endif // __WXUNIVERSAL__/!__WXUNIVERSAL__
+
+// Define this macro if the corresponding operating system handles the state
+// of children windows automatically when the parent is enabled/disabled.
+// Otherwise wx itself must ensure that when the parent is disabled its
+// children are disabled too, and their initial state is restored when the
+// parent is enabled back.
+#if defined(__WXMSW__) || defined(__WXPM__)
+ // must do everything ourselves
+ #undef wxHAS_NATIVE_ENABLED_MANAGEMENT
+#else
+ #define wxHAS_NATIVE_ENABLED_MANAGEMENT
+#endif
+
// ----------------------------------------------------------------------------
// forward declarations
// ----------------------------------------------------------------------------
void SetInitialSize(const wxSize& size=wxDefaultSize);
wxDEPRECATED( void SetBestFittingSize(const wxSize& size=wxDefaultSize) ); // replaced by SetInitialSize
-
+
// the generic centre function - centers the window on parent by`
// default or on screen if it doesn't have parent or
// wxCENTER_ON_SCREEN flag is given
// and it is therefore overridden in wxTLW to do that.
// In wxWindow(Base), it has (unfortunately) been abused
// to mean the same as SetMinSize() and SetMaxSize().
-
+
virtual void SetSizeHints( int minW, int minH,
int maxW = wxDefaultCoord, int maxH = wxDefaultCoord,
int incW = wxDefaultCoord, int incH = wxDefaultCoord )
}
- // Call these to override what GetBestSize() returns. This
+ // Call these to override what GetBestSize() returns. This
// method is only virtual because it is overriden in wxTLW
// as a different API for SetSizeHints().
virtual void SetMinSize(const wxSize& minSize) { m_minWidth = minSize.x; m_minHeight = minSize.y; }
virtual void SetMaxSize(const wxSize& maxSize) { m_maxWidth = maxSize.x; m_maxHeight = maxSize.y; }
// Override these methods to impose restrictions on min/max size.
- // The easier way is to call SetMinSize() and SetMaxSize() which
+ // The easier way is to call SetMinSize() and SetMaxSize() which
// will have the same effect. Doing both is non-sense.
virtual wxSize GetMinSize() const { return wxSize(m_minWidth, m_minHeight); }
virtual wxSize GetMaxSize() const { return wxSize(m_maxWidth, m_maxHeight); }
bool Disable() { return Enable(false); }
virtual bool IsShown() const { return m_isShown; }
- virtual bool IsEnabled() const { return m_isEnabled; }
+ // returns true if the window is really enabled and false otherwise,
+ // whether because it had been explicitly disabled itself or because
+ // its parent is currently disabled -- then this method returns false
+ // whatever is the intrinsic state of this window, use IsThisEnabled(0
+ // to retrieve it. In other words, this relation always holds:
+ //
+ // IsEnabled() == IsThisEnabled() && parent.IsEnabled()
+ //
+ bool IsEnabled() const;
+
+ // returns the internal window state independently of the parent(s)
+ // state, i.e. the state in which the window would be if all its
+ // parents were enabled (use IsEnabled() above to get the effective
+ // window state)
+ bool IsThisEnabled() const { return m_isEnabled; }
// returns true if the window is visible, i.e. IsShown() returns true
// if called on it and all its parents up to the first TLW
virtual wxWindow *GetMainWindowOfCompositeControl()
{ return (wxWindow*)this; }
+ // this method should be implemented to use operating system specific code
+ // to really enable/disable the widget, it will only be called when we
+ // really need to enable/disable window and so no additional checks on the
+ // widgets state are necessary
+ virtual void DoEnable(bool WXUNUSED(enable)) { }
+
+ // called when the on-screen widget state changes and provides an
+ // an opportunity for the widget to update its visual state (colours,
+ // fonts, anything else) as necessary
+ virtual void OnEnabled(bool WXUNUSED(enabled)) { }
+
+
// the window id - a number which uniquely identifies a window among
// its siblings unless it is wxID_ANY
wxWindowID m_windowId;
static void NotifyCaptureLost();
private:
+ // recursively call our own and our children OnEnabled() when the
+ // enabled/disabled status changed because a parent window had been
+ // enabled/disabled
+ void NotifyWindowOnEnableChange(bool enabled);
+
+
// contains the last id generated by NewControlId
static int ms_lastControlId;
#endif // wxUSE_TOOLTIPS
void OnEnableAll(wxCommandEvent& event);
+ void OnHideAll(wxCommandEvent& event);
+ void OnHideList(wxCommandEvent& event);
void OnContextHelp(wxCommandEvent& event);
void OnIdle( wxIdleEvent& event );
// panel menu
CONTROLS_ENABLE_ALL,
+ CONTROLS_HIDE_ALL,
+ CONTROLS_HIDE_LIST,
CONTROLS_CONTEXT_HELP
};
#endif // wxUSE_TOOLTIPS
EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll)
+ EVT_MENU(CONTROLS_HIDE_ALL, MyFrame::OnHideAll)
+ EVT_MENU(CONTROLS_HIDE_LIST, MyFrame::OnHideList)
EVT_MENU(CONTROLS_CONTEXT_HELP, MyFrame::OnContextHelp)
EVT_ICONIZE(MyFrame::OnIconized)
wxMenu *panel_menu = new wxMenu;
panel_menu->Append(CONTROLS_ENABLE_ALL, _T("&Disable all\tCtrl-E"),
_T("Enable/disable all panel controls"), true);
+ panel_menu->Append(CONTROLS_HIDE_ALL, _T("&Hide all\tCtrl-I"),
+ _T("Show/hide thoe whole panel controls"), true);
+ panel_menu->Append(CONTROLS_HIDE_LIST, _T("Hide &list ctrl\tCtrl-S"),
+ _T("Enable/disable all panel controls"), true);
panel_menu->Append(CONTROLS_CONTEXT_HELP, _T("&Context help...\tCtrl-H"),
_T("Get context help for a control"));
menu_bar->Append(panel_menu, _T("&Panel"));
s_enable = !s_enable;
m_panel->Enable(s_enable);
+ static bool s_enableCheckbox = true;
+ if ( !s_enable )
+ {
+ // this is a test for correct behaviour of either enabling or disabling
+ // a child when its parent is disabled: the checkbox should have the
+ // correct state when the parent is enabled back
+ m_panel->m_checkbox->Enable(s_enableCheckbox);
+ s_enableCheckbox = !s_enableCheckbox;
+ }
+}
+
+void MyFrame::OnHideAll(wxCommandEvent& WXUNUSED(event))
+{
+ static bool s_show = true;
+
+ s_show = !s_show;
+ m_panel->Show(s_show);
+}
+
+void MyFrame::OnHideList(wxCommandEvent& WXUNUSED(event))
+{
+ static bool s_show = true;
+
+ s_show = !s_show;
+ m_panel->m_listbox->Show(s_show);
}
void MyFrame::OnContextHelp(wxCommandEvent& WXUNUSED(event))
m_wxCocoaScrollView = NULL;
m_isBeingDeleted = false;
m_isInPaint = false;
- m_shouldBeEnabled = true;
}
// Constructor
[[oldView superview] replaceSubview:oldView with:newView];
}
-bool wxWindow::EnableSelfAndChildren(bool enable)
+void wxWindow::DoEnable(bool enable)
{
- // If the state isn't changing, don't do anything
- if(!wxWindowBase::Enable(enable && m_shouldBeEnabled))
- return false;
- // Set the state of the Cocoa window
- CocoaSetEnabled(m_isEnabled);
- // Disable all children or (if enabling) return them to their proper state
- for(wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
- node; node = node->GetNext())
- {
- node->GetData()->EnableSelfAndChildren(enable);
- }
- return true;
-}
-
-bool wxWindow::Enable(bool enable)
-{
- // Keep track of what the window SHOULD be doing
- m_shouldBeEnabled = enable;
- // If the parent is disabled for any reason, then this window will be too.
- if(!IsTopLevel() && GetParent())
- {
- enable = enable && GetParent()->IsEnabled();
- }
- return EnableSelfAndChildren(enable);
+ CocoaSetEnabled(enable);
}
bool wxWindow::Show(bool show)
}
}
-bool wxWindowBase::Enable(bool enable)
+bool wxWindowBase::IsEnabled() const
{
- if ( enable != m_isEnabled )
- {
- m_isEnabled = enable;
+ return IsThisEnabled() && (IsTopLevel() || !GetParent() || GetParent()->IsEnabled());
+}
- return true;
- }
- else
+void wxWindowBase::NotifyWindowOnEnableChange(bool enabled)
+{
+#ifndef wxHAS_NATIVE_ENABLED_MANAGEMENT
+ DoEnable(enabled);
+#endif // !defined(wxHAS_NATIVE_ENABLED_MANAGEMENT)
+
+ OnEnabled(enabled);
+
+ // If we are top-level then the logic doesn't apply - otherwise
+ // showing a modal dialog would result in total greying out (and ungreying
+ // out later) of everything which would be really ugly
+ if ( IsTopLevel() )
+ return;
+
+ for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
+ node;
+ node = node->GetNext() )
{
+ wxWindowBase * const child = node->GetData();
+ if ( !child->IsTopLevel() && child->IsThisEnabled() )
+ child->NotifyWindowOnEnableChange(enabled);
+ }
+}
+
+bool wxWindowBase::Enable(bool enable)
+{
+ if ( enable == IsThisEnabled() )
return false;
+
+ m_isEnabled = enable;
+
+#ifdef wxHAS_NATIVE_ENABLED_MANAGEMENT
+ DoEnable(enable);
+#else // !defined(wxHAS_NATIVE_ENABLED_MANAGEMENT)
+ wxWindowBase * const parent = GetParent();
+ if( !IsTopLevel() && parent && !parent->IsEnabled() )
+ {
+ return true;
}
+#endif // !defined(wxHAS_NATIVE_ENABLED_MANAGEMENT)
+
+ NotifyWindowOnEnableChange(enable);
+
+ return true;
}
bool wxWindowBase::IsShownOnScreen() const
return false;
}
+ const bool oldEnabledState = IsEnabled();
+
// unlink this window from the existing parent.
if ( oldParent )
{
wxTopLevelWindows.Append((wxWindow *)this);
}
+ // We need to notify window (and its subwindows) if by changing the parent
+ // we also change our enabled/disabled status.
+ const bool newEnabledState = IsEnabled();
+ if ( newEnabledState != oldEnabledState )
+ {
+ NotifyWindowOnEnableChange(newEnabledState);
+ }
+
return true;
}
InvalidateBestSize();
wxBitmap the_one;
- if (!m_isEnabled)
+ if (!IsThisEnabled())
the_one = m_bmpDisabled;
else if (m_isSelected)
the_one = m_bmpSelected;
}
// wxGTK-specific: called recursively by Enable,
-// to give widgets an oppprtunity to correct their colours after they
+// to give widgets an opportunity to correct their colours after they
// have been changed by Enable
-void wxTextCtrl::OnParentEnable( bool enable )
+void wxTextCtrl::OnEnabled( bool enable )
{
// If we have a custom background colour, we use this colour in both
// disabled and enabled mode, or we end up with a different colour under the
return true;
}
-static void wxWindowNotifyEnable(wxWindowGTK* win, bool enable)
+void wxWindowGTK::DoEnable( bool enable )
{
- win->OnParentEnable(enable);
-
- // Recurse, so that children have the opportunity to Do The Right Thing
- // and reset colours that have been messed up by a parent's (really ancestor's)
- // Enable call
- for ( wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst();
- node;
- node = node->GetNext() )
- {
- wxWindow *child = node->GetData();
- if (!child->IsKindOf(CLASSINFO(wxDialog)) && !child->IsKindOf(CLASSINFO(wxFrame)))
- wxWindowNotifyEnable(child, enable);
- }
-}
-
-bool wxWindowGTK::Enable( bool enable )
-{
- wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") );
-
- if (!wxWindowBase::Enable(enable))
- {
- // nothing to do
- return false;
- }
+ wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
gtk_widget_set_sensitive( m_widget, enable );
if ( m_wxwindow )
gtk_widget_set_sensitive( m_wxwindow, enable );
-
- wxWindowNotifyEnable(this, enable);
-
- return true;
}
int wxWindowGTK::GetCharHeight() const
InvalidateBestSize();
wxBitmap the_one;
- if (!m_isEnabled)
+ if (!IsThisEnabled())
the_one = m_bmpDisabled;
else if (m_isSelected)
the_one = m_bmpSelected;
}
}
-bool wxTextCtrl::Enable( bool enable )
+void wxTextCtrl::DoEnable( bool enable )
{
- if (!wxWindowBase::Enable(enable))
- {
- // nothing to do
- return false;
- }
-
if (m_windowStyle & wxTE_MULTILINE)
{
gtk_text_set_editable( GTK_TEXT(m_text), enable );
- OnParentEnable(enable);
}
else
{
gtk_widget_set_sensitive( m_text, enable );
}
-
- return true;
}
// wxGTK-specific: called recursively by Enable,
// to give widgets an oppprtunity to correct their colours after they
// have been changed by Enable
-void wxTextCtrl::OnParentEnable( bool enable )
+void wxTextCtrl::OnEnabled( bool enable )
{
+ if ( IsSingleLine() )
+ return;
+
// If we have a custom background colour, we use this colour in both
// disabled and enabled mode, or we end up with a different colour under the
// text.
return true;
}
-static void wxWindowNotifyEnable(wxWindowGTK* win, bool enable)
-{
- win->OnParentEnable(enable);
-
- // Recurse, so that children have the opportunity to Do The Right Thing
- // and reset colours that have been messed up by a parent's (really ancestor's)
- // Enable call
- for ( wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst();
- node;
- node = node->GetNext() )
- {
- wxWindow *child = node->GetData();
- if (!child->IsKindOf(CLASSINFO(wxDialog)) && !child->IsKindOf(CLASSINFO(wxFrame)))
- wxWindowNotifyEnable(child, enable);
- }
-}
-
-bool wxWindowGTK::Enable( bool enable )
+void wxWindowGTK::DoEnable( bool enable )
{
wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") );
- if (!wxWindowBase::Enable(enable))
- {
- // nothing to do
- return false;
- }
-
gtk_widget_set_sensitive( m_widget, enable );
if ( m_wxwindow )
gtk_widget_set_sensitive( m_wxwindow, enable );
-
- wxWindowNotifyEnable(this, enable);
-
- return true;
}
int wxWindowGTK::GetCharHeight() const
return true;
}
-bool wxWindowMac::Enable(bool enable)
+void wxWindowMac::DoEnable(bool enable)
{
- wxASSERT( m_peer->Ok() ) ;
- bool former = MacIsReallyEnabled() ;
- if ( !wxWindowBase::Enable(enable) )
- return false;
-
m_peer->Enable( enable ) ;
-
- if ( former != MacIsReallyEnabled() )
- MacPropagateEnabledStateChanged() ;
-
- return true;
}
//
#endif
}
-void wxWindowMac::MacPropagateEnabledStateChanged()
+void wxWindowMac::OnEnabled(bool enabled)
{
#if !TARGET_API_MAC_OSX
MacEnabledStateChanged() ;
-
- wxWindowMac *child;
- wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
- while ( node )
- {
- child = node->GetData();
- if ( child->IsEnabled() )
- child->MacPropagateEnabledStateChanged() ;
-
- node = node->GetNext();
- }
#endif
}
m_mouseInWindow = false;
m_lastKeydownProcessed = false;
- m_childrenDisabled = NULL;
m_frozenness = 0;
m_hWnd = 0;
wxRemoveHandleAssociation(this);
}
- delete m_childrenDisabled;
-
}
// real construction (Init() must have been called before!)
return NULL;
}
-bool wxWindowMSW::Enable(bool enable)
+void wxWindowMSW::DoEnable( bool enable )
{
- // we shouldn't really enable the window if our parent is currently
- // disabled because under MSW this would indeed show the window in enabled
- // state but it still wouldn't respond to the input (as its parent is
- // disabled), so just update the internal m_childrenDisabled list in this
- // case and our state will be really changed when the parent is enabled
-
- // the logic above doesn't apply to top level windows, of course
- wxWindowMSW * const parent = IsTopLevel() ? NULL : GetParent();
- if ( parent && !parent->IsEnabled() && !IsEnabled() )
- {
- // it's a reference as we can create it below
- wxWindowList *& disabledSiblings = parent->m_childrenDisabled;
-
- bool rc = false;
- if ( enable )
- {
- // shouldn't be disabled when the parent is reenabled
- if ( disabledSiblings )
- {
- wxWindowList::compatibility_iterator
- i = disabledSiblings->Find(this);
- if ( i )
- {
- disabledSiblings->Erase(i);
- rc = true;
- }
- }
- //else: nothing to do
- }
- else // !enable
- {
- // should disable this window when the parent is enabled
- if ( !disabledSiblings )
- disabledSiblings = new wxWindowList;
-
- disabledSiblings->Append(this);
- }
-
- return rc;
- }
-
- if ( !wxWindowBase::Enable(enable) )
- return false;
-
HWND hWnd = GetHwnd();
if ( hWnd )
::EnableWindow(hWnd, (BOOL)enable);
-
- // the logic below doesn't apply to the top level windows -- otherwise
- // showing a modal dialog would result in total greying out (and ungreying
- // out later) of everything which would be really ugly
- if ( IsTopLevel() )
- return true;
-
- // when the parent is disabled, all of its children should be disabled as
- // well but when it is enabled back, only those of the children which
- // hadn't been already disabled in the beginning should be enabled again,
- // so we have to keep the list of those children
- for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
- node;
- node = node->GetNext() )
- {
- wxWindow *child = node->GetData();
- if ( child->IsTopLevel() )
- {
- // the logic below doesn't apply to top level children
- continue;
- }
-
- if ( enable )
- {
- // re-enable the child 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);
- }
- }
- }
-
- 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;
}
bool wxWindowMSW::Show(bool show)
m_bUseCtl3D = false;
m_bMouseInWindow = false;
m_bLastKeydownProcessed = false;
- m_pChildrenDisabled = NULL;
//
// wxWnd
//
wxRemoveHandleAssociation(this);
}
- delete m_pChildrenDisabled;
} // end of wxWindowOS2::~wxWindowOS2
// real construction (Init() must have been called before!)
return NULL;
} // wxWindowBase::DoFindFocus
-bool wxWindowOS2::Enable( bool bEnable )
+void wxWindowOS2::DoEnable( bool bEnable )
{
- if (!wxWindowBase::Enable(bEnable))
- return false;
-
HWND hWnd = GetHwnd();
-
if ( hWnd )
::WinEnableWindow(hWnd, (BOOL)bEnable);
-
- //
- // The logic below doesn't apply to the top level windows -- otherwise
- // showing a modal dialog would result in total greying out (and ungreying
- // out later) of everything which would be really ugly
- //
- if (IsTopLevel())
- return true;
-
- wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
-
- while (node)
- {
- wxWindow* pChild = node->GetData();
-
- if (bEnable)
- {
- //
- // Enable the child back unless it had been disabled before us
- //
- if (!m_pChildrenDisabled || !m_pChildrenDisabled->Find(pChild))
- pChild->Enable();
- }
- else // we're being disabled
- {
- if (pChild->IsEnabled())
- {
- //
- // Disable it as children shouldn't stay enabled while the
- // parent is not
- //
- pChild->Disable();
- }
- else // child already disabled, remember it
- {
- //
- // Have we created the list of disabled children already?
- //
- if (!m_pChildrenDisabled)
- m_pChildrenDisabled = new wxWindowList;
- m_pChildrenDisabled->Append(pChild);
- }
- }
- node = node->GetNext();
- }
- if (bEnable && m_pChildrenDisabled)
- {
- //
- // We don't need this list any more, don't keep unused memory
- //
- delete m_pChildrenDisabled;
- m_pChildrenDisabled = NULL;
- }
- return true;
-} // end of wxWindowOS2::Enable
+}
bool wxWindowOS2::Show( bool bShow )
{