#include "wx/statusbr.h"
#endif // wxUSE_GUI
+#ifndef __WXPALMOS5__
#ifndef __WXWINCE__
#include <time.h>
#else
#include "wx/msw/wince/time.h"
#endif
+#endif // ! __WXPALMOS5__
#ifdef __WXMAC__
-#include "wx/mac/private.h"
-#ifndef __DARWIN__
-#include "InternetConfig.h"
-#endif
+#include "wx/osx/private.h"
#endif
+#ifndef __WXPALMOS5__
#if !defined(__MWERKS__) && !defined(__WXWINCE__)
#include <sys/types.h>
#include <sys/stat.h>
#endif
+#endif // ! __WXPALMOS5__
#if defined(__WXMSW__)
#include "wx/msw/private.h"
#include <shellapi.h> // needed for SHELLEXECUTEINFO
#endif
+#if wxUSE_GUI && defined(__WXGTK__)
+ #include <gtk/gtk.h> // for GTK_XXX_VERSION constants
+#endif
+
#if wxUSE_BASE
// ----------------------------------------------------------------------------
if ( !email )
return false;
- wxStrncpy(address, email, maxSize - 1);
- address[maxSize - 1] = wxT('\0');
+ wxStrlcpy(address, email.t_str(), maxSize);
return true;
}
#if wxUSE_GUI
+// ----------------------------------------------------------------------------
+// Launch document with default app
+// ----------------------------------------------------------------------------
+
+bool wxLaunchDefaultApplication(const wxString& document, int flags)
+{
+ wxUnusedVar(flags);
+
+#ifdef __WXMAC__
+ static const char * const OPEN_CMD = "/usr/bin/open";
+ if ( wxFileExists(OPEN_CMD) &&
+ wxExecute(wxString(OPEN_CMD) + " " + document) )
+ return true;
+#elif defined(__UNIX__)
+ // Our best best is to use xdg-open from freedesktop.org cross-desktop
+ // compatibility suite xdg-utils
+ // (see http://portland.freedesktop.org/wiki/) -- this is installed on
+ // most modern distributions and may be tweaked by them to handle
+ // distribution specifics.
+ wxString path, xdg_open;
+ if ( wxGetEnv("PATH", &path) &&
+ wxFindFileInPath(&xdg_open, path, "xdg-open") )
+ {
+ if ( wxExecute(xdg_open + " " + document) )
+ return true;
+ }
+#elif defined(__WXMSW__)
+ WinStruct<SHELLEXECUTEINFO> sei;
+ sei.lpFile = document.wx_str();
+ sei.lpVerb = _T("open");
+#ifdef __WXWINCE__
+ sei.nShow = SW_SHOWNORMAL; // SW_SHOWDEFAULT not defined under CE (#10216)
+#else
+ sei.nShow = SW_SHOWDEFAULT;
+#endif
+
+ // avoid Windows message box in case of error for consistency with
+ // wxLaunchDefaultBrowser() even if don't show the error ourselves in this
+ // function
+ sei.fMask = SEE_MASK_FLAG_NO_UI;
+
+ if ( ::ShellExecuteEx(&sei) )
+ return true;
+#endif
+
+ return false;
+}
+
// ----------------------------------------------------------------------------
// Launch default browser
// ----------------------------------------------------------------------------
bool wxCocoaLaunchDefaultBrowser(const wxString& url, int flags);
#endif
-bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags)
+static bool DoLaunchDefaultBrowser(const wxString& urlOrig, int flags)
{
wxUnusedVar(flags);
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
+ static const wxChar *TOPIC_OPEN_URL = wxT("WWW_OpenURL");
wxString ddeCmd;
- bool ok = ddeTopic == wxT("WWW_OpenURL");
+ wxRegKey keyTopic(keyDDE, wxT("topic"));
+ bool ok = keyTopic.Exists() &&
+ keyTopic.QueryDefaultValue() == TOPIC_OPEN_URL;
if ( ok )
{
ddeCmd = keyDDE.QueryDefaultValue();
// 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;
+ false /* only first occurrence */) == 1;
}
if ( ok )
wxLogNull noLog;
const wxString ddeServer = wxRegKey(keyDDE, wxT("application"));
- if ( wxExecuteDDE(ddeServer, ddeTopic, ddeCmd) )
+ if ( wxExecuteDDE(ddeServer, TOPIC_OPEN_URL, ddeCmd) )
return true;
// this is not necessarily an error: maybe browser is
sei.lpFile = url.c_str();
sei.lpVerb = _T("open");
sei.nShow = SW_SHOWNORMAL;
+ sei.fMask = SEE_MASK_FLAG_NO_UI; // we give error message ourselves
- ::ShellExecuteEx(&sei);
-
- const int nResult = (int) sei.hInstApp;
-
- // Firefox returns file not found for some reason, so make an exception
- // for it
- if ( nResult > 32 || nResult == SE_ERR_FNF )
- {
-#ifdef __WXDEBUG__
- // Log something if SE_ERR_FNF happens
- if ( nResult == SE_ERR_FNF )
- wxLogDebug(wxT("SE_ERR_FNF from ShellExecute -- maybe FireFox?"));
-#endif // __WXDEBUG__
+ if ( ::ShellExecuteEx(&sei) )
return true;
- }
#elif defined(__WXCOCOA__)
// NOTE: We need to call the real implementation from src/cocoa/utils.mm
// because the code must use Objective-C features.
return wxCocoaLaunchDefaultBrowser(url, flags);
-#elif defined(__WXMAC__)
- OSStatus err;
- ICInstance inst;
- long int startSel;
- long int endSel;
+#elif defined(__WXMAC__) && !defined(__WXOSX_IPHONE__)
+ wxCFRef< CFURLRef > curl( CFURLCreateWithString( kCFAllocatorDefault,
+ wxCFStringRef( url ), NULL ) );
+ OSStatus err = LSOpenCFURLRef( curl , NULL );
- err = ICStart(&inst, 'STKA'); // put your app creator code here
if (err == noErr)
{
- if (err == noErr)
- {
- ConstStr255Param hint = 0;
- startSel = 0;
- endSel = url.length();
- err = ICLaunchURL(inst, hint, url.fn_str(), endSel, &startSel, &endSel);
- if (err != noErr)
- wxLogDebug(wxT("ICLaunchURL error %d"), (int) err);
- }
- ICStop(inst);
return true;
}
else
{
- wxLogDebug(wxT("ICStart error %d"), (int) err);
+ wxLogDebug(wxT("Browser Launch error %d"), (int) err);
return false;
}
#else
#ifdef __UNIX__
+ // Our best best is to use xdg-open from freedesktop.org cross-desktop
+ // compatibility suite xdg-utils
+ // (see http://portland.freedesktop.org/wiki/) -- this is installed on
+ // most modern distributions and may be tweaked by them to handle
+ // distribution specifics. Only if that fails, try to find the right
+ // browser ourselves.
+ wxString path, xdg_open;
+ if ( wxGetEnv("PATH", &path) &&
+ wxFindFileInPath(&xdg_open, path, "xdg-open") )
+ {
+ if ( wxExecute(xdg_open + " " + url) )
+ return true;
+ }
+
wxString desktop = wxTheApp->GetTraits()->GetDesktopEnvironment();
// GNOME and KDE desktops have some applications which should be always installed
return ok;
// no file type for HTML extension
- wxLogError(_T("No default application configured for HTML files."));
+ wxLogError(_("No default application configured for HTML files."));
#endif // !wxUSE_MIMETYPE && !__WXMSW__
- wxLogSysError(_T("Failed to open URL \"%s\" in default browser."),
+ wxLogSysError(_("Failed to open URL \"%s\" in default browser."),
url.c_str());
return false;
}
+bool wxLaunchDefaultBrowser(const wxString& url, int flags)
+{
+ if ( flags & wxBROWSER_NOBUSYCURSOR )
+ return DoLaunchDefaultBrowser(url, flags);
+
+ wxBusyCursor bc;
+ return DoLaunchDefaultBrowser(url, flags);
+}
+
// ----------------------------------------------------------------------------
// Menu accelerators related functions
// ----------------------------------------------------------------------------
msg.Printf(_T("wxWidgets Library (%s port)\n")
_T("Version %d.%d.%d%s%s, compiled at %s %s\n")
_T("Runtime version of toolkit used is %d.%d.%s\n")
- _T("Copyright (c) 1995-2007 wxWidgets team"),
+ _T("Copyright (c) 1995-2008 wxWidgets team"),
wxPlatformInfo::Get().GetPortIdName().c_str(),
wxMAJOR_VERSION,
wxMINOR_VERSION,
wxPlatformInfo::Get().GetToolkitMajorVersion(),
wxPlatformInfo::Get().GetToolkitMinorVersion(),
#ifdef __WXGTK__
- wxString::Format(_T("\nThe compile-time GTK+ version is %d.%d.%d."), GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION).c_str()
+ wxString::Format("\nThe compile-time GTK+ version is %d.%d.%d.",
+ GTK_MAJOR_VERSION,
+ GTK_MINOR_VERSION,
+ GTK_MICRO_VERSION).c_str()
#else
wxEmptyString
#endif
#if wxUSE_COLOURDLG
-wxColour wxGetColourFromUser(wxWindow *parent,
- const wxColour& colInit,
+wxColour wxGetColourFromUser(wxWindow *parent,
+ const wxColour& colInit,
const wxString& caption,
wxColourData *ptrData)
{
node->GetData()->Enable(enable);
}
+wxWindowDisabler::wxWindowDisabler(bool disable)
+{
+ m_disabled = disable;
+ if ( disable )
+ DoDisable();
+}
+
wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip)
+{
+ m_disabled = true;
+ DoDisable(winToSkip);
+}
+
+void wxWindowDisabler::DoDisable(wxWindow *winToSkip)
{
// remember the top level windows which were already disabled, so that we
// don't reenable them later
wxWindowDisabler::~wxWindowDisabler()
{
+ if ( !m_disabled )
+ return;
+
wxWindowList::compatibility_iterator node;
for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() )
{