From 470b7da353545369db1a4ecdbc673a496d9980c8 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 14 Aug 1998 21:49:27 +0000 Subject: [PATCH] wxLogWindoe changed again: now takes a parent frame in ctor git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@537 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/log.h | 23 ++++++++++++---- src/common/log.cpp | 68 ++++++++++++++++++++++++++++++---------------- 2 files changed, 62 insertions(+), 29 deletions(-) diff --git a/include/wx/log.h b/include/wx/log.h index 22acfb9e51..50918b2c02 100644 --- a/include/wx/log.h +++ b/include/wx/log.h @@ -49,6 +49,14 @@ enum typedef unsigned long wxTraceMask; typedef unsigned long wxLogLevel; +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- +class wxTextCtrl; +class wxLogFrame; +class wxFrame; +class ostream; + // ---------------------------------------------------------------------------- // derive from this class to redirect (or suppress, or ...) log messages // normally, only a single instance of this class exists but it's not enforced @@ -166,7 +174,6 @@ protected: }; // log everything to a text window (GUI only of course) -class wxTextCtrl; class WXDLLEXPORT wxLogTextCtrl : public wxLogStream { public: @@ -200,12 +207,11 @@ protected: // to the log window. This window has it's own menu which allows the user to // close it, clear the log contents or save it to the file. // ---------------------------------------------------------------------------- -class wxLogFrame; -class wxFrame; class WXDLLEXPORT wxLogWindow : public wxLog { public: - wxLogWindow(const char *szTitle, // the title of the frame + wxLogWindow(wxFrame *pParent, // the parent frame (can be NULL) + const char *szTitle, // the title of the frame bool bShow = TRUE, // show window immediately? bool bPassToOld = TRUE); // pass log messages to the old target? ~wxLogWindow(); @@ -302,9 +308,16 @@ DECLARE_LOG_FUNCTION(Error); DECLARE_LOG_FUNCTION(Warning); DECLARE_LOG_FUNCTION(Message); DECLARE_LOG_FUNCTION(Info); -DECLARE_LOG_FUNCTION(Status); DECLARE_LOG_FUNCTION(Verbose); +// this function sends the log message to the status line of the top level +// application frame, if any +DECLARE_LOG_FUNCTION(Status); + +// this one is the same as previous except that it allows to explicitly +// specify the frame to which the output should go +DECLARE_LOG_FUNCTION2(Status, wxFrame *pFrame); + // additional one: as wxLogError, but also logs last system call error code // and the corresponding error message if available DECLARE_LOG_FUNCTION(SysError); diff --git a/src/common/log.cpp b/src/common/log.cpp index 666c612589..d23a3e1c8f 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -66,6 +66,14 @@ static void wxLogWrap(FILE *f, const char *pszPrefix, const char *psz); #endif +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// we use a global variable to store the frame pointer for wxLogStatus - bad, +// but it's he easiest way +static wxFrame *gs_pFrame; + // ============================================================================ // implementation // ============================================================================ @@ -117,6 +125,24 @@ IMPLEMENT_LOG_FUNCTION(Message) IMPLEMENT_LOG_FUNCTION(Info) IMPLEMENT_LOG_FUNCTION(Status) +// accepts an additional argument which tells to which frame the output should +// be directed +void wxLogStatus(wxFrame *pFrame, const char *szFormat, ...) +{ + wxLog *pLog = wxLog::GetActiveTarget(); + if ( pLog != NULL ) { + va_list argptr; + va_start(argptr, szFormat); + vsprintf(s_szBuf, szFormat, argptr); + va_end(argptr); + + wxASSERT( gs_pFrame == NULL ); // should be reset! + gs_pFrame = pFrame; + wxLog::OnLog(wxLOG_Status, s_szBuf); + gs_pFrame = NULL; + } +} + // same as info, but only if 'verbose' mode is on void wxLogVerbose(const char *szFormat, ...) { @@ -444,11 +470,16 @@ void wxLogGui::DoLog(wxLogLevel level, const char *szString) case wxLOG_Status: { // find the top window and set it's status text if it has any - wxWindow *pWin = wxTheApp->GetTopWindow(); - if ( pWin != NULL && pWin->IsKindOf(CLASSINFO(wxFrame)) ) { - wxFrame *pFrame = (wxFrame *)pWin; - pFrame->SetStatusText(szString); + wxFrame *pFrame = gs_pFrame; + if ( pFrame == NULL ) { + wxWindow *pWin = wxTheApp->GetTopWindow(); + if ( pWin != NULL && pWin->IsKindOf(CLASSINFO(wxFrame)) ) { + pFrame = (wxFrame *)pWin; + } } + + if ( pFrame != NULL ) + pFrame->SetStatusText(szString); } break; @@ -506,7 +537,7 @@ class wxLogFrame : public wxFrame { public: // ctor & dtor - wxLogFrame(wxLogWindow *log, const char *szTitle); + wxLogFrame(wxFrame *pParent, wxLogWindow *log, const char *szTitle); virtual ~wxLogFrame(); // menu callbacks @@ -544,12 +575,10 @@ BEGIN_EVENT_TABLE(wxLogFrame, wxFrame) EVT_MENU(Menu_Clear, wxLogFrame::OnClear) EVT_CLOSE(wxLogFrame::OnCloseWindow) - - EVT_IDLE(wxLogFrame::OnIdle) END_EVENT_TABLE() -wxLogFrame::wxLogFrame(wxLogWindow *log, const char *szTitle) - : wxFrame(NULL, -1, szTitle) +wxLogFrame::wxLogFrame(wxFrame *pParent, wxLogWindow *log, const char *szTitle) + : wxFrame(pParent, -1, szTitle) { m_log = log; @@ -557,14 +586,10 @@ wxLogFrame::wxLogFrame(wxLogWindow *log, const char *szTitle) // a rich edit control instead of a normal one we want in wxMSW m_pTextCtrl = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, - wxSIMPLE_BORDER | + //wxSIMPLE_BORDER | wxTE_MULTILINE | wxHSCROLL | wxTE_READONLY); - /* - m_pTextCtrl->SetEditable(FALSE); - m_pTextCtrl->SetRichEdit(FALSE); - */ // create menu wxMenuBar *pMenuBar = new wxMenuBar; @@ -592,14 +617,6 @@ void wxLogFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) DoClose(); } -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)) { // get the file name @@ -679,11 +696,14 @@ wxLogFrame::~wxLogFrame() // wxLogWindow // ----------- -wxLogWindow::wxLogWindow(const char *szTitle, bool bShow, bool bDoPass) +wxLogWindow::wxLogWindow(wxFrame *pParent, + const char *szTitle, + bool bShow, + bool bDoPass) { m_bPassMessages = bDoPass; - m_pLogFrame = new wxLogFrame(this, szTitle); + m_pLogFrame = new wxLogFrame(pParent, this, szTitle); m_pOldLog = wxLog::SetActiveTarget(this); if ( bShow ) -- 2.45.2