+// ----------------------------------------------------------------------------
+// wxLogDialog
+// ----------------------------------------------------------------------------
+
+#if wxUSE_LOG_DIALOG
+
+static const size_t MARGIN = 10;
+
+wxLogDialog::wxLogDialog(wxWindow *parent,
+ const wxArrayString& messages,
+ const wxArrayInt& severity,
+ const wxArrayLong& times,
+ const wxString& caption,
+ long style)
+ : wxDialog(parent, -1, caption )
+{
+ size_t count = messages.GetCount();
+ m_messages.Alloc(count);
+ m_severity.Alloc(count);
+ m_times.Alloc(count);
+
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxString msg = messages[n];
+ do
+ {
+ m_messages.Add(msg.BeforeFirst(_T('\n')));
+ msg = msg.AfterFirst(_T('\n'));
+
+ m_severity.Add(severity[n]);
+ m_times.Add(times[n]);
+ }
+ while ( !!msg );
+ }
+
+ m_showingDetails = FALSE; // not initially
+ m_listctrl = (wxListCtrl *)NULL;
+
+ // 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
+ // the dialog properly
+ wxBoxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
+ wxBoxSizer *sizerButtons = new wxBoxSizer(wxVERTICAL);
+ wxBoxSizer *sizerAll = new wxBoxSizer(wxHORIZONTAL);
+
+ wxButton *btnOk = new wxButton(this, wxID_OK, _T("OK"));
+ sizerButtons->Add(btnOk, 0, wxCENTRE|wxBOTTOM, MARGIN/2);
+ m_btnDetails = new wxButton(this, wxID_MORE, _T("&Details >>"));
+ sizerButtons->Add(m_btnDetails, 0, wxCENTRE|wxTOP, MARGIN/2 - 1);
+
+ wxIcon icon = wxTheApp->GetStdIcon((int)(style & wxICON_MASK));
+ sizerAll->Add(new wxStaticBitmap(this, -1, icon), 0, wxCENTRE);
+ const wxString& message = messages.Last();
+ sizerAll->Add(CreateTextSizer(message), 0, wxCENTRE|wxLEFT|wxRIGHT, MARGIN);
+ sizerAll->Add(sizerButtons, 0, wxALIGN_RIGHT|wxLEFT, MARGIN);
+
+ sizerTop->Add(sizerAll, 0, wxCENTRE|wxALL, MARGIN);
+
+ SetAutoLayout(TRUE);
+ SetSizer(sizerTop);
+
+ sizerTop->SetSizeHints(this);
+ sizerTop->Fit(this);
+
+ btnOk->SetFocus();
+
+ // this can't happen any more as we don't use this dialog in this case
+#if 0
+ if ( count == 1 )
+ {
+ // no details... it's easier to disable a button than to change the
+ // dialog layout depending on whether we have details or not
+ m_btnDetails->Disable();
+ }
+#endif // 0
+
+ Centre();
+}
+
+void wxLogDialog::OnListSelect(wxListEvent& event)
+{
+ // we can't just disable the control because this looks ugly under Windows
+ // (wrong bg colour, no scrolling...), but we still want to disable
+ // selecting items - it makes no sense here
+ m_listctrl->SetItemState(event.GetIndex(), 0, wxLIST_STATE_SELECTED);
+}
+
+void wxLogDialog::OnOk(wxCommandEvent& WXUNUSED(event))
+{
+ EndModal(wxID_OK);
+}
+
+void wxLogDialog::OnDetails(wxCommandEvent& WXUNUSED(event))
+{
+ wxSizer *sizer = GetSizer();
+
+ if ( m_showingDetails )
+ {
+ m_btnDetails->SetLabel(_T("&Details >>"));
+
+ sizer->Remove(m_listctrl);
+ }
+ else // show details now
+ {
+ m_btnDetails->SetLabel(_T("<< &Details"));
+
+ if ( !m_listctrl )
+ {
+ // create it now
+ m_listctrl = new wxListCtrl(this, -1,
+ wxDefaultPosition, wxDefaultSize,
+ wxSUNKEN_BORDER |
+ wxLC_REPORT |
+ wxLC_NO_HEADER |
+ wxLC_SINGLE_SEL);
+ m_listctrl->InsertColumn(0, _("Message"));
+ m_listctrl->InsertColumn(1, _("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 int icons[] =
+ {
+ wxICON_ERROR,
+ wxICON_EXCLAMATION,
+ wxICON_INFORMATION
+ };
+
+ for ( size_t icon = 0; icon < WXSIZEOF(icons); icon++ )
+ {
+ wxBitmap bmp = wxTheApp->GetStdIcon(icons[icon]);
+ imageList->Add(wxImage(bmp).
+ Rescale(ICON_SIZE, ICON_SIZE).
+ ConvertToBitmap());
+ }
+
+ m_listctrl->SetImageList(imageList, wxIMAGE_LIST_SMALL);
+
+ // and fill it
+ wxString fmt = wxLog::GetTimestamp();
+ if ( !fmt )
+ {
+ // default format
+ fmt = _T("%X");
+ }
+
+ size_t count = m_messages.GetCount();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ int image;
+ switch ( m_severity[n] )
+ {
+ case wxLOG_Error:
+ image = 0;
+ break;
+
+ case wxLOG_Warning:
+ image = 1;
+ break;
+
+ default:
+ image = 2;
+ }
+
+ m_listctrl->InsertItem(n, m_messages[n], image);
+ m_listctrl->SetItem(n, 1,
+ wxDateTime((time_t)m_times[n]).Format(fmt));
+ }
+
+ // let the columns size themselves
+ m_listctrl->SetColumnWidth(0, wxLIST_AUTOSIZE);
+ m_listctrl->SetColumnWidth(1, wxLIST_AUTOSIZE);
+
+ // get the approx height of the listctrl
+ wxFont font = GetFont();
+ if ( !font.Ok() )
+ font = *wxSWISS_FONT;
+
+ int y;
+ GetTextExtent(_T("H"), (int*)NULL, &y, (int*)NULL, (int*)NULL, &font);
+ int height = wxMin(y*(count + 3), 100);
+ m_listctrl->SetSize(-1, height);
+ }
+
+ sizer->Add(m_listctrl, 1, wxEXPAND|(wxALL & ~wxTOP), MARGIN);
+ }
+
+ m_showingDetails = !m_showingDetails;
+
+ // in any case, our size changed - update
+ sizer->SetSizeHints(this);
+ sizer->Fit(this);
+}
+
+wxLogDialog::~wxLogDialog()
+{
+ if ( m_listctrl )
+ {
+ delete m_listctrl->GetImageList(wxIMAGE_LIST_SMALL);
+ }
+}
+
+#endif // wxUSE_LOG_DIALOG