1/////////////////////////////////////////////////////////////////////////////// 2// Name: wx/apptrait.h 3// Purpose: declaration of wxAppTraits and derived classes 4// Author: Vadim Zeitlin 5// Modified by: 6// Created: 19.06.2003 7// RCS-ID: $Id: apptrait.h 49804 2007-11-10 01:09:42Z VZ $ 8// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> 9// Licence: wxWindows licence 10/////////////////////////////////////////////////////////////////////////////// 11 12#ifndef _WX_APPTRAIT_H_ 13#define _WX_APPTRAIT_H_ 14 15#include "wx/string.h" 16#include "wx/platinfo.h" 17 18class WXDLLIMPEXP_FWD_BASE wxObject; 19class WXDLLIMPEXP_FWD_BASE wxAppTraits; 20#if wxUSE_FONTMAP 21 class WXDLLIMPEXP_FWD_CORE wxFontMapper; 22#endif // wxUSE_FONTMAP 23class WXDLLIMPEXP_FWD_BASE wxLog; 24class WXDLLIMPEXP_FWD_BASE wxMessageOutput; 25class WXDLLIMPEXP_FWD_CORE wxRendererNative; 26class WXDLLIMPEXP_FWD_BASE wxString; 27 28class GSocketGUIFunctionsTable; 29 30 31// ---------------------------------------------------------------------------- 32// wxAppTraits: this class defines various configurable aspects of wxApp 33// ---------------------------------------------------------------------------- 34 35class WXDLLIMPEXP_FWD_BASE wxStandardPathsBase; 36 37class WXDLLIMPEXP_BASE wxAppTraitsBase 38{ 39public: 40 // needed since this class declares virtual members 41 virtual ~wxAppTraitsBase() { } 42 43 // hooks for creating the global objects, may be overridden by the user 44 // ------------------------------------------------------------------------ 45 46#if wxUSE_LOG 47 // create the default log target 48 virtual wxLog *CreateLogTarget() = 0; 49#endif // wxUSE_LOG 50 51 // create the global object used for printing out messages 52 virtual wxMessageOutput *CreateMessageOutput() = 0; 53 54#if wxUSE_FONTMAP 55 // create the global font mapper object used for encodings/charset mapping 56 virtual wxFontMapper *CreateFontMapper() = 0; 57#endif // wxUSE_FONTMAP 58 59 // get the renderer to use for drawing the generic controls (return value 60 // may be NULL in which case the default renderer for the current platform 61 // is used); this is used in GUI only and always returns NULL in console 62 // 63 // NB: returned pointer will be deleted by the caller 64 virtual wxRendererNative *CreateRenderer() = 0; 65 66#if wxUSE_STDPATHS 67 // wxStandardPaths object is normally the same for wxBase and wxGUI 68 // except in the case of wxMac and wxCocoa 69 virtual wxStandardPathsBase& GetStandardPaths(); 70#endif // wxUSE_STDPATHS 71 72 // functions abstracting differences between GUI and console modes 73 // ------------------------------------------------------------------------ 74 75#ifdef __WXDEBUG__ 76 // show the assert dialog with the specified message in GUI or just print 77 // the string to stderr in console mode 78 // 79 // base class version has an implementation (in spite of being pure 80 // virtual) in base/appbase.cpp which can be called as last resort. 81 // 82 // return true to suppress subsequent asserts, false to continue as before 83 virtual bool ShowAssertDialog(const wxString& msg) = 0; 84#endif // __WXDEBUG__ 85 86 // return true if fprintf(stderr) goes somewhere, false otherwise 87 virtual bool HasStderr() = 0; 88 89 // managing "pending delete" list: in GUI mode we can't immediately delete 90 // some objects because there may be unprocessed events for them and so we 91 // only do it during the next idle loop iteration while this is, of course, 92 // unnecessary in wxBase, so we have a few functions to abstract these 93 // operations 94 95 // add the object to the pending delete list in GUI, delete it immediately 96 // in wxBase 97 virtual void ScheduleForDestroy(wxObject *object) = 0; 98 99 // remove this object from the pending delete list in GUI, do nothing in 100 // wxBase 101 virtual void RemoveFromPendingDelete(wxObject *object) = 0; 102 103#if wxUSE_SOCKETS 104 // return table of GUI callbacks for GSocket code or NULL in wxBase. This 105 // is needed because networking classes are in their own library and so 106 // they can't directly call GUI functions (the same net library can be 107 // used in both GUI and base apps). To complicate it further, GUI library 108 // ("wxCore") doesn't depend on networking library and so only a functions 109 // table can be passed around 110 virtual GSocketGUIFunctionsTable* GetSocketGUIFunctionsTable() = 0; 111#endif 112 113 // return information about the (native) toolkit currently used and its 114 // runtime (not compile-time) version. 115 // returns wxPORT_BASE for console applications and one of the remaining 116 // wxPORT_* values for GUI applications. 117 virtual wxPortId GetToolkitVersion(int *majVer, int *minVer) const = 0; 118 119 // return true if the port is using wxUniversal for the GUI, false if not 120 virtual bool IsUsingUniversalWidgets() const = 0; 121 122 // return the name of the Desktop Environment such as 123 // "KDE" or "GNOME". May return an empty string. 124 virtual wxString GetDesktopEnvironment() const { return wxEmptyString; } 125 126protected: 127#if wxUSE_STACKWALKER && defined( __WXDEBUG__ ) 128 // utility function: returns the stack frame as a plain wxString 129 virtual wxString GetAssertStackTrace(); 130#endif 131}; 132 133// ---------------------------------------------------------------------------- 134// include the platform-specific version of the class 135// ---------------------------------------------------------------------------- 136 137// NB: test for __UNIX__ before __WXMAC__ as under Darwin we want to use the 138// Unix code (and otherwise __UNIX__ wouldn't be defined) 139// ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port 140#if defined(__WXPALMOS__) 141 #include "wx/palmos/apptbase.h" 142#elif defined(__WIN32__) 143 #include "wx/msw/apptbase.h" 144#elif defined(__UNIX__) && !defined(__EMX__) 145 #include "wx/unix/apptbase.h" 146#elif defined(__WXMAC__) 147 #include "wx/mac/apptbase.h" 148#elif defined(__OS2__) 149 #include "wx/os2/apptbase.h" 150#else // no platform-specific methods to add to wxAppTraits 151 // wxAppTraits must be a class because it was forward declared as class 152 class WXDLLIMPEXP_BASE wxAppTraits : public wxAppTraitsBase 153 { 154 }; 155#endif // platform 156 157// ============================================================================ 158// standard traits for console and GUI applications 159// ============================================================================ 160 161// ---------------------------------------------------------------------------- 162// wxConsoleAppTraitsBase: wxAppTraits implementation for the console apps 163// ---------------------------------------------------------------------------- 164 165class WXDLLIMPEXP_BASE wxConsoleAppTraitsBase : public wxAppTraits 166{ 167public: 168#if wxUSE_LOG 169 virtual wxLog *CreateLogTarget(); 170#endif // wxUSE_LOG 171 virtual wxMessageOutput *CreateMessageOutput(); 172#if wxUSE_FONTMAP 173 virtual wxFontMapper *CreateFontMapper(); 174#endif // wxUSE_FONTMAP 175 virtual wxRendererNative *CreateRenderer(); 176#if wxUSE_SOCKETS 177 virtual GSocketGUIFunctionsTable* GetSocketGUIFunctionsTable(); 178#endif 179 180#ifdef __WXDEBUG__ 181 virtual bool ShowAssertDialog(const wxString& msg); 182#endif // __WXDEBUG__ 183 virtual bool HasStderr(); 184 185 virtual void ScheduleForDestroy(wxObject *object); 186 virtual void RemoveFromPendingDelete(wxObject *object); 187 188 // the GetToolkitVersion for console application is always the same 189 virtual wxPortId GetToolkitVersion(int *verMaj, int *verMin) const 190 { 191 // no toolkits (wxBase is for console applications without GUI support) 192 // NB: zero means "no toolkit", -1 means "not initialized yet" 193 // so we must use zero here! 194 if (verMaj) *verMaj = 0; 195 if (verMin) *verMin = 0; 196 return wxPORT_BASE; 197 } 198 199 virtual bool IsUsingUniversalWidgets() const { return false; } 200}; 201 202// ---------------------------------------------------------------------------- 203// wxGUIAppTraitsBase: wxAppTraits implementation for the GUI apps 204// ---------------------------------------------------------------------------- 205 206#if wxUSE_GUI 207 208class WXDLLEXPORT wxGUIAppTraitsBase : public wxAppTraits 209{ 210public: 211#if wxUSE_LOG 212 virtual wxLog *CreateLogTarget(); 213#endif // wxUSE_LOG 214 virtual wxMessageOutput *CreateMessageOutput(); 215#if wxUSE_FONTMAP 216 virtual wxFontMapper *CreateFontMapper(); 217#endif // wxUSE_FONTMAP 218 virtual wxRendererNative *CreateRenderer(); 219#if wxUSE_SOCKETS 220 virtual GSocketGUIFunctionsTable* GetSocketGUIFunctionsTable(); 221#endif 222 223#ifdef __WXDEBUG__ 224 virtual bool ShowAssertDialog(const wxString& msg); 225#endif // __WXDEBUG__ 226 virtual bool HasStderr(); 227 228 virtual void ScheduleForDestroy(wxObject *object); 229 virtual void RemoveFromPendingDelete(wxObject *object); 230 231 virtual bool IsUsingUniversalWidgets() const 232 { 233 #ifdef __WXUNIVERSAL__ 234 return true; 235 #else 236 return false; 237 #endif 238 } 239}; 240 241#endif // wxUSE_GUI 242 243// ---------------------------------------------------------------------------- 244// include the platform-specific version of the classes above 245// ---------------------------------------------------------------------------- 246 247// ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port 248#if defined(__WXPALMOS__) 249 #include "wx/palmos/apptrait.h" 250#elif defined(__WIN32__) 251 #include "wx/msw/apptrait.h" 252#elif defined(__OS2__) 253 #include "wx/os2/apptrait.h" 254#elif defined(__UNIX__) 255 #include "wx/unix/apptrait.h" 256#elif defined(__WXMAC__) 257 #include "wx/mac/apptrait.h" 258#elif defined(__DOS__) 259 #include "wx/msdos/apptrait.h" 260#else 261 #if wxUSE_GUI 262 class wxGUIAppTraits : public wxGUIAppTraitsBase 263 { 264 }; 265 #endif // wxUSE_GUI 266 class wxConsoleAppTraits: public wxConsoleAppTraitsBase 267 { 268 }; 269#endif // platform 270 271#endif // _WX_APPTRAIT_H_ 272 273