From 146ba0feacf1222ec8a45dfd69dae77b063bf2cf Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Sat, 25 May 2002 14:24:43 +0000
Subject: [PATCH] new wxWindow::FindWindowByXXX() methods replacing the old
 global functions (patches 560214, 559916, 559811, ...)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15664 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/function.tex |   6 ++
 docs/latex/wx/window.tex   |  43 +++++++++++++
 include/wx/utils.h         |  20 +++---
 include/wx/window.h        |  16 ++++-
 src/common/utilscmn.cpp    |  99 +-----------------------------
 src/common/wincmn.cpp      | 121 ++++++++++++++++++++++++++++++++++++-
 6 files changed, 197 insertions(+), 108 deletions(-)

diff --git a/docs/latex/wx/function.tex b/docs/latex/wx/function.tex
index 486303f667..5db1fceff4 100644
--- a/docs/latex/wx/function.tex
+++ b/docs/latex/wx/function.tex
@@ -2160,6 +2160,9 @@ Find a menu item identifier associated with the given frame's menu bar.
 
 \func{wxWindow *}{wxFindWindowByLabel}{\param{const wxString\& }{label}, \param{wxWindow *}{parent=NULL}}
 
+{\bf NB:} This function is obsolete, please use 
+\helpref{wxWindow::FindWindowByLabel}{wxwindowfindwindowbylabel} instead.
+
 Find a window by its label. Depending on the type of window, the label may be a window title
 or panel item label. If {\it parent} is NULL, the search will start from all top-level
 frames and dialog boxes; if non-NULL, the search will be limited to the given window hierarchy.
@@ -2173,6 +2176,9 @@ The search is recursive in both cases.
 
 \func{wxWindow *}{wxFindWindowByName}{\param{const wxString\& }{name}, \param{wxWindow *}{parent=NULL}}
 
+{\bf NB:} This function is obsolete, please use 
+\helpref{wxWindow::FindWindowByName}{wxwindowfindwindowbyname} instead.
+
 Find a window by its name (as given in a window constructor or {\bf Create} function call).
 If {\it parent} is NULL, the search will start from all top-level
 frames and dialog boxes; if non-NULL, the search will be limited to the given window hierarchy.
diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex
index ac4fba3bba..5ccf411a0d 100644
--- a/docs/latex/wx/window.tex
+++ b/docs/latex/wx/window.tex
@@ -469,6 +469,49 @@ implements the following methods:\par
 \end{twocollist}}
 }
 
+\membersection{wxWindow::FindWindowById}\label{wxwindowfindwindow}
+
+\func{wxWindow*}{FindWindowById}{\param{long}{ id}}
+
+Find the first window with the given {\it id}.
+
+If {\it parent} is NULL, the search will start from all top-level
+frames and dialog boxes; if non-NULL, the search will be limited to the given window hierarchy.
+The search is recursive in both cases.
+
+\wxheading{See also}
+
+\helpref{FindWindowById}{wxwindowfindwindowbyid}
+
+\membersection{wxWindow::FindWindowByName}\label{wxwindowfindwindowbyname}
+
+\func{wxWindow*}{FindWindowByName}{\param{long}{ id}}
+
+Find a window by its name (as given in a window constructor or {\bf Create} function call).
+If {\it parent} is NULL, the search will start from all top-level
+frames and dialog boxes; if non-NULL, the search will be limited to the given window hierarchy.
+The search is recursive in both cases.
+
+If no window with such name is found, 
+\helpref{FindWindowByLabel}{wxwindowfindwindowbylabel} is called.
+
+\wxheading{See also}
+
+\helpref{FindWindowById}{wxwindowfindwindowbyid}
+
+\membersection{wxWindow::FindWindowByLabel}\label{wxwindowfindwindowbylabel}
+
+\func{wxWindow*}{FindWindowByLabel}{\param{long}{ id}}
+
+Find a window by its label. Depending on the type of window, the label may be a window title
+or panel item label. If {\it parent} is NULL, the search will start from all top-level
+frames and dialog boxes; if non-NULL, the search will be limited to the given window hierarchy.
+The search is recursive in both cases.
+
+\wxheading{See also}
+
+\helpref{FindWindowById}{wxwindowfindwindowbyid}
+
 \membersection{wxWindow::Fit}\label{wxwindowfit}
 
 \func{virtual void}{Fit}{\void}
