]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxWindow::IsDescendant() helper.
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 27 Mar 2012 11:58:02 +0000 (11:58 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 27 Mar 2012 11:58:02 +0000 (11:58 +0000)
This function checks if another window is a direct or indirect child of this
one, which can be needed in a number of situations.

See #3063.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71024 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/window.h
interface/wx/window.h
src/common/wincmn.cpp

index 774be3539d61f03bfd1a7fccfd999c76b8183a71..7a15b0bee7f5e9b65261d1d843ae6c2c50735906 100644 (file)
@@ -740,6 +740,10 @@ public:
         // is this window a top level one?
     virtual bool IsTopLevel() const;
 
+        // is this window a child or grand child of this one (inside the same
+        // TLW)?
+    bool IsDescendant(wxWindowBase* win) const;
+
         // it doesn't really change parent, use Reparent() instead
     void SetParent( wxWindowBase *parent ) { m_parent = (wxWindow *)parent; }
         // change the real parent of this window, return true if the parent
index 83725acb3365c92719033deba44234cf7f739df8..89d34bd2fd87604306b1722dc99576ab4dd55ee3 100644 (file)
@@ -493,6 +493,23 @@ public:
         @see GetNextSibling()
     */
     wxWindow* GetPrevSibling() const;
+
+    /**
+        Check if the specified window is a descendant of this one.
+
+        Returns @true if the window is a descendant (i.e. a child or
+        grand-child or grand-grand-child or ...) of this one.
+
+        Notice that a window can never be a descendant of another one if they
+        are in different top level windows, i.e. a child of a wxDialog is not
+        considered to be a descendant of dialogs parent wxFrame.
+
+        @param win Any window, possible @NULL (@false is always returned then).
+
+        @since 2.9.4
+     */
+    bool IsDescendant(wxWindowBase* win) const;
+
     /**
         Reparents the window, i.e. the window will be removed from its
         current parent window (e.g. a non-standard toolbar in a wxFrame)
index 068a15bc40515ea88a61601e252d6eb05650773d..17d8f40a31a5fe19a9094e66697a7ad5d6de9ec1 100644 (file)
@@ -1242,9 +1242,28 @@ void wxWindowBase::Thaw()
 }
 
 // ----------------------------------------------------------------------------
-// reparenting the window
+// Dealing with parents and children.
 // ----------------------------------------------------------------------------
 
+bool wxWindowBase::IsDescendant(wxWindowBase* win) const
+{
+    // Iterate until we find this window in the parent chain or exhaust it.
+    while ( win )
+    {
+        wxWindow* const parent = win->GetParent();
+        if ( parent == this )
+            return true;
+
+        // Stop iterating on reaching the top level window boundary.
+        if ( parent->IsTopLevel() )
+            break;
+
+        win = parent;
+    }
+
+    return false;
+}
+
 void wxWindowBase::AddChild(wxWindowBase *child)
 {
     wxCHECK_RET( child, wxT("can't add a NULL child") );