some minor changes in wxLogWindow

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@478 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1998-08-08 21:38:22 +00:00
parent b593568eca
commit fe7b115601
2 changed files with 109 additions and 40 deletions

View File

@@ -16,8 +16,6 @@
#pragma interface "log.h" #pragma interface "log.h"
#endif #endif
#include "wx/intl.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// constants // constants
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -122,6 +120,10 @@ protected:
// you override DoLog() you might not need it at all // you override DoLog() you might not need it at all
virtual void DoLogString(const char *szString); virtual void DoLogString(const char *szString);
// helpers
// put the time stamp in the current format into the string
wxString TimeStamp() const;
private: private:
// static variables // static variables
// ---------------- // ----------------
@@ -211,7 +213,7 @@ public:
// window operations // window operations
// show/hide the log window // show/hide the log window
void Show(bool bShow = TRUE); void Show(bool bShow = TRUE);
// get the frame pointer (you shouldn't close it!) // retrieve the pointer to the frame
wxFrame *GetFrame() const; wxFrame *GetFrame() const;
// accessors // accessors
@@ -225,6 +227,17 @@ public:
// processing take place) // processing take place)
void PassMessages(bool bDoPass) { m_bPassMessages = bDoPass; } void PassMessages(bool bDoPass) { m_bPassMessages = bDoPass; }
// base class virtuals
// we don't need it ourselves, but we pass it to the previous logger
virtual void Flush();
// overridables
// called immediately after the log frame creation allowing for
// any extra initializations
virtual void OnFrameCreate(wxFrame *frame);
// called right before the log frame is going to be deleted
virtual void OnFrameDelete(wxFrame *frame);
protected: protected:
virtual void DoLog(wxLogLevel level, const char *szString); virtual void DoLog(wxLogLevel level, const char *szString);
virtual void DoLogString(const char *szString); virtual void DoLogString(const char *szString);

View File

@@ -249,11 +249,10 @@ wxLog *wxLog::SetActiveTarget(wxLog *pLogger)
return pOldLogger; return pOldLogger;
} }
void wxLog::DoLog(wxLogLevel level, const char *szString) wxString wxLog::TimeStamp() const
{ {
wxString str; wxString str;
// prepend a timestamp if not disabled
if ( !IsEmpty(m_szTimeFormat) ) { if ( !IsEmpty(m_szTimeFormat) ) {
char szBuf[128]; char szBuf[128];
time_t timeNow; time_t timeNow;
@@ -266,6 +265,14 @@ void wxLog::DoLog(wxLogLevel level, const char *szString)
str = szBuf; str = szBuf;
} }
return str;
}
void wxLog::DoLog(wxLogLevel level, const char *szString)
{
// prepend a timestamp if not disabled
wxString str = TimeStamp();
switch ( level ) { switch ( level ) {
case wxLOG_FatalError: case wxLOG_FatalError:
DoLogString(str << _("Fatal error: ") << szString); DoLogString(str << _("Fatal error: ") << szString);
@@ -295,11 +302,6 @@ void wxLog::DoLog(wxLogLevel level, const char *szString)
case wxLOG_Trace: case wxLOG_Trace:
case wxLOG_Debug: case wxLOG_Debug:
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
#ifdef __WIN32__
// in addition to normal logging, also send the string to debugger
// (don't prepend "Debug" here: it will go to debug window anyhow)
::OutputDebugString(str + szString + "\n\r");
#endif //Win32
DoLogString(str << (level == wxLOG_Trace ? _("Trace") : _("Debug")) DoLogString(str << (level == wxLOG_Trace ? _("Trace") : _("Debug"))
<< ": " << szString); << ": " << szString);
#endif #endif
@@ -453,15 +455,22 @@ void wxLogGui::DoLog(wxLogLevel level, const char *szString)
case wxLOG_Trace: case wxLOG_Trace:
case wxLOG_Debug: case wxLOG_Debug:
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
{
wxString strTime = TimeStamp();
#ifdef __WIN32__ #ifdef __WIN32__
OutputDebugString(szString); // don't prepend debug/trace here: it goes to the debug window
OutputDebugString("\n\r"); // anyhow, but do put a timestamp
OutputDebugString(strTime + szString + "\n\r");
#else //!WIN32 #else //!WIN32
// send them to stderr // send them to stderr
fprintf(stderr, "%s: %s\n", fprintf(stderr, "%s %s: %s\n",
level == wxLOG_Trace ? _("Trace") : _("Debug"), szString); strTime.c_str(),
level == wxLOG_Trace ? _("Trace") : _("Debug"),
szString);
fflush(stderr); fflush(stderr);
#endif // WIN32 #endif // WIN32
}
#endif #endif
break; break;
@@ -488,15 +497,17 @@ void wxLogGui::DoLog(wxLogLevel level, const char *szString)
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxLogWindow implementation // wxLogWindow and wxLogFrame implementation
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// log frame class // log frame class
// ---------------
class wxLogFrame : public wxFrame class wxLogFrame : public wxFrame
{ {
public: public:
// ctor // ctor & dtor
wxLogFrame(const char *szTitle); wxLogFrame(wxLogWindow *log, const char *szTitle);
virtual ~wxLogFrame();
// menu callbacks // menu callbacks
void OnClose(wxCommandEvent& event); void OnClose(wxCommandEvent& event);
@@ -504,6 +515,8 @@ public:
void OnSave (wxCommandEvent& event); void OnSave (wxCommandEvent& event);
void OnClear(wxCommandEvent& event); void OnClear(wxCommandEvent& event);
void OnIdle(wxIdleEvent&);
// accessors // accessors
wxTextCtrl *TextCtrl() const { return m_pTextCtrl; } wxTextCtrl *TextCtrl() const { return m_pTextCtrl; }
@@ -515,7 +528,11 @@ private:
Menu_Clear Menu_Clear
}; };
// instead of closing just hide the window to be able to Show() it later
void DoClose() { Show(FALSE); }
wxTextCtrl *m_pTextCtrl; wxTextCtrl *m_pTextCtrl;
wxLogWindow *m_log;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
@@ -527,17 +544,17 @@ BEGIN_EVENT_TABLE(wxLogFrame, wxFrame)
EVT_MENU(Menu_Clear, wxLogFrame::OnClear) EVT_MENU(Menu_Clear, wxLogFrame::OnClear)
EVT_CLOSE(wxLogFrame::OnCloseWindow) EVT_CLOSE(wxLogFrame::OnCloseWindow)
EVT_IDLE(wxLogFrame::OnIdle)
END_EVENT_TABLE() END_EVENT_TABLE()
wxLogFrame::wxLogFrame(const char *szTitle) wxLogFrame::wxLogFrame(wxLogWindow *log, const char *szTitle)
: wxFrame(NULL, -1, szTitle) : wxFrame(NULL, -1, szTitle)
{ {
// we don't want to be a top-level frame because it would prevent the m_log = log;
// application termination when all other frames are closed
wxTopLevelWindows.DeleteObject(this);
// @@ kludge: wxSIMPLE_BORDER is simply to prevent wxWindows from creating // @@ kludge: wxSIMPLE_BORDER is simply to prevent wxWindows from creating
// a rich edit control instead of a normal one we want // a rich edit control instead of a normal one we want in wxMSW
m_pTextCtrl = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition, m_pTextCtrl = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition,
wxDefaultSize, wxDefaultSize,
wxSIMPLE_BORDER | wxSIMPLE_BORDER |
@@ -552,26 +569,35 @@ wxLogFrame::wxLogFrame(const char *szTitle)
// create menu // create menu
wxMenuBar *pMenuBar = new wxMenuBar; wxMenuBar *pMenuBar = new wxMenuBar;
wxMenu *pMenu = new wxMenu; wxMenu *pMenu = new wxMenu;
pMenu->Append(Menu_Save, _("&Save...")); pMenu->Append(Menu_Save, _("&Save..."), _("Save log contents to file"));
pMenu->Append(Menu_Clear, _("C&lear")); pMenu->Append(Menu_Clear, _("C&lear"), _("Clear the log contents"));
pMenu->AppendSeparator(); pMenu->AppendSeparator();
pMenu->Append(Menu_Close, _("&Close")); pMenu->Append(Menu_Close, _("&Close"), _("Close this window"));
pMenuBar->Append(pMenu, _("&Log")); pMenuBar->Append(pMenu, _("&Log"));
SetMenuBar(pMenuBar); SetMenuBar(pMenuBar);
// @@ what about status bar? needed (for menu prompts)? // status bar for menu prompts
CreateStatusBar();
m_log->OnFrameCreate(this);
} }
void wxLogFrame::OnClose(wxCommandEvent& WXUNUSED(event)) void wxLogFrame::OnClose(wxCommandEvent& WXUNUSED(event))
{ {
// just hide the window DoClose();
Show(FALSE);
} }
void wxLogFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) void wxLogFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
{ {
// just hide the window DoClose();
Show(FALSE); }
void wxLogFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
{
// if we're the last frame to stay, delete log frame letting the
// application to close
if ( wxTopLevelWindows.Number() == 1 )
Destroy();
} }
void wxLogFrame::OnSave(wxCommandEvent& WXUNUSED(event)) void wxLogFrame::OnSave(wxCommandEvent& WXUNUSED(event))
@@ -646,11 +672,18 @@ void wxLogFrame::OnClear(wxCommandEvent& WXUNUSED(event))
m_pTextCtrl->Clear(); m_pTextCtrl->Clear();
} }
wxLogFrame::~wxLogFrame()
{
m_log->OnFrameDelete(this);
}
// wxLogWindow
// -----------
wxLogWindow::wxLogWindow(const char *szTitle, bool bShow, bool bDoPass) wxLogWindow::wxLogWindow(const char *szTitle, bool bShow, bool bDoPass)
{ {
m_bPassMessages = bDoPass; m_bPassMessages = bDoPass;
m_pLogFrame = new wxLogFrame(szTitle); m_pLogFrame = new wxLogFrame(this, szTitle);
m_pOldLog = wxLog::SetActiveTarget(this); m_pOldLog = wxLog::SetActiveTarget(this);
if ( bShow ) if ( bShow )
@@ -662,9 +695,12 @@ void wxLogWindow::Show(bool bShow)
m_pLogFrame->Show(bShow); m_pLogFrame->Show(bShow);
} }
wxFrame *wxLogWindow::GetFrame() const void wxLogWindow::Flush()
{ {
return m_pLogFrame; if ( m_pOldLog != NULL )
m_pOldLog->Flush();
m_bHasMessages = FALSE;
} }
void wxLogWindow::DoLog(wxLogLevel level, const char *szString) void wxLogWindow::DoLog(wxLogLevel level, const char *szString)
@@ -680,6 +716,8 @@ void wxLogWindow::DoLog(wxLogLevel level, const char *szString)
// and this will format it nicely and call our DoLogString() // and this will format it nicely and call our DoLogString()
wxLog::DoLog(level, szString); wxLog::DoLog(level, szString);
m_bHasMessages = TRUE;
} }
void wxLogWindow::DoLogString(const char *szString) void wxLogWindow::DoLogString(const char *szString)
@@ -700,9 +738,27 @@ void wxLogWindow::DoLogString(const char *szString)
// @@@ TODO // @@@ TODO
} }
wxFrame *wxLogWindow::GetFrame() const
{
return m_pLogFrame;
}
void wxLogWindow::OnFrameCreate(wxFrame *frame)
{
}
void wxLogWindow::OnFrameDelete(wxFrame *frame)
{
m_pLogFrame = NULL;
}
wxLogWindow::~wxLogWindow() wxLogWindow::~wxLogWindow()
{ {
m_pLogFrame->Close(TRUE); // may be NULL if log frame already auto destroyed itself
delete m_pLogFrame;
// delete the old log
delete m_pOldLog;
} }
#endif //WX_TEST_MINIMAL #endif //WX_TEST_MINIMAL