#include "wx/sizer.h"
#include "wx/statbmp.h"
#include "wx/button.h"
+ #include "wx/settings.h"
#endif // WX_PRECOMP
#if wxUSE_LOGGUI || wxUSE_LOGWINDOW
// we use a global variable to store the frame pointer for wxLogStatus - bad,
// but it's the easiest way
-static wxFrame *gs_pFrame; // FIXME MT-unsafe
+static wxFrame *gs_pFrame = NULL; // FIXME MT-unsafe
// ============================================================================
// implementation
wxString title;
title.Printf(titleFormat, appName.c_str());
- // this is the best we can do here
- wxWindow *parent = wxTheApp->GetTopWindow();
-
size_t nMsgCount = m_aMessages.Count();
+ // 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 )
{
{
#if wxUSE_LOG_DIALOG
- wxLogDialog dlg(parent,
+ wxLogDialog dlg(NULL,
m_aMessages, m_aSeverity, m_aTimes,
title, style);
// situation without it
if ( !!str )
{
- wxMessageBox(str, title, wxOK | style, parent);
+ wxMessageBox(str, title, wxOK | style);
// no undisplayed messages whatsoever
Clear();
}
+
+ // allow flushing the logs again
+ Resume();
}
// log all kinds of messages
case wxLOG_Debug:
#ifdef __WXDEBUG__
{
+ wxString str;
+ TimeStamp(&str);
+ str += szString;
+
#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("\r\n");
+ // debug window anyhow
+ str += wxT("\r\n");
OutputDebugString(str);
#else
// send them to stderr
- wxFprintf(stderr, wxT("%s: %s\n"),
+ wxFprintf(stderr, wxT("[%s] %s\n"),
level == wxLOG_Trace ? wxT("Trace")
: wxT("Debug"),
- szString);
+ str.c_str());
fflush(stderr);
#endif
}
const wxArrayLong& times,
const wxString& caption,
long style)
- : wxDialog(parent, -1, caption)
+ : wxDialog(parent, -1, caption,
+ wxDefaultPosition, wxDefaultSize,
+ wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
if ( ms_details.IsEmpty() )
{
// to close the log dialog with <Esc> which wouldn't work otherwise (as it
// translates into click on cancel button)
wxButton *btnOk = new wxButton(this, wxID_CANCEL, _("OK"));
- sizerButtons->Add(btnOk, 0, wxCENTRE|wxBOTTOM, MARGIN/2);
+ sizerButtons->Add(btnOk, 0, wxCENTRE | wxBOTTOM, MARGIN/2);
m_btnDetails = new wxButton(this, wxID_MORE, ms_details + _T(" >>"));
- sizerButtons->Add(m_btnDetails, 0, wxCENTRE|wxTOP, MARGIN/2 - 1);
+ sizerButtons->Add(m_btnDetails, 0, wxCENTRE | wxTOP, MARGIN/2 - 1);
#ifndef __WIN16__
wxIcon icon = wxTheApp->GetStdIcon((int)(style & wxICON_MASK));
- sizerAll->Add(new wxStaticBitmap(this, -1, icon), 0, wxCENTRE);
+ sizerAll->Add(new wxStaticBitmap(this, -1, icon), 0);
#endif // !Win16
const wxString& message = messages.Last();
- sizerAll->Add(CreateTextSizer(message), 0, wxCENTRE|wxLEFT|wxRIGHT, MARGIN);
- sizerAll->Add(sizerButtons, 0, wxALIGN_RIGHT|wxLEFT, MARGIN);
+ sizerAll->Add(CreateTextSizer(message), 1,
+ wxALIGN_CENTRE_VERTICAL | wxLEFT | wxRIGHT, MARGIN);
+ sizerAll->Add(sizerButtons, 0, wxALIGN_RIGHT | wxLEFT, MARGIN);
- sizerTop->Add(sizerAll, 0, wxCENTRE|wxALL, MARGIN);
+ sizerTop->Add(sizerAll, 0, wxALL | wxEXPAND, MARGIN);
SetAutoLayout(TRUE);
SetSizer(sizerTop);
int y;
GetTextExtent(_T("H"), (int*)NULL, &y, (int*)NULL, (int*)NULL, &font);
int height = wxMax(y*(count + 3), 100);
- m_listctrl->SetSize(-1, height);
+
+ // if the height as computed from list items exceeds, together with the
+ // actual message & controls, the screen, make it smaller
+ int heightMax =
+ (3*wxSystemSettings::GetSystemMetric(wxSYS_SCREEN_Y))/5 - GetSize().y;
+
+ m_listctrl->SetSize(-1, wxMin(height, heightMax));
}
void wxLogDialog::OnListSelect(wxListEvent& event)
wxString msg;
TimeStamp(&msg);
-#ifdef __WXMAC__
+#if defined(__WXMAC__) && !defined(__DARWIN__)
// 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');