Applied slightly-modified patch 1826540 from Gareth Simpson.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49763 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Elliott
2007-11-09 18:11:17 +00:00
parent 6e2b69c66f
commit e9871aaf86
3 changed files with 257 additions and 1 deletions

View File

@@ -1 +1,63 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/cocoa/dirdlg.h
// Purpose: wxMessageDialog class
// Author: Gareth Simpson
// Created: 2007-10-29
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_COCOA_MSGDLG_H_
#define _WX_COCOA_MSGDLG_H_
#include "wx/msgdlg.h"
DECLARE_WXCOCOA_OBJC_CLASS(NSAlert);
#define wxMessageDialog wxCocoaMessageDialog
//-------------------------------------------------------------------------
// wxMsgDialog
//-------------------------------------------------------------------------
class WXDLLEXPORT wxMessageDialog: public wxMessageDialogBase
{
DECLARE_DYNAMIC_CLASS(wxMessageDialog)
DECLARE_NO_COPY_CLASS(wxMessageDialog)
public:
wxMessageDialog(wxWindow *parent,
const wxString& message,
const wxString& caption = wxMessageBoxCaptionStr,
long style = wxOK|wxCENTRE,
const wxPoint& pos = wxDefaultPosition);
virtual ~wxCocoaMessageDialog();
virtual int ShowModal();
// customization of the message box
virtual bool SetYesNoLabels(const wxString& yes,const wxString& no);
virtual bool SetYesNoCancelLabels(const wxString& yes, const wxString& no, const wxString& cancel);
virtual bool SetOKLabel(const wxString& ok);
virtual bool SetOKCancelLabels(const wxString& ok, const wxString& cancel);
protected:
// not supported for message dialog
virtual void DoSetSize(int WXUNUSED(x), int WXUNUSED(y),
int WXUNUSED(width), int WXUNUSED(height),
int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {}
private:
wxString m_yes,
m_no,
m_ok,
m_cancel;
};
#endif // _WX_MSGDLG_H_

View File

@@ -111,11 +111,12 @@ protected:
#if defined(__WX_COMPILING_MSGDLGG_CPP__) || \
defined(__WXUNIVERSAL__) || defined(__WXGPE__) || \
defined(__WXCOCOA__) || \
(defined(__WXGTK__) && !defined(__WXGTK20__))
#include "wx/generic/msgdlgg.h"
#define wxMessageDialog wxGenericMessageDialog
#elif defined(__WXCOCOA__)
#include "wx/cocoa/msgdlg.h"
#elif defined(__WXPALMOS__)
#include "wx/palmos/msgdlg.h"
#elif defined(__WXMSW__)

View File

@@ -1 +1,194 @@
/////////////////////////////////////////////////////////////////////////////
// Name: src/cocoa/dirdlg.mm
// Purpose: wxMessageDialog for wxCocoa
// Author: Gareth Simpson
// Created: 2007-10-09
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#if wxUSE_MSGDLG
#include "wx/msgdlg.h"
#ifndef WX_PRECOMP
#include "wx/app.h"
#endif
#include "wx/cocoa/autorelease.h"
#include "wx/cocoa/string.h"
#import <AppKit/NSAlert.h>
// ============================================================================
// implementation
// ============================================================================
IMPLEMENT_CLASS(wxCocoaMessageDialog, wxDialog)
// ----------------------------------------------------------------------------
// wxDirDialog
// ----------------------------------------------------------------------------
wxCocoaMessageDialog::wxCocoaMessageDialog(wxWindow *parent,
const wxString& message,
const wxString& caption,
long style,
const wxPoint& pos) : wxMessageDialogBase(parent,message,caption,style)
{
//m_caption = caption;
//m_message = message;
//wxTopLevelWindows.Append((wxWindowBase*)this);
wxTopLevelWindows.Append(this);
wxASSERT(CreateBase(parent,wxID_ANY,wxDefaultPosition,wxDefaultSize,style,wxDefaultValidator,wxDialogNameStr));
if ( parent )
parent->AddChild(this);
m_cocoaNSWindow = nil;
m_cocoaNSView = nil;
m_yes = _("Yes");
m_no = _("No");
m_ok = _("OK");
m_cancel = _("Cancel");
}
wxCocoaMessageDialog::~wxCocoaMessageDialog()
{
}
int wxCocoaMessageDialog::ShowModal()
{
wxAutoNSAutoreleasePool thePool;
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
const long style = GetMessageDialogStyle();
NSAlertStyle nsStyle = NSInformationalAlertStyle;
if (style & wxICON_EXCLAMATION)
nsStyle = NSWarningAlertStyle;
else if (style & wxICON_HAND)
nsStyle = NSCriticalAlertStyle;
else if (style & wxICON_INFORMATION)
nsStyle = NSInformationalAlertStyle;
else if (style & wxICON_QUESTION)
nsStyle = NSInformationalAlertStyle;
[alert setAlertStyle:nsStyle];
// work out what to display
// if the extended text is empty then we use the caption as the title
// and the message as the text (for backwards compatibility)
// but if the extended message is not empty then we use the message as the title
// and the extended message as the text because that makes more sense
if (m_extendedMessage.empty())
{
[alert setMessageText:wxNSStringWithWxString(m_caption)];
[alert setInformativeText:wxNSStringWithWxString(m_message)];
}
else
{
[alert setMessageText:wxNSStringWithWxString(m_message)];
[alert setInformativeText:wxNSStringWithWxString(m_extendedMessage)];
}
// The wxReturn value corresponding to each button
int buttonId[4] = { 0, 0, 0, wxID_CANCEL /* time-out */ };
if (style & wxYES_NO)
{
if ( style & wxNO_DEFAULT )
{
[alert addButtonWithTitle:wxNSStringWithWxString(m_no)];
[alert addButtonWithTitle:wxNSStringWithWxString(m_yes)];
buttonId[0] = wxID_NO;
buttonId[1] = wxID_YES;
}
else
{
[alert addButtonWithTitle:wxNSStringWithWxString(m_yes)];
[alert addButtonWithTitle:wxNSStringWithWxString(m_no)];
buttonId[0] = wxID_YES;
buttonId[1] = wxID_NO;
}
if (style & wxCANCEL)
{
[alert addButtonWithTitle:wxNSStringWithWxString(m_cancel)];
buttonId[2] = wxID_CANCEL;
}
}
else
{
// the MSW implementation even shows an OK button if it is not specified, we'll do the same
buttonId[0] = wxID_OK;
// using null as default title does not work on earlier systems
[alert addButtonWithTitle:wxNSStringWithWxString(m_ok)];
if (style & wxCANCEL)
{
[alert addButtonWithTitle:wxNSStringWithWxString(m_cancel)];
buttonId[1] = wxID_CANCEL;
}
}
int ret = [alert runModal];
return buttonId[ret-NSAlertFirstButtonReturn];
}
bool wxCocoaMessageDialog::SetYesNoLabels(const wxString& yes,const wxString& no)
{
m_yes = yes;
m_yes.Replace(_("&"),_(""));
m_no = no;
m_no.Replace(_("&"),_(""));
return true;
}
bool wxCocoaMessageDialog::SetYesNoCancelLabels(const wxString& yes, const wxString& no, const wxString& cancel)
{
m_yes = yes;
m_yes.Replace(_("&"),_(""));
m_no = no;
m_no.Replace(_("&"),_(""));
m_cancel = cancel;
m_cancel.Replace(_("&"),_(""));
return true;
}
bool wxCocoaMessageDialog::SetOKLabel(const wxString& ok)
{
m_ok = ok;
m_ok.Replace(_("&"),_(""));
return true;
}
bool wxCocoaMessageDialog::SetOKCancelLabels(const wxString& ok, const wxString& cancel)
{
m_ok = ok;
m_ok.Replace(_("&"),_(""));
m_cancel = cancel;
m_cancel.Replace(_("&"),_(""));
return true;
}
#endif // wxUSE_DIRDLG