diff --git a/include/wx/utils.h b/include/wx/utils.h
index 2b984a8d4c..9362a0055a 100644
--- a/include/wx/utils.h
+++ b/include/wx/utils.h
@@ -332,14 +332,6 @@ WXDLLEXPORT wxAcceleratorEntry *wxGetAccelFromString(const wxString& label);
 // Window search
 // ----------------------------------------------------------------------------
 
-// Find the window/widget with the given title or label.
-// Pass a parent to begin the search from, or NULL to look through
-// all windows.
-WXDLLEXPORT wxWindow* wxFindWindowByLabel(const wxString& title, wxWindow *parent = (wxWindow *) NULL);
-
-// Find window by name, and if that fails, by label.
-WXDLLEXPORT wxWindow* wxFindWindowByName(const wxString& name, wxWindow *parent = (wxWindow *) NULL);
-
 // Returns menu item id or -1 if none.
 WXDLLEXPORT int wxFindMenuItemId(wxFrame *frame, const wxString& menuString, const wxString& itemString);
 
@@ -348,6 +340,18 @@ WXDLLEXPORT int wxFindMenuItemId(wxFrame *frame, const wxString& menuString, con
 WXDLLEXPORT wxWindow* wxGenericFindWindowAtPoint(const wxPoint& pt);
 WXDLLEXPORT wxWindow* wxFindWindowAtPoint(const wxPoint& pt);
 
+// NB: this function is obsolete, use wxWindow::FindWindowByLabel() instead
+//
+// Find the window/widget with the given title or label.
+// Pass a parent to begin the search from, or NULL to look through
+// all windows.
+WXDLLEXPORT wxWindow* wxFindWindowByLabel(const wxString& title, wxWindow *parent = (wxWindow *) NULL);
+
+// NB: this function is obsolete, use wxWindow::FindWindowByName() instead
+//
+// Find window by name, and if that fails, by label.
+WXDLLEXPORT wxWindow* wxFindWindowByName(const wxString& name, wxWindow *parent = (wxWindow *) NULL);
+
 // ----------------------------------------------------------------------------
 // Message/event queue helpers
 // ----------------------------------------------------------------------------
diff --git a/include/wx/window.h b/include/wx/window.h
index e048a84744..ea39b0fd94 100644
--- a/include/wx/window.h
+++ b/include/wx/window.h
@@ -423,14 +423,24 @@ public:
         // was changed, FALSE otherwise (error or newParent == oldParent)
     virtual bool Reparent( wxWindowBase *newParent );
 
+        // implementation mostly
+    virtual void AddChild( wxWindowBase *child );
+    virtual void RemoveChild( wxWindowBase *child );
+
+    // looking for windows
+    // -------------------
+
         // find window among the descendants of this one either by id or by
         // name (return NULL if not found)
     wxWindow *FindWindow( long id );
     wxWindow *FindWindow( const wxString& name );
 
-        // implementation mostly
-    virtual void AddChild( wxWindowBase *child );
-    virtual void RemoveChild( wxWindowBase *child );
+        // Find a window among any window (all return NULL if not found)
+    static wxWindow *FindWindowById( long id, const wxWindow *parent = NULL );
+    static wxWindow *FindWindowByName( const wxString& name,
+                                       const wxWindow *parent = NULL );
+    static wxWindow *FindWindowByLabel( const wxString& label,
+                                        const wxWindow *parent = NULL );
 
     // event handler stuff
     // -------------------
diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp
index 71958c6fc2..05e1c3f123 100644
--- a/src/common/utilscmn.cpp
+++ b/src/common/utilscmn.cpp
@@ -102,11 +102,6 @@
 // function protoypes
 // ----------------------------------------------------------------------------
 
-#if wxUSE_GUI
-    static wxWindow *wxFindWindowByLabel1(const wxString& title, wxWindow *parent);
-    static wxWindow *wxFindWindowByName1 (const wxString& title, wxWindow *parent);
-#endif // wxUSE_GUI
-
 // ============================================================================
 // implementation
 // ============================================================================
@@ -491,52 +486,9 @@ wxString wxStripMenuCodes(const wxString& in)
 wxWindow *
 wxFindWindowByLabel (const wxString& title, wxWindow * parent)
 {
-    if (parent)
-    {
-        return wxFindWindowByLabel1(title, parent);
-    }
-    else
-    {
-        for ( wxWindowList::Node * node = wxTopLevelWindows.GetFirst();
-              node;
-              node = node->GetNext() )
-        {
-            wxWindow *win = node->GetData();
-            wxWindow *retwin = wxFindWindowByLabel1 (title, win);
-            if (retwin)
-                return retwin;
-        }                        // for()
-
-    }
-    return (wxWindow *) NULL;
+    return wxWindow::FindWindowByLabel( title, parent );
 }
 
-// Recursive
-static wxWindow *
-wxFindWindowByLabel1 (const wxString& title, wxWindow * parent)
-{
-    if (parent)
-    {
-        if (parent->GetLabel() == title)
-            return parent;
-    }
-
-    if (parent)
-    {
-        for ( wxWindowList::Node * node = parent->GetChildren().GetFirst();
-              node;
-              node = node->GetNext() )
-        {
-            wxWindow *win = (wxWindow *)node->GetData();
-            wxWindow *retwin = wxFindWindowByLabel1 (title, win);
-            if (retwin)
-                return retwin;
-        }
-
-    }
-
-    return (wxWindow *) NULL;                        // Not found
-}
 
 /*
  * If parent is non-NULL, look through children for a name
@@ -545,54 +497,9 @@ wxFindWindowByLabel1 (const wxString& title, wxWindow * parent)
  */
 
 wxWindow *
-wxFindWindowByName (const wxString& title, wxWindow * parent)
+wxFindWindowByName (const wxString& name, wxWindow * parent)
 {
-    if (parent)
-    {
-        return wxFindWindowByName1 (title, parent);
-    }
-    else
-    {
-        for ( wxWindowList::Node * node = wxTopLevelWindows.GetFirst();
-              node;
-              node = node->GetNext() )
-        {
-            wxWindow *win = node->GetData();
-            wxWindow *retwin = wxFindWindowByName1 (title, win);
-            if (retwin)
-                return retwin;
-        }
-
-    }
-
-    // Failed? Try by label instead.
-    return wxFindWindowByLabel(title, parent);
-}
-
-// Recursive
-static wxWindow *
-wxFindWindowByName1 (const wxString& title, wxWindow * parent)
-{
-  if (parent)
-    {
-            if ( parent->GetName() == title )
-                        return parent;
-    }
-
-  if (parent)
-    {
-      for (wxNode * node = parent->GetChildren().First (); node; node = node->Next ())
-        {
-          wxWindow *win = (wxWindow *) node->Data ();
-          wxWindow *retwin = wxFindWindowByName1 (title, win);
-          if (retwin)
-            return retwin;
-        }                        // for()
-
-    }
-
-  return (wxWindow *) NULL;                        // Not found
-
+    return wxWindow::FindWindowByName( name, parent );
 }
 
 // Returns menu item id or -1 if none.
diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp
index 5922d27f4a..32185dcf68 100644
--- a/src/common/wincmn.cpp
+++ b/src/common/wincmn.cpp
@@ -870,7 +870,7 @@ bool wxWindowBase::IsExposed(int x, int y, int w, int h) const
 }
 
 // ----------------------------------------------------------------------------
