From adb4816c3eb825108e8e94ef523a5da666111430 Mon Sep 17 00:00:00 2001 From: David Elliott <dfe@tgwbd.org> Date: Tue, 19 Aug 2003 14:45:54 +0000 Subject: [PATCH] Added machinery to Enable/Disable windows. When a window is disabled, it disables all of its children. Every window maintains a bool indicating whether it should be enabled (i.e. Enable() was called on it directly). When a window is reenabled, it reenables children, but only if they are actually supposed to be enabled. Override CocoaSetEnabled() in subclasses to actually enable/disable a Cocoa control. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23014 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/cocoa/window.h | 9 +++++++++ src/cocoa/window.mm | 29 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/include/wx/cocoa/window.h b/include/wx/cocoa/window.h index 0a072ea49a..cbfc40a11b 100644 --- a/include/wx/cocoa/window.h +++ b/include/wx/cocoa/window.h @@ -68,6 +68,14 @@ public: void CocoaAddChild(wxWindowCocoa *child); void CocoaRemoveFromParent(void); 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); virtual void Cocoa_FrameChanged(void); @@ -164,6 +172,7 @@ public: // 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 ); }; #endif // __WX_COCOA_WINDOW_H__ diff --git a/src/cocoa/window.mm b/src/cocoa/window.mm index 7eae1635ab..dd2e272a75 100644 --- a/src/cocoa/window.mm +++ b/src/cocoa/window.mm @@ -202,6 +202,7 @@ void wxWindowCocoa::Init() m_cocoaScroller = NULL; m_isBeingDeleted = FALSE; m_isInPaint = FALSE; + m_shouldBeEnabled = true; } // Constructor @@ -416,6 +417,34 @@ void wxWindow::CocoaReplaceView(WX_NSView oldView, WX_NSView newView) [[oldView superview] replaceSubview:oldView with:newView]; } +bool wxWindow::EnableSelfAndChildren(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); +} + bool wxWindow::Show(bool show) { wxAutoNSAutoreleasePool pool; -- 2.47.2