ede7b01760
Use the task dialog instead of the legacy message box for wxMessageDialog implementation under wxMSW on recent (Vista and later) Windows versions. As part of this change, remove wxMessageDialogWithCustomLabels and integrate its functionality in wxMessageDialogBase itself as it's now used by all platforms. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65348 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
299 lines
9.8 KiB
C++
299 lines
9.8 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/msgdlgg.h
|
|
// Purpose: common header and base class for wxMessageDialog
|
|
// Author: Julian Smart
|
|
// Modified by:
|
|
// Created:
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_MSGDLG_H_BASE_
|
|
#define _WX_MSGDLG_H_BASE_
|
|
|
|
#include "wx/defs.h"
|
|
|
|
#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)
|
|
{
|
|
}
|
|
|
|
ButtonLabel(const char *label)
|
|
: m_label(label), m_stockId(wxID_NONE)
|
|
{
|
|
}
|
|
|
|
ButtonLabel(const wchar_t *label)
|
|
: m_label(label), m_stockId(wxID_NONE)
|
|
{
|
|
}
|
|
|
|
ButtonLabel(const wxCStrData& 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, wxSTOCK_FOR_BUTTON);
|
|
}
|
|
|
|
// 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,
|
|
const wxString& message,
|
|
const wxString& caption,
|
|
long style)
|
|
: m_message(message),
|
|
m_caption(caption)
|
|
{
|
|
m_parent = parent;
|
|
SetMessageDialogStyle(style);
|
|
}
|
|
|
|
// virtual dtor for the base class
|
|
virtual ~wxMessageDialogBase() { }
|
|
|
|
wxString GetCaption() const { return m_caption; }
|
|
|
|
virtual void SetMessage(const wxString& message)
|
|
{
|
|
m_message = message;
|
|
}
|
|
|
|
wxString GetMessage() const { return m_message; }
|
|
|
|
void SetExtendedMessage(const wxString& extendedMessage)
|
|
{
|
|
m_extendedMessage = extendedMessage;
|
|
}
|
|
|
|
wxString GetExtendedMessage() const { return m_extendedMessage; }
|
|
|
|
// change the dialog style flag
|
|
void SetMessageDialogStyle(long style)
|
|
{
|
|
wxASSERT_MSG( ((style & wxYES_NO) == wxYES_NO) || !(style & wxYES_NO),
|
|
"wxYES and wxNO may only be used together" );
|
|
|
|
wxASSERT_MSG( !(style & wxYES) || !(style & wxOK),
|
|
"wxOK and wxYES/wxNO can't be used together" );
|
|
|
|
wxASSERT_MSG( (style & wxYES) || (style & wxOK),
|
|
"one of wxOK and wxYES/wxNO must be used" );
|
|
|
|
wxASSERT_MSG( (style & wxID_OK) != wxID_OK,
|
|
"wxMessageBox: Did you mean wxOK (and not wxID_OK)?" );
|
|
|
|
wxASSERT_MSG( !(style & wxNO_DEFAULT) || (style & wxNO),
|
|
"wxNO_DEFAULT is invalid without wxNO" );
|
|
|
|
wxASSERT_MSG( !(style & wxCANCEL_DEFAULT) || (style & wxCANCEL),
|
|
"wxCANCEL_DEFAULT is invalid without wxCANCEL" );
|
|
|
|
wxASSERT_MSG( !(style & wxCANCEL_DEFAULT) || !(style & wxNO_DEFAULT),
|
|
"only one default button can be specified" );
|
|
|
|
m_dialogStyle = style;
|
|
}
|
|
|
|
long GetMessageDialogStyle() const { return m_dialogStyle; }
|
|
|
|
// customization of the message box buttons
|
|
virtual bool SetYesNoLabels(const ButtonLabel& yes,const ButtonLabel& no)
|
|
{
|
|
DoSetCustomLabel(m_yes, yes);
|
|
DoSetCustomLabel(m_no, no);
|
|
return true;
|
|
}
|
|
|
|
virtual bool SetYesNoCancelLabels(const ButtonLabel& yes,
|
|
const ButtonLabel& no,
|
|
const ButtonLabel& cancel)
|
|
{
|
|
DoSetCustomLabel(m_yes, yes);
|
|
DoSetCustomLabel(m_no, no);
|
|
DoSetCustomLabel(m_cancel, cancel);
|
|
return true;
|
|
}
|
|
|
|
virtual bool SetOKLabel(const ButtonLabel& ok)
|
|
{
|
|
DoSetCustomLabel(m_ok, ok);
|
|
return true;
|
|
}
|
|
|
|
virtual bool SetOKCancelLabels(const ButtonLabel& ok,
|
|
const ButtonLabel& cancel)
|
|
{
|
|
DoSetCustomLabel(m_ok, ok);
|
|
DoSetCustomLabel(m_cancel, cancel);
|
|
return true;
|
|
}
|
|
|
|
// test if any custom labels were set
|
|
bool HasCustomLabels() const
|
|
{
|
|
return !(m_ok.empty() && m_cancel.empty() &&
|
|
m_yes.empty() && m_no.empty());
|
|
}
|
|
|
|
// 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() ? 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() ? GetDefaultCancelLabel() : m_cancel; }
|
|
|
|
// based on message dialog style, returns exactly one of: wxICON_NONE,
|
|
// wxICON_ERROR, wxICON_WARNING, wxICON_QUESTION, wxICON_INFORMATION
|
|
long GetEffectiveIcon() const
|
|
{
|
|
if ( m_dialogStyle & wxICON_NONE )
|
|
return wxICON_NONE;
|
|
else if ( m_dialogStyle & wxICON_ERROR )
|
|
return wxICON_ERROR;
|
|
else if ( m_dialogStyle & wxICON_WARNING )
|
|
return wxICON_WARNING;
|
|
else if ( m_dialogStyle & wxICON_QUESTION )
|
|
return wxICON_QUESTION;
|
|
else if ( m_dialogStyle & wxICON_INFORMATION )
|
|
return wxICON_INFORMATION;
|
|
else if ( m_dialogStyle & wxYES )
|
|
return wxICON_QUESTION;
|
|
else
|
|
return wxICON_INFORMATION;
|
|
}
|
|
|
|
protected:
|
|
// for the platforms not supporting separate main and extended messages
|
|
// this function should be used to combine both of them in a single string
|
|
wxString GetFullMessage() const
|
|
{
|
|
wxString msg = m_message;
|
|
if ( !m_extendedMessage.empty() )
|
|
msg << "\n\n" << m_extendedMessage;
|
|
|
|
return msg;
|
|
}
|
|
|
|
wxString m_message,
|
|
m_extendedMessage,
|
|
m_caption;
|
|
long m_dialogStyle;
|
|
|
|
// 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
|
|
// while GTK+ one handles stock items specifically here)
|
|
virtual void DoSetCustomLabel(wxString& var, const ButtonLabel& label)
|
|
{
|
|
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 wxGetTranslation("Yes"); }
|
|
virtual wxString GetDefaultNoLabel() const { return wxGetTranslation("No"); }
|
|
virtual wxString GetDefaultOKLabel() const { return wxGetTranslation("OK"); }
|
|
virtual wxString GetDefaultCancelLabel() const { return wxGetTranslation("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,
|
|
m_no,
|
|
m_ok,
|
|
m_cancel;
|
|
|
|
wxDECLARE_NO_COPY_CLASS(wxMessageDialogBase);
|
|
};
|
|
|
|
#include "wx/generic/msgdlgg.h"
|
|
|
|
#if defined(__WX_COMPILING_MSGDLGG_CPP__) || \
|
|
defined(__WXUNIVERSAL__) || defined(__WXGPE__) || \
|
|
(defined(__WXGTK__) && !defined(__WXGTK20__))
|
|
|
|
#define wxMessageDialog wxGenericMessageDialog
|
|
#elif defined(__WXCOCOA__)
|
|
#include "wx/cocoa/msgdlg.h"
|
|
#elif defined(__WXPALMOS__)
|
|
#include "wx/palmos/msgdlg.h"
|
|
#elif defined(__WXMSW__)
|
|
#include "wx/msw/msgdlg.h"
|
|
#elif defined(__WXMOTIF__)
|
|
#include "wx/motif/msgdlg.h"
|
|
#elif defined(__WXGTK20__)
|
|
#include "wx/gtk/msgdlg.h"
|
|
#elif defined(__WXMAC__)
|
|
#include "wx/osx/msgdlg.h"
|
|
#elif defined(__WXPM__)
|
|
#include "wx/os2/msgdlg.h"
|
|
#endif
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxMessageBox: the simplest way to use wxMessageDialog
|
|
// ----------------------------------------------------------------------------
|
|
|
|
int WXDLLIMPEXP_CORE wxMessageBox(const wxString& message,
|
|
const wxString& caption = wxMessageBoxCaptionStr,
|
|
long style = wxOK | wxCENTRE,
|
|
wxWindow *parent = NULL,
|
|
int x = wxDefaultCoord, int y = wxDefaultCoord);
|
|
|
|
#endif // wxUSE_MSGDLG
|
|
|
|
#endif // _WX_MSGDLG_H_BASE_
|