-// find window by id or name
+// find child window by id or name
 // ----------------------------------------------------------------------------
 
 wxWindow *wxWindowBase::FindWindow( long id )
@@ -905,6 +905,125 @@ wxWindow *wxWindowBase::FindWindow( const wxString& name )
     return (wxWindow *)res;
 }
 
+
+// find any window by id or name or label: If parent is non-NULL, look through
+// children for a label or title matching the specified string. If NULL, look
+// through all top-level windows.
+//
+// to avoid duplicating code we reuse the same helper function but with
+// different comparators
+
+typedef bool (*wxFindWindowCmp)(const wxWindow *win,
+                                const wxString& label, long id);
+
+static
+bool wxFindWindowCmpLabels(const wxWindow *win, const wxString& label,
+                           long WXUNUSED(id))
+{
+    return win->GetLabel() == label;
+}
+
+static
+bool wxFindWindowCmpNames(const wxWindow *win, const wxString& label,
+                          long WXUNUSED(id))
+{
+    return win->GetName() == label;
+}
+
+static
+bool wxFindWindowCmpIds(const wxWindow *win, const wxString& WXUNUSED(label),
+                        long id)
+{
+    return win->GetId() == id;
+}
+
+// recursive helper for the FindWindowByXXX() functions
+static
+wxWindow *wxFindWindowRecursively(const wxWindow *parent,
+                                  const wxString& label,
+                                  long id,
+                                  wxFindWindowCmp cmp)
+{
+    if ( parent )
+    {
+        // see if this is the one we're looking for
+        if ( (*cmp)(parent, label, id) )
+            return (wxWindow *)parent;
+
+        // It wasn't, so check all its children
+        for ( wxWindowList::Node * node = parent->GetChildren().GetFirst();
+              node;
+              node = node->GetNext() )
+        {
+            // recursively check each child
+            wxWindow *win = (wxWindow *)node->GetData();
+            wxWindow *retwin = wxFindWindowRecursively(win, label, id, cmp);
+            if (retwin)
+                return retwin;
+        }
+    }
+
+    // Not found
+    return NULL;
+}
+
+// helper for FindWindowByXXX()
+static
+wxWindow *wxFindWindowHelper(const wxWindow *parent,
+                             const wxString& label,
+                             long id,
+                             wxFindWindowCmp cmp)
+{
+    if ( parent )
+    {
+        // just check parent and all its children
+        return wxFindWindowRecursively(parent, label, id, cmp);
+    }
+
+    // start at very top of wx's windows
+    for ( wxWindowList::Node * node = wxTopLevelWindows.GetFirst();
+          node;
+          node = node->GetNext() )
+    {
+        // recursively check each window & its children
+        wxWindow *win = node->GetData();
+        wxWindow *retwin = wxFindWindowRecursively(win, label, id, cmp);
+        if (retwin)
+            return retwin;
+    }
+
+    return NULL;
+}
+
+/* static */
+wxWindow *
+wxWindowBase::FindWindowByLabel(const wxString& title, const wxWindow *parent)
+{
+    return wxFindWindowHelper(parent, title, 0, wxFindWindowCmpLabels);
+}
+
+/* static */
+wxWindow *
+wxWindowBase::FindWindowByName(const wxString& title, const wxWindow *parent)
+{
+    wxWindow *win = wxFindWindowHelper(parent, title, 0, wxFindWindowCmpNames);
+
+    if ( !win )
+    {
+        // fall back to the label
+        win = FindWindowByLabel(title, parent);
+    }
+
+    return win;
+}
+
+/* static */
+wxWindow *
+wxWindowBase::FindWindowById( long id, const wxWindow* parent )
+{
+    return wxFindWindowHelper(parent, _T(""), id, wxFindWindowCmpIds);
+}
+
 // ----------------------------------------------------------------------------
 // dialog oriented functions
 // ----------------------------------------------------------------------------
-- 
2.50.0

