X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a3608593a3f28099d01196bb2402f3b2217db995..336aecf1c2f69fa10e3271ea94dac7c545bf6300:/src/generic/logg.cpp?ds=sidebyside diff --git a/src/generic/logg.cpp b/src/generic/logg.cpp index 1393f0879e..ed2a915892 100644 --- a/src/generic/logg.cpp +++ b/src/generic/logg.cpp @@ -281,6 +281,74 @@ void wxLogGui::Clear() m_aTimes.Empty(); } +int wxLogGui::GetSeverityIcon() const +{ + return m_bErrors ? wxICON_STOP + : m_bWarnings ? wxICON_EXCLAMATION + : wxICON_INFORMATION; +} + +wxString wxLogGui::GetTitle() const +{ + wxString titleFormat; + switch ( GetSeverityIcon() ) + { + case wxICON_STOP: + titleFormat = _("%s Error"); + break; + + case wxICON_EXCLAMATION: + titleFormat = _("%s Warning"); + break; + + default: + wxFAIL_MSG( "unexpected icon severity" ); + // fall through + + case wxICON_INFORMATION: + titleFormat = _("%s Information"); + } + + return wxString::Format(titleFormat, wxTheApp->GetAppDisplayName()); +} + +void +wxLogGui::DoShowSingleLogMessage(const wxString& message, + const wxString& title, + int style) +{ + wxMessageBox(message, title, wxOK | style); +} + +void +wxLogGui::DoShowMultipleLogMessages(const wxArrayString& messages, + const wxArrayInt& severities, + const wxArrayLong& times, + const wxString& title, + int style) +{ +#if wxUSE_LOG_DIALOG + wxLogDialog dlg(NULL, + messages, severities, times, + 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 + // start from the most recent message + wxString message; + str.reserve(nMsgCount*100); + for ( size_t n = nMsgCount; n > 0; n-- ) { + message << m_aMessages[n - 1] << wxT("\n"); + } + + DoShowSingleLogMessage(message, title, style); +#endif // wxUSE_LOG_DIALOG/!wxUSE_LOG_DIALOG +} + void wxLogGui::Flush() { if ( !m_bHasMessages ) @@ -289,105 +357,45 @@ void wxLogGui::Flush() // do it right now to block any new calls to Flush() while we're here m_bHasMessages = false; + // note that this must be done before examining m_aMessages as it may log + // yet another message const unsigned repeatCount = LogLastRepeatIfNeeded(); - wxString appName = wxTheApp->GetAppDisplayName(); + const size_t nMsgCount = m_aMessages.size(); - long style; - wxString titleFormat; - if ( m_bErrors ) { - titleFormat = _("%s Error"); - style = wxICON_STOP; - } - else if ( m_bWarnings ) { - titleFormat = _("%s Warning"); - style = wxICON_EXCLAMATION; - } - else { - titleFormat = _("%s Information"); - style = wxICON_INFORMATION; + if ( repeatCount > 0 ) + { + m_aMessages[nMsgCount - 1] << " (" << m_aMessages[nMsgCount - 2] << ")"; } - wxString title; - title.Printf(titleFormat, appName.c_str()); - - size_t nMsgCount = m_aMessages.GetCount(); + const wxString title = GetTitle(); + const int style = GetSeverityIcon(); // avoid showing other log dialogs until we're done with the dialog we're // showing right now: nested modal dialogs make for really bad UI! Suspend(); - wxString str; if ( nMsgCount == 1 ) { - str = m_aMessages[0]; - } - else // more than one message - { -#if wxUSE_LOG_DIALOG - - if ( repeatCount > 0 ) - { - m_aMessages[nMsgCount - 1] - << " (" << m_aMessages[nMsgCount - 2] << ")"; - } - - wxLogDialog dlg(NULL, - 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 + // make a copy before calling Clear() + const wxString message(m_aMessages[0]); Clear(); - (void)dlg.ShowModal(); -#else // !wxUSE_LOG_DIALOG - // 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; - - nLines += (m_aMessages[n - 1].Len() + nMsgLineWidth - 1) / nMsgLineWidth; - - if ( nLines > 25 ) // don't put too many lines in message box - break; - - str << m_aMessages[n - 1] << wxT("\n"); - } -#endif // wxUSE_LOG_DIALOG/!wxUSE_LOG_DIALOG + DoShowSingleLogMessage(message, title, style); } - - // this catches both cases of 1 message with wxUSE_LOG_DIALOG and any - // situation without it - if ( !str.empty() ) + else // more than one message { - // we use a message dialog with 2 buttons to be able to use one of them - // for copying the message text to clipboard -#if wxUSE_CLIPBOARD - wxMessageDialog dlg(NULL, str, title, style | wxYES_NO); - if ( !dlg.SetYesNoLabels(wxID_COPY, wxID_OK) ) -#endif // wxUSE_CLIPBOARD - { - // but if custom labels are not supported it makes no sense to keep - // two buttons so revert to a single one - dlg.SetMessageDialogStyle(style | wxOK); - } + wxArrayString messages; + wxArrayInt severities; + wxArrayLong times; -#if wxUSE_CLIPBOARD - if ( dlg.ShowModal() == wxID_YES ) - { - // this means the wxID_COPY button was selected - wxClipboardLocker clip; - if ( !clip || !wxTheClipboard->AddData(new wxTextDataObject(str)) ) - wxLogError(_("Failed to copy dialog contents to the clipboard.")); - } -#endif // wxUSE_CLIPBOARD + messages.swap(m_aMessages); + severities.swap(m_aSeverity); + times.swap(m_aTimes); - // no undisplayed messages whatsoever Clear(); + + DoShowMultipleLogMessages(messages, severities, times, title, style); } // allow flushing the logs again @@ -1162,7 +1170,7 @@ static int OpenLogFile(wxFile& file, wxString *pFilename, wxWindow *parent) // open file // --------- - bool bOk = false; + bool bOk; if ( wxFile::Exists(filename) ) { bool bAppend = false; wxString strMsg;