From d9ff0f91fbddae88286567cab74dcfb59c91fc0f Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Mon, 23 Jul 2001 13:28:39 +0000
Subject: [PATCH] added and documented wxDir::HasFiles/SubDirs(), use the
 latter in wxDirDialog - it is several orders of magniture faster than
 wxFindFirstFile!

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11161 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/dir.tex   | 16 ++++++++++++++++
 include/wx/dir.h        | 11 +++++++++--
 src/generic/dirdlgg.cpp | 34 ++++++++++++----------------------
 3 files changed, 37 insertions(+), 24 deletions(-)

diff --git a/docs/latex/wx/dir.tex b/docs/latex/wx/dir.tex
index f54e104053..6a3dbe6a83 100644
--- a/docs/latex/wx/dir.tex
+++ b/docs/latex/wx/dir.tex
@@ -126,6 +126,22 @@ empty) and flags, return TRUE on success.
 Continue enumerating files satisfying the criteria specified by the last call
 to \helpref{GetFirst}{wxdirgetfirst}.
 
+\membersection{wxDir::HasFiles}\label{wxdirhasfiles}
+
+\func{bool}{HasFiles}{\param{const wxString& }{filespec = wxEmptyString}}
+
+Returns {\tt TRUE} if the directory contains any files matching the given 
+{\it filespec}. If {\it filespec} is empty, look for any files at all. In any
+case, even hidden files are taken into account.
+
+\membersection{wxDir::HasSubDirs}\label{wxdirhassubdirs}
+
+\func{bool}{HasSubDirs}{\param{const wxString& }{dirspec = wxEmptyString}}
+
+Returns {\tt TRUE} if the directory contains any subdirectories (if a non
+empty {\it filespec} is given, only check for directories matching it).
+The hidden subdirectories are taken into account as well.
+
 \membersection{wxDir::Traverse}\label{wxdirtraverse}
 
 \func{size\_t}{Traverse}{\param{wxDirTraverser& }{sink}, \param{const wxString& }{filespec = wxEmptyString}, \param{int }{flags = wxDIR\_DEFAULT}}
diff --git a/include/wx/dir.h b/include/wx/dir.h
index de2563540b..4c8a2368cb 100644
--- a/include/wx/dir.h
+++ b/include/wx/dir.h
@@ -103,10 +103,17 @@ public:
                   const wxString& filespec = wxEmptyString,
                   int flags = wxDIR_DEFAULT) const;
 
-    // get next file in the enumeration started with either GetFirst() or
-    // GetFirstNormal()
+    // get next file in the enumeration started with GetFirst()
     bool GetNext(wxString *filename) const;
 
+    // return true if this directory has any files in it
+    bool HasFiles(const wxString& spec = wxEmptyString)
+        { wxString s; return GetFirst(&s, spec, wxDIR_FILES | wxDIR_HIDDEN); }
+
+    // return true if this directory has any subdirectories
+    bool HasSubDirs(const wxString& spec = wxEmptyString)
+        { wxString s; return GetFirst(&s, spec, wxDIR_DIRS | wxDIR_HIDDEN); }
+
     // enumerate all files in this directory and its subdirectories
     //
     // return the number of files found
diff --git a/src/generic/dirdlgg.cpp b/src/generic/dirdlgg.cpp
index 6158e8d0e6..d993b94ae7 100644
--- a/src/generic/dirdlgg.cpp
+++ b/src/generic/dirdlgg.cpp
@@ -39,6 +39,7 @@
 #include "wx/log.h"
 #include "wx/sizer.h"
 #include "wx/tokenzr.h"
+#include "wx/dir.h"
 
 #if wxUSE_STATLINE
     #include "wx/statline.h"
@@ -147,10 +148,7 @@ void wxDirItemData::SetNewDirName( wxString path )
 
 bool wxDirItemData::HasSubDirs()
 {
-    wxString search = m_path + wxT("/*");
-    wxLogNull log;
-    wxString path = wxFindFirstFile( search, wxDIR );
-    return (bool)(!path.IsNull());
+    return wxDir(m_path).HasSubDirs();
 }
 
 //-----------------------------------------------------------------------------
@@ -315,27 +313,19 @@ void wxDirCtrl::OnExpandItem(wxTreeEvent &event)
     wxDirItemData *data = (wxDirItemData *)GetItemData(event.GetItem());
     wxASSERT(data);
 
-    wxString search,path,filename;
-
     m_paths.Clear();
     m_names.Clear();
-#ifdef __WXMSW__
-    search = data->m_path + _T("\\*.*");
-#else
-    search = data->m_path + _T("/*");
-#endif
-    for (path = wxFindFirstFile( search, wxDIR ); !path.IsNull();
-       path=wxFindNextFile() )
+
+    wxDir dir(data->m_path);
+
+    wxString filename;
+    bool cont = dir.GetFirst(&filename, "", wxDIR_DIRS | wxDIR_HIDDEN);
+    while ( cont )
     {
-        filename = wxFileNameFromPath( path );
-        /* Don't add "." and ".." to the tree. I think wxFindNextFile
-         * also checks this, but I don't quite understand what happens
-         * there. Also wxFindNextFile seems to swallow hidden dirs */
-        if ( (filename != _T(".")) && (filename != _T("..")) )
-        {
-            m_paths.Add(path);
-            m_names.Add(filename);
-        }
+        m_paths.Add(data->m_path);
+        m_names.Add(filename);
+
+        cont = dir.GetNext(&filename);
     }
 
     CreateItems( event.GetItem() );
-- 
2.51.0

