X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a95bd96b46d68605badf5b338a0fdb53c817b502..dcdce64e665eb3bb8d97d4fb819a5cbe829b6f45:/src/generic/logg.cpp diff --git a/src/generic/logg.cpp b/src/generic/logg.cpp index 254439bfc4..969ccb4b2d 100644 --- a/src/generic/logg.cpp +++ b/src/generic/logg.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: logg.cpp +// Name: src/generic/logg.cpp // Purpose: wxLog-derived classes which need GUI support (the rest is in // src/common/log.cpp) // Author: Vadim Zeitlin @@ -59,6 +59,10 @@ #include "wx/msw/private.h" #endif // Windows +#ifdef __WXPM__ + #include +#endif + #if wxUSE_LOG_DIALOG #include "wx/listctrl.h" #include "wx/imaglist.h" @@ -67,6 +71,9 @@ #include "wx/msgdlg.h" #endif // wxUSE_LOG_DIALOG/!wxUSE_LOG_DIALOG +// the suffix we add to the button to show that the dialog can be expanded +#define EXPAND_SUFFIX _T(" >>") + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -731,7 +738,7 @@ wxLogDialog::wxLogDialog(wxWindow *parent, // translates into click on cancel button) wxButton *btnOk = new wxButton(this, wxID_CANCEL, _("OK")); sizerButtons->Add(btnOk, 0, wxCENTRE | wxBOTTOM, MARGIN/2); - m_btnDetails = new wxButton(this, wxID_MORE, ms_details + _T(" >>")); + m_btnDetails = new wxButton(this, wxID_MORE, ms_details + EXPAND_SUFFIX); sizerButtons->Add(m_btnDetails, 0, wxCENTRE | wxTOP, MARGIN/2 - 1); #ifndef __WIN16__ @@ -739,11 +746,26 @@ wxLogDialog::wxLogDialog(wxWindow *parent, switch ( style & wxICON_MASK ) { case wxICON_ERROR: - bitmap = wxArtProvider::GetIcon(wxART_ERROR, wxART_MESSAGE_BOX); break; + bitmap = wxArtProvider::GetIcon(wxART_ERROR, wxART_MESSAGE_BOX); +#ifdef __WXPM__ + bitmap.SetId(wxICON_SMALL_ERROR); +#endif + break; + case wxICON_INFORMATION: - bitmap = wxArtProvider::GetIcon(wxART_INFORMATION, wxART_MESSAGE_BOX); break; + bitmap = wxArtProvider::GetIcon(wxART_INFORMATION, wxART_MESSAGE_BOX); +#ifdef __WXPM__ + bitmap.SetId(wxICON_SMALL_INFO); +#endif + break; + case wxICON_WARNING: - bitmap = wxArtProvider::GetIcon(wxART_WARNING, wxART_MESSAGE_BOX); break; + bitmap = wxArtProvider::GetIcon(wxART_WARNING, wxART_MESSAGE_BOX); +#ifdef __WXPM__ + bitmap.SetId(wxICON_SMALL_WARNING); +#endif + break; + default: wxFAIL_MSG(_T("incorrect log style")); } @@ -760,8 +782,19 @@ wxLogDialog::wxLogDialog(wxWindow *parent, SetAutoLayout(TRUE); SetSizer(sizerTop); - sizerTop->SetSizeHints(this); - sizerTop->Fit(this); + // see comments in OnDetails() + // + // Note: Doing this, this way, triggered a nasty bug in + // wxTopLevelWindowGTK::GtkOnSize which took -1 literally once + // either of maxWidth or maxHeight was set. This symptom has been + // fixed there, but it is a problem that remains as long as we allow + // unchecked access to the internal size members. We really need to + // encapuslate window sizes more cleanly and make it clear when -1 will + // be substituted and when it will not. + + wxSize size = sizerTop->Fit(this); + m_maxHeight = size.y; + SetSizeHints(size.x, size.y, m_maxWidth, m_maxHeight); btnOk->SetFocus(); @@ -961,7 +994,7 @@ void wxLogDialog::OnDetails(wxCommandEvent& WXUNUSED(event)) if ( m_showingDetails ) { - m_btnDetails->SetLabel(ms_details + _T(">>")); + m_btnDetails->SetLabel(ms_details + EXPAND_SUFFIX); sizer->Remove(m_listctrl); @@ -1004,9 +1037,34 @@ void wxLogDialog::OnDetails(wxCommandEvent& WXUNUSED(event)) m_showingDetails = !m_showingDetails; - // in any case, our size changed - update - sizer->SetSizeHints(this); - sizer->Fit(this); + // in any case, our size changed - relayout everything and set new hints + // --------------------------------------------------------------------- + + // we have to reset min size constraints or Fit() would never reduce the + // dialog size when collapsing it and we have to reset max constraint + // because it wouldn't expand it otherwise + + m_minHeight = + m_maxHeight = -1; + + // wxSizer::FitSize() is private, otherwise we might use it directly... + wxSize sizeTotal = GetSize(), + sizeClient = GetClientSize(); + + wxSize size = sizer->GetMinSize(); + size.x += sizeTotal.x - sizeClient.x; + size.y += sizeTotal.y - sizeClient.y; + + // we don't want to allow expanding the dialog in vertical direction as + // this would show the "hidden" details but we can resize the dialog + // vertically while the details are shown + if ( !m_showingDetails ) + m_maxHeight = size.y; + + SetSizeHints(size.x, size.y, m_maxWidth, m_maxHeight); + + // don't change the width when expanding/collapsing + SetSize(-1, size.y); #ifdef __WXGTK__ // VS: this is neccessary in order to force frame redraw under @@ -1117,3 +1175,4 @@ void wxLogTextCtrl::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) #endif // wxUSE_TEXTCTRL +// vi:sts=4:sw=4:et