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 
18 class WXDLLIMPEXP_FWD_BASE wxObject;
19 class WXDLLIMPEXP_FWD_BASE wxAppTraits;
20 #if wxUSE_FONTMAP
21     class WXDLLIMPEXP_FWD_CORE wxFontMapper;
22 #endif // wxUSE_FONTMAP
23 class WXDLLIMPEXP_FWD_BASE wxLog;
24 class WXDLLIMPEXP_FWD_BASE wxMessageOutput;
25 class WXDLLIMPEXP_FWD_CORE wxRendererNative;
26 class WXDLLIMPEXP_FWD_BASE wxString;
27 
28 class GSocketGUIFunctionsTable;
29 
30 
31 // ----------------------------------------------------------------------------
32 // wxAppTraits: this class defines various configurable aspects of wxApp
33 // ----------------------------------------------------------------------------
34 
35 class WXDLLIMPEXP_FWD_BASE wxStandardPathsBase;
36 
37 class WXDLLIMPEXP_BASE wxAppTraitsBase
38 {
39 public:
40     // needed since this class declares virtual members
~wxAppTraitsBase()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.
GetDesktopEnvironment()124     virtual wxString GetDesktopEnvironment() const { return wxEmptyString; }
125 
126 protected:
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 
165 class WXDLLIMPEXP_BASE wxConsoleAppTraitsBase : public wxAppTraits
166 {
167 public:
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
GetToolkitVersion(int * verMaj,int * verMin)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 
IsUsingUniversalWidgets()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 
208 class WXDLLEXPORT wxGUIAppTraitsBase : public wxAppTraits
209 {
210 public:
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 
IsUsingUniversalWidgets()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