using a locally-defined list of directories makes the application and its files more
portable.
-Use the {\it wxFileNameFromPath} global function to extract the filename
-from the path.
+Use the \helpref{wxFileName::SplitPath}{wxfilenamesplitpath} global function
+to extract the filename from the path.
\wxheading{Derived from}
-\helpref{wxList}{wxlist}\\
-\helpref{wxObject}{wxobject}
+\helpref{wxArrayString}{wxarraystring}
\wxheading{Include files}
\wxheading{See also}
-\helpref{wxList}{wxlist}
+\helpref{wxArrayString}{wxarraystring}
\latexignore{\rtfignore{\wxheading{Members}}}
\func{}{wxPathList}{\void}
-Constructor.
+Empty constructor.
+
+\func{}{wxPathList}{\param{const wxArrayString\& }{arr}}
+
+Constructs the object calling the \helpref{Add}{wxpathlistadd} function.
\membersection{wxPathList::AddEnvList}\label{wxpathlistaddenvlist}
\func{void}{Add}{\param{const wxString\& }{path}}
-Adds the given directory to the path list, but does not
-check if the path was already on the list (use
-\helpref{wxPathList::Member()}{wxpathlistmember} for this).
+\func{void}{Add}{\param{const wxArrayString\& }{arr}}
+
+The first form adds the given directory (the filename if present is removed)
+to the path list, if the path is not already in the list.
+
+The second form just calls the first form on all elements of the given array.
\membersection{wxPathList::EnsureFileAccessible}\label{wxpathlistensurefileaccessible}
\membersection{wxPathList::FindAbsoluteValidPath}\label{wxpathlistfindabsolutepath}
-\func{wxString}{FindAbsoluteValidPath}{\param{const wxString\& }{file}}
+\constfunc{wxString}{FindAbsoluteValidPath}{\param{const wxString\& }{file}}
Searches for a full path for an existing file by appending {\it file} to
successive members of the path list. If the file wasn't found, an empty
\membersection{wxPathList::FindValidPath}\label{wxpathlistfindvalidpath}
-\func{wxString}{FindValidPath}{\param{const wxString\& }{file}}
+\constfunc{wxString}{FindValidPath}{\param{const wxString\& }{file}}
Searches for a full path for an existing file by appending {\it file} to
successive members of the path list. If the file wasn't found, an empty string
is returned. This path may be relative to the current working directory.
-
-\membersection{wxPathList::Member}\label{wxpathlistmember}
-
-\func{bool}{Member}{\param{const wxString\& }{file}}
-
-true if the path is in the path list (ignoring case).
-
// Path searching
-class WXDLLIMPEXP_BASE wxPathList : public wxStringList
+class WXDLLIMPEXP_BASE wxPathList : public wxArrayString
{
public:
+ wxPathList() {}
+ wxPathList(const wxArrayString &arr)
+ { Add(arr); }
+
// avoid GCC warning about virtual functions w/o virtual dtor
virtual ~wxPathList() {}
// Adds all paths in environment variable
void AddEnvList(const wxString& envVariable);
+ // Adds given path to this list
void Add(const wxString& path);
+ void Add(const wxArrayString &paths);
+
// Find the first full path for which the file exists
- wxString FindValidPath(const wxString& filename);
+ wxString FindValidPath(const wxString& filename) const;
+
// Find the first full path for which the file exists; ensure it's an
// absolute path that gets returned.
- wxString FindAbsoluteValidPath(const wxString& filename);
+ wxString FindAbsoluteValidPath(const wxString& filename) const;
+
// Given full path and filename, add path to list
void EnsureFileAccessible(const wxString& path);
- // Returns true if the path is in the list
- bool Member(const wxString& path);
-private:
- // DECLARE_DYNAMIC_CLASS(wxPathList)
+ // Returns true if the path is in the list
+ wxDEPRECATED( bool Member(const wxString& path) const );
};
-#endif
- // _WX_FILEFN_H_
+#endif // _WX_FILEFN_H_
#include "wx/filename.h"
#include "wx/dir.h"
+#include "wx/tokenzr.h"
+
// there are just too many of those...
#ifdef __VISUALC__
#pragma warning(disable:4706) // assignment within conditional expression
// wxPathList
// ----------------------------------------------------------------------------
-// IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList)
-
-static inline wxChar* MYcopystring(const wxString& s)
+void wxPathList::Add (const wxString& path)
{
- wxChar* copy = new wxChar[s.length() + 1];
- return wxStrcpy(copy, s.c_str());
-}
+ // add only the path part of the given string (not the filename, in case it's present)
+ wxFileName fn(path + wxFileName::GetPathSeparator());
+ fn.Normalize(); // add only normalized paths
-static inline wxChar* MYcopystring(const wxChar* s)
-{
- wxChar* copy = new wxChar[wxStrlen(s) + 1];
- return wxStrcpy(copy, s);
+ wxString toadd = fn.GetPath();
+ if (Index(toadd) == wxNOT_FOUND)
+ wxArrayString::Add(toadd); // do not add duplicates
}
-void wxPathList::Add (const wxString& path)
+void wxPathList::Add(const wxArrayString &arr)
{
- wxStringList::Add (WXSTRINGCAST path);
+ for (size_t j=0; j < arr.GetCount(); j++)
+ Add(arr[j]);
}
// Add paths e.g. from the PATH environment variable
{
// No environment variables on WinCE
#ifndef __WXWINCE__
+
+ // The space has been removed from the tokenizers, otherwise a
+ // path such as "C:\Program Files" would be split into 2 paths:
+ // "C:\Program" and "Files"; this is true for both Windows and Unix.
+
static const wxChar PATH_TOKS[] =
#if defined(__WINDOWS__) || defined(__OS2__)
- /*
- The space has been removed from the tokenizers, otherwise a
- path such as "C:\Program Files" would be split into 2 paths:
- "C:\Program" and "Files"
- */
-// wxT(" ;"); // Don't separate with colon in DOS (used for drive)
wxT(";"); // Don't separate with colon in DOS (used for drive)
#else
- wxT(" :;");
+ wxT(":;");
#endif
- wxString val ;
- if (wxGetEnv (WXSTRINGCAST envVariable, &val))
+ wxString val;
+ if ( wxGetEnv(envVariable, &val) )
{
- wxChar *s = MYcopystring (val);
- wxChar *save_ptr, *token = wxStrtok (s, PATH_TOKS, &save_ptr);
-
- if (token)
- {
- Add(token);
- while (token)
- {
- if ( (token = wxStrtok ((wxChar *) NULL, PATH_TOKS, &save_ptr))
- != NULL )
- {
- Add(token);
- }
- }
- }
-
- // suppress warning about unused variable save_ptr when wxStrtok() is a
- // macro which throws away its third argument
- save_ptr = token;
-
- delete [] s;
+ // split into an array of string the value of the env var
+ wxArrayString arr = wxStringTokenize(val, PATH_TOKS);
+ WX_APPEND_ARRAY(*this, arr);
}
#endif // !__WXWINCE__
}
wxString path_only(wxPathOnly(path));
if ( !path_only.empty() )
{
- if ( !Member(path_only) )
+ if ( Index(path_only) == wxNOT_FOUND )
Add(path_only);
}
}
-bool wxPathList::Member (const wxString& path)
+// deprecated !
+bool wxPathList::Member (const wxString& path) const
{
- for (wxStringList::compatibility_iterator node = GetFirst(); node; node = node->GetNext())
- {
- wxString path2( node->GetData() );
- if (
-#if defined(__WINDOWS__) || defined(__OS2__) || defined(__VMS__) || defined(__WXMAC__)
- // Case INDEPENDENT
- path.CompareTo (path2, wxString::ignoreCase) == 0
-#else
- // Case sensitive File System
- path.CompareTo (path2) == 0
-#endif
- )
- return true;
- }
- return false;
+ return Index(path) != wxNOT_FOUND;
}
-wxString wxPathList::FindValidPath (const wxString& file)
+wxString wxPathList::FindValidPath (const wxString& file) const
{
- wxExpandPath(wxFileFunctionsBuffer, file);
+ wxFileName fn(file);
+ wxString strend;
- wxChar buf[_MAXPATHLEN];
- wxStrcpy(buf, wxFileFunctionsBuffer);
-
- wxChar *filename = wxIsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (wxChar *)buf;
+ fn.Normalize();
+ if (fn.IsAbsolute())
+ strend = fn.GetFullName();
+ else
+ strend = fn.GetFullPath();
- for (wxStringList::compatibility_iterator node = GetFirst(); node; node = node->GetNext())
+ for (size_t i=0; i<GetCount(); i++)
{
- const wxString path(node->GetData());
- wxStrcpy (wxFileFunctionsBuffer, path);
- wxChar ch = wxFileFunctionsBuffer[wxStrlen(wxFileFunctionsBuffer)-1];
- if (ch != wxT('\\') && ch != wxT('/'))
- wxStrcat (wxFileFunctionsBuffer, wxT("/"));
- wxStrcat (wxFileFunctionsBuffer, filename);
-#ifdef __WINDOWS__
- wxUnix2DosFilename (wxFileFunctionsBuffer);
-#endif
- if (wxFileExists (wxFileFunctionsBuffer))
- {
- return wxString(wxFileFunctionsBuffer); // Found!
- }
- } // for()
+ wxString strstart = Item(i);
+ if (!strstart.IsEmpty() && strstart.Last() != wxFileName::GetPathSeparator())
+ strstart += wxFileName::GetPathSeparator();
+
+ if (wxFileExists(strstart + strend))
+ return strstart + strend; // Found!
+ }
- return wxEmptyString; // Not found
+ return wxEmptyString; // Not found
}
-wxString wxPathList::FindAbsoluteValidPath (const wxString& file)
+wxString wxPathList::FindAbsoluteValidPath (const wxString& file) const
{
wxString f = FindValidPath(file);
if ( f.empty() || wxIsAbsolutePath(f) )
return buf;
}
+// ----------------------------------------------------------------------------
+// miscellaneous global functions (TOFIX!)
+// ----------------------------------------------------------------------------
+
+static inline wxChar* MYcopystring(const wxString& s)
+{
+ wxChar* copy = new wxChar[s.length() + 1];
+ return wxStrcpy(copy, s.c_str());
+}
+
+static inline wxChar* MYcopystring(const wxChar* s)
+{
+ wxChar* copy = new wxChar[wxStrlen(s) + 1];
+ return wxStrcpy(copy, s);
+}
+
+
bool
wxFileExists (const wxString& filename)
{