X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/470b7da353545369db1a4ecdbc673a496d9980c8..3b1de9c2eeedf27401d897a609baf15d8ff5914e:/src/common/log.cpp?ds=sidebyside diff --git a/src/common/log.cpp b/src/common/log.cpp index d23a3e1c8f..db45214b9e 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -33,6 +33,7 @@ #include #include #include + #include #include #include @@ -51,6 +52,8 @@ #ifdef __WXMSW__ #include + // Redefines OutputDebugString if necessary + #include "wx/msw/private.h" #else //Unix #include #endif //Win/Unix @@ -139,7 +142,7 @@ void wxLogStatus(wxFrame *pFrame, const char *szFormat, ...) wxASSERT( gs_pFrame == NULL ); // should be reset! gs_pFrame = pFrame; wxLog::OnLog(wxLOG_Status, s_szBuf); - gs_pFrame = NULL; + gs_pFrame = (wxFrame *) NULL; } } @@ -249,14 +252,18 @@ wxLog *wxLog::GetActiveTarget() if ( !s_bInGetActiveTarget ) { s_bInGetActiveTarget = TRUE; - #ifdef WX_TEST_MINIMAL + #ifdef wxUSE_NOGUI ms_pLogger = new wxLogStderr; #else // ask the application to create a log target for us if ( wxTheApp != NULL ) ms_pLogger = wxTheApp->CreateLogTarget(); + else + ms_pLogger = new wxLogStderr; #endif + s_bInGetActiveTarget = FALSE; + // do nothing if it fails - what can we do? } } @@ -266,12 +273,15 @@ wxLog *wxLog::GetActiveTarget() wxLog *wxLog::SetActiveTarget(wxLog *pLogger) { - // flush the old messages before changing - if ( ms_pLogger != NULL ) + if ( ms_pLogger != NULL ) { + // flush the old messages before changing because otherwise they might + // get lost later if this target is not restored ms_pLogger->Flush(); + } wxLog *pOldLogger = ms_pLogger; ms_pLogger = pLogger; + return pOldLogger; } @@ -279,6 +289,9 @@ wxString wxLog::TimeStamp() const { wxString str; +/* Let's disable TimeStamp and see if anyone complains. + * If not, we'll remove it, since it's probably unlikely + * to ever be used. -- JACS 22/11/98 if ( !IsEmpty(m_szTimeFormat) ) { char szBuf[128]; time_t timeNow; @@ -290,6 +303,7 @@ wxString wxLog::TimeStamp() const strftime(szBuf, WXSIZEOF(szBuf), m_szTimeFormat, ptmNow); str = szBuf; } +*/ return str; } @@ -328,8 +342,11 @@ void wxLog::DoLog(wxLogLevel level, const char *szString) case wxLOG_Trace: case wxLOG_Debug: #ifdef __WXDEBUG__ - DoLogString(str << (level == wxLOG_Trace ? _("Trace") : _("Debug")) - << ": " << szString); + // DoLogString(str << (level == wxLOG_Trace ? _("Trace") : _("Debug")) + // << ": " << szString); + // JACS: we don't really want to prefix with 'Debug'. It's just extra + // verbiage. + DoLogString(szString); #endif break; @@ -385,6 +402,7 @@ void wxLogStream::DoLogString(const char *szString) (*m_ostr) << szString << endl << flush; } +#ifndef wxUSE_NOGUI // ---------------------------------------------------------------------------- // wxLogTextCtrl implementation // ---------------------------------------------------------------------------- @@ -408,8 +426,6 @@ wxLogTextCtrl::~wxLogTextCtrl() // wxLogGui implementation // ---------------------------------------------------------------------------- -#ifndef WX_TEST_MINIMAL - wxLogGui::wxLogGui() { m_bErrors = FALSE; @@ -420,17 +436,20 @@ void wxLogGui::Flush() if ( !m_bHasMessages ) return; + // do it right now to block any new calls to Flush() while we're here + m_bHasMessages = FALSE; + // @@@ ugly... // concatenate all strings (but not too many to not overfill the msg box) wxString str; - uint nLines = 0, + size_t nLines = 0, nMsgCount = m_aMessages.Count(); // start from the most recent message - for ( uint n = nMsgCount; n > 0; n-- ) { + for ( size_t n = nMsgCount; n > 0; n-- ) { // for Windows strings longer than this value are wrapped (NT 4.0) - const uint nMsgLineWidth = 156; + const size_t nMsgLineWidth = 156; nLines += (m_aMessages[n - 1].Len() + nMsgLineWidth - 1) / nMsgLineWidth; @@ -448,7 +467,6 @@ void wxLogGui::Flush() } // no undisplayed messages whatsoever - m_bHasMessages = m_bErrors = FALSE; m_aMessages.Empty(); } @@ -489,18 +507,22 @@ void wxLogGui::DoLog(wxLogLevel level, const char *szString) { wxString strTime = TimeStamp(); - #ifdef __WIN32__ + #ifdef __WXMSW__ // don't prepend debug/trace here: it goes to the debug window // anyhow, but do put a timestamp OutputDebugString(strTime + szString + "\n\r"); - #else //!WIN32 + #else // send them to stderr + /* fprintf(stderr, "%s %s: %s\n", strTime.c_str(), level == wxLOG_Trace ? _("Trace") : _("Debug"), szString); + */ + fprintf(stderr, "%s\n", + szString); fflush(stderr); - #endif // WIN32 + #endif } #endif break; @@ -630,7 +652,7 @@ void wxLogFrame::OnSave(wxCommandEvent& WXUNUSED(event)) // open file // --------- wxFile file; - bool bOk = FALSE; + bool bOk = FALSE; if ( wxFile::Exists(szFileName) ) { bool bAppend = FALSE; wxString strMsg; @@ -665,22 +687,19 @@ void wxLogFrame::OnSave(wxCommandEvent& WXUNUSED(event)) // retrieve text and save it // ------------------------- -#ifdef __WXGTK__ - // @@@@ TODO: no GetNumberOfLines and GetLineText in wxGTK yet - wxLogError(_("Sorry, this function is not implemented under GTK")); -#else int nLines = m_pTextCtrl->GetNumberOfLines(); for ( int nLine = 0; bOk && nLine < nLines; nLine++ ) { bOk = file.Write(m_pTextCtrl->GetLineText(nLine) + wxTextFile::GetEOL()); } -#endif //GTK if ( bOk ) bOk = file.Close(); if ( !bOk ) { wxLogError(_("Can't save log contents to file.")); - return; + } + else { + wxLogStatus(this, _("Log saved to the file '%s'."), szFileName); } } @@ -720,7 +739,7 @@ void wxLogWindow::Flush() if ( m_pOldLog != NULL ) m_pOldLog->Flush(); - m_bHasMessages = FALSE; + m_bHasMessages = FALSE; } void wxLogWindow::DoLog(wxLogLevel level, const char *szString) @@ -734,13 +753,29 @@ void wxLogWindow::DoLog(wxLogLevel level, const char *szString) ((wxLogWindow *)m_pOldLog)->DoLog(level, szString); } - // don't put trace messages in the text window for 2 reasons: - // 1) there are too many of them - // 2) they may provoke other trace messages thus sending a program into an - // infinite loop - if ( m_pLogFrame && level != wxLOG_Trace ) { - // and this will format it nicely and call our DoLogString() - wxLog::DoLog(level, szString); + if ( m_pLogFrame ) { + switch ( level ) { + case wxLOG_Status: + // by default, these messages are ignored by wxLog, so process + // them ourselves + { + wxString str = TimeStamp(); + str << _("Status: ") << szString; + DoLogString(str); + } + break; + + // don't put trace messages in the text window for 2 reasons: + // 1) there are too many of them + // 2) they may provoke other trace messages thus sending a program + // into an infinite loop + case wxLOG_Trace: + break; + + default: + // and this will format it nicely and call our DoLogString() + wxLog::DoLog(level, szString); + } } m_bHasMessages = TRUE; @@ -760,8 +795,7 @@ void wxLogWindow::DoLogString(const char *szString) pText->WriteText(szString); pText->WriteText("\n"); // "\n" ok here (_not_ "\r\n") - // ensure that the line can be seen - // @@@ TODO + // TODO ensure that the line can be seen } wxFrame *wxLogWindow::GetFrame() const @@ -769,22 +803,24 @@ wxFrame *wxLogWindow::GetFrame() const return m_pLogFrame; } -void wxLogWindow::OnFrameCreate(wxFrame *frame) +void wxLogWindow::OnFrameCreate(wxFrame * WXUNUSED(frame)) { } -void wxLogWindow::OnFrameDelete(wxFrame *frame) +void wxLogWindow::OnFrameDelete(wxFrame * WXUNUSED(frame)) { - m_pLogFrame = NULL; + m_pLogFrame = (wxLogFrame *)NULL; } wxLogWindow::~wxLogWindow() { + delete m_pOldLog; + // may be NULL if log frame already auto destroyed itself delete m_pLogFrame; } -#endif //WX_TEST_MINIMAL +#endif //wxUSE_NOGUI // ============================================================================ // Global functions/variables @@ -793,7 +829,8 @@ wxLogWindow::~wxLogWindow() // ---------------------------------------------------------------------------- // static variables // ---------------------------------------------------------------------------- -wxLog *wxLog::ms_pLogger = NULL; +wxLog *wxLog::ms_pLogger = (wxLog *) NULL; +bool wxLog::ms_doLog = TRUE; bool wxLog::ms_bAutoCreate = TRUE; wxTraceMask wxLog::ms_ulTraceMask = (wxTraceMask)0; @@ -905,6 +942,8 @@ void Trap() { #ifdef __WXMSW__ DebugBreak(); + #elif defined(__WXSTUBS__) + // TODO #else // Unix raise(SIGTRAP); #endif // Win/Unix @@ -920,6 +959,8 @@ void wxOnAssert(const char *szFile, int nLine, const char *szMsg) if ( s_bInAssert ) { // He-e-e-e-elp!! we're trapped in endless loop Trap(); + + return; } s_bInAssert = TRUE; @@ -938,22 +979,26 @@ void wxOnAssert(const char *szFile, int nLine, const char *szMsg) // send it to the normal log destination wxLogDebug(szBuf); - strcat(szBuf, _("\nDo you want to stop the program?" - "\nYou can also choose [Cancel] to suppress " - "further warnings.")); + #ifdef wxUSE_NOGUI + Trap(); + #else + strcat(szBuf, _("\nDo you want to stop the program?" + "\nYou can also choose [Cancel] to suppress " + "further warnings.")); - switch ( wxMessageBox(szBuf, _("Debug"), - wxYES_NO | wxCANCEL | wxICON_STOP ) ) { - case wxYES: - Trap(); - break; + switch ( wxMessageBox(szBuf, _("Debug"), + wxYES_NO | wxCANCEL | wxICON_STOP ) ) { + case wxYES: + Trap(); + break; - case wxCANCEL: - s_bNoAsserts = TRUE; - break; + case wxCANCEL: + s_bNoAsserts = TRUE; + break; - //case wxNO: nothing to do - } + //case wxNO: nothing to do + } + #endif // USE_NOGUI } s_bInAssert = FALSE;