Files
wxWidgets/src/generic/msgdlgg.cpp
Vadim Zeitlin 61d10a7328 Remove unnecessary wxSizer::Fit() calls
wxSizer::SetSizeHints() already does what Fit() does (while also setting
the minimum window size to the fitting size), so there is no need to
call both of them.

No real changes, just some cleanup.
2022-02-19 15:38:07 +01:00

273 lines
7.7 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/generic/msgdlgg.cpp
// Purpose: wxGenericMessageDialog
// Author: Julian Smart, Robert Roebling
// Modified by:
// Created: 04/01/98
// Copyright: (c) Julian Smart and Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#if wxUSE_MSGDLG
#ifndef WX_PRECOMP
#include "wx/utils.h"
#include "wx/dialog.h"
#include "wx/button.h"
#include "wx/stattext.h"
#include "wx/statbmp.h"
#include "wx/layout.h"
#include "wx/intl.h"
#include "wx/icon.h"
#include "wx/sizer.h"
#include "wx/app.h"
#include "wx/settings.h"
#endif
#include <stdio.h>
#include <string.h>
#define __WX_COMPILING_MSGDLGG_CPP__ 1
#include "wx/msgdlg.h"
#include "wx/artprov.h"
#include "wx/textwrapper.h"
#include "wx/modalhook.h"
#if wxUSE_STATLINE
#include "wx/statline.h"
#endif
// ----------------------------------------------------------------------------
// wxTitleTextWrapper: simple class to create wrapped text in "title font"
// ----------------------------------------------------------------------------
class wxTitleTextWrapper : public wxTextSizerWrapper
{
public:
wxTitleTextWrapper(wxWindow *win)
: wxTextSizerWrapper(win)
{
}
protected:
virtual wxWindow *OnCreateLine(const wxString& s) wxOVERRIDE
{
wxWindow * const win = wxTextSizerWrapper::OnCreateLine(s);
win->SetFont(win->GetFont().Larger().MakeBold());
return win;
}
};
// ----------------------------------------------------------------------------
// icons
// ----------------------------------------------------------------------------
wxBEGIN_EVENT_TABLE(wxGenericMessageDialog, wxDialog)
EVT_BUTTON(wxID_YES, wxGenericMessageDialog::OnYes)
EVT_BUTTON(wxID_NO, wxGenericMessageDialog::OnNo)
EVT_BUTTON(wxID_HELP, wxGenericMessageDialog::OnHelp)
EVT_BUTTON(wxID_CANCEL, wxGenericMessageDialog::OnCancel)
wxEND_EVENT_TABLE()
wxIMPLEMENT_CLASS(wxGenericMessageDialog, wxDialog);
wxGenericMessageDialog::wxGenericMessageDialog( wxWindow *parent,
const wxString& message,
const wxString& caption,
long style,
const wxPoint& pos)
: wxMessageDialogBase(GetParentForModalDialog(parent, style),
message,
caption,
style),
m_pos(pos)
{
m_created = false;
}
wxSizer *wxGenericMessageDialog::CreateMsgDlgButtonSizer()
{
if ( HasCustomLabels() )
{
wxStdDialogButtonSizer * const sizerStd = new wxStdDialogButtonSizer;
wxButton *btnDef = NULL;
if ( m_dialogStyle & wxOK )
{
btnDef = new wxButton(this, wxID_OK, GetCustomOKLabel());
sizerStd->AddButton(btnDef);
}
if ( m_dialogStyle & wxCANCEL )
{
wxButton * const
cancel = new wxButton(this, wxID_CANCEL, GetCustomCancelLabel());
sizerStd->AddButton(cancel);
if ( m_dialogStyle & wxCANCEL_DEFAULT )
btnDef = cancel;
}
if ( m_dialogStyle & wxYES_NO )
{
wxButton * const
yes = new wxButton(this, wxID_YES, GetCustomYesLabel());
sizerStd->AddButton(yes);
wxButton * const
no = new wxButton(this, wxID_NO, GetCustomNoLabel());
sizerStd->AddButton(no);
if ( m_dialogStyle & wxNO_DEFAULT )
btnDef = no;
else if ( !btnDef )
btnDef = yes;
}
if ( m_dialogStyle & wxHELP )
{
wxButton * const
help = new wxButton(this, wxID_HELP, GetCustomHelpLabel());
sizerStd->AddButton(help);
}
if ( btnDef )
{
btnDef->SetDefault();
btnDef->SetFocus();
}
sizerStd->Realize();
return CreateSeparatedSizer(sizerStd);
}
// Use standard labels for all buttons
return CreateSeparatedButtonSizer
(
m_dialogStyle & (wxOK | wxCANCEL | wxHELP | wxYES_NO |
wxNO_DEFAULT | wxCANCEL_DEFAULT)
);
}
void wxGenericMessageDialog::DoCreateMsgdialog()
{
wxDialog::Create(m_parent, wxID_ANY, m_caption, m_pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE);
wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer *icon_text = new wxBoxSizer( wxHORIZONTAL );
#if wxUSE_STATBMP
// 1) icon
if (m_dialogStyle & wxICON_MASK)
{
wxStaticBitmap *icon = new wxStaticBitmap
(
this,
wxID_ANY,
wxArtProvider::GetMessageBoxIcon(m_dialogStyle)
);
if ( wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA )
topsizer->Add( icon, 0, wxTOP|wxLEFT|wxRIGHT | wxALIGN_LEFT, 10 );
else
icon_text->Add(icon, wxSizerFlags().Top().Border(wxRIGHT, 20));
}
#endif // wxUSE_STATBMP
#if wxUSE_STATTEXT
// 2) text
wxBoxSizer * const textsizer = new wxBoxSizer(wxVERTICAL);
// We want to show the main message in a different font to make it stand
// out if the extended message is used as well. This looks better and is
// more consistent with the native dialogs under MSW and GTK.
wxString lowerMessage;
if ( !m_extendedMessage.empty() )
{
wxTitleTextWrapper titleWrapper(this);
textsizer->Add(CreateTextSizer(GetMessage(), titleWrapper),
wxSizerFlags().Border(wxBOTTOM, 20));
lowerMessage = GetExtendedMessage();
}
else // no extended message
{
lowerMessage = GetMessage();
}
textsizer->Add(CreateTextSizer(lowerMessage));
icon_text->Add(textsizer, 0, wxALIGN_CENTER, 10);
topsizer->Add( icon_text, 1, wxLEFT|wxRIGHT|wxTOP, 10 );
#endif // wxUSE_STATTEXT
// 3) optional checkbox and detailed text
AddMessageDialogCheckBox( topsizer );
AddMessageDialogDetails( topsizer );
// 4) buttons
wxSizer *sizerBtn = CreateMsgDlgButtonSizer();
if ( sizerBtn )
topsizer->Add(sizerBtn, 0, wxEXPAND | wxALL, 10 );
SetSizer( topsizer );
topsizer->SetSizeHints( this );
wxSize size( GetSize() );
if (size.x < size.y*3/2)
{
size.x = size.y*3/2;
SetSize( size );
}
Centre( wxBOTH | wxCENTER_FRAME);
}
void wxGenericMessageDialog::OnYes(wxCommandEvent& WXUNUSED(event))
{
EndModal( wxID_YES );
}
void wxGenericMessageDialog::OnNo(wxCommandEvent& WXUNUSED(event))
{
EndModal( wxID_NO );
}
void wxGenericMessageDialog::OnHelp(wxCommandEvent& WXUNUSED(event))
{
EndModal( wxID_HELP );
}
void wxGenericMessageDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
{
// Allow cancellation via ESC/Close button except if
// only YES and NO are specified.
const long style = GetMessageDialogStyle();
if ( (style & wxYES_NO) != wxYES_NO || (style & wxCANCEL) )
{
EndModal( wxID_CANCEL );
}
}
int wxGenericMessageDialog::ShowModal()
{
WX_HOOK_MODAL_DIALOG();
if ( !m_created )
{
m_created = true;
DoCreateMsgdialog();
}
return wxMessageDialogBase::ShowModal();
}
#endif // wxUSE_MSGDLG