1 /////////////////////////////////////////////////////////////////////////////
 
   3 // Purpose:     SWIG interface stuff for wxLog
 
   7 // Created:     18-June-1999
 
   9 // Copyright:   (c) 2003 by Total Control Software
 
  10 // Licence:     wxWindows license
 
  11 /////////////////////////////////////////////////////////////////////////////
 
  16 //---------------------------------------------------------------------------
 
  20 typedef unsigned long wxTraceMask;
 
  21 typedef unsigned long wxLogLevel;
 
  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
 
  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
 
  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
 
  51 //---------------------------------------------------------------------------
 
  59     // these functions allow to completely disable all log messages
 
  60     // is logging disabled now?
 
  61     static bool IsEnabled();
 
  63     // change the flag state, return the previous one
 
  64     static bool EnableLogging(bool doIt = true);
 
  66     // static sink function
 
  67     static void OnLog(wxLogLevel level, const wxChar *szString, time_t t);    
 
  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)
 
  75     // flush the active target if any
 
  76     static void FlushActive();
 
  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();
 
  83     // change log target, pLogger may be NULL
 
  84     static wxLog *SetActiveTarget(wxLog *pLogger);
 
  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();
 
  91     // must be called for each Suspend()!
 
  95     // verbose mode is activated by standard command-line '-verbose'
 
  97     static void SetVerbose(bool bVerbose = true);
 
  99     // Set log level.  Log messages with level > logLevel will not be logged.
 
 100     static void SetLogLevel(wxLogLevel logLevel);
 
 102     // should GetActiveTarget() try to create a new log object if the
 
 104     static void DontCreateOnDemand();
 
 106     // trace mask (see wxTraceXXX constants for details)
 
 107     static void SetTraceMask(wxTraceMask ulMask);
 
 109     // add string trace mask
 
 110     static void AddTraceMask(const wxString& str);
 
 112     // remove string trace mask
 
 113     static void RemoveTraceMask(const wxString& str);
 
 115     // remove all string trace masks
 
 116     static void ClearTraceMasks();
 
 118     // get string trace masks
 
 119     static const wxArrayString &GetTraceMasks();
 
 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);
 
 127     // gets the verbose status
 
 128     static bool GetVerbose();
 
 131     static wxTraceMask GetTraceMask();
 
 133     // is this trace mask in the list?
 
 134     static bool IsAllowedTraceMask(const wxChar *mask);
 
 136     // return the current loglevel limit
 
 137     static wxLogLevel GetLogLevel();
 
 140     // get the current timestamp format string (may be NULL)
 
 141     static const wxChar *GetTimestamp();
 
 145         static wxString TimeStamp() {
 
 147             wxLog::TimeStamp(&msg);
 
 152     %extend { void Destroy() { delete self; } }
 
 156 //---------------------------------------------------------------------------
 
 159 class wxLogStderr : public wxLog
 
 162     wxLogStderr(/* TODO: FILE *fp = (FILE *) NULL*/);
 
 166 class wxLogTextCtrl : public wxLog
 
 169     wxLogTextCtrl(wxTextCtrl *pTextCtrl);
 
 173 class wxLogGui : public wxLog
 
 179 class wxLogWindow : public wxLog
 
 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?
 
 187     void Show(bool bShow = true);
 
 188     wxFrame *GetFrame() const;
 
 189     wxLog *GetOldLog() const;
 
 190     bool IsPassingMessages() const;
 
 191     void PassMessages(bool bDoPass);
 
 195 class wxLogChain : public wxLog
 
 198     wxLogChain(wxLog *logger);
 
 199     void SetLog(wxLog *logger);
 
 200     void PassMessages(bool bDoPass);
 
 201     bool IsPassingMessages();
 
 206 //---------------------------------------------------------------------------
 
 208 unsigned long wxSysErrorCode();
 
 209 const wxString wxSysErrorMsg(unsigned long nErrCode = 0);
 
 211 %{// Make somce wrappers that double any % signs so they are 'escaped'
 
 212     void wxPyLogFatalError(const wxString& msg)
 
 215         m.Replace(wxT("%"), wxT("%%"));
 
 219     void wxPyLogError(const wxString& msg)
 
 222         m.Replace(wxT("%"), wxT("%%"));
 
 226     void wxPyLogWarning(const wxString& msg)
 
 229         m.Replace(wxT("%"), wxT("%%"));
 
 233     void wxPyLogMessage(const wxString& msg)
 
 236         m.Replace(wxT("%"), wxT("%%"));
 
 240     void wxPyLogInfo(const wxString& msg)
 
 243         m.Replace(wxT("%"), wxT("%%"));
 
 247     void wxPyLogDebug(const wxString& msg)
 
 250         m.Replace(wxT("%"), wxT("%%"));
 
 254     void wxPyLogVerbose(const wxString& msg)
 
 257         m.Replace(wxT("%"), wxT("%%"));
 
 261     void wxPyLogStatus(const wxString& msg)
 
 264         m.Replace(wxT("%"), wxT("%%"));
 
 268     void wxPyLogStatusFrame(wxFrame *pFrame, const wxString& msg)
 
 271         m.Replace(wxT("%"), wxT("%%"));
 
 272         wxLogStatus(pFrame, m);
 
 275     void wxPyLogSysError(const wxString& msg)
 
 278         m.Replace(wxT("%"), wxT("%%"));
 
 282     void wxPyLogGeneric(unsigned long level, const wxString& msg)
 
 285         m.Replace(wxT("%"), wxT("%%"));
 
 286         wxLogGeneric(level, m);
 
 289     void wxPyLogTrace(unsigned long mask, const wxString& msg)
 
 292         m.Replace(wxT("%"), wxT("%%"));
 
 296     void wxPyLogTrace(const wxString& mask, const wxString& msg)
 
 299         m.Replace(wxT("%"), wxT("%%"));
 
 305 %Rename(LogFatalError,  void, wxPyLogFatalError(const wxString& msg));
 
 306 %Rename(LogError,  void, wxPyLogError(const wxString& msg));
 
 307 %Rename(LogWarning,  void, wxPyLogWarning(const wxString& msg));
 
 308 %Rename(LogMessage,  void, wxPyLogMessage(const wxString& msg));
 
 309 %Rename(LogInfo,  void, wxPyLogInfo(const wxString& msg));
 
 310 %Rename(LogDebug,  void, wxPyLogDebug(const wxString& msg));
 
 311 %Rename(LogVerbose,  void, wxPyLogVerbose(const wxString& msg));
 
 312 %Rename(LogStatus,  void, wxPyLogStatus(const wxString& msg));
 
 313 %Rename(LogStatusFrame,  void, wxPyLogStatusFrame(wxFrame *pFrame, const wxString& msg));
 
 314 %Rename(LogSysError,  void, wxPyLogSysError(const wxString& msg));
 
 316 %Rename(LogGeneric,  void, wxPyLogGeneric(unsigned long level, const wxString& msg));
 
 318 %nokwargs wxPyLogTrace;
 
 319 %Rename(LogTrace,  void, wxPyLogTrace(unsigned long mask, const wxString& msg));
 
 320 %Rename(LogTrace,  void, wxPyLogTrace(const wxString& mask, const wxString& msg));
 
 323 // wxLogFatalError helper: show the (fatal) error to the user in a safe way,
 
 324 // i.e. without using wxMessageBox() for example because it could crash
 
 325 void wxSafeShowMessage(const wxString& title, const wxString& text);
 
 329 // Suspress logging while an instance of this class exists
 
 339 //---------------------------------------------------------------------------
 
 342 // A wxLog class that can be derived from in wxPython
 
 343 class wxPyLog : public wxLog {
 
 345     wxPyLog() : wxLog() {}
 
 347     virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t) {
 
 349         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 350         if ((found = wxPyCBH_findCallback(m_myInst, "DoLog"))) {
 
 351             PyObject* s = wx2PyString(szString);
 
 352             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iOi)", level, s, t));
 
 355         wxPyEndBlockThreads(blocked);
 
 357             wxLog::DoLog(level, szString, t);
 
 360     virtual void DoLogString(const wxChar *szString, time_t t) {
 
 362         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 363         if ((found = wxPyCBH_findCallback(m_myInst, "DoLogString"))) {
 
 364             PyObject* s = wx2PyString(szString);
 
 365             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(Oi)", s, t));
 
 368         wxPyEndBlockThreads(blocked);
 
 370             wxLog::DoLogString(szString, t);
 
 377 // Now tell SWIG about it
 
 378 class wxPyLog : public wxLog {
 
 380     %pythonAppend wxPyLog   "self._setCallbackInfo(self, PyLog)"
 
 384     void _setCallbackInfo(PyObject* self, PyObject* _class);
 
 387 //---------------------------------------------------------------------------