// event handlers
void OnOk(wxCommandEvent& event);
void OnDetails(wxCommandEvent& event);
+ void OnListSelect(wxListEvent& event);
private:
// the data for the listctrl
- const wxArrayString& m_messages;
- const wxArrayInt& m_severity;
- const wxArrayLong& m_times;
+ wxArrayString m_messages;
+ wxArrayInt m_severity;
+ wxArrayLong m_times;
// the "toggle" button and its state
wxButton *m_btnDetails;
BEGIN_EVENT_TABLE(wxLogDialog, wxDialog)
EVT_BUTTON(wxID_OK, wxLogDialog::OnOk)
EVT_BUTTON(wxID_MORE, wxLogDialog::OnDetails)
+ EVT_LIST_ITEM_SELECTED(-1, wxLogDialog::OnListSelect)
END_EVENT_TABLE()
#endif // wxUSE_LOG_DIALOG
style = wxICON_INFORMATION;
}
+ // this is the best we can do here
+ wxWindow *parent = wxTheApp->GetTopWindow();
+
+ size_t nMsgCount = m_aMessages.Count();
+
+ wxString str;
+ if ( nMsgCount == 1 )
+ {
+ str = m_aMessages[0];
+ }
+ else // more than one message
+ {
#if wxUSE_LOG_DIALOG
- wxLogDialog dlg(wxTheApp->GetTopWindow(),
- m_aMessages, m_aSeverity, m_aTimes,
- title, style);
- (void)dlg.ShowModal();
+ wxLogDialog dlg(parent,
+ m_aMessages, m_aSeverity, m_aTimes,
+ title, style);
+ // clear the message list before showing the dialog because while it's
+ // shown some new messages may appear
+ Clear();
+
+ (void)dlg.ShowModal();
#else // !wxUSE_LOG_DIALOG
- // concatenate all strings (but not too many to not overfill the msg box)
- wxString str;
- size_t nLines = 0,
- nMsgCount = m_aMessages.Count();
+ // concatenate all strings (but not too many to not overfill the msg box)
+ size_t nLines = 0;
- // start from the most recent message
- for ( size_t n = nMsgCount; n > 0; n-- ) {
- // for Windows strings longer than this value are wrapped (NT 4.0)
- const size_t nMsgLineWidth = 156;
+ // start from the most recent message
+ for ( size_t n = nMsgCount; n > 0; n-- ) {
+ // for Windows strings longer than this value are wrapped (NT 4.0)
+ const size_t nMsgLineWidth = 156;
- nLines += (m_aMessages[n - 1].Len() + nMsgLineWidth - 1) / nMsgLineWidth;
+ nLines += (m_aMessages[n - 1].Len() + nMsgLineWidth - 1) / nMsgLineWidth;
- if ( nLines > 25 ) // don't put too many lines in message box
- break;
+ if ( nLines > 25 ) // don't put too many lines in message box
+ break;
- str << m_aMessages[n - 1] << wxT("\n");
+ str << m_aMessages[n - 1] << wxT("\n");
+ }
+#endif // wxUSE_LOG_DIALOG/!wxUSE_LOG_DIALOG
}
- wxMessageBox(str, title, wxOK | style);
-#endif // wxUSE_LOG_DIALOG/!wxUSE_LOG_DIALOG
+ // this catches both cases of 1 message with wxUSE_LOG_DIALOG and any
+ // situation without it
+ if ( !!str )
+ {
+ wxMessageBox(str, title, wxOK | style, parent);
- // no undisplayed messages whatsoever
- Clear();
+ // no undisplayed messages whatsoever
+ Clear();
+ }
// do it here again
m_bHasMessages = FALSE;
}
-// the default behaviour is to discard all informational messages if there
-// are any errors/warnings.
+// log all kinds of messages
void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t)
{
switch ( level ) {
case wxLOG_FatalError:
// show this one immediately
wxMessageBox(szString, _("Fatal error"), wxICON_HAND);
+ wxExit();
break;
case wxLOG_Error:
}
m_aMessages.Add(szString);
- m_aSeverity.Add(level);
+ m_aSeverity.Add((int)level);
m_aTimes.Add((long)t);
m_bHasMessages = TRUE;
break;
wxTextCtrl *TextCtrl() const { return m_pTextCtrl; }
private:
+ // use standard ids for our commands!
enum
{
- Menu_Close = 100,
- Menu_Save,
- Menu_Clear
+ Menu_Close = wxID_CLOSE,
+ Menu_Save = wxID_SAVE,
+ Menu_Clear = wxID_CLEAR
};
// instead of closing just hide the window to be able to Show() it later
const wxArrayLong& times,
const wxString& caption,
long style)
- : wxDialog(parent, -1, caption),
- m_messages(messages), m_severity(severity), m_times(times)
+ : 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;
wxBoxSizer *sizerButtons = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *sizerAll = new wxBoxSizer(wxHORIZONTAL);
- wxButton *btnOk = new wxButton(this, wxID_OK, _T("Ok"));
- m_btnDetails = new wxButton(this, wxID_MORE, _T("&Details >>"));
+ 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(style & wxICON_MASK);
+ 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);
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);
// create it now
m_listctrl = new wxListCtrl(this, -1,
wxDefaultPosition, wxDefaultSize,
- wxLC_REPORT | wxLC_NO_HEADER);
+ wxSUNKEN_BORDER |
+ wxLC_REPORT |
+ wxLC_NO_HEADER |
+ wxLC_SINGLE_SEL);
m_listctrl->InsertColumn(0, _("Message"));
m_listctrl->InsertColumn(1, _("Time"));
wxDateTime((time_t)m_times[n]).Format(fmt));
}
- // let the columns size themselves (TODO does this work under GTK?)
+ // let the columns size themselves
m_listctrl->SetColumnWidth(0, wxLIST_AUTOSIZE);
m_listctrl->SetColumnWidth(1, wxLIST_AUTOSIZE);
m_showingDetails = !m_showingDetails;
// in any case, our size changed - update
+ sizer->SetSizeHints(this);
sizer->Fit(this);
}