// Author: Vadim Zeitlin
// Modified by:
// Created: 20.09.99 (extracted from src/common/log.cpp)
-// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/image.h"
#endif // wxUSE_LOG_DIALOG/!wxUSE_LOG_DIALOG
-#if defined(__MWERKS__) && wxUSE_UNICODE
- #include <wtime.h>
-#endif
-
-#include "wx/datetime.h"
+#include "wx/time.h"
// the suffix we add to the button to show that the dialog can be expanded
-#define EXPAND_SUFFIX _T(" >>")
+#define EXPAND_SUFFIX wxT(" >>")
#define CAN_SAVE_FILES (wxUSE_FILE && wxUSE_FILEDLG)
// allows to exclude the usage of wxDateTime
static wxString TimeStamp(const wxString& format, time_t t)
{
-#if wxUSE_DATETIME
wxChar buf[4096];
struct tm tm;
if ( !wxStrftime(buf, WXSIZEOF(buf), format, wxLocaltime_r(&t, &tm)) )
{
// buffer is too small?
- wxFAIL_MSG(_T("strftime() failed"));
+ wxFAIL_MSG(wxT("strftime() failed"));
}
return wxString(buf);
-#else // !wxUSE_DATETIME
- return wxEmptyString;
-#endif // wxUSE_DATETIME/!wxUSE_DATETIME
}
wxFrame *pFrame = NULL;
// check if the frame was passed to us explicitly
- wxUIntPtr ptr = NULL;
+ wxUIntPtr ptr = 0;
if ( info.GetNumValue(wxLOG_KEY_FRAME, &ptr) )
{
pFrame = static_cast<wxFrame *>(wxUIntToPtr(ptr));
// find the top window and set it's status text if it has any
if ( pFrame == NULL ) {
wxWindow *pWin = wxTheApp->GetTopWindow();
- if ( pWin != NULL && pWin->IsKindOf(CLASSINFO(wxFrame)) ) {
+ if ( wxDynamicCast(pWin, wxFrame) ) {
pFrame = (wxFrame *)pWin;
}
}
m_bHasMessages = true;
break;
- default:
- // let the base class deal with debug/trace messages as well as any
- // custom levels
+ case wxLOG_Debug:
+ case wxLOG_Trace:
+ // let the base class deal with debug/trace messages
wxLog::DoLogRecord(level, msg, info);
+ break;
+
+ case wxLOG_FatalError:
+ case wxLOG_Max:
+ // fatal errors are shown immediately and terminate the program so
+ // we should never see them here
+ wxFAIL_MSG("unexpected log level");
+ break;
+
+ case wxLOG_Progress:
+ case wxLOG_User:
+ // just ignore those: passing them to the base class would result
+ // in asserts from DoLogText() because DoLogTextAtLevel() would
+ // call it as it doesn't know how to handle these levels otherwise
+ break;
}
}
wxLogFrame(wxWindow *pParent, wxLogWindow *log, const wxString& szTitle);
virtual ~wxLogFrame();
+ // Don't prevent the application from exiting if just this frame remains.
+ virtual bool ShouldPreventAppExit() const { return false; }
+
// menu callbacks
void OnClose(wxCommandEvent& event);
void OnCloseWindow(wxCloseEvent& event);
wxMenuBar *pMenuBar = new wxMenuBar;
wxMenu *pMenu = new wxMenu;
#if CAN_SAVE_FILES
- pMenu->Append(Menu_Save, _("&Save..."), _("Save log contents to file"));
+ pMenu->Append(Menu_Save, _("Save &As..."), _("Save log contents to file"));
#endif // CAN_SAVE_FILES
pMenu->Append(Menu_Clear, _("C&lear"), _("Clear the log contents"));
pMenu->AppendSeparator();
// status bar for menu prompts
CreateStatusBar();
#endif // wxUSE_STATUSBAR
-
- m_log->OnFrameCreate(this);
}
void wxLogFrame::DoClose()
bool bShow,
bool bDoPass)
{
+ // Initialize it to NULL to ensure that we don't crash if any log messages
+ // are generated before the frame is fully created (while this doesn't
+ // happen normally, it might, in principle).
+ m_pLogFrame = NULL;
+
PassMessages(bDoPass);
m_pLogFrame = new wxLogFrame(pParent, this, szTitle);
void wxLogWindow::DoLogTextAtLevel(wxLogLevel level, const wxString& msg)
{
- // first let the previous logger show it
- wxLogPassThrough::DoLogTextAtLevel(level, msg);
-
if ( !m_pLogFrame )
return;
return m_pLogFrame;
}
-void wxLogWindow::OnFrameCreate(wxFrame * WXUNUSED(frame))
-{
-}
-
bool wxLogWindow::OnFrameClose(wxFrame * WXUNUSED(frame))
{
// allow to close
bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA);
// create the controls which are always shown and layout them: we use
- // sizers even though our window is not resizeable to calculate the size of
+ // sizers even though our window is not resizable to calculate the size of
// the dialog properly
wxBoxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *sizerAll = new wxBoxSizer(isPda ? wxVERTICAL : wxHORIZONTAL);
// add the details pane
#ifndef __SMARTPHONE__
+
+#if wxUSE_COLLPANE
wxCollapsiblePane * const
collpane = new wxCollapsiblePane(this, wxID_ANY, ms_details);
sizerTop->Add(collpane, wxSizerFlags(1).Expand().Border());
wxWindow *win = collpane->GetPane();
+#else
+ wxPanel* win = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
+ wxBORDER_NONE);
+#endif
wxSizer * const paneSz = new wxBoxSizer(wxVERTICAL);
CreateDetailsControls(win);
btnSizer->Add(new wxButton(win, wxID_SAVE), flagsBtn);
#endif // CAN_SAVE_FILES
- paneSz->Add(btnSizer, wxSizerFlags().Right().Border(wxTOP));
+ paneSz->Add(btnSizer, wxSizerFlags().Right().Border(wxTOP|wxBOTTOM));
#endif // wxUSE_CLIPBOARD || CAN_SAVE_FILES
win->SetSizer(paneSz);
// create the list ctrl now
m_listctrl = new wxListCtrl(parent, wxID_ANY,
wxDefaultPosition, wxDefaultSize,
- wxSUNKEN_BORDER |
+ wxBORDER_SIMPLE |
wxLC_REPORT |
wxLC_NO_HEADER |
wxLC_SINGLE_SEL);
// no need to translate these strings as they're not shown to the
// user anyhow (we use wxLC_NO_HEADER style)
- m_listctrl->InsertColumn(0, _T("Message"));
+ m_listctrl->InsertColumn(0, wxT("Message"));
if (hasTimeStamp)
- m_listctrl->InsertColumn(1, _T("Time"));
+ m_listctrl->InsertColumn(1, wxT("Time"));
// prepare the imagelist
static const int ICON_SIZE = 16;
wxImageList *imageList = new wxImageList(ICON_SIZE, ICON_SIZE);
// order should be the same as in the switch below!
- static const wxChar* icons[] =
+ static const char* const icons[] =
{
wxART_ERROR,
wxART_WARNING,
// This may very well fail if there are insufficient colours available.
// Degrade gracefully.
- if ( !bmp.Ok() )
+ if ( !bmp.IsOk() )
{
loadedIcons = false;