]> git.saurik.com Git - wxWidgets.git/commitdiff
Added machinery to Enable/Disable windows. When a window is disabled, it
authorDavid Elliott <dfe@tgwbd.org>
Tue, 19 Aug 2003 14:45:54 +0000 (14:45 +0000)
committerDavid Elliott <dfe@tgwbd.org>
Tue, 19 Aug 2003 14:45:54 +0000 (14:45 +0000)
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
src/cocoa/window.mm

index 0a072ea49a039e27c215c08ce2972c155aaf3048..cbfc40a11bf9b69577b4012b30b7f8a5ae86bae5 100644 (file)
@@ -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__
index 7eae1635ab09cf89e1d41f740a17ada9ff113410..dd2e272a75232a363c5291875d40eb3e6ec2534b 100644 (file)
@@ -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;