X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6f9eb452395e4ef48fe70c7ad77a4d570d7cd271..cc345f789777f7a06ea5e549f6df338925378c07:/src/common/log.cpp diff --git a/src/common/log.cpp b/src/common/log.cpp index 0a3e9bdd92..b29f583649 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -29,21 +29,26 @@ // wxWindows #ifndef WX_PRECOMP - #include - #include - #include - #include - #include - #include - #include - #include - #include + #include "wx/window.h" +#ifdef __WXMSW__ + #include "wx/msw/private.h" +#endif + #include "wx/event.h" + #include "wx/app.h" + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/menu.h" + #include "wx/frame.h" + #include "wx/msgdlg.h" + #include "wx/filedlg.h" + #include "wx/textctrl.h" #endif //WX_PRECOMP -#include -#include -#include -#include +#include "wx/file.h" +#include "wx/textfile.h" +#include "wx/utils.h" +#include "wx/wxchar.h" +#include "wx/log.h" // other standard headers #include @@ -311,6 +316,20 @@ void wxLog::RemoveTraceMask(const wxString& str) ms_aTraceMasks.Remove((size_t)index); } +void wxLog::TimeStamp(wxString *str) +{ + if ( ms_timestamp ) + { + wxChar buf[256]; + time_t timeNow; + (void)time(&timeNow); + wxStrftime(buf, WXSIZEOF(buf), ms_timestamp, localtime(&timeNow)); + + str->Empty(); + *str << buf << _T(": "); + } +} + void wxLog::DoLog(wxLogLevel level, const wxChar *szString, time_t t) { switch ( level ) { @@ -349,7 +368,7 @@ void wxLog::DoLog(wxLogLevel level, const wxChar *szString, time_t t) } } -void wxLog::DoLogString(const wxChar *WXUNUSED(szString), time_t t) +void wxLog::DoLogString(const wxChar *WXUNUSED(szString), time_t WXUNUSED(t)) { wxFAIL_MSG(_T("DoLogString must be overriden if it's called.")); } @@ -371,10 +390,11 @@ wxLogStderr::wxLogStderr(FILE *fp) m_fp = fp; } -void wxLogStderr::DoLogString(const wxChar *szString, time_t t) +void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) { - wxString str(szString); - str << _T('\n'); + wxString str; + TimeStamp(&str); + str << szString << _T('\n'); fputs(str.mb_str(), m_fp); fflush(m_fp); @@ -399,9 +419,9 @@ wxLogStream::wxLogStream(ostream *ostr) m_ostr = ostr; } -void wxLogStream::DoLogString(const wxChar *szString, time_t t) +void wxLogStream::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) { - (*m_ostr) << szString << endl << flush; + (*m_ostr) << wxConvCurrent->cWX2MB(szString) << endl << flush; } #endif // wxUSE_STD_IOSTREAM @@ -411,19 +431,19 @@ void wxLogStream::DoLogString(const wxChar *szString, time_t t) // wxLogTextCtrl implementation // ---------------------------------------------------------------------------- -#if wxUSE_STD_IOSTREAM wxLogTextCtrl::wxLogTextCtrl(wxTextCtrl *pTextCtrl) -#if !defined(NO_TEXT_WINDOW_STREAM) -: wxLogStream(new ostream(pTextCtrl)) -#endif { + m_pTextCtrl = pTextCtrl; } -wxLogTextCtrl::~wxLogTextCtrl() +void wxLogTextCtrl::DoLogString(const wxChar *szString, time_t t) { - delete m_ostr; + wxString msg; + TimeStamp(&msg); + msg << szString << _T('\n'); + + m_pTextCtrl->AppendText(msg); } -#endif // wxUSE_STD_IOSTREAM // ---------------------------------------------------------------------------- // wxLogGui implementation (FIXME MT-unsafe) @@ -505,6 +525,7 @@ void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t) break; case wxLOG_Status: +#if wxUSE_STATUSBAR { // find the top window and set it's status text if it has any wxFrame *pFrame = gs_pFrame; @@ -518,6 +539,7 @@ void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t) if ( pFrame != NULL ) pFrame->SetStatusText(szString); } +#endif // wxUSE_STATUSBAR break; case wxLOG_Trace: @@ -527,12 +549,16 @@ void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t) #ifdef __WXMSW__ // don't prepend debug/trace here: it goes to the // debug window anyhow, but do put a timestamp - OutputDebugString(wxString(szString) + _T("\n\r")); + wxString str; + TimeStamp(&str); + str << szString << _T("\n\r"); + OutputDebugString(str); #else // send them to stderr wxFprintf(stderr, _T("%s: %s\n"), - level == wxLOG_Trace ? _T("Trace") : _T("Debug"), - szString); + level == wxLOG_Trace ? _T("Trace") + : _T("Debug"), + szString); fflush(stderr); #endif } @@ -551,7 +577,6 @@ void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t) if ( !m_bErrors ) { m_aMessages.Empty(); m_aTimes.Empty(); - m_bHasMessages = TRUE; m_bErrors = TRUE; } // fall through @@ -564,6 +589,7 @@ void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t) m_aMessages.Add(szString); m_aTimes.Add((long)t); + m_bHasMessages = TRUE; break; } } @@ -584,7 +610,9 @@ public: // menu callbacks void OnClose(wxCommandEvent& event); void OnCloseWindow(wxCloseEvent& event); +#if wxUSE_FILE void OnSave (wxCommandEvent& event); +#endif // wxUSE_FILE void OnClear(wxCommandEvent& event); void OnIdle(wxIdleEvent&); @@ -612,7 +640,9 @@ private: BEGIN_EVENT_TABLE(wxLogFrame, wxFrame) // wxLogWindow menu events EVT_MENU(Menu_Close, wxLogFrame::OnClose) +#if wxUSE_FILE EVT_MENU(Menu_Save, wxLogFrame::OnSave) +#endif // wxUSE_FILE EVT_MENU(Menu_Clear, wxLogFrame::OnClear) EVT_CLOSE(wxLogFrame::OnCloseWindow) @@ -632,15 +662,19 @@ wxLogFrame::wxLogFrame(wxFrame *pParent, wxLogWindow *log, const wxChar *szTitle // create menu wxMenuBar *pMenuBar = new wxMenuBar; wxMenu *pMenu = new wxMenu; +#if wxUSE_FILE pMenu->Append(Menu_Save, _("&Save..."), _("Save log contents to file")); +#endif // wxUSE_FILE pMenu->Append(Menu_Clear, _("C&lear"), _("Clear the log contents")); pMenu->AppendSeparator(); pMenu->Append(Menu_Close, _("&Close"), _("Close this window")); pMenuBar->Append(pMenu, _("&Log")); SetMenuBar(pMenuBar); +#if wxUSE_STATUSBAR // status bar for menu prompts CreateStatusBar(); +#endif // wxUSE_STATUSBAR m_log->OnFrameCreate(this); } @@ -655,6 +689,7 @@ void wxLogFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) DoClose(); } +#if wxUSE_FILE void wxLogFrame::OnSave(wxCommandEvent& WXUNUSED(event)) { // get the file name @@ -725,6 +760,7 @@ void wxLogFrame::OnSave(wxCommandEvent& WXUNUSED(event)) wxLogStatus(this, _("Log saved to the file '%s'."), szFileName); } } +#endif // wxUSE_FILE void wxLogFrame::OnClear(wxCommandEvent& WXUNUSED(event)) { @@ -739,9 +775,9 @@ wxLogFrame::~wxLogFrame() // wxLogWindow // ----------- wxLogWindow::wxLogWindow(wxFrame *pParent, - const wxChar *szTitle, - bool bShow, - bool bDoPass) + const wxChar *szTitle, + bool bShow, + bool bDoPass) { m_bPassMessages = bDoPass; @@ -805,7 +841,7 @@ void wxLogWindow::DoLog(wxLogLevel level, const wxChar *szString, time_t t) m_bHasMessages = TRUE; } -void wxLogWindow::DoLogString(const wxChar *szString, time_t t) +void wxLogWindow::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) { // put the text into our window wxTextCtrl *pText = m_pLogFrame->TextCtrl(); @@ -816,8 +852,11 @@ void wxLogWindow::DoLogString(const wxChar *szString, time_t t) pText->SetSelection(nLen, nLen); #endif // Windows - pText->WriteText(szString); - pText->WriteText(_T("\n")); // "\n" ok here (_not_ "\r\n") + wxString msg; + TimeStamp(&msg); + msg << szString << _T('\n'); + + pText->AppendText(msg); // TODO ensure that the line can be seen } @@ -857,6 +896,9 @@ wxLogWindow::~wxLogWindow() wxLog *wxLog::ms_pLogger = (wxLog *)NULL; bool wxLog::ms_doLog = TRUE; bool wxLog::ms_bAutoCreate = TRUE; + +const wxChar *wxLog::ms_timestamp = _T("%X"); // time only, no date + wxTraceMask wxLog::ms_ulTraceMask = (wxTraceMask)0; wxArrayString wxLog::ms_aTraceMasks; @@ -956,7 +998,7 @@ const wxChar *wxSysErrorMsg(unsigned long nErrCode) #else // Unix #if wxUSE_UNICODE static wxChar s_szBuf[LOG_BUFFER_SIZE / 2]; - wxConv_libc.MB2WC(s_szBuf, strerror(nErrCode), WXSIZEOF(s_szBuf) -1); + wxConvCurrent->MB2WC(s_szBuf, strerror(nErrCode), WXSIZEOF(s_szBuf) -1); return s_szBuf; #else return strerror(nErrCode);