wxPathList cleanup by Francesco (patch 1521481)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40298 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-07-25 00:16:55 +00:00
parent da87911d65
commit 8daf3c3664
3 changed files with 97 additions and 112 deletions

View File

@@ -6,13 +6,12 @@ in those directories. Storing the filename only in an application's files and
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}
@@ -20,7 +19,7 @@ from the path.
\wxheading{See also}
\helpref{wxList}{wxlist}
\helpref{wxArrayString}{wxarraystring}
\latexignore{\rtfignore{\wxheading{Members}}}
@@ -29,7 +28,11 @@ from the path.
\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}
@@ -45,9 +48,12 @@ example.
\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}
@@ -61,7 +67,7 @@ filename and adding the path to the list if not already there.
\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
@@ -70,16 +76,9 @@ string is returned.
\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).

View File

@@ -595,29 +595,35 @@ private:
// 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_

View File

@@ -34,6 +34,8 @@
#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
@@ -144,23 +146,21 @@ WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode )
// wxPathList
// ----------------------------------------------------------------------------
// IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList)
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);
}
void wxPathList::Add (const wxString& path)
{
wxStringList::Add (WXSTRINGCAST path);
// 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
wxString toadd = fn.GetPath();
if (Index(toadd) == wxNOT_FOUND)
wxArrayString::Add(toadd); // do not add duplicates
}
void wxPathList::Add(const wxArrayString &arr)
{
for (size_t j=0; j < arr.GetCount(); j++)
Add(arr[j]);
}
// Add paths e.g. from the PATH environment variable
@@ -168,43 +168,24 @@ void wxPathList::AddEnvList (const wxString& WXUNUSED_IN_WINCE(envVariable))
{
// 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(":;");
#endif
wxString val;
if (wxGetEnv (WXSTRINGCAST envVariable, &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__
}
@@ -217,60 +198,42 @@ void wxPathList::EnsureFileAccessible (const wxString& path)
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);
fn.Normalize();
if (fn.IsAbsolute())
strend = fn.GetFullName();
else
strend = fn.GetFullPath();
wxChar *filename = wxIsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (wxChar *)buf;
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!
wxString strstart = Item(i);
if (!strstart.IsEmpty() && strstart.Last() != wxFileName::GetPathSeparator())
strstart += wxFileName::GetPathSeparator();
if (wxFileExists(strstart + strend))
return strstart + strend; // Found!
}
} // for()
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) )
@@ -287,6 +250,23 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file)
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)
{