X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dca0f651782d5c2659203c97b3243f613966998d..396825dced4558d8d724d0e38f7e1017f76d0a96:/src/common/utilscmn.cpp diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index e656559ad2..43826ac40f 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -75,23 +75,24 @@ #include "wx/statusbr.h" #endif // wxUSE_GUI +#ifndef __WXPALMOS5__ #ifndef __WXWINCE__ #include #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 #include #endif +#endif // ! __WXPALMOS5__ #if defined(__WXMSW__) #include "wx/msw/private.h" @@ -435,8 +436,7 @@ bool wxGetEmailAddress(wxChar *address, int maxSize) if ( !email ) return false; - wxStrncpy(address, email, maxSize - 1); - address[maxSize - 1] = wxT('\0'); + wxStrlcpy(address, email.t_str(), maxSize); return true; } @@ -932,6 +932,50 @@ void wxQsort(void *const pbase, size_t total_elems, #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 sei; + sei.lpFile = document.wx_str(); + sei.lpVerb = _T("open"); + sei.nShow = SW_SHOWDEFAULT; + + // 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 // ---------------------------------------------------------------------------- @@ -941,7 +985,7 @@ void wxQsort(void *const pbase, size_t total_elems, 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); @@ -977,13 +1021,14 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int 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(); @@ -996,7 +1041,7 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) // 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 ) @@ -1012,7 +1057,7 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) 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 @@ -1030,50 +1075,26 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) 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_PTR nResult = (INT_PTR)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 @@ -1161,6 +1182,15 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) 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 // ---------------------------------------------------------------------------- @@ -1390,7 +1420,7 @@ void wxInfoMessageBox(wxWindow* parent) 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, @@ -1477,8 +1507,8 @@ wxString wxGetPasswordFromUser(const wxString& message, #if wxUSE_COLOURDLG -wxColour wxGetColourFromUser(wxWindow *parent, - const wxColour& colInit, +wxColour wxGetColourFromUser(wxWindow *parent, + const wxColour& colInit, const wxString& caption, wxColourData *ptrData) { @@ -1569,7 +1599,20 @@ void wxEnableTopLevelWindows(bool enable) 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 @@ -1601,6 +1644,9 @@ wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) wxWindowDisabler::~wxWindowDisabler() { + if ( !m_disabled ) + return; + wxWindowList::compatibility_iterator node; for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) {