diff --git a/include/wx/generic/msgdlgg.h b/include/wx/generic/msgdlgg.h index 8238ccd7d1..f6583bd351 100644 --- a/include/wx/generic/msgdlgg.h +++ b/include/wx/generic/msgdlgg.h @@ -12,6 +12,8 @@ #ifndef _WX_GENERIC_MSGDLGG_H_ #define _WX_GENERIC_MSGDLGG_H_ +class WXDLLIMPEXP_FWD_CORE wxSizer; + class WXDLLIMPEXP_CORE wxGenericMessageDialog : public wxMessageDialogBase { public: @@ -37,6 +39,12 @@ protected: virtual void AddMessageDialogDetails(wxSizer *WXUNUSED(sizer)) { } private: + // Creates and returns a standard button sizer using the style of this + // dialog and the custom labels, if any. + // + // May return NULL on smart phone platforms not using buttons at all. + wxSizer *CreateMsgDlgButtonSizer(); + wxPoint m_pos; bool m_created; diff --git a/include/wx/msgdlg.h b/include/wx/msgdlg.h index 7e2eb5c80c..958e46a782 100644 --- a/include/wx/msgdlg.h +++ b/include/wx/msgdlg.h @@ -242,6 +242,16 @@ protected: var = label.GetAsString(); } + // these functions return the custom label or empty string and should be + // used only in specific circumstances such as creating the buttons with + // these labels (in which case it makes sense to only use a custom label if + // it was really given and fall back on stock label otherwise), use the + // Get{Yes,No,OK,Cancel}Label() methods above otherwise + const wxString& GetCustomYesLabel() const { return m_yes; } + const wxString& GetCustomNoLabel() const { return m_no; } + const wxString& GetCustomOKLabel() const { return m_ok; } + const wxString& GetCustomCancelLabel() const { return m_cancel; } + private: // these functions may be overridden to provide different defaults for the // default button labels (this is used by wxGTK) diff --git a/src/generic/msgdlgg.cpp b/src/generic/msgdlgg.cpp index ec6e7e924f..9ba2ee10d8 100644 --- a/src/generic/msgdlgg.cpp +++ b/src/generic/msgdlgg.cpp @@ -93,6 +93,66 @@ wxGenericMessageDialog::wxGenericMessageDialog( wxWindow *parent, m_created = false; } +wxSizer *wxGenericMessageDialog::CreateMsgDlgButtonSizer() +{ +#ifndef __SMARTPHONE__ + 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 ( btnDef ) + { + btnDef->SetDefault(); + btnDef->SetFocus(); + } + + sizerStd->Realize(); + + return CreateSeparatedSizer(sizerStd); + } +#endif // !__SMARTPHONE__ + + // Use standard labels for all buttons + return CreateSeparatedButtonSizer + ( + m_dialogStyle & (wxOK | wxCANCEL | wxYES_NO | + wxNO_DEFAULT | wxCANCEL_DEFAULT) + ); +} + void wxGenericMessageDialog::DoCreateMsgdialog() { wxDialog::Create(m_parent, wxID_ANY, m_caption, m_pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE); @@ -156,11 +216,7 @@ void wxGenericMessageDialog::DoCreateMsgdialog() int center_flag = wxEXPAND; if (m_dialogStyle & wxYES_NO) center_flag = wxALIGN_CENTRE; - wxSizer *sizerBtn = CreateSeparatedButtonSizer - ( - m_dialogStyle & (wxOK | wxCANCEL | wxYES_NO | - wxNO_DEFAULT | wxCANCEL_DEFAULT) - ); + wxSizer *sizerBtn = CreateMsgDlgButtonSizer(); if ( sizerBtn ) topsizer->Add(sizerBtn, 0, center_flag | wxALL, 10 );