]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement wxFileType::GetOpenCommand() in wxOSX.
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 5 Aug 2011 19:02:26 +0000 (19:02 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 5 Aug 2011 19:02:26 +0000 (19:02 +0000)
This method used to work in 2.8 but was unimplemented in 2.9.

Restore more or less the old implementation using the data that we already
have in wxMimeTypesManager anyhow.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68563 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/osx/core/mimetype.h
src/osx/core/mimetype.cpp

index 7e7620bf750c849985dc797c806d0a9a14b251a2..92f145027fbed42a026eea328224e5086f6c468c 100644 (file)
@@ -456,6 +456,7 @@ All (GUI):
 OSX:
 
 - Implement wxRegion::Equal() (Dr.Acula).
+- Implement wxFileType::GetOpenCommand().
 - wxGetOsVersion() now returns more sensible version numbers, e.g. 10 and 6
   for OS X 10.6.
 
index 3fc642ee997921f70350ce9f7edb4ef0642c9930..f0758e7df4414ebcefc13eb87d27be314afc9345 100644 (file)
@@ -56,6 +56,7 @@ private:
     bool GetMimeTypes(const wxString& uti, wxArrayString& mimeTypes);
     bool GetIcon(const wxString& uti, wxIconLocation *iconLoc);
     bool GetDescription(const wxString& uti, wxString *desc);
+    bool GetApplication(const wxString& uti, wxString *command);
 
     // Structure to represent file types
     typedef struct FileTypeData
@@ -63,6 +64,7 @@ private:
         wxArrayString extensions;
         wxArrayString mimeTypes;
         wxIconLocation iconLoc;
+        wxString application;
         wxString description;
     }
     FileTypeInfo;
@@ -95,9 +97,9 @@ public:
     bool GetMimeTypes(wxArrayString& mimeTypes) const ;
     bool GetIcon(wxIconLocation *iconLoc) const ;
     bool GetDescription(wxString *desc) const ;
+    bool GetOpenCommand(wxString *openCmd, const wxFileType::MessageParameters& params) const;
 
     // These functions are only stubs on Mac OS X
-    bool GetOpenCommand(wxString *openCmd, const wxFileType::MessageParameters& params) const;
     bool GetPrintCommand(wxString *printCmd, const wxFileType::MessageParameters& params) const;
     size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands, const wxFileType::MessageParameters& params) const;
     bool SetCommand(const wxString& cmd, const wxString& verb, bool overwriteprompt = TRUE);
index c2661e22b0bca7fb4024b44680bce9172e08bf95..4910f30ad40c442ac3b5815a7f7d6195979175fc 100644 (file)
@@ -447,7 +447,11 @@ void wxMimeTypesManagerImpl::LoadDisplayDataForUti(const wxString& uti)
     if( !bundle )
         return;
 
-    // Get a all the document type data in this bundle
+    // Also get the open command while we have the bundle
+    wxCFStringRef cfsAppPath(CFURLCopyFileSystemPath(appUrl, kCFURLPOSIXPathStyle));
+    m_utiMap[ uti ].application = cfsAppPath.AsString();
+
+    // Get all the document type data in this bundle
     CFTypeRef docTypeData;
     docTypeData = CFBundleGetValueForInfoDictionaryKey( bundle, docTypesKey );
 
@@ -587,6 +591,19 @@ bool wxMimeTypesManagerImpl::GetDescription(const wxString& uti, wxString *desc)
     return true;
 }
 
+bool wxMimeTypesManagerImpl::GetApplication(const wxString& uti, wxString *command)
+{
+    const UtiMap::const_iterator itr = m_utiMap.find( uti );
+
+    if( itr == m_utiMap.end() )
+    {
+        command->clear();
+        return false;
+    }
+
+    *command = itr->second.application;
+    return true;
+}
 
 /////////////////////////////////////////////////////////////////////////////
 // The remaining functionality has not yet been implemented for OS X
@@ -626,9 +643,36 @@ bool wxFileTypeImpl::GetDescription(wxString *desc) const
     return m_manager->GetDescription( m_uti, desc );
 }
 
-bool wxFileTypeImpl::GetOpenCommand(wxString *WXUNUSED(openCmd), const wxFileType::MessageParameters& WXUNUSED(params)) const
+namespace
 {
-    return false;
+
+// Helper function for GetOpenCommand(): returns the string surrounded by
+// (singly) quotes if it contains spaces.
+wxString QuoteIfNecessary(const wxString& path)
+{
+    wxString result(path);
+
+    if ( path.find(' ') != wxString::npos )
+    {
+        result.insert(0, "'");
+        result.append("'");
+    }
+
+    return result;
+}
+
+} // anonymous namespace
+
+bool wxFileTypeImpl::GetOpenCommand(wxString *openCmd, const wxFileType::MessageParameters& params) const
+{
+    wxString application;
+    if ( !m_manager->GetApplication(m_uti, &application) )
+        return false;
+
+    *openCmd << QuoteIfNecessary(application)
+             << ' ' << QuoteIfNecessary(params.GetFileName());
+
+    return true;
 }
 
 bool wxFileTypeImpl::GetPrintCommand(wxString *WXUNUSED(printCmd), const wxFileType::MessageParameters& WXUNUSED(params)) const