From 9276358892b129bbed2c52028b3485df02117918 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 5 Sep 2008 17:27:20 +0000 Subject: [PATCH] added support for custom labels in wxMessageBox for wxGTK too git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55482 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/gtk/msgdlg.h | 13 ++++- include/wx/msgdlg.h | 23 +++++++-- src/gtk/msgdlg.cpp | 106 ++++++++++++++++++++++++++-------------- 4 files changed, 98 insertions(+), 45 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index ae175b28e7..398321d9d5 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -307,6 +307,7 @@ All (GUI): - Added wxWindow::Show/HideWithEffect() - Added wxWrapSizer (Arne Steinarson) - Added wxSpinCtrlDouble (John Labenski) +- Support custom labels in wxMessageDialog/wxMessageBox in wxMSW and wxGTK. - Added multisample (anti-aliasing) support to wxGLCanvas (Olivier Playez). - Initialize wx{Client,Paint,Window}DC with fonts/colours of its window. - Added wxNativeContainerWindow to allow embedding wx into native windows diff --git a/include/wx/gtk/msgdlg.h b/include/wx/gtk/msgdlg.h index 97998869d0..955a2bfdec 100644 --- a/include/wx/gtk/msgdlg.h +++ b/include/wx/gtk/msgdlg.h @@ -12,7 +12,7 @@ #ifndef _WX_GTK_MSGDLG_H_ #define _WX_GTK_MSGDLG_H_ -class WXDLLIMPEXP_CORE wxMessageDialog : public wxMessageDialogBase +class WXDLLIMPEXP_CORE wxMessageDialog : public wxMessageDialogWithCustomLabels { public: wxMessageDialog(wxWindow *parent, const wxString& message, @@ -21,7 +21,7 @@ public: const wxPoint& pos = wxDefaultPosition); virtual int ShowModal(); - virtual bool Show( bool WXUNUSED(show) = true ) { return false; }; + virtual bool Show(bool WXUNUSED(show) = true) { return false; } protected: // implement some base class methods to do nothing to avoid asserts and @@ -33,6 +33,15 @@ protected: int WXUNUSED(width), int WXUNUSED(height)) {} private: + // override to use stock GTK+ defaults instead of just string ones + virtual wxString GetDefaultYesLabel() const; + virtual wxString GetDefaultNoLabel() const; + virtual wxString GetDefaultOKLabel() const; + virtual wxString GetDefaultCancelLabel() const; + + // override to convert wx mnemonics to GTK+ ones + virtual void DoSetCustomLabel(wxString& var, const wxString& value); + // create the real GTK+ dialog: this is done from ShowModal() to allow // changing the message between constructing the dialog and showing it void GTKCreateMsgDialog(); diff --git a/include/wx/msgdlg.h b/include/wx/msgdlg.h index be89f2ce34..1dbd69e3af 100644 --- a/include/wx/msgdlg.h +++ b/include/wx/msgdlg.h @@ -117,7 +117,10 @@ protected: // functions for setting these labels immediately and we also don't need to // store them at all if custom labels are not supported, which is why we do // this in a separate class and not wxMessageDialogBase itself) -#if defined(__WXCOCOA__) || defined(__WXMAC__) || defined(__WXMSW__) +#if defined(__WXCOCOA__) || \ + defined(__WXGTK20__) || \ + defined(__WXMAC__) || \ + defined(__WXMSW__) class WXDLLIMPEXP_CORE wxMessageDialogWithCustomLabels : public wxMessageDialogBase @@ -175,11 +178,14 @@ protected: // these functions return the label to be used for the button which is // either a custom label explicitly set by the user or the default label, // i.e. they always return a valid string - wxString GetYesLabel() const { return m_yes.empty() ? _("Yes") : m_yes; } - wxString GetNoLabel() const { return m_no.empty() ? _("No") : m_no; } - wxString GetOKLabel() const { return m_ok.empty() ? _("OK") : m_ok; } + wxString GetYesLabel() const + { return m_yes.empty() ? GetDefaultYesLabel() : m_yes; } + wxString GetNoLabel() const + { return m_no.empty() ? GetDefaultNoLabel() : m_no; } + wxString GetOKLabel() const + { return m_ok.empty() ? GetDefaultOKLabel() : m_ok; } wxString GetCancelLabel() const - { return m_cancel.empty() ? _("Cancel") : m_cancel; } + { return m_cancel.empty() ? GetDefaultCancelLabel() : m_cancel; } private: // this function is called by our public SetXXXLabels() and should assign @@ -190,6 +196,13 @@ private: var = value; } + // these functions may be overridden to provide different defaults for the + // default button labels (this is used by wxGTK) + virtual wxString GetDefaultYesLabel() const { return _("Yes"); } + virtual wxString GetDefaultNoLabel() const { return _("No"); } + virtual wxString GetDefaultOKLabel() const { return _("OK"); } + virtual wxString GetDefaultCancelLabel() const { return _("Cancel"); } + // labels for the buttons, initially empty meaning that the defaults should // be used, use GetYes/No/OK/CancelLabel() to access them wxString m_yes, diff --git a/src/gtk/msgdlg.cpp b/src/gtk/msgdlg.cpp index bbeed8884e..9f12398fb6 100644 --- a/src/gtk/msgdlg.cpp +++ b/src/gtk/msgdlg.cpp @@ -25,6 +25,7 @@ #endif #include "wx/gtk/private.h" +#include "wx/gtk/private/mnemonics.h" #include #if wxUSE_LIBHILDON @@ -38,13 +39,38 @@ wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& caption, long style, const wxPoint& WXUNUSED(pos)) - : wxMessageDialogBase(GetParentForModalDialog(parent), - message, - caption, - style) + : wxMessageDialogWithCustomLabels(GetParentForModalDialog(parent), + message, + caption, + style) { } +wxString wxMessageDialog::GetDefaultYesLabel() const +{ + return GTK_STOCK_YES; +} + +wxString wxMessageDialog::GetDefaultNoLabel() const +{ + return GTK_STOCK_NO; +} + +wxString wxMessageDialog::GetDefaultOKLabel() const +{ + return GTK_STOCK_OK; +} + +wxString wxMessageDialog::GetDefaultCancelLabel() const +{ + return GTK_STOCK_CANCEL; +} + +void wxMessageDialog::DoSetCustomLabel(wxString& var, const wxString& value) +{ + var = wxConvertMnemonicsToGTK(value); +} + void wxMessageDialog::GTKCreateMsgDialog() { GtkWindow * const parent = m_parent ? GTK_WINDOW(m_parent->m_widget) : NULL; @@ -74,22 +100,22 @@ void wxMessageDialog::GTKCreateMsgDialog() ); #else // !wxUSE_LIBHILDON GtkMessageType type = GTK_MESSAGE_ERROR; - GtkButtonsType buttons = GTK_BUTTONS_OK; - - if (m_dialogStyle & wxYES_NO) - { - if (m_dialogStyle & wxCANCEL) - buttons = GTK_BUTTONS_NONE; - else - buttons = GTK_BUTTONS_YES_NO; - } + GtkButtonsType buttons = GTK_BUTTONS_NONE; - if (m_dialogStyle & wxOK) + // when using custom labels, we have to add all the buttons ourselves + if ( !HasCustomLabels() ) { - if (m_dialogStyle & wxCANCEL) - buttons = GTK_BUTTONS_OK_CANCEL; - else - buttons = GTK_BUTTONS_OK; + if ( m_dialogStyle & wxYES_NO ) + { + if ( !(m_dialogStyle & wxCANCEL) ) + buttons = GTK_BUTTONS_YES_NO; + //else: no standard GTK_BUTTONS_YES_NO_CANCEL so leave as NONE + } + else if ( m_dialogStyle & wxOK ) + { + buttons = m_dialogStyle & wxCANCEL ? GTK_BUTTONS_OK_CANCEL + : GTK_BUTTONS_OK; + } } if (m_dialogStyle & wxICON_EXCLAMATION) @@ -145,39 +171,43 @@ void wxMessageDialog::GTKCreateMsgDialog() if (m_caption != wxMessageBoxCaptionStr) gtk_window_set_title(GTK_WINDOW(m_widget), wxGTK_CONV(m_caption)); - // we need to add dialogs manually when using Yes/No/Cancel dialog as GTK+ - // doesn't support it natively and when using Hildon we add all the buttons - // manually as it doesn't support too many of the combinations we have GtkDialog * const dlg = GTK_DIALOG(m_widget); - if ( m_dialogStyle & wxYES_NO ) - { - if ( m_dialogStyle & wxCANCEL ) - { - gtk_dialog_add_button(dlg, GTK_STOCK_NO, GTK_RESPONSE_NO); - gtk_dialog_add_button(dlg, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - gtk_dialog_add_button(dlg, GTK_STOCK_YES, GTK_RESPONSE_YES); - } + + // we need to add buttons manually if we use custom labels or always for + // Yes/No/Cancel dialog as GTK+ doesn't support it natively and when using + // Hildon we add all the buttons manually as it doesn't support too many of + // the combinations we may have #if wxUSE_LIBHILDON - else // just Yes/No + static const bool addButtons = true; +#else // !wxUSE_LIBHILDON + const bool addButtons = buttons == GTK_BUTTONS_NONE; +#endif // wxUSE_LIBHILDON/!wxUSE_LIBHILDON + + if ( m_dialogStyle & wxYES_NO ) // Yes/No or Yes/No/Cancel dialog + { + if ( addButtons ) { - gtk_dialog_add_button(dlg, GTK_STOCK_NO, GTK_RESPONSE_NO); - gtk_dialog_add_button(dlg, GTK_STOCK_YES, GTK_RESPONSE_YES); + gtk_dialog_add_button(dlg, GetNoLabel(), GTK_RESPONSE_NO); + gtk_dialog_add_button(dlg, GetYesLabel(), GTK_RESPONSE_YES); + + if ( m_dialogStyle & wxCANCEL ) + { + gtk_dialog_add_button(dlg, GetCancelLabel(), + GTK_RESPONSE_CANCEL); + } } -#endif // wxUSE_LIBHILDON gtk_dialog_set_default_response(dlg, m_dialogStyle & wxNO_DEFAULT ? GTK_RESPONSE_NO : GTK_RESPONSE_YES); } -#if wxUSE_LIBHILDON - else // Ok or Ok/Cancel dialog + else if ( addButtons ) // Ok or Ok/Cancel dialog { - gtk_dialog_add_button(dlg, GTK_STOCK_OK, GTK_RESPONSE_OK); + gtk_dialog_add_button(dlg, GetOKLabel(), GTK_RESPONSE_OK); if ( m_dialogStyle & wxCANCEL ) - gtk_dialog_add_button(dlg, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + gtk_dialog_add_button(dlg, GetCancelLabel(), GTK_RESPONSE_CANCEL); } -#endif // wxUSE_LIBHILDON } int wxMessageDialog::ShowModal() -- 2.47.2