#include <stdlib.h>
#include <string.h>
-#if !defined(__WATCOMC__)
+#if !wxONLY_WATCOM_EARLIER_THAN(1,4)
#if !(defined(_MSC_VER) && (_MSC_VER > 800))
#include <errno.h>
#endif
#include "wx/colordlg.h"
#include "wx/fontdlg.h"
#include "wx/notebook.h"
- #include "wx/frame.h"
#include "wx/statusbr.h"
#endif // wxUSE_GUI
#if defined(__WXMSW__)
#include "wx/msw/private.h"
#include "wx/msw/registry.h"
+ #include <shellapi.h> // needed for SHELLEXECUTEINFO
#endif
#if wxUSE_BASE
return dir;
}
-int wxGetOsVersion(int *verMaj, int *verMin)
+bool wxIsPlatformLittleEndian()
{
- // we want this function to work even if there is no wxApp
- wxConsoleAppTraits traitsConsole;
- wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
- if ( ! traits )
- traits = &traitsConsole;
+ // 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();
+}
- wxToolkitInfo& info = traits->GetToolkitInfo();
- if ( verMaj )
- *verMaj = info.versionMajor;
- if ( verMin )
- *verMin = info.versionMinor;
- return info.os;
+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;
}
// ----------------------------------------------------------------------------
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);
- if ( !wxURI(url).HasScheme() )
+ wxURI uri(url);
+ if ( !uri.HasScheme() )
url.Prepend(wxT("http://"));
+
#if defined(__WXMSW__)
#if wxUSE_IPC
{
// 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"));
+ 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"));
#elif defined(__WXMAC__)
OSStatus err;
ICInstance inst;
- SInt32 startSel;
- SInt32 endSel;
+ long int startSel;
+ long int endSel;
err = ICStart(&inst, 'STKA'); // put your app creator code here
- if (err == noErr) {
+ if (err == noErr)
+ {
#if !TARGET_CARBON
- err = ICFindConfigFile(inst, 0, nil);
+ err = ICFindConfigFile(inst, 0, NULL);
#endif
if (err == noErr)
{
ConstStr255Param hint = 0;
startSel = 0;
- endSel = url.Length();
+ endSel = url.length();
err = ICLaunchURL(inst, hint, url.fn_str(), endSel, &startSel, &endSel);
if (err != noErr)
wxLogDebug(wxT("ICLaunchURL error %d"), (int) err);
wxLogDebug(wxT("ICStart error %d"), (int) err);
return false;
}
-#elif wxUSE_MIMETYPE
- // Non-windows way
- wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension (_T("html"));
+#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);
- wxString cmd;
- bool ok = ft->GetOpenCommand(&cmd, wxFileType::MessageParameters(url));
+ 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;
- }
-
- if ( !cmd.empty() && wxExecute(cmd) )
- return true;
}
- else // no file type for html extension
+#endif // wxUSE_MIMETYPE
+
+ if ( !ok || cmd.empty() )
{
- wxLogError(_T("No default application configured for HTML files."));
+ // 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."),
wxCurrentId = id + 1;
}
-#if wxUSE_MENUS
-
// ----------------------------------------------------------------------------
// Menu accelerators related functions
// ----------------------------------------------------------------------------
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
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();
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
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;
return out;
}
-#endif // wxUSE_MENUS
-
// ----------------------------------------------------------------------------
// Window search functions
// ----------------------------------------------------------------------------
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 wxNOT_FOUND;
+ return wxNOT_FOUND;
}
// Try to find the deepest child that contains '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)
wxColour colRet;
wxColourDialog dialog(parent, &data);
- if (!caption.IsEmpty())
+ if (!caption.empty())
dialog.SetTitle(caption);
if ( dialog.ShowModal() == wxID_OK )
{
wxFont fontRet;
wxFontDialog dialog(parent, data);
- if (!caption.IsEmpty())
+ if (!caption.empty())
dialog.SetTitle(caption);
if ( dialog.ShowModal() == wxID_OK )
{