X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/636773ddad93b2b9ec98c166a3a41251e52407a8..e319bb30f7e88242f56144fcc279b57047566a6b:/src/common/utilscmn.cpp diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index f9e56b9f2b..7cf1062a5f 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: utilscmn.cpp +// Name: src/common/utilscmn.cpp // Purpose: Miscellaneous utility functions and classes // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "utils.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -29,14 +25,13 @@ #endif #ifndef WX_PRECOMP - #include "wx/defs.h" + #include "wx/app.h" #include "wx/string.h" #include "wx/utils.h" #include "wx/intl.h" #include "wx/log.h" #if wxUSE_GUI - #include "wx/app.h" #include "wx/window.h" #include "wx/frame.h" #include "wx/menu.h" @@ -50,9 +45,16 @@ #endif // wxUSE_GUI #endif // WX_PRECOMP -#ifndef __WIN16__ +#include "wx/apptrait.h" + #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" #endif #include @@ -60,7 +62,7 @@ #include #include -#if !defined(__WATCOMC__) +#if !wxONLY_WATCOM_EARLIER_THAN(1,4) #if !(defined(_MSC_VER) && (_MSC_VER > 800)) #include #endif @@ -70,36 +72,39 @@ #include "wx/colordlg.h" #include "wx/fontdlg.h" #include "wx/notebook.h" - #include "wx/frame.h" #include "wx/statusbr.h" #endif // wxUSE_GUI +#ifndef __WXWINCE__ #include +#else +#include "wx/msw/wince/time.h" +#endif -#ifndef __MWERKS__ - #include - #include +#ifdef __WXMAC__ +#include "wx/mac/private.h" +#ifndef __DARWIN__ +#include "InternetConfig.h" +#endif #endif -#ifdef __SALFORDC__ - #include +#if !defined(__MWERKS__) && !defined(__WXWINCE__) + #include + #include #endif -#ifdef __WXMSW__ +#if defined(__WXMSW__) #include "wx/msw/private.h" + #include "wx/msw/registry.h" + #include // needed for SHELLEXECUTEINFO #endif -#if 1 // def __WXBASE__ +#if wxUSE_BASE // ---------------------------------------------------------------------------- // common data // ---------------------------------------------------------------------------- -#if WXWIN_COMPATIBILITY_2_2 - const wxChar *wxInternalErrorStr = wxT("wxWindows Internal Error"); - const wxChar *wxFatalErrorStr = wxT("wxWindows Fatal Error"); -#endif // WXWIN_COMPATIBILITY_2_2 - // ============================================================================ // implementation // ============================================================================ @@ -109,107 +114,88 @@ wxChar * copystring (const wxChar *s) { - if (s == NULL) s = wxT(""); - size_t len = wxStrlen (s) + 1; + if (s == NULL) s = wxEmptyString; + size_t len = wxStrlen (s) + 1; - wxChar *news = new wxChar[len]; - memcpy (news, s, len * sizeof(wxChar)); // Should be the fastest + wxChar *news = new wxChar[len]; + memcpy (news, s, len * sizeof(wxChar)); // Should be the fastest - return news; + return news; } #endif // WXWIN_COMPATIBILITY_2_4 -// Id generation -static long wxCurrentId = 100; - -long -wxNewId (void) -{ - return wxCurrentId++; -} - -long -wxGetCurrentId(void) { return wxCurrentId; } - -void -wxRegisterId (long id) -{ - if (id >= wxCurrentId) - wxCurrentId = id + 1; -} - // ---------------------------------------------------------------------------- // String <-> Number conversions (deprecated) // ---------------------------------------------------------------------------- #if WXWIN_COMPATIBILITY_2_4 -WXDLLEXPORT_DATA(const wxChar *) wxFloatToStringStr = wxT("%.2f"); -WXDLLEXPORT_DATA(const wxChar *) wxDoubleToStringStr = wxT("%.2f"); +WXDLLIMPEXP_DATA_BASE(const wxChar *) wxFloatToStringStr = wxT("%.2f"); +WXDLLIMPEXP_DATA_BASE(const wxChar *) wxDoubleToStringStr = wxT("%.2f"); void StringToFloat (const wxChar *s, float *number) { - if (s && *s && number) - *number = (float) wxStrtod (s, (wxChar **) NULL); + if (s && *s && number) + *number = (float) wxStrtod (s, (wxChar **) NULL); } void StringToDouble (const wxChar *s, double *number) { - if (s && *s && number) - *number = wxStrtod (s, (wxChar **) NULL); + if (s && *s && number) + *number = wxStrtod (s, (wxChar **) NULL); } wxChar * FloatToString (float number, const wxChar *fmt) { - static wxChar buf[256]; + static wxChar buf[256]; - wxSprintf (buf, fmt, number); - return buf; + wxSprintf (buf, fmt, number); + return buf; } wxChar * DoubleToString (double number, const wxChar *fmt) { - static wxChar buf[256]; + static wxChar buf[256]; - wxSprintf (buf, fmt, number); - return buf; + wxSprintf (buf, fmt, number); + return buf; } void StringToInt (const wxChar *s, int *number) { - if (s && *s && number) - *number = (int) wxStrtol (s, (wxChar **) NULL, 10); + if (s && *s && number) + *number = (int) wxStrtol (s, (wxChar **) NULL, 10); } void StringToLong (const wxChar *s, long *number) { - if (s && *s && number) - *number = wxStrtol (s, (wxChar **) NULL, 10); + if (s && *s && number) + *number = wxStrtol (s, (wxChar **) NULL, 10); } wxChar * IntToString (int number) { - static wxChar buf[20]; + static wxChar buf[20]; - wxSprintf (buf, wxT("%d"), number); - return buf; + wxSprintf (buf, wxT("%d"), number); + return buf; } wxChar * LongToString (long number) { - static wxChar buf[20]; + static wxChar buf[20]; - wxSprintf (buf, wxT("%ld"), number); - return buf; + wxSprintf (buf, wxT("%ld"), number); + return buf; } #endif // WXWIN_COMPATIBILITY_2_4 @@ -220,29 +206,29 @@ static wxChar hexArray[] = wxT("0123456789ABCDEF"); // Convert 2-digit hex number to decimal int wxHexToDec(const wxString& buf) { - int firstDigit, secondDigit; + int firstDigit, secondDigit; - if (buf.GetChar(0) >= wxT('A')) - firstDigit = buf.GetChar(0) - wxT('A') + 10; - else - firstDigit = buf.GetChar(0) - wxT('0'); + if (buf.GetChar(0) >= wxT('A')) + firstDigit = buf.GetChar(0) - wxT('A') + 10; + else + firstDigit = buf.GetChar(0) - wxT('0'); - if (buf.GetChar(1) >= wxT('A')) - secondDigit = buf.GetChar(1) - wxT('A') + 10; - else - secondDigit = buf.GetChar(1) - wxT('0'); + if (buf.GetChar(1) >= wxT('A')) + secondDigit = buf.GetChar(1) - wxT('A') + 10; + else + secondDigit = buf.GetChar(1) - wxT('0'); - return (firstDigit & 0xF) * 16 + (secondDigit & 0xF ); + return (firstDigit & 0xF) * 16 + (secondDigit & 0xF ); } // Convert decimal integer to 2-character hex string void wxDecToHex(int dec, wxChar *buf) { - int firstDigit = (int)(dec/16.0); - int secondDigit = (int)(dec - (firstDigit*16.0)); - buf[0] = hexArray[firstDigit]; - buf[1] = hexArray[secondDigit]; - buf[2] = 0; + int firstDigit = (int)(dec/16.0); + int secondDigit = (int)(dec - (firstDigit*16.0)); + buf[0] = hexArray[firstDigit]; + buf[1] = hexArray[secondDigit]; + buf[2] = 0; } // Convert decimal integer to 2-character hex string @@ -260,10 +246,24 @@ wxString wxDecToHex(int dec) // Return the current date/time wxString wxNow() { +#ifdef __WXWINCE__ +#if wxUSE_DATETIME + wxDateTime now = wxDateTime::Now(); + return now.Format(); +#else + return wxEmptyString; +#endif +#else time_t now = time((time_t *) NULL); char *date = ctime(&now); date[24] = '\0'; return wxString::FromAscii(date); +#endif +} + +void wxUsleep(unsigned long milliseconds) +{ + wxMilliSleep(milliseconds); } const wxChar *wxGetInstallPrefix() @@ -276,22 +276,231 @@ const wxChar *wxGetInstallPrefix() #ifdef wxINSTALL_PREFIX return wxT(wxINSTALL_PREFIX); #else - return wxT(""); + return wxEmptyString; #endif } wxString wxGetDataDir() { - wxString format = wxGetInstallPrefix(); - format << wxFILE_SEP_PATH - << wxT("share") << wxFILE_SEP_PATH - << wxT("wx") << wxFILE_SEP_PATH - << wxT("%i.%i"); - wxString dir; - dir.Printf(format.c_str(), wxMAJOR_VERSION, wxMINOR_VERSION); + wxString dir = wxGetInstallPrefix(); + dir << wxFILE_SEP_PATH << wxT("share") << wxFILE_SEP_PATH << wxT("wx"); return dir; } +bool wxIsPlatformLittleEndian() +{ + // Are we little or big endian? This method is from Harbison & Steele. + union + { + long l; + char c[sizeof(long)]; + } u; + u.l = 1; + + return u.c[0] == 1; +} + + +/* + * Class to make it easier to specify platform-dependent values + */ + +wxArrayInt* wxPlatform::sm_customPlatforms = NULL; + +void wxPlatform::Copy(const wxPlatform& platform) +{ + m_longValue = platform.m_longValue; + m_doubleValue = platform.m_doubleValue; + m_stringValue = platform.m_stringValue; +} + +wxPlatform wxPlatform::If(int platform, long value) +{ + if (Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform wxPlatform::IfNot(int platform, long value) +{ + if (!Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform& wxPlatform::ElseIf(int platform, long value) +{ + if (Is(platform)) + m_longValue = value; + return *this; +} + +wxPlatform& wxPlatform::ElseIfNot(int platform, long value) +{ + if (!Is(platform)) + m_longValue = value; + return *this; +} + +wxPlatform wxPlatform::If(int platform, double value) +{ + if (Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform wxPlatform::IfNot(int platform, double value) +{ + if (!Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform& wxPlatform::ElseIf(int platform, double value) +{ + if (Is(platform)) + m_doubleValue = value; + return *this; +} + +wxPlatform& wxPlatform::ElseIfNot(int platform, double value) +{ + if (!Is(platform)) + m_doubleValue = value; + return *this; +} + +wxPlatform wxPlatform::If(int platform, const wxString& value) +{ + if (Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform wxPlatform::IfNot(int platform, const wxString& value) +{ + if (!Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform& wxPlatform::ElseIf(int platform, const wxString& value) +{ + if (Is(platform)) + m_stringValue = value; + return *this; +} + +wxPlatform& wxPlatform::ElseIfNot(int platform, const wxString& value) +{ + if (!Is(platform)) + m_stringValue = value; + return *this; +} + +wxPlatform& wxPlatform::Else(long value) +{ + m_longValue = value; + return *this; +} + +wxPlatform& wxPlatform::Else(double value) +{ + m_doubleValue = value; + return *this; +} + +wxPlatform& wxPlatform::Else(const wxString& value) +{ + m_stringValue = value; + return *this; +} + +void wxPlatform::AddPlatform(int platform) +{ + if (!sm_customPlatforms) + sm_customPlatforms = new wxArrayInt; + sm_customPlatforms->Add(platform); +} + +void wxPlatform::ClearPlatforms() +{ + delete sm_customPlatforms; + sm_customPlatforms = NULL; +} + +/// Function for testing current platform + +bool wxPlatform::Is(int platform) +{ +#ifdef __WXMSW__ + if (platform == wxOS_WINDOWS) + return true; +#endif +#ifdef __WXWINCE__ + if (platform == wxOS_WINDOWS_CE) + return true; +#endif + +#if 0 + +// FIXME: wxWinPocketPC and wxWinSmartPhone are unknown symbols + +#if defined(__WXWINCE__) && defined(__POCKETPC__) + if (platform == wxWinPocketPC) + return true; +#endif +#if defined(__WXWINCE__) && defined(__SMARTPHONE__) + if (platform == wxWinSmartPhone) + return true; +#endif + +#endif + +#ifdef __WXGTK__ + if (platform == wxPORT_GTK) + return true; +#endif +#ifdef __WXMAC__ + if (platform == wxPORT_MAC) + return true; +#endif +#ifdef __WXX11__ + if (platform == wxPORT_X11) + return true; +#endif +#ifdef __UNIX__ + if (platform == wxOS_UNIX) + return true; +#endif +#ifdef __WXMGL__ + if (platform == wxPORT_MGL) + return true; +#endif +#ifdef __OS2__ + if (platform == wxOS_OS2) + return true; +#endif +#ifdef __WXPM__ + if (platform == wxPORT_PM) + return true; +#endif +#ifdef __WXCOCOA__ + if (platform == wxPORT_MAC) + return true; +#endif + + if (sm_customPlatforms && sm_customPlatforms->Index(platform) != wxNOT_FOUND) + return true; + + return false; +} // ---------------------------------------------------------------------------- // network and user id functions @@ -302,12 +511,12 @@ bool wxGetEmailAddress(wxChar *address, int maxSize) { wxString email = wxGetEmailAddress(); if ( !email ) - return FALSE; + return false; wxStrncpy(address, email, maxSize - 1); address[maxSize - 1] = wxT('\0'); - return TRUE; + return true; } wxString wxGetEmailAddress() @@ -315,10 +524,10 @@ wxString wxGetEmailAddress() wxString email; wxString host = wxGetFullHostName(); - if ( !!host ) + if ( !host.empty() ) { wxString user = wxGetUserId(); - if ( !!user ) + if ( !user.empty() ) { email << user << wxT('@') << host; } @@ -332,8 +541,7 @@ wxString wxGetUserId() static const int maxLoginLen = 256; // FIXME arbitrary number wxString buf; - bool ok = wxGetUserId(buf.GetWriteBuf(maxLoginLen), maxLoginLen); - buf.UngetWriteBuf(); + bool ok = wxGetUserId(wxStringBuffer(buf, maxLoginLen), maxLoginLen); if ( !ok ) buf.Empty(); @@ -346,8 +554,7 @@ wxString wxGetUserName() static const int maxUserNameLen = 1024; // FIXME arbitrary number wxString buf; - bool ok = wxGetUserName(buf.GetWriteBuf(maxUserNameLen), maxUserNameLen); - buf.UngetWriteBuf(); + bool ok = wxGetUserName(wxStringBuffer(buf, maxUserNameLen), maxUserNameLen); if ( !ok ) buf.Empty(); @@ -360,9 +567,7 @@ wxString wxGetHostName() static const size_t hostnameSize = 257; wxString buf; - bool ok = wxGetHostName(buf.GetWriteBuf(hostnameSize), hostnameSize); - - buf.UngetWriteBuf(); + bool ok = wxGetHostName(wxStringBuffer(buf, hostnameSize), hostnameSize); if ( !ok ) buf.Empty(); @@ -375,9 +580,7 @@ wxString wxGetFullHostName() static const size_t hostnameSize = 257; wxString buf; - bool ok = wxGetFullHostName(buf.GetWriteBuf(hostnameSize), hostnameSize); - - buf.UngetWriteBuf(); + bool ok = wxGetFullHostName(wxStringBuffer(buf, hostnameSize), hostnameSize); if ( !ok ) buf.Empty(); @@ -433,18 +636,18 @@ wxString wxGetCurrentDir() // wxDoExecuteWithCapture() helper: reads an entire stream into one array // -// returns TRUE if ok, FALSE if error +// returns true if ok, false if error #if wxUSE_STREAMS static bool ReadAll(wxInputStream *is, wxArrayString& output) { - wxCHECK_MSG( is, FALSE, _T("NULL stream in wxExecute()?") ); + wxCHECK_MSG( is, false, _T("NULL stream in wxExecute()?") ); // the stream could be already at EOF or in wxSTREAM_BROKEN_PIPE state is->Reset(); wxTextInputStream tis(*is); - bool cont = TRUE; + bool cont = true; while ( cont ) { wxString line = tis.ReadLine(); @@ -453,7 +656,7 @@ static bool ReadAll(wxInputStream *is, wxArrayString& output) if ( !*is ) { - cont = FALSE; + cont = false; } else { @@ -470,18 +673,14 @@ static bool ReadAll(wxInputStream *is, wxArrayString& output) // public versions of wxExecute() below static long wxDoExecuteWithCapture(const wxString& command, wxArrayString& output, - wxArrayString* error) + wxArrayString* error, + int flags) { -#ifdef __WIN16__ - wxFAIL_MSG("Sorry, this version of wxExecute not implemented on WIN16."); - - return 0; -#else // !Win16 // create a wxProcess which will capture the output wxProcess *process = new wxProcess; process->Redirect(); - long rc = wxExecute(command, wxEXEC_SYNC, process); + long rc = wxExecute(command, wxEXEC_SYNC | flags, process); #if wxUSE_STREAMS if ( rc != -1 ) @@ -496,24 +695,231 @@ static long wxDoExecuteWithCapture(const wxString& command, } } -#endif // wxUSE_STREAMS +#else + wxUnusedVar(output); + wxUnusedVar(error); +#endif // wxUSE_STREAMS/!wxUSE_STREAMS delete process; return rc; -#endif // IO redirection supported } -long wxExecute(const wxString& command, wxArrayString& output) +long wxExecute(const wxString& command, wxArrayString& output, int flags) { - return wxDoExecuteWithCapture(command, output, NULL); + return wxDoExecuteWithCapture(command, output, NULL, flags); } long wxExecute(const wxString& command, wxArrayString& output, - wxArrayString& error) + wxArrayString& error, + int flags) { - return wxDoExecuteWithCapture(command, output, &error); + return wxDoExecuteWithCapture(command, output, &error, flags); +} + +// ---------------------------------------------------------------------------- +// Launch default browser +// ---------------------------------------------------------------------------- + +bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) +{ + wxUnusedVar(flags); + + // set the scheme of url to http if it does not have one + // RR: This doesn't work if the url is just a local path + wxString url(urlOrig); + wxURI uri(url); + if ( !uri.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, uri.GetScheme() + _T("\\shell\\open")); + if ( !key.Exists() ) + { + // try default browser, it must be registered at least for http URLs + key.SetName(wxRegKey::HKCR, _T("http\\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 sei; + sei.lpFile = url.c_str(); + sei.lpVerb = _T("open"); + sei.nShow = SW_SHOWNORMAL; + + ::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__ + return true; + } +#elif defined(__WXMAC__) + OSStatus err; + ICInstance inst; + long int startSel; + long int endSel; + + err = ICStart(&inst, 'STKA'); // put your app creator code here + if (err == noErr) + { +#if !TARGET_CARBON + err = ICFindConfigFile(inst, 0, NULL); +#endif + 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); + return false; + } +#else + // (non-Mac, non-MSW) + +#ifdef __UNIX__ + + wxString desktop = wxTheApp->GetTraits()->GetDesktopEnvironment(); + + // GNOME and KDE desktops have some applications which should be always installed + // together with their main parts, which give us the + if (desktop == wxT("GNOME")) + { + wxArrayString errors; + wxArrayString output; + + // gconf will tell us the path of the application to use as browser + long res = wxExecute( wxT("gconftool-2 --get /desktop/gnome/applications/browser/exec"), + output, errors, wxEXEC_NODISABLE ); + if (res >= 0 && errors.GetCount() == 0) + { + wxString cmd = output[0]; + cmd << _T(' ') << url; + if (wxExecute(cmd)) + return true; + } + } + else if (desktop == wxT("KDE")) + { + // kfmclient directly opens the given URL + if (wxExecute(wxT("kfmclient openURL ") + url)) + return true; + } +#endif + + bool ok = false; + wxString cmd; + +#if wxUSE_MIMETYPE + wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(_T("html")); + if ( ft ) + { + wxString mt; + ft->GetMimeType(&mt); + + ok = ft->GetOpenCommand(&cmd, wxFileType::MessageParameters(url)); + delete ft; + } +#endif // wxUSE_MIMETYPE + + if ( !ok || cmd.empty() ) + { + // fallback to checking for the BROWSER environment variable + cmd = wxGetenv(wxT("BROWSER")); + if ( !cmd.empty() ) + cmd << _T(' ') << url; + } + + ok = ( !cmd.empty() && wxExecute(cmd) ); + if (ok) + return ok; + + // no file type for HTML extension + wxLogError(_T("No default application configured for HTML files.")); + +#endif // !wxUSE_MIMETYPE && !__WXMSW__ + + wxLogSysError(_T("Failed to open URL \"%s\" in default browser."), + url.c_str()); + + return false; } // ---------------------------------------------------------------------------- @@ -527,10 +933,10 @@ bool wxYield() bool wxYieldIfNeeded() { - return wxTheApp && wxTheApp->Yield(TRUE); + return wxTheApp && wxTheApp->Yield(true); } -#endif // __WXBASE__ +#endif // wxUSE_BASE // ============================================================================ // GUI-only functions from now on @@ -538,7 +944,27 @@ bool wxYieldIfNeeded() #if wxUSE_GUI -#if wxUSE_MENUS +// Id generation +static long wxCurrentId = 100; + +long wxNewId() +{ + // skip the part of IDs space that contains hard-coded values: + if (wxCurrentId == wxID_LOWEST) + wxCurrentId = wxID_HIGHEST + 1; + + return wxCurrentId++; +} + +long +wxGetCurrentId(void) { return wxCurrentId; } + +void +wxRegisterId (long id) +{ + if (id >= wxCurrentId) + wxCurrentId = id + 1; +} // ---------------------------------------------------------------------------- // Menu accelerators related functions @@ -546,7 +972,12 @@ bool wxYieldIfNeeded() wxChar *wxStripMenuCodes(const wxChar *in, wxChar *out) { +#if wxUSE_MENUS wxString s = wxMenuItem::GetLabelFromText(in); +#else + wxString str(in); + wxString s = wxStripMenuCodes(str); +#endif // wxUSE_MENUS if ( out ) { // go smash their buffer if it's not big enough - I love char * params @@ -554,14 +985,18 @@ wxChar *wxStripMenuCodes(const wxChar *in, wxChar *out) } else { - out = copystring(s); + // MYcopystring - for easier search... + out = new wxChar[s.length() + 1]; + wxStrcpy(out, s.c_str()); } return out; } -wxString wxStripMenuCodes(const wxString& in) +wxString wxStripMenuCodes(const wxString& in, int flags) { + wxASSERT_MSG( flags, _T("this is useless to call without any flags") ); + wxString out; size_t len = in.length(); @@ -570,7 +1005,7 @@ wxString wxStripMenuCodes(const wxString& in) for ( size_t n = 0; n < len; n++ ) { wxChar ch = in[n]; - if ( ch == _T('&') ) + if ( (flags & wxStrip_Mnemonics) && ch == _T('&') ) { // skip it, it is used to introduce the accel char (or to quote // itself in which case it should still be skipped): note that it @@ -585,7 +1020,7 @@ wxString wxStripMenuCodes(const wxString& in) ch = in[n]; } } - else if ( ch == _T('\t') ) + else if ( (flags & wxStrip_Accel) && ch == _T('\t') ) { // everything after TAB is accel string, exit the loop break; @@ -597,8 +1032,6 @@ wxString wxStripMenuCodes(const wxString& in) return out; } -#endif // wxUSE_MENUS - // ---------------------------------------------------------------------------- // Window search functions // ---------------------------------------------------------------------------- @@ -628,17 +1061,17 @@ wxFindWindowByName (const wxString& name, wxWindow * parent) return wxWindow::FindWindowByName( name, parent ); } -// Returns menu item id or -1 if none. +// Returns menu item id or wxNOT_FOUND if none. int wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& itemString) { #if wxUSE_MENUS - wxMenuBar *menuBar = frame->GetMenuBar (); - if ( menuBar ) - return menuBar->FindMenuItem (menuString, itemString); + wxMenuBar *menuBar = frame->GetMenuBar (); + if ( menuBar ) + return menuBar->FindMenuItem (menuString, itemString); #endif // wxUSE_MENUS - return -1; + return wxNOT_FOUND; } // Try to find the deepest child that contains 'pt'. @@ -668,7 +1101,7 @@ wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt) } #endif - wxWindowList::Node *node = win->GetChildren().GetLast(); + wxWindowList::compatibility_iterator node = win->GetChildren().GetLast(); while (node) { wxWindow* child = node->GetData(); @@ -680,16 +1113,16 @@ wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt) wxPoint pos = win->GetPosition(); wxSize sz = win->GetSize(); - if (win->GetParent()) + if ( !win->IsTopLevel() && win->GetParent() ) { pos = win->GetParent()->ClientToScreen(pos); } wxRect rect(pos, sz); - if (rect.Inside(pt)) + if (rect.Contains(pt)) return win; - else - return NULL; + + return NULL; } wxWindow* wxGenericFindWindowAtPoint(const wxPoint& pt) @@ -697,7 +1130,7 @@ wxWindow* wxGenericFindWindowAtPoint(const wxPoint& pt) // Go backwards through the list since windows // on top are likely to have been appended most // recently. - wxWindowList::Node *node = wxTopLevelWindows.GetLast(); + wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetLast(); while (node) { wxWindow* win = node->GetData(); @@ -723,7 +1156,14 @@ wxWindow* wxGenericFindWindowAtPoint(const wxPoint& pt) int wxMessageBox(const wxString& message, const wxString& caption, long style, wxWindow *parent, int WXUNUSED(x), int WXUNUSED(y) ) { - wxMessageDialog dialog(parent, message, caption, style); + long decorated_style = style; + + if ( ( style & ( wxICON_EXCLAMATION | wxICON_HAND | wxICON_INFORMATION | wxICON_QUESTION ) ) == 0 ) + { + decorated_style |= ( style & wxYES ) ? wxICON_QUESTION : wxICON_INFORMATION ; + } + + wxMessageDialog dialog(parent, message, caption, decorated_style); int ans = dialog.ShowModal(); switch ( ans ) @@ -749,10 +1189,18 @@ int wxMessageBox(const wxString& message, const wxString& caption, long style, wxString wxGetTextFromUser(const wxString& message, const wxString& caption, const wxString& defaultValue, wxWindow *parent, - int x, int y, bool WXUNUSED(centre) ) + wxCoord x, wxCoord y, bool centre ) { wxString str; - wxTextEntryDialog dialog(parent, message, caption, defaultValue, wxOK|wxCANCEL, wxPoint(x, y)); + long style = wxTextEntryDialogStyle; + + if (centre) + style |= wxCENTRE; + else + style &= ~wxCENTRE; + + wxTextEntryDialog dialog(parent, message, caption, defaultValue, style, wxPoint(x, y)); + if (dialog.ShowModal() == wxID_OK) { str = dialog.GetValue(); @@ -764,11 +1212,19 @@ wxString wxGetTextFromUser(const wxString& message, const wxString& caption, wxString wxGetPasswordFromUser(const wxString& message, const wxString& caption, const wxString& defaultValue, - wxWindow *parent) + wxWindow *parent, + wxCoord x, wxCoord y, bool centre ) { wxString str; - wxTextEntryDialog dialog(parent, message, caption, defaultValue, - wxOK | wxCANCEL | wxTE_PASSWORD); + long style = wxTextEntryDialogStyle; + + if (centre) + style |= wxCENTRE; + else + style &= ~wxCENTRE; + + wxPasswordEntryDialog dialog(parent, message, caption, defaultValue, + style, wxPoint(x, y)); if ( dialog.ShowModal() == wxID_OK ) { str = dialog.GetValue(); @@ -781,10 +1237,10 @@ 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 data; - data.SetChooseFull(TRUE); + data.SetChooseFull(true); if ( colInit.Ok() ) { data.SetColour((wxColour &)colInit); // const_cast @@ -792,6 +1248,8 @@ wxColour wxGetColourFromUser(wxWindow *parent, const wxColour& colInit) wxColour colRet; wxColourDialog dialog(parent, &data); + if (!caption.empty()) + dialog.SetTitle(caption); if ( dialog.ShowModal() == wxID_OK ) { colRet = dialog.GetColourData().GetColour(); @@ -805,7 +1263,7 @@ wxColour wxGetColourFromUser(wxWindow *parent, const wxColour& colInit) #if wxUSE_FONTDLG -wxFont wxGetFontFromUser(wxWindow *parent, const wxFont& fontInit) +wxFont wxGetFontFromUser(wxWindow *parent, const wxFont& fontInit, const wxString& caption) { wxFontData data; if ( fontInit.Ok() ) @@ -815,6 +1273,8 @@ wxFont wxGetFontFromUser(wxWindow *parent, const wxFont& fontInit) wxFont fontRet; wxFontDialog dialog(parent, data); + if (!caption.empty()) + dialog.SetTitle(caption); if ( dialog.ShowModal() == wxID_OK ) { fontRet = dialog.GetFontData().GetChosenFont(); @@ -825,20 +1285,6 @@ wxFont wxGetFontFromUser(wxWindow *parent, const wxFont& fontInit) } #endif // wxUSE_FONTDLG -// ---------------------------------------------------------------------------- -// missing C RTL functions (FIXME shouldn't be here at all) -// ---------------------------------------------------------------------------- - -#if defined( __MWERKS__ ) && !defined(__MACH__) -char *strdup(const char *s) -{ - return strcpy( (char*) malloc( strlen( s ) + 1 ) , s ) ; -} -int isascii( int c ) -{ - return ( c >= 0 && c < 128 ) ; -} -#endif // __MWERKS__ // ---------------------------------------------------------------------------- // wxSafeYield and supporting functions @@ -846,7 +1292,7 @@ int isascii( int c ) void wxEnableTopLevelWindows(bool enable) { - wxWindowList::Node *node; + wxWindowList::compatibility_iterator node; for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) node->GetData()->Enable(enable); } @@ -857,7 +1303,7 @@ wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) // don't reenable them later m_winDisabled = NULL; - wxWindowList::Node *node; + wxWindowList::compatibility_iterator node; for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { wxWindow *winTop = node->GetData(); @@ -883,7 +1329,7 @@ wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) wxWindowDisabler::~wxWindowDisabler() { - wxWindowList::Node *node; + wxWindowList::compatibility_iterator node; for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { wxWindow *winTop = node->GetData(); @@ -918,9 +1364,8 @@ bool wxSafeYield(wxWindow *win, bool onlyIfNeeded) #ifndef __WXGTK__ bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) ) { - return TRUE; // detectable auto-repeat is the only mode MSW supports + return true; // detectable auto-repeat is the only mode MSW supports } #endif // !wxGTK #endif // wxUSE_GUI -