#include "wx/button.h"
#endif // WX_PRECOMP
+#if wxUSE_LOGGUI || wxUSE_LOGWINDOW
+
#include "wx/file.h"
#include "wx/textfile.h"
#include "wx/statline.h"
#include "wx/msw/private.h"
#endif // Windows
-// may be defined to 0 for old behavior (using wxMessageBox) - shouldn't be
-// changed normally (that's why it's here and not in setup.h)
-#define wxUSE_LOG_DIALOG 1
-
#if wxUSE_LOG_DIALOG
- #include "wx/datetime.h"
#include "wx/listctrl.h"
#include "wx/imaglist.h"
#include "wx/image.h"
-#else // !wxUSE_TEXTFILE
+#else // !wxUSE_LOG_DIALOG
#include "wx/msgdlg.h"
#endif // wxUSE_LOG_DIALOG/!wxUSE_LOG_DIALOG
#if wxUSE_LOG_DIALOG
+// this function is a wrapper around strftime(3)
+// allows to exclude the usage of wxDateTime
+static wxString TimeStamp(const wxChar *format, time_t t)
+{
+ wxChar buf[4096];
+ if ( !wxStrftime(buf, WXSIZEOF(buf), format, localtime(&t)) )
+ {
+ // buffer is too small?
+ wxFAIL_MSG(_T("strftime() failed"));
+ }
+ return wxString(buf);
+}
+
+
class wxLogDialog : public wxDialog
{
public:
// private functions
// ----------------------------------------------------------------------------
-#if wxUSE_FILE
+#if wxUSE_FILE && wxUSE_FILEDLG
// pass an uninitialized file object, the function will ask the user for the
// filename and try to open it, returns TRUE on success (file was opened),
// ----------------------------------------------------------------------------
// we use a global variable to store the frame pointer for wxLogStatus - bad,
-// but it's he easiest way
-static wxFrame *gs_pFrame; // FIXME MT-unsafe
+// but it's the easiest way
+static wxFrame *gs_pFrame = NULL; // FIXME MT-unsafe
// ============================================================================
// implementation
}
}
-// ----------------------------------------------------------------------------
-// wxLogTextCtrl implementation
-// ----------------------------------------------------------------------------
-
-wxLogTextCtrl::wxLogTextCtrl(wxTextCtrl *pTextCtrl)
-{
- m_pTextCtrl = pTextCtrl;
-}
-
-void wxLogTextCtrl::DoLogString(const wxChar *szString, time_t WXUNUSED(t))
-{
- wxString msg;
- TimeStamp(&msg);
-#ifdef __WXMAC__
- msg << szString << wxT('\r');
-#else
- msg << szString << wxT('\n');
-#endif
-
- m_pTextCtrl->AppendText(msg);
-}
-
// ----------------------------------------------------------------------------
// wxLogGui implementation (FIXME MT-unsafe)
// ----------------------------------------------------------------------------
titleFormat = _("%s Information");
style = wxICON_INFORMATION;
}
-
+
wxString title;
title.Printf(titleFormat, appName.c_str());
else // more than one message
{
#if wxUSE_LOG_DIALOG
+
wxLogDialog dlg(parent,
m_aMessages, m_aSeverity, m_aTimes,
title, style);
case wxLOG_Debug:
#ifdef __WXDEBUG__
{
- #ifdef __WXMSW__
+ #if defined(__WXMSW__) && !defined(__WXMICROWIN__)
// don't prepend debug/trace here: it goes to the
// debug window anyhow, but do put a timestamp
wxString str;
TimeStamp(&str);
- str << szString << wxT("\n\r");
+ str << szString << wxT("\r\n");
OutputDebugString(str);
#else
// send them to stderr
wxHSCROLL |
wxTE_READONLY);
+#if wxUSE_MENUS
// create menu
wxMenuBar *pMenuBar = new wxMenuBar;
wxMenu *pMenu = new wxMenu;
pMenu->Append(Menu_Close, _("&Close"), _("Close this window"));
pMenuBar->Append(pMenu, _("&Log"));
SetMenuBar(pMenuBar);
+#endif // wxUSE_MENUS
#if wxUSE_STATUSBAR
// status bar for menu prompts
#if wxUSE_FILE
void wxLogFrame::OnSave(wxCommandEvent& WXUNUSED(event))
{
+#if wxUSE_FILEDLG
wxString filename;
wxFile file;
int rc = OpenLogFile(file, &filename);
else {
wxLogStatus(this, _("Log saved to the file '%s'."), filename.c_str());
}
+#endif
}
#endif // wxUSE_FILE
// wxLogWindow
// -----------
+
wxLogWindow::wxLogWindow(wxFrame *pParent,
const wxChar *szTitle,
bool bShow,
bool bDoPass)
{
- m_bPassMessages = bDoPass;
+ PassMessages(bDoPass);
m_pLogFrame = new wxLogFrame(pParent, this, szTitle);
- m_pOldLog = wxLog::SetActiveTarget(this);
if ( bShow )
m_pLogFrame->Show(TRUE);
m_pLogFrame->Show(bShow);
}
-void wxLogWindow::Flush()
-{
- if ( m_pOldLog != NULL )
- m_pOldLog->Flush();
-
- m_bHasMessages = FALSE;
-}
-
void wxLogWindow::DoLog(wxLogLevel level, const wxChar *szString, time_t t)
{
// first let the previous logger show it
- if ( m_pOldLog != NULL && m_bPassMessages ) {
- // bogus cast just to access protected DoLog
- ((wxLogWindow *)m_pOldLog)->DoLog(level, szString, t);
- }
+ wxLogPassThrough::DoLog(level, szString, t);
if ( m_pLogFrame ) {
switch ( level ) {
wxLogWindow::~wxLogWindow()
{
- delete m_pOldLog;
-
// may be NULL if log frame already auto destroyed itself
delete m_pLogFrame;
}
m_listctrl->InsertItem(n, m_messages[n]);
m_listctrl->SetItem(n, 1,
- wxDateTime((time_t)m_times[n]).Format(fmt));
+ TimeStamp(fmt, (time_t)m_times[n]));
}
// let the columns size themselves
void wxLogDialog::OnSave(wxCommandEvent& WXUNUSED(event))
{
+#if wxUSE_FILEDLG
wxFile file;
int rc = OpenLogFile(file);
if ( rc == -1 )
for ( size_t n = 0; ok && (n < count); n++ )
{
wxString line;
- line << wxDateTime((time_t)m_times[n]).Format(fmt)
+ line << TimeStamp(fmt, (time_t)m_times[n])
<< _T(": ")
<< m_messages[n]
<< wxTextFile::GetEOL();
if ( !ok )
wxLogError(_("Can't save log contents to file."));
+#endif
}
#endif // wxUSE_FILE
#endif // wxUSE_LOG_DIALOG
-#if wxUSE_FILE
+#if wxUSE_FILE && wxUSE_FILEDLG
// pass an uninitialized file object, the function will ask the user for the
// filename and try to open it, returns TRUE on success (file was opened),
#endif // wxUSE_FILE
+#endif // !(wxUSE_LOGGUI || wxUSE_LOGWINDOW)
+
+#if wxUSE_TEXTCTRL
+
+// ----------------------------------------------------------------------------
+// wxLogTextCtrl implementation
+// ----------------------------------------------------------------------------
+
+wxLogTextCtrl::wxLogTextCtrl(wxTextCtrl *pTextCtrl)
+{
+ m_pTextCtrl = pTextCtrl;
+}
+
+void wxLogTextCtrl::DoLogString(const wxChar *szString, time_t WXUNUSED(t))
+{
+ wxString msg;
+ TimeStamp(&msg);
+
+#ifdef __WXMAC__
+ // VZ: this is a bug in wxMac, it *must* accept '\n' as new line, the
+ // translation must be done in wxTextCtrl, not here! (FIXME)
+ msg << szString << wxT('\r');
+#else
+ msg << szString << wxT('\n');
+#endif
+
+ m_pTextCtrl->AppendText(msg);
+}
+
+#endif // wxUSE_TEXTCTRL
+