2.7.0
-----
+All:
+
+- wxLaunchDefaultBrowser() now supports wxBROWSER_NEW_WINDOW flag
+
wxMSW:
- wxFileDialog respects absence of wxCHANGE_DIR flag under NT (Brad Anderson)
\membersection{::wxLaunchDefaultBrowser}\label{wxlaunchdefaultbrowser}
-\func{bool}{wxLaunchDefaultBrowser}{\param{const wxString\& }{sUrl}}
+\func{bool}{wxLaunchDefaultBrowser}{\param{const wxString\& }{url}, \param{int }{flags = $0$}}
-Launches the user's default browser and tells it to open the location at {\tt sUrl}.
+Open the \arg{url} in user's default browser. If \arg{flags} parameter contains
+\texttt{wxBROWSER\_NEW\_WINDOW} flag, a new window is opened for the URL
+(currently this is only supported under Windows).
-Returns true if the application was successfully launched.
+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"}}
wxArrayString& error,
int flags = 0);
+#ifdef __WXMSW__
+// ask a DDE server to execute the DDE request with given parameters
+WXDLLIMPEXP_BASE bool wxExecuteDDE(const wxString& ddeServer,
+ const wxString& ddeTopic,
+ const wxString& ddeCommand);
+#endif // __WXMSW__
+
enum wxSignal
{
wxSIGNONE = 0, // verify if the process exists under Unix
#endif // wxUSE_ON_FATAL_EXCEPTION
#if wxABI_VERSION >= 20601
+
+// flags for wxLaunchDefaultBrowser
+enum
+{
+ wxBROWSER_NEW_WINDOW = 1
+};
+
// Launch url in the user's default internet browser
-WXDLLIMPEXP_BASE bool wxLaunchDefaultBrowser(const wxString& url);
+WXDLLIMPEXP_BASE bool wxLaunchDefaultBrowser(const wxString& url, int flags = 0);
#endif
// ----------------------------------------------------------------------------
// 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 ( 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;
+ 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
+ }
+ }
+ }
+ }
+
WinStruct<SHELLEXECUTEINFO> sei;
sei.lpFile = url.c_str();
sei.lpVerb = _T("open");
#if wxUSE_IPC
// connect to the given server via DDE and ask it to execute the command
-static bool wxExecuteDDE(const wxString& ddeServer,
- const wxString& ddeTopic,
- const wxString& ddeCommand)
+bool
+wxExecuteDDE(const wxString& ddeServer,
+ const wxString& ddeTopic,
+ const wxString& ddeCommand)
{
bool ok wxDUMMY_INITIALIZE(false);
wxDDEClient client;
- wxConnectionBase *conn = client.MakeConnection(wxEmptyString,
- ddeServer,
- ddeTopic);
+ wxConnectionBase *
+ conn = client.MakeConnection(wxEmptyString, ddeServer, ddeTopic);
if ( !conn )
{
ok = false;