]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/utilscmn.cpp
minor refactoring of menu UpdateUI handling
[wxWidgets.git] / src / common / utilscmn.cpp
index 24f2866ea43a2188ba1fe62ff3aa6b43057acbf9..b048ccd3c6e617ebffabefdb593d7a95d3b15872 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        utilscmn.cpp
+// Name:        src/common/utilscmn.cpp
 // Purpose:     Miscellaneous utility functions and classes
 // Author:      Julian Smart
 // Modified by:
@@ -89,6 +89,7 @@
 
 #if defined(__WXMSW__)
     #include "wx/msw/private.h"
+    #include "wx/msw/registry.h"
 #endif
 
 #if wxUSE_BASE
 // common data
 // ----------------------------------------------------------------------------
 
-#if WXWIN_COMPATIBILITY_2_2
-    const wxChar *wxInternalErrorStr = wxT("wxWidgets Internal Error");
-    const wxChar *wxFatalErrorStr = wxT("wxWidgets Fatal Error");
-#endif // WXWIN_COMPATIBILITY_2_2
-
 // ============================================================================
 // implementation
 // ============================================================================
@@ -520,14 +516,77 @@ long wxExecute(const wxString& command,
 // Launch default browser
 // ----------------------------------------------------------------------------
 
-bool wxLaunchDefaultBrowser(const wxString& urlOrig)
+bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags)
 {
+    wxUnusedVar(flags);
+
     // set the scheme of url to http if it does not have one
     wxString url(urlOrig);
     if ( !wxURI(url).HasScheme() )
         url.Prepend(wxT("http://"));
 
 #if defined(__WXMSW__)
+
+#if wxUSE_IPC
+    if ( flags & wxBROWSER_NEW_WINDOW )
+    {
+        // ShellExecuteEx() opens the URL in an existing window by default so
+        // we can't use it if we need a new window
+        wxRegKey key(wxRegKey::HKCR, url.BeforeFirst(':') + _T("\\shell\\open"));
+        if ( key.Exists() )
+        {
+            wxRegKey keyDDE(key, wxT("DDEExec"));
+            if ( keyDDE.Exists() )
+            {
+                const wxString ddeTopic = wxRegKey(keyDDE, wxT("topic"));
+
+                // we only know the syntax of WWW_OpenURL DDE request for IE,
+                // optimistically assume that all other browsers are compatible
+                // with it
+                wxString ddeCmd;
+                bool ok = ddeTopic == wxT("WWW_OpenURL");
+                if ( ok )
+                {
+                    ddeCmd = keyDDE.QueryDefaultValue();
+                    ok = !ddeCmd.empty();
+                }
+
+                if ( ok )
+                {
+                    // for WWW_OpenURL, the index of the window to open the URL
+                    // in is -1 (meaning "current") by default, replace it with
+                    // 0 which means "new" (see KB article 160957)
+                    ok = ddeCmd.Replace(wxT("-1"), wxT("0"),
+                                        false /* only first occurence */) == 1;
+                }
+
+                if ( ok )
+                {
+                    // and also replace the parameters: the topic should
+                    // contain a placeholder for the URL
+                    ok = ddeCmd.Replace(wxT("%1"), url, false) == 1;
+                }
+
+                if ( ok )
+                {
+                    // try to send it the DDE request now but ignore the errors
+                    wxLogNull noLog;
+
+                    const wxString ddeServer = wxRegKey(keyDDE, wxT("application"));
+                    if ( wxExecuteDDE(ddeServer, ddeTopic, ddeCmd) )
+                        return true;
+
+                    // this is not necessarily an error: maybe browser is
+                    // simply not running, but no matter, in any case we're
+                    // going to launch it using ShellExecuteEx() below now and
+                    // we shouldn't try to open a new window if we open a new
+                    // browser anyhow
+                }
+            }
+        }
+    }
+#endif // wxUSE_IPC
+
     WinStruct<SHELLEXECUTEINFO> sei;
     sei.lpFile = url.c_str();
     sei.lpVerb = _T("open");