X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c193821a999730fbf6a9bea83763f37daae68f1..507abc7b3af8d73e7caf05261d1f40b51775ae7a:/src/common/utilscmn.cpp diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 3a131a372f..303e31881f 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" @@ -53,13 +49,20 @@ #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 #include #include #include -#if !defined(__WATCOMC__) +#if !wxONLY_WATCOM_EARLIER_THAN(1,4) #if !(defined(_MSC_VER) && (_MSC_VER > 800)) #include #endif @@ -69,7 +72,6 @@ #include "wx/colordlg.h" #include "wx/fontdlg.h" #include "wx/notebook.h" - #include "wx/frame.h" #include "wx/statusbr.h" #endif // wxUSE_GUI @@ -79,17 +81,22 @@ #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 wxUSE_BASE @@ -98,11 +105,6 @@ // 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 // ============================================================================ @@ -112,36 +114,17 @@ 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) // ---------------------------------------------------------------------------- @@ -154,65 +137,65 @@ 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 @@ -223,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 @@ -263,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() @@ -279,19 +276,14 @@ 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; } @@ -303,7 +295,201 @@ int wxGetOsVersion(int *verMaj, int *verMin) if ( ! traits ) traits = &traitsConsole; - return traits->GetOSVersion(verMaj, verMin); + wxToolkitInfo& info = traits->GetToolkitInfo(); + if ( verMaj ) + *verMaj = info.versionMajor; + if ( verMin ) + *verMin = info.versionMinor; + return info.os; +} + +/* + * 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 == wxMSW) + return true; +#endif +#ifdef __WXWINCE__ + if (platform == wxWinCE) + return true; +#endif +#if defined(__WXWINCE__) && defined(__POCKETPC__) + if (platform == wxWinPocketPC) + return true; +#endif +#if defined(__WXWINCE__) && defined(__SMARTPHONE__) + if (platform == wxWinSmartPhone) + return true; +#endif +#ifdef __WXGTK__ + if (platform == wxGTK) + return true; +#endif +#ifdef __WXMAC__ + if (platform == wxMac) + return true; +#endif +#ifdef __WXX11__ + if (platform == wxX11) + return true; +#endif +#ifdef __UNIX__ + if (platform == wxUnix) + return true; +#endif +#ifdef __WXMGL__ + if (platform == wxMGL) + return true; +#endif +#ifdef __WXOS2__ + if (platform == wxOS2) + return true; +#endif +#ifdef __WXCOCOA__ + if (platform == wxCocoa) + return true; +#endif + + if (sm_customPlatforms && sm_customPlatforms->Index(platform) != wxNOT_FOUND) + return true; + + return false; } // ---------------------------------------------------------------------------- @@ -315,12 +501,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() @@ -328,10 +514,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; } @@ -345,8 +531,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(); @@ -359,8 +544,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(); @@ -373,9 +557,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(); @@ -388,9 +570,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(); @@ -446,18 +626,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(); @@ -466,7 +646,7 @@ static bool ReadAll(wxInputStream *is, wxArrayString& output) if ( !*is ) { - cont = FALSE; + cont = false; } else { @@ -483,13 +663,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) { // 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 ) @@ -504,23 +685,189 @@ static long wxDoExecuteWithCapture(const wxString& command, } } -#endif // wxUSE_STREAMS +#else + wxUnusedVar(output); + wxUnusedVar(error); +#endif // wxUSE_STREAMS/!wxUSE_STREAMS delete process; return rc; } -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, flags); +} + +// ---------------------------------------------------------------------------- +// Launch default browser +// ---------------------------------------------------------------------------- + +bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) { - return wxDoExecuteWithCapture(command, output, &error); + 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 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; + SInt32 startSel; + SInt32 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; + } +#elif wxUSE_MIMETYPE + // Non-windows way + bool ok = false; + wxString cmd; + + wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(_T("html")); + if ( ft ) + { + wxString mt; + ft->GetMimeType(&mt); + + ok = ft->GetOpenCommand(&cmd, wxFileType::MessageParameters(url)); + delete ft; + } + + 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; } // ---------------------------------------------------------------------------- @@ -534,7 +881,7 @@ bool wxYield() bool wxYieldIfNeeded() { - return wxTheApp && wxTheApp->Yield(TRUE); + return wxTheApp && wxTheApp->Yield(true); } #endif // wxUSE_BASE @@ -545,7 +892,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 @@ -553,7 +920,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 @@ -569,8 +941,10 @@ wxChar *wxStripMenuCodes(const wxChar *in, wxChar *out) 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(); @@ -579,7 +953,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 @@ -594,7 +968,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; @@ -606,8 +980,6 @@ wxString wxStripMenuCodes(const wxString& in) return out; } -#endif // wxUSE_MENUS - // ---------------------------------------------------------------------------- // Window search functions // ---------------------------------------------------------------------------- @@ -637,17 +1009,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'. @@ -689,7 +1061,7 @@ 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); } @@ -697,8 +1069,8 @@ wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt) wxRect rect(pos, sz); if (rect.Inside(pt)) return win; - else - return NULL; + + return NULL; } wxWindow* wxGenericFindWindowAtPoint(const wxPoint& pt) @@ -732,7 +1104,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 ) @@ -758,10 +1137,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(); @@ -773,11 +1160,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(); @@ -790,10 +1185,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 @@ -801,6 +1196,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(); @@ -814,7 +1211,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() ) @@ -824,6 +1221,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(); @@ -913,9 +1312,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 -