]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxLaunchDefaultBrowser, note wxGetKeyState change
authorRyan Norton <wxprojects@comcast.net>
Thu, 21 Apr 2005 20:13:44 +0000 (20:13 +0000)
committerRyan Norton <wxprojects@comcast.net>
Thu, 21 Apr 2005 20:13:44 +0000 (20:13 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33802 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/function.tex
include/wx/utils.h
src/common/utilscmn.cpp

index aeaf72176f2c1e42f1951a9465b8c82233b0fa7b..b9332dfc0b8b3cbc564b0ed84cc449128b8cdcf9 100644 (file)
@@ -5,9 +5,11 @@ wxWidgets Change Log - For more verbose changes, see the manual
 2.6.1
 -----
 All:
+- Added wxLaunchDefaultBrowser.
 
 wxMac:
 - Added support for launching 'APPL' bundles with wxExecute (usually they have a .app extension and are the ones that reside in the Applications folder).
+- Fixed a bug in wxGetKeyState where shift and some other keys were returning an incorrect state.
 
 2.6.0
 -----
index 1a1bb44e5157ad91d0259edb1c050686ef72e8ed..58e59644991363d1115aed59a8e79205d8a89c48 100644 (file)
@@ -164,6 +164,7 @@ the corresponding topic.
 \helpref{wxIsNaN}{wxisnan}\\
 \helpref{wxIsWild}{wxiswild}\\
 \helpref{wxKill}{wxkill}\\
+\helpref{wxLaunchDefaultBrowser}{wxlaunchdefaultbrowser}\\
 \helpref{wxLEAVE\_CRIT\_SECT}{wxleavecritsect}\\
 \helpref{wxLoadUserResource}{wxloaduserresource}\\
 \helpref{wxLogDebug}{wxlogdebug}\\
@@ -2978,6 +2979,18 @@ frame or dialog containing it, or {\tt NULL}.
 <wx/window.h>
 
 
+\membersection{::wxLaunchDefaultBrowser}\label{wxlaunchdefaultbrowser}
+
+\func{bool}{wxLaunchDefaultBrowser}{\param{const wxString\& }{sUrl}}
+
+Launches the user's default browser and tells it to open the location at {\tt sUrl}.
+
+Returns true if the application was successfully launched.
+
+\wxheading{Include files}
+
+<wx/utils.h>
+
 \membersection{::wxLoadUserResource}\label{wxloaduserresource}
 
 \func{wxString}{wxLoadUserResource}{\param{const wxString\& }{resourceName}, \param{const wxString\& }{resourceType=``TEXT"}}
index 30b4b59816168243d6a59ddb11a9e9e15c90b6a0..9c73ab4214d4fdd662956ce0c7836845eaffe22f 100644 (file)
@@ -324,6 +324,9 @@ WXDLLIMPEXP_BASE bool wxHandleFatalExceptions(bool doit = true);
 
 #endif // wxUSE_ON_FATAL_EXCEPTION
 
+// Launch url in the user's default internet browser
+WXDLLIMPEXP_BASE bool wxLaunchDefaultBrowser(const wxString& url);
+
 // ----------------------------------------------------------------------------
 // Environment variables
 // ----------------------------------------------------------------------------
index 09369b63f3151bef006dc88747bd6543bdb3d0b7..bd2714f1eb326b5924ffa59b24c008db988240fb 100644 (file)
@@ -60,6 +60,9 @@
 
 #include "wx/process.h"
 #include "wx/txtstrm.h"
+#include "wx/uri.h"
+#include "wx/mimetype.h"
+#include "wx/config.h"
 
 #if defined(__WXWINCE__) && wxUSE_DATETIME
 #include "wx/datetime.h"
@@ -524,6 +527,143 @@ long wxExecute(const wxString& command,
     return wxDoExecuteWithCapture(command, output, &error, flags);
 }
 
+// ----------------------------------------------------------------------------
+// Launch default browser
+// ----------------------------------------------------------------------------
+
+bool wxLaunchDefaultBrowser(const wxString& url)
+{
+    wxString finalurl = url;
+
+    //if it isn't a full url, try appending http:// to it
+    if(wxURI(url).IsReference())
+        finalurl = wxString(wxT("http://")) + url;
+
+#ifdef __WINDOWS__
+    wxString command;
+
+    // ShellExecute() always opens in the same window,
+    // so do it manually for new window (from Mahogany)
+    wxRegKey key(wxRegKey::HKCR, url.BeforeFirst(':') + wxT("\\shell\\open"));
+    if ( key.Exists() )
+    {
+        wxRegKey keyDDE(key, wxT("DDEExec"));
+        if ( keyDDE.Exists() )
+        {
+           wxString ddeTopic = wxRegKey(keyDDE, wxT("topic"));
+
+           // we only know the syntax of WWW_OpenURL DDE request
+           if ( ddeTopic == wxT("WWW_OpenURL") )
+           {
+              wxString ddeCmd = keyDDE;
+
+              // this is a bit naive but should work as -1 can't appear
+              // elsewhere in the DDE topic, normally
+              if ( ddeCmd.Replace(wxT("-1"), wxT("0"),
+                                  FALSE /* only first occurence */) == 1 )
+              {
+                 // and also replace the parameters
+                 if ( ddeCmd.Replace(wxT("%1"), url, FALSE) == 1 )
+                 {
+                    // magic incantation understood by wxMSW
+                    command << wxT("WX_DDE#")
+                            << wxRegKey(key, wxT("command")).QueryDefaultValue() << wxT('#')
+                            << wxRegKey(keyDDE, wxT("application")).QueryDefaultValue()
+                            << wxT('#') << ddeTopic << wxT('#')
+                            << ddeCmd;
+                 }
+              }
+           }
+        }
+    }
+
+      //Try wxExecute - if it doesn't work or the regkey stuff
+      //above failed, fallback to opening the file in the same
+      //browser window
+      if ( command.empty() || wxExecute(command) == -1)
+      {
+          // CYGWIN and MINGW may have problems - so load ShellExecute
+          // dynamically
+         typedef HINSTANCE (*LPShellExecute)(HWND hwnd, const wxChar* lpOperation,
+                                             const wxChar* lpFile, 
+                                             const wxChar* lpParameters, 
+                                             const wxChar* lpDirectory, 
+                                             INT nShowCmd);
+
+         HINSTANCE hShellDll = ::LoadLibrary(wxT("shell32.dll"));
+         if(hShellDll == NULL)
+             return false;
+
+         LPShellExecute lpShellExecute = 
+             (LPShellExecute) ::GetProcAddress(hShellDll, 
+             wxString::Format(wxT("ShellExecute%s"), 
+#ifdef __WXUNICODE__
+             wxT("W")
+#else
+             wxT("A")
+#endif
+                             )
+                                              );
+         if(lpShellExecute == NULL)
+             return false;
+
+        // Windows sometimes doesn't open the browser correctly when using mime
+        // types, so do ShellExecute - i.e. start <url> (from James Carroll)
+        unsigned int nResult = (int) (*lpShellExecute)(NULL, NULL, finalurl.c_str(), 
+                          NULL, wxT(""), SW_SHOWNORMAL);
+
+        // Unload Shell32.dll
+        ::FreeLibrary(hShellDll);
+
+        // Hack for Firefox (returns file not found for some reason)
+        // from Angelo Mandato's wxHyperlinksCtrl
+        // HINSTANCE_ERROR == 32
+        if (nResult <= HINSTANCE_ERROR && nResult != SE_ERR_FNF)
+            return false;    
+
+    #   ifdef __WXDEBUG__
+        // Log something if SE_ERR_FNF happens
+        if(nResult == SE_ERR_FNF)
+            wxLogDebug(wxT("Got SE_ERR_FNF from ShellExecute - maybe FireFox"));
+    #   endif
+      }
+
+#else
+    // Non-windows way
+    wxFileType *ft = 
+    wxTheMimeTypesManager->GetFileTypeFromExtension (_T("html")); 
+    if (!ft) 
+    { 
+        wxLogError(_T("No default application can open .html extension")); 
+        return false; 
+    } 
+
+    wxString mt;
+    ft->GetMimeType(&mt);
+
+    wxString cmd; 
+    bool ok = 
+    ft->GetOpenCommand (&cmd, 
+        wxFileType::MessageParameters (finalurl.c_str(), 
+                                       _T(""))); 
+    delete ft; 
+    
+    if (ok) 
+    {
+        if( wxExecute (cmd, wxEXEC_ASYNC) == -1 )
+        {
+            wxLogError(_T("Failed to launch application for wxLaunchDefaultBrowser"));
+            return false;
+        }
+    }
+    else
+      return false;
+#endif
+
+    //success - hopefully
+    return true;
+}
+
 // ----------------------------------------------------------------------------
 // wxApp::Yield() wrappers for backwards compatibility
 // ----------------------------------------------------------------------------