]> git.saurik.com Git - wxWidgets.git/blob - wxPython/src/_log.i
fix wxMac-QD - blank focusesed text; minor reformat
[wxWidgets.git] / wxPython / src / _log.i
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: _log.i
3 // Purpose: SWIG interface stuff for wxLog
4 //
5 // Author: Robin Dunn
6 //
7 // Created: 18-June-1999
8 // RCS-ID: $Id$
9 // Copyright: (c) 2003 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
12
13 // Not a %module
14
15
16 //---------------------------------------------------------------------------
17 %newgroup
18
19
20 typedef unsigned long wxTraceMask;
21 typedef unsigned long wxLogLevel;
22
23
24 enum
25 {
26 wxLOG_FatalError, // program can't continue, abort immediately
27 wxLOG_Error, // a serious error, user must be informed about it
28 wxLOG_Warning, // user is normally informed about it but may be ignored
29 wxLOG_Message, // normal message (i.e. normal output of a non GUI app)
30 wxLOG_Status, // informational: might go to the status line of GUI app
31 wxLOG_Info, // informational message (a.k.a. 'Verbose')
32 wxLOG_Debug, // never shown to the user, disabled in release mode
33 wxLOG_Trace, // trace messages are also only enabled in debug mode
34 wxLOG_Progress, // used for progress indicator (not yet)
35 wxLOG_User = 100, // user defined levels start here
36 wxLOG_Max = 10000
37 };
38
39 #define wxTRACE_MemAlloc "memalloc" // trace memory allocation (new/delete)
40 #define wxTRACE_Messages "messages" // trace window messages/X callbacks
41 #define wxTRACE_ResAlloc "resalloc" // trace GDI resource allocation
42 #define wxTRACE_RefCount "refcount" // trace various ref counting operations
43 #define wxTRACE_OleCalls "ole" // OLE interface calls
44
45 #define wxTraceMemAlloc 0x0001 // trace memory allocation (new/delete)
46 #define wxTraceMessages 0x0002 // trace window messages/X callbacks
47 #define wxTraceResAlloc 0x0004 // trace GDI resource allocation
48 #define wxTraceRefCount 0x0008 // trace various ref counting operations
49 #define wxTraceOleCalls 0x0100 // OLE interface calls
50
51 //---------------------------------------------------------------------------
52
53 class wxLog
54 {
55 public:
56 wxLog();
57
58
59 // these functions allow to completely disable all log messages
60 // is logging disabled now?
61 static bool IsEnabled();
62
63 // change the flag state, return the previous one
64 static bool EnableLogging(bool doIt = true);
65
66 // static sink function
67 static void OnLog(wxLogLevel level, const wxChar *szString, time_t t);
68
69 // message buffering
70 // flush shows all messages if they're not logged immediately (FILE
71 // and iostream logs don't need it, but wxGuiLog does to avoid showing
72 // 17 modal dialogs one after another)
73 virtual void Flush();
74
75 // flush the active target if any
76 static void FlushActive();
77
78 // only one sink is active at each moment
79 // get current log target, will call wxApp::CreateLogTarget() to
80 // create one if none exists
81 static wxLog *GetActiveTarget();
82
83 // change log target, pLogger may be NULL
84 static wxLog *SetActiveTarget(wxLog *pLogger);
85
86 // suspend the message flushing of the main target until the next call
87 // to Resume() - this is mainly for internal use (to prevent wxYield()
88 // from flashing the messages)
89 static void Suspend();
90
91 // must be called for each Suspend()!
92 static void Resume();
93
94
95 // verbose mode is activated by standard command-line '-verbose'
96 // option
97 static void SetVerbose(bool bVerbose = true);
98
99 // Set log level. Log messages with level > logLevel will not be logged.
100 static void SetLogLevel(wxLogLevel logLevel);
101
102 // should GetActiveTarget() try to create a new log object if the
103 // current is NULL?
104 static void DontCreateOnDemand();
105
106 // trace mask (see wxTraceXXX constants for details)
107 static void SetTraceMask(wxTraceMask ulMask);
108
109 // add string trace mask
110 static void AddTraceMask(const wxString& str);
111
112 // remove string trace mask
113 static void RemoveTraceMask(const wxString& str);
114
115 // remove all string trace masks
116 static void ClearTraceMasks();
117
118 // get string trace masks
119 static const wxArrayString &GetTraceMasks();
120
121 // sets the timestamp string: this is used as strftime() format string
122 // for the log targets which add time stamps to the messages - set it
123 // to NULL to disable time stamping completely.
124 static void SetTimestamp(const wxChar *ts);
125
126
127 // gets the verbose status
128 static bool GetVerbose();
129
130 // get trace mask
131 static wxTraceMask GetTraceMask();
132
133 // is this trace mask in the list?
134 static bool IsAllowedTraceMask(const wxChar *mask);
135
136 // return the current loglevel limit
137 static wxLogLevel GetLogLevel();
138
139
140 // get the current timestamp format string (may be NULL)
141 static const wxChar *GetTimestamp();
142
143
144 %extend {
145 static wxString TimeStamp() {
146 wxString msg;
147 wxLog::TimeStamp(&msg);
148 return msg;
149 }
150 }
151
152 %extend { void Destroy() { delete self; } }
153 };
154
155
156 //---------------------------------------------------------------------------
157
158
159 class wxLogStderr : public wxLog
160 {
161 public:
162 wxLogStderr(/* TODO: FILE *fp = (FILE *) NULL*/);
163 };
164
165
166 class wxLogTextCtrl : public wxLog
167 {
168 public:
169 wxLogTextCtrl(wxTextCtrl *pTextCtrl);
170 };
171
172
173 class wxLogGui : public wxLog
174 {
175 public:
176 wxLogGui();
177 };
178
179 class wxLogWindow : public wxLog
180 {
181 public:
182 wxLogWindow(wxFrame *pParent, // the parent frame (can be NULL)
183 const wxString& szTitle, // the title of the frame
184 bool bShow = true, // show window immediately?
185 bool bPassToOld = true); // pass log messages to the old target?
186
187 void Show(bool bShow = true);
188 wxFrame *GetFrame() const;
189 wxLog *GetOldLog() const;
190 bool IsPassingMessages() const;
191 void PassMessages(bool bDoPass);
192 };
193
194
195 class wxLogChain : public wxLog
196 {
197 public:
198 wxLogChain(wxLog *logger);
199 void SetLog(wxLog *logger);
200 void PassMessages(bool bDoPass);
201 bool IsPassingMessages();
202 wxLog *GetOldLog();
203 };
204
205 // log everything to a buffer
206 class wxLogBuffer : public wxLog
207 {
208 public:
209 wxLogBuffer();
210
211 // get the string contents with all messages logged
212 const wxString& GetBuffer() const { return m_str; }
213
214 // show the buffer contents to the user in the best possible way (this uses
215 // wxMessageOutputMessageBox) and clear it
216 virtual void Flush();
217 };
218
219
220 //---------------------------------------------------------------------------
221
222 unsigned long wxSysErrorCode();
223 const wxString wxSysErrorMsg(unsigned long nErrCode = 0);
224
225 %{// Make somce wrappers that double any % signs so they are 'escaped'
226 void wxPyLogFatalError(const wxString& msg)
227 {
228 wxString m(msg);
229 m.Replace(wxT("%"), wxT("%%"));
230 wxLogFatalError(m);
231 }
232
233 void wxPyLogError(const wxString& msg)
234 {
235 wxString m(msg);
236 m.Replace(wxT("%"), wxT("%%"));
237 wxLogError(m);
238 }
239
240 void wxPyLogWarning(const wxString& msg)
241 {
242 wxString m(msg);
243 m.Replace(wxT("%"), wxT("%%"));
244 wxLogWarning(m);
245 }
246
247 void wxPyLogMessage(const wxString& msg)
248 {
249 wxString m(msg);
250 m.Replace(wxT("%"), wxT("%%"));
251 wxLogMessage(m);
252 }
253
254 void wxPyLogInfo(const wxString& msg)
255 {
256 wxString m(msg);
257 m.Replace(wxT("%"), wxT("%%"));
258 wxLogInfo(m);
259 }
260
261 void wxPyLogDebug(const wxString& msg)
262 {
263 wxString m(msg);
264 m.Replace(wxT("%"), wxT("%%"));
265 wxLogDebug(m);
266 }
267
268 void wxPyLogVerbose(const wxString& msg)
269 {
270 wxString m(msg);
271 m.Replace(wxT("%"), wxT("%%"));
272 wxLogVerbose(m);
273 }
274
275 void wxPyLogStatus(const wxString& msg)
276 {
277 wxString m(msg);
278 m.Replace(wxT("%"), wxT("%%"));
279 wxLogStatus(m);
280 }
281
282 void wxPyLogStatusFrame(wxFrame *pFrame, const wxString& msg)
283 {
284 wxString m(msg);
285 m.Replace(wxT("%"), wxT("%%"));
286 wxLogStatus(pFrame, m);
287 }
288
289 void wxPyLogSysError(const wxString& msg)
290 {
291 wxString m(msg);
292 m.Replace(wxT("%"), wxT("%%"));
293 wxLogSysError(m);
294 }
295
296 void wxPyLogGeneric(unsigned long level, const wxString& msg)
297 {
298 wxString m(msg);
299 m.Replace(wxT("%"), wxT("%%"));
300 wxLogGeneric(level, m);
301 }
302
303 void wxPyLogTrace(unsigned long mask, const wxString& msg)
304 {
305 wxString m(msg);
306 m.Replace(wxT("%"), wxT("%%"));
307 wxLogTrace(mask, m);
308 }
309
310 void wxPyLogTrace(const wxString& mask, const wxString& msg)
311 {
312 wxString m(msg);
313 m.Replace(wxT("%"), wxT("%%"));
314 wxLogTrace(mask, m);
315 }
316
317 %}
318
319 %Rename(LogFatalError, void, wxPyLogFatalError(const wxString& msg));
320 %Rename(LogError, void, wxPyLogError(const wxString& msg));
321 %Rename(LogWarning, void, wxPyLogWarning(const wxString& msg));
322 %Rename(LogMessage, void, wxPyLogMessage(const wxString& msg));
323 %Rename(LogInfo, void, wxPyLogInfo(const wxString& msg));
324 %Rename(LogDebug, void, wxPyLogDebug(const wxString& msg));
325 %Rename(LogVerbose, void, wxPyLogVerbose(const wxString& msg));
326 %Rename(LogStatus, void, wxPyLogStatus(const wxString& msg));
327 %Rename(LogStatusFrame, void, wxPyLogStatusFrame(wxFrame *pFrame, const wxString& msg));
328 %Rename(LogSysError, void, wxPyLogSysError(const wxString& msg));
329
330 %Rename(LogGeneric, void, wxPyLogGeneric(unsigned long level, const wxString& msg));
331
332 %nokwargs wxPyLogTrace;
333 %Rename(LogTrace, void, wxPyLogTrace(unsigned long mask, const wxString& msg));
334 %Rename(LogTrace, void, wxPyLogTrace(const wxString& mask, const wxString& msg));
335
336
337 // wxLogFatalError helper: show the (fatal) error to the user in a safe way,
338 // i.e. without using wxMessageBox() for example because it could crash
339 void wxSafeShowMessage(const wxString& title, const wxString& text);
340
341
342
343 // Suspress logging while an instance of this class exists
344 class wxLogNull
345 {
346 public:
347 wxLogNull();
348 ~wxLogNull();
349 };
350
351
352
353 //---------------------------------------------------------------------------
354
355 %{
356 // A wxLog class that can be derived from in wxPython
357 class wxPyLog : public wxLog {
358 public:
359 wxPyLog() : wxLog() {}
360
361 virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t) {
362 bool found;
363 wxPyBlock_t blocked = wxPyBeginBlockThreads();
364 if ((found = wxPyCBH_findCallback(m_myInst, "DoLog"))) {
365 PyObject* s = wx2PyString(szString);
366 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iOi)", level, s, t));
367 Py_DECREF(s);
368 }
369 wxPyEndBlockThreads(blocked);
370 if (! found)
371 wxLog::DoLog(level, szString, t);
372 }
373
374 virtual void DoLogString(const wxChar *szString, time_t t) {
375 bool found;
376 wxPyBlock_t blocked = wxPyBeginBlockThreads();
377 if ((found = wxPyCBH_findCallback(m_myInst, "DoLogString"))) {
378 PyObject* s = wx2PyString(szString);
379 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(Oi)", s, t));
380 Py_DECREF(s);
381 }
382 wxPyEndBlockThreads(blocked);
383 if (! found)
384 wxLog::DoLogString(szString, t);
385 }
386
387 PYPRIVATE;
388 };
389 %}
390
391 // Now tell SWIG about it
392 class wxPyLog : public wxLog {
393 public:
394 %pythonAppend wxPyLog "self._setCallbackInfo(self, PyLog)"
395
396 wxPyLog();
397
398 void _setCallbackInfo(PyObject* self, PyObject* _class);
399 };
400
401 //---------------------------------------------------------------------------