make it possible to use stock ids for custom message box labels

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55483 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2008-09-05 18:02:49 +00:00
parent 9276358892
commit e08931c05a
6 changed files with 107 additions and 36 deletions

View File

@ -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)

View File

@ -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

View File

@ -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"); }

View File

@ -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,

View File

@ -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);

View File

@ -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()