diff --git a/include/wx/cocoa/msgdlg.h b/include/wx/cocoa/msgdlg.h index 9f01df5dfa..a490cf49d6 100644 --- a/include/wx/cocoa/msgdlg.h +++ b/include/wx/cocoa/msgdlg.h @@ -61,7 +61,7 @@ protected: // // VZ: I have no idea _why_ do we do this but the old version did and // I didn't want to change the existing behaviour - virtual void DoSetCustomLabel(wxString& var, const wxString& value); + virtual void DoSetCustomLabel(wxString& var, const ButtonLabel& label); DECLARE_DYNAMIC_CLASS(wxCocoaMessageDialog) DECLARE_NO_COPY_CLASS(wxCocoaMessageDialog) diff --git a/include/wx/gtk/msgdlg.h b/include/wx/gtk/msgdlg.h index 955a2bfdec..cb3c49c772 100644 --- a/include/wx/gtk/msgdlg.h +++ b/include/wx/gtk/msgdlg.h @@ -39,8 +39,8 @@ private: virtual wxString GetDefaultOKLabel() const; virtual wxString GetDefaultCancelLabel() const; - // override to convert wx mnemonics to GTK+ ones - virtual void DoSetCustomLabel(wxString& var, const wxString& value); + // override to convert wx mnemonics to GTK+ ones and handle stock ids + virtual void DoSetCustomLabel(wxString& var, const ButtonLabel& label); // create the real GTK+ dialog: this is done from ShowModal() to allow // changing the message between constructing the dialog and showing it diff --git a/include/wx/msgdlg.h b/include/wx/msgdlg.h index 1dbd69e3af..80644941ff 100644 --- a/include/wx/msgdlg.h +++ b/include/wx/msgdlg.h @@ -17,12 +17,58 @@ #if wxUSE_MSGDLG #include "wx/dialog.h" +#include "wx/stockitem.h" WXDLLIMPEXP_DATA_CORE(extern const char) wxMessageBoxCaptionStr[]; +// ---------------------------------------------------------------------------- +// wxMessageDialogBase: base class defining wxMessageDialog interface +// ---------------------------------------------------------------------------- + class WXDLLIMPEXP_CORE wxMessageDialogBase : public wxDialog { public: + // helper class for SetXXXLabels() methods: it makes it possible to pass + // either a stock id (wxID_CLOSE) or a string ("&Close") to them + class ButtonLabel + { + public: + // ctors are not explicit, objects of this class can be implicitly + // constructed from either stock ids or strings + ButtonLabel(int stockId) + : m_stockId(stockId) + { + wxASSERT_MSG( wxIsStockID(stockId), "invalid stock id" ); + } + + ButtonLabel(const wxString& label) + : m_label(label), m_stockId(wxID_NONE) + { + } + + // default copy ctor and dtor are ok + + // get the string label, whether it was originally specified directly + // or as a stock id -- this is only useful for platforms without native + // stock items id support + wxString GetAsString() const + { + return m_stockId == wxID_NONE ? m_label + : wxGetStockLabel(m_stockId); + } + + // return the stock id or wxID_NONE if this is not a stock label + int GetStockId() const { return m_stockId; } + + private: + // the label if explicitly given or empty if this is a stock item + const wxString m_label; + + // the stock item id or wxID_NONE if m_label should be used + const int m_stockId; + }; + + // ctors wxMessageDialogBase() { m_dialogStyle = 0; } wxMessageDialogBase(wxWindow *parent, @@ -42,26 +88,26 @@ public: // methods for setting up more custom message dialogs -- all functions // return false if they're not implemented - virtual bool SetYesNoLabels(const wxString& WXUNUSED(yes), - const wxString& WXUNUSED(no)) + virtual bool SetYesNoLabels(const ButtonLabel& WXUNUSED(yes), + const ButtonLabel& WXUNUSED(no)) { return false; } - virtual bool SetYesNoCancelLabels(const wxString& WXUNUSED(yes), - const wxString& WXUNUSED(no), - const wxString& WXUNUSED(cancel)) + virtual bool SetYesNoCancelLabels(const ButtonLabel& WXUNUSED(yes), + const ButtonLabel& WXUNUSED(no), + const ButtonLabel& WXUNUSED(cancel)) { return false; } - virtual bool SetOKLabel(const wxString& WXUNUSED(ok)) + virtual bool SetOKLabel(const ButtonLabel& WXUNUSED(ok)) { return false; } - virtual bool SetOKCancelLabels(const wxString& WXUNUSED(ok), - const wxString& WXUNUSED(cancel)) + virtual bool SetOKCancelLabels(const ButtonLabel& WXUNUSED(ok), + const ButtonLabel& WXUNUSED(cancel)) { return false; } @@ -80,11 +126,11 @@ protected: // common validation of wxMessageDialog style void SetMessageDialogStyle(long style) { - wxASSERT_MSG( ((style & wxYES_NO) == wxYES_NO) || ((style & wxYES_NO) == 0), - _T("wxYES and wxNO may only be used together in wxMessageDialog") ); + wxASSERT_MSG( ((style & wxYES_NO) == wxYES_NO) || !(style & wxYES_NO), + "wxYES and wxNO may only be used together" ); wxASSERT_MSG( (style & wxID_OK) != wxID_OK, - _T("wxMessageBox: Did you mean wxOK (and not wxID_OK)?") ); + "wxMessageBox: Did you mean wxOK (and not wxID_OK)?" ); m_dialogStyle = style; } @@ -137,16 +183,16 @@ public: } // customization of the message box buttons - virtual bool SetYesNoLabels(const wxString& yes,const wxString& no) + virtual bool SetYesNoLabels(const ButtonLabel& yes,const ButtonLabel& no) { DoSetCustomLabel(m_yes, yes); DoSetCustomLabel(m_no, no); return true; } - virtual bool SetYesNoCancelLabels(const wxString& yes, - const wxString& no, - const wxString& cancel) + virtual bool SetYesNoCancelLabels(const ButtonLabel& yes, + const ButtonLabel& no, + const ButtonLabel& cancel) { DoSetCustomLabel(m_yes, yes); DoSetCustomLabel(m_no, no); @@ -154,13 +200,14 @@ public: return true; } - virtual bool SetOKLabel(const wxString& ok) + virtual bool SetOKLabel(const ButtonLabel& ok) { DoSetCustomLabel(m_ok, ok); return true; } - virtual bool SetOKCancelLabels(const wxString& ok, const wxString& cancel) + virtual bool SetOKCancelLabels(const ButtonLabel& ok, + const ButtonLabel& cancel) { DoSetCustomLabel(m_ok, ok); DoSetCustomLabel(m_cancel, cancel); @@ -187,15 +234,16 @@ protected: wxString GetCancelLabel() const { return m_cancel.empty() ? GetDefaultCancelLabel() : m_cancel; } -private: // this function is called by our public SetXXXLabels() and should assign // the value to var with possibly some transformation (e.g. Cocoa version - // currently uses this to remove any accelerators from the button strings) - virtual void DoSetCustomLabel(wxString& var, const wxString& value) + // currently uses this to remove any accelerators from the button strings + // while GTK+ one handles stock items specifically here) + virtual void DoSetCustomLabel(wxString& var, const ButtonLabel& label) { - var = value; + var = label.GetAsString(); } +private: // 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"); } diff --git a/interface/wx/msgdlg.h b/interface/wx/msgdlg.h index ea998ee6e8..87f9158451 100644 --- a/interface/wx/msgdlg.h +++ b/interface/wx/msgdlg.h @@ -100,30 +100,44 @@ public: Please see the remarks in SetYesNoLabels() documentation. */ - bool SetOKCancelLabels(const wxString ok, const wxString cancel); + bool SetOKCancelLabels(const ButtonLabel& ok, const ButtonLabel& cancel); /** Overrides the default label of the OK button. Please see the remarks in SetYesNoLabels() documentation. */ - bool SetOKLabel(const wxString ok); + bool SetOKLabel(const ButtonLabel& ok); /** Overrides the default labels of the Yes, No and Cancel buttons. Please see the remarks in SetYesNoLabels() documentation. */ - bool SetYesNoCancelLabels(const wxString yes, const wxString no, - const wxString cancel); + bool SetYesNoCancelLabels(const ButtonLabel& yes, const ButtonLabel& no, + const ButtonLabel& cancel); /** Overrides the default labels of the Yes and No buttons. - Notice that this function is not currently available on all platforms, - so it may return @false to indicate that the labels couldn't be - changed. If it returns @true (currently only under wxMac), the labels - were set successfully. Typically, if the function was used + The arguments of this function can be either strings or one of the + standard identifiers, such as @c wxID_APPLY or @c wxID_OPEN. Notice + that even if the label is specified as an identifier, the return value + of the dialog ShowModal() method still remains one of @c wxID_OK, @c + wxID_CANCEL, @c wxID_YES or @c wxID_NO values, i.e. this identifier + changes only the label appearance but not the return code generated by + the button. It is possible to mix stock identifiers and string labels + in the same function call, for example: + @code + wxMessageDialog dlg(...); + dlg.SetYesNoLabels(wxID_SAVE, _("&Don't save")); + @endcode + + Also notice that this function is not currently available on all + platforms (although as of wxWidgets 2.9.0 it is implemented in all + major ports), so it may return @false to indicate that the labels + couldn't be changed. If it returns @true (currently only under wxMac), + the labels were set successfully. Typically, if the function was used successfully, the main dialog message may need to be changed, e.g.: @code wxMessageDialog dlg(...); @@ -133,7 +147,7 @@ public: dlg.SetMessage(_("Do you really want to quit?")); @endcode */ - bool SetYesNoLabels(const wxString yes, const wxString no); + bool SetYesNoLabels(const ButtonLabel& yes, const ButtonLabel& no); /** Shows the dialog, returning one of wxID_OK, wxID_CANCEL, wxID_YES, diff --git a/src/cocoa/msgdlg.mm b/src/cocoa/msgdlg.mm index fce905f6ba..3dfe3f0a15 100644 --- a/src/cocoa/msgdlg.mm +++ b/src/cocoa/msgdlg.mm @@ -63,7 +63,7 @@ wxCocoaMessageDialog::wxCocoaMessageDialog(wxWindow *parent, m_cocoaNSView = nil; } -void wxCocoaMessageDialog::DoSetCustomLabel(wxString& var, const wxString& value) +void wxCocoaMessageDialog::DoSetCustomLabel(wxString& var, const ButtonLabel& value) { wxMessageDialogWithCustomLabels::DoSetCustomLabel(var, value); diff --git a/src/gtk/msgdlg.cpp b/src/gtk/msgdlg.cpp index 9f12398fb6..1e56c1c1e4 100644 --- a/src/gtk/msgdlg.cpp +++ b/src/gtk/msgdlg.cpp @@ -66,9 +66,18 @@ wxString wxMessageDialog::GetDefaultCancelLabel() const return GTK_STOCK_CANCEL; } -void wxMessageDialog::DoSetCustomLabel(wxString& var, const wxString& value) +void wxMessageDialog::DoSetCustomLabel(wxString& var, const ButtonLabel& label) { - var = wxConvertMnemonicsToGTK(value); + int stockId = label.GetStockId(); + if ( stockId == wxID_NONE ) + { + wxMessageDialogWithCustomLabels::DoSetCustomLabel(var, label); + var = wxConvertMnemonicsToGTK(var); + } + else // stock label + { + var = wxGetStockGtkID(stockId); + } } void wxMessageDialog::GTKCreateMsgDialog()