X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ecf9559d5703afb1732f2f04a86d3732be6fed37..62795f413a7222863b4aee76c08764071f94bd87:/src/common/stdpbase.cpp diff --git a/src/common/stdpbase.cpp b/src/common/stdpbase.cpp index dd9fb2801f..41e27e7724 100644 --- a/src/common/stdpbase.cpp +++ b/src/common/stdpbase.cpp @@ -1,12 +1,11 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: common/stdpbase.cpp +// Name: src/common/stdpbase.cpp // Purpose: wxStandardPathsBase methods common to all ports // Author: Vadim Zeitlin // Modified by: // Created: 2004-10-19 -// RCS-ID: $Id$ // Copyright: (c) 2004 Vadim Zeitlin -// License: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -24,8 +23,6 @@ #pragma hdrstop #endif -#if wxUSE_STDPATHS - #ifndef WX_PRECOMP #include "wx/app.h" #endif //WX_PRECOMP @@ -38,26 +35,70 @@ // module globals // ---------------------------------------------------------------------------- -static wxStandardPaths gs_stdPaths; +namespace +{ + +// Derive a class just to be able to create it: wxStandardPaths ctor is +// protected to prevent its misuse, but it also means we can't create an object +// of this class directly. +class wxStandardPathsDefault : public wxStandardPaths +{ +public: + wxStandardPathsDefault() { } +}; + +static wxStandardPathsDefault gs_stdPaths; + +} // anonymous namespace // ============================================================================ // implementation // ============================================================================ /* static */ -wxStandardPathsBase& wxStandardPathsBase::Get() +wxStandardPaths& wxStandardPathsBase::Get() { wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL; - wxCHECK_MSG( traits, gs_stdPaths, _T("create wxApp before calling this") ); + wxCHECK_MSG( traits, gs_stdPaths, wxT("create wxApp before calling this") ); return traits->GetStandardPaths(); } -wxStandardPathsBase& wxAppTraitsBase::GetStandardPaths() +wxString wxStandardPathsBase::GetExecutablePath() const +{ + if ( !wxTheApp || !wxTheApp->argv ) + return wxEmptyString; + + wxString argv0 = wxTheApp->argv[0]; + if (wxIsAbsolutePath(argv0)) + return argv0; + + // Search PATH.environment variable... + wxPathList pathlist; + pathlist.AddEnvList(wxT("PATH")); + wxString path = pathlist.FindAbsoluteValidPath(argv0); + if ( path.empty() ) + return argv0; // better than nothing + + wxFileName filename(path); + filename.Normalize(); + return filename.GetFullPath(); +} + +wxStandardPaths& wxAppTraitsBase::GetStandardPaths() { return gs_stdPaths; } +wxStandardPathsBase::wxStandardPathsBase() +{ + // Set the default information that is used when + // forming some paths (by AppendAppInfo). + // Derived classes can call this in their constructors + // to set the platform-specific settings + UseAppInfo(AppInfo_AppName); +} + wxStandardPathsBase::~wxStandardPathsBase() { // nothing to do here @@ -78,6 +119,14 @@ wxString wxStandardPathsBase::GetDocumentsDir() const return wxFileName::GetHomeDir(); } +wxString wxStandardPathsBase::GetAppDocumentsDir() const +{ + const wxString docsDir = GetDocumentsDir(); + wxString appDocsDir = AppendAppInfo(docsDir); + + return wxDirExists(appDocsDir) ? appDocsDir : docsDir; +} + // return the temporary directory for the current user wxString wxStandardPathsBase::GetTempDir() const { @@ -85,25 +134,43 @@ wxString wxStandardPathsBase::GetTempDir() const } /* static */ -wxString wxStandardPathsBase::AppendAppName(const wxString& dir) +wxString +wxStandardPathsBase::AppendPathComponent(const wxString& dir, + const wxString& component) { wxString subdir(dir); // empty string indicates that an error has occurred, don't touch it then if ( !subdir.empty() ) { - const wxString appname = wxTheApp->GetAppName(); - if ( !appname.empty() ) + if ( !component.empty() ) { const wxChar ch = *(subdir.end() - 1); - if ( !wxFileName::IsPathSeparator(ch) && ch != _T('.') ) + if ( !wxFileName::IsPathSeparator(ch) && ch != wxT('.') ) subdir += wxFileName::GetPathSeparator(); - subdir += appname; + subdir += component; } } return subdir; } -#endif // wxUSE_STDPATHS + +wxString wxStandardPathsBase::AppendAppInfo(const wxString& dir) const +{ + wxString subdir(dir); + + if ( UsesAppInfo(AppInfo_VendorName) ) + { + subdir = AppendPathComponent(subdir, wxTheApp->GetVendorName()); + } + + if ( UsesAppInfo(AppInfo_AppName) ) + { + subdir = AppendPathComponent(subdir, wxTheApp->GetAppName()); + } + + return subdir; +} +