]> git.saurik.com Git - wxWidgets.git/commitdiff
implemented wxDir as pure MGL code
authorVáclav Slavík <vslavik@fastmail.fm>
Fri, 14 Dec 2001 19:25:39 +0000 (19:25 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Fri, 14 Dec 2001 19:25:39 +0000 (19:25 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13014 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/mgl/dir.cpp [new file with mode: 0644]

diff --git a/src/mgl/dir.cpp b/src/mgl/dir.cpp
new file mode 100644 (file)
index 0000000..2fdbfe2
--- /dev/null
@@ -0,0 +1,275 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        mgl/dir.cpp
+// Purpose:     wxDir implementation for MGL
+// Author:      Vaclav Slavik, Vadim Zeitlin
+// Modified by:
+// Created:     2001/12/09
+// RCS-ID:      $Id$
+// Copyright:   (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
+//              (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Licence:     wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#ifdef __GNUG__
+    #pragma implementation "dir.h"
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+    #include "wx/intl.h"
+    #include "wx/log.h"
+#endif // PCH
+
+#include "wx/dir.h"
+#include "wx/filefn.h"          // for wxMatchWild
+#include "wx/mgl/private.h"
+
+// ----------------------------------------------------------------------------
+// macros
+// ----------------------------------------------------------------------------
+
+#define M_DIR       ((wxDirData *)m_data)
+
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
+
+// this class stores everything we need to enumerate the files
+class wxDirData
+{
+public:
+    wxDirData(const wxString& dirname);
+    ~wxDirData();
+
+    bool IsOk() const { return m_dir != NULL; }
+
+    void SetFileSpec(const wxString& filespec) { m_filespec = filespec; }
+    void SetFlags(int flags) { m_flags = flags; }
+
+    void Rewind();
+    bool Read(wxString *filename);
+
+    const wxString& GetName() const { return m_dirname; }
+
+private:
+    void    *m_dir;
+
+    wxString m_dirname;
+    wxString m_filespec;
+
+    int      m_flags;
+};
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxDirData
+// ----------------------------------------------------------------------------
+
+wxDirData::wxDirData(const wxString& dirname)
+         : m_dirname(dirname)
+{
+    m_dir = NULL;
+
+    // throw away the trailing slashes
+    size_t n = m_dirname.length();
+    wxCHECK_RET( n, _T("empty dir name in wxDir") );
+
+    while ( n > 0 && m_dirname[--n] == wxFILE_SEP_PATH ) {}
+
+    m_dirname.Truncate(n + 1);
+}
+
+wxDirData::~wxDirData()
+{
+    if ( m_dir )
+        PM_findClose(m_dir);
+}
+
+void wxDirData::Rewind()
+{
+    if ( m_dir )
+    {
+        PM_findClose(m_dir);
+        m_dir = NULL;
+    }
+}
+
+bool wxDirData::Read(wxString *filename)
+{
+    PM_findData data;
+    bool matches = FALSE;
+
+    // speed up string concatenation in the loop a bit
+    wxString path = m_dirname;
+    path += wxFILE_SEP_PATH;
+    path.reserve(path.length() + 255);
+
+    while ( !matches )
+    {
+        if ( m_dir )
+        {
+            if ( !PM_findNextFile(m_dir, &data) )
+                return FALSE;
+        }
+        else
+        {
+            m_dir = PM_findFirstFile(path + m_filespec , &data);
+            if ( m_dir == PM_FILE_INVALID )
+            {
+                m_dir = NULL;
+                return FALSE;
+            }
+        }
+
+        // don't return "." and ".." unless asked for
+        if ( data.name[0] == '.' &&
+             ((data.name[1] == '.' && data.name[2] == '\0') ||
+              (data.name[1] == '\0')) )
+        {
+            if ( !(m_flags & wxDIR_DOTDOT) )
+                continue;
+
+            // we found a valid match
+            break;
+        }
+
+        // check the type now
+        if ( !(m_flags & wxDIR_FILES) && !(data.attrib & PM_FILE_DIRECTORY) )
+        {
+            // it's a file, but we don't want them
+            continue;
+        }
+        else if ( !(m_flags & wxDIR_DIRS) && (data.attrib & PM_FILE_DIRECTORY) )
+        {
+            // it's a dir, and we don't want it
+            continue;
+        }
+
+        matches = m_flags & wxDIR_HIDDEN ? TRUE : !(data.attrib & PM_FILE_HIDDEN);
+    }
+
+    *filename = data.name;
+
+    return TRUE;
+}
+
+
+// ----------------------------------------------------------------------------
+// wxDir helpers
+// ----------------------------------------------------------------------------
+
+/* static */
+bool wxDir::Exists(const wxString& dir)
+{
+    return wxPathExists(dir);
+}
+
+// ----------------------------------------------------------------------------
+// wxDir construction/destruction
+// ----------------------------------------------------------------------------
+
+wxDir::wxDir(const wxString& dirname)
+{
+    m_data = NULL;
+
+    (void)Open(dirname);
+}
+
+bool wxDir::Open(const wxString& dirname)
+{
+    delete M_DIR;
+    m_data = new wxDirData(dirname);
+
+    if ( !M_DIR->IsOk() )
+    {
+        wxLogSysError(_("Can not enumerate files in directory '%s'"),
+                      dirname.c_str());
+
+        delete M_DIR;
+        m_data = NULL;
+
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+bool wxDir::IsOpened() const
+{
+    return m_data != NULL;
+}
+
+wxString wxDir::GetName() const
+{
+    wxString name;
+    if ( m_data )
+    {
+        name = M_DIR->GetName();
+        if ( !name.empty() && (name.Last() == wxFILE_SEP_PATH) )
+        {
+            // chop off the last (back)slash
+            name.Truncate(name.length() - 1);
+        }
+    }
+
+    return name;
+}
+
+wxDir::~wxDir()
+{
+    delete M_DIR;
+}
+
+// ----------------------------------------------------------------------------
+// wxDir enumerating
+// ----------------------------------------------------------------------------
+
+bool wxDir::GetFirst(wxString *filename,
+                     const wxString& filespec,
+                     int flags) const
+{
+    wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") );
+
+    M_DIR->Rewind();
+
+    M_DIR->SetFileSpec(filespec);
+    M_DIR->SetFlags(flags);
+
+    return GetNext(filename);
+}
+
+bool wxDir::GetNext(wxString *filename) const
+{
+    wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") );
+
+    wxCHECK_MSG( filename, FALSE, _T("bad pointer in wxDir::GetNext()") );
+
+    return M_DIR->Read(filename);
+}
+
+bool wxDir::HasSubDirs(const wxString& spec)
+{
+    wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") );
+
+    // just try to find first directory
+    wxString s;
+    return GetFirst(&s, spec, wxDIR_DIRS | wxDIR_HIDDEN);
+}
+