#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"
#endif
#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
// ----------------------------------------------------------------------------
/* The next 4 #defines implement a very fast in-line stack abstraction. */
#define STACK_SIZE (8 * sizeof(unsigned long int))
-#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top))
-#define POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi)))
-#define STACK_NOT_EMPTY (stack < top)
+#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top))
+#define POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi)))
+#define STACK_NOT_EMPTY (stack < top)
/* Order size using quicksort. This implementation incorporates
of the array to sort, and END_PTR points at the very last element in
the array (*not* one beyond it!). */
-#define min(x, y) ((x) < (y) ? (x) : (y))
-
{
char *const end_ptr = &base_ptr[size * (total_elems - 1)];
char *tmp_ptr = base_ptr;
- char *thresh = min(end_ptr, base_ptr + max_thresh);
+ char *thresh = base_ptr + max_thresh;
+ if ( thresh > end_ptr )
+ thresh = end_ptr;
register char *run_ptr;
/* Find smallest element in first threshold and place it at the
::ShellExecuteEx(&sei);
- const int nResult = (int) sei.hInstApp;
+ const INT_PTR nResult = (INT_PTR)sei.hInstApp;
// Firefox returns file not found for some reason, so make an exception
// for it
// 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;
+ 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 !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);
+ 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;
wxChar *wxStripMenuCodes(const wxChar *in, wxChar *out)
{
#if wxUSE_MENUS
- wxString s = wxMenuItem::GetLabelFromText(in);
+ wxString s = wxMenuItem::GetLabelText(in);
#else
wxString str(in);
wxString s = wxStripMenuCodes(str);
// Returns menu item id or wxNOT_FOUND if none.
int
-wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& itemString)
+wxFindMenuItemId(wxFrame *frame,
+ const wxString& menuString,
+ const wxString& itemString)
{
#if wxUSE_MENUS
wxMenuBar *menuBar = frame->GetMenuBar ();
if ( menuBar )
return menuBar->FindMenuItem (menuString, itemString);
-#endif // wxUSE_MENUS
+#else // !wxUSE_MENUS
+ wxUnusedVar(frame);
+ wxUnusedVar(menuString);
+ wxUnusedVar(itemString);
+#endif // wxUSE_MENUS/!wxUSE_MENUS
return wxNOT_FOUND;
}
return wxCANCEL;
}
+void wxInfoMessageBox(wxWindow* parent)
+{
+ // don't translate these strings, they're for diagnostics purposes only
+ wxString msg;
+ 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"),
+ wxPlatformInfo::Get().GetPortIdName().c_str(),
+ wxMAJOR_VERSION,
+ wxMINOR_VERSION,
+ wxRELEASE_NUMBER,
+#if wxUSE_UNICODE
+ L" (Unicode)",
+#else
+ wxEmptyString,
+#endif
+#ifdef __WXDEBUG__
+ _T(" Debug build"),
+#else
+ wxEmptyString,
+#endif
+ __TDATE__,
+ __TTIME__,
+ wxPlatformInfo::Get().GetToolkitMajorVersion(),
+ wxPlatformInfo::Get().GetToolkitMinorVersion(),
+#ifdef __WXGTK__
+ 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
+ );
+ wxMessageBox(msg, _T("wxWidgets information"),
+ wxICON_INFORMATION | wxOK,
+ parent);
+}
+
#endif // wxUSE_MSGDLG
#if wxUSE_TEXTDLG
#if wxUSE_COLOURDLG
-wxColour wxGetColourFromUser(wxWindow *parent, const wxColour& colInit, const wxString& caption)
+wxColour wxGetColourFromUser(wxWindow *parent,
+ const wxColour& colInit,
+ const wxString& caption,
+ wxColourData *ptrData)
{
+ // contains serialized representation of wxColourData used the last time
+ // the dialog was shown: we want to reuse it the next time in order to show
+ // the same custom colours to the user (and we can't just have static
+ // wxColourData itself because it's a GUI object and so should be destroyed
+ // before GUI shutdown and doing it during static cleanup is too late)
+ static wxString s_strColourData;
+
wxColourData data;
- data.SetChooseFull(true);
- if ( colInit.Ok() )
+ if ( !ptrData )
+ {
+ ptrData = &data;
+ if ( !s_strColourData.empty() )
+ {
+ if ( !data.FromString(s_strColourData) )
+ {
+ wxFAIL_MSG( "bug in wxColourData::FromString()?" );
+ }
+
+#ifdef __WXMSW__
+ // we don't get back the "choose full" flag value from the native
+ // dialog and so we can't preserve it between runs, so we decide to
+ // always use it as it seems better than not using it (user can
+ // just ignore the extra controls in the dialog but having to click
+ // a button each time to show them would be very annoying
+ data.SetChooseFull(true);
+#endif // __WXMSW__
+ }
+ }
+
+ if ( colInit.IsOk() )
{
- data.SetColour((wxColour &)colInit); // const_cast
+ ptrData->SetColour(colInit);
}
wxColour colRet;
- wxColourDialog dialog(parent, &data);
+ wxColourDialog dialog(parent, ptrData);
if (!caption.empty())
dialog.SetTitle(caption);
if ( dialog.ShowModal() == wxID_OK )
{
- colRet = dialog.GetColourData().GetColour();
+ *ptrData = dialog.GetColourData();
+ colRet = ptrData->GetColour();
+ s_strColourData = ptrData->ToString();
}
- //else: leave it invalid
+ //else: leave colRet invalid
return colRet;
}
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() )
{