]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/msgdlg.cpp
Fix for non-CG mode
[wxWidgets.git] / src / mac / carbon / msgdlg.cpp
index 5aa8554038e4959c5e492e2f80a5c1c413f5f1ec..ade6197a84faffd33af9cbe026465e1f41bfcdd1 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
-// Name:        msgdlg.cpp
+// Name:        src/mac/carbon/msgdlg.cpp
 // Purpose:     wxMessageDialog
-// Author:      AUTHOR
+// Author:      Stefan Csomor
 // Modified by:
 // Created:     04/01/98
-// RCS-ID:      $$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// RCS-ID:      $Id$
+// Copyright:   (c) Stefan Csomor
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "msgdlg.h"
-#endif
+#include "wx/wxprec.h"
 
 #include "wx/msgdlg.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/intl.h"
+    #include "wx/app.h"
+#endif
+
 #include "wx/mac/uma.h"
 
-#if !USE_SHARED_LIBRARY
+
 IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
-#endif
 
-#define kMacOKAlertResourceID 128
-#define kMacYesNoAlertResourceID 129
-#define kMacYesNoCancelAlertResourceID 130
-#define kMacNoYesAlertResourceID 131
-#define kMacNoYesCancelAlertResourceID 132
 
-short language = 0 ;
+wxMessageDialog::wxMessageDialog(wxWindow *parent,
+                                 const wxString& message,
+                                 const wxString& caption,
+                                 long style,
+                                 const wxPoint& pos)
+               : wxMessageDialogBase(parent, message, caption, style)
+{
+    m_yes = _("Yes");
+    m_no  = _("No");
+    m_ok  = _("OK");
+    m_cancel = _("Cancel");
+}
 
-void wxMacConvertNewlines( const char *source , char * destination )
+bool wxMessageDialog::SetYesNoLabels(const wxString& yes,const wxString& no)
 {
-       const char *s = source ;
-       char *d = destination ;
-       
-       while( *s  )
-       {
-               switch( *s )
-               {
-                       case 0x0a :
-                               *d++ = 0x0d ;
-                               ++s ;
-                               break ;
-                       case 0x0d :
-                               *d++ = 0x0d ;
-                               ++s ;
-                               if ( *s == 0x0a )
-                                       ++s ;
-                               break ;
-                       default :
-                               *d++ = *s++ ;
-                               break ;
-               }
-       }
-       *d = 0 ;
+    m_yes = yes;
+    m_no = no;
+    return true;
 }
 
-wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
-        long style, const wxPoint& pos)
+bool wxMessageDialog::SetYesNoCancelLabels(const wxString& yes, const wxString& no, const wxString& cancel)
 {
-    m_caption = caption;
-    m_message = message;
-    m_dialogStyle = style;
-    m_parent = parent;
+    m_yes = yes;
+    m_no = no;
+    m_cancel = cancel;
+    return true;
 }
 
-int wxMessageDialog::ShowModal()
+bool wxMessageDialog::SetOKLabel(const wxString& ok)
 {
-       int resultbutton = wxID_CANCEL ;
-
-       short result ;
-       Str255 pascalTitle ;
-       Str255 pascalText ;
-       
-       strcpy( (char*) pascalTitle , m_caption ) ;
-       c2pstr( (char*) pascalTitle ) ;
-       strcpy( (char*) pascalText , m_message ) ;
-       wxMacConvertNewlines( (char*)pascalText ,(char*) pascalText) ;
-       c2pstr( (char*) pascalText ) ;
-
-       if ( !UMAHasAppearance() )
-       {
-               int resourceID ;
-               
-         if (m_dialogStyle & wxYES_NO)
-         {
-           if (m_dialogStyle & wxCANCEL)
-             resourceID = kMacYesNoCancelAlertResourceID;
-           else
-             resourceID = kMacYesNoAlertResourceID + language * 10 ;
-         }
-         else if (m_dialogStyle & wxOK)
-         {
-           if (m_dialogStyle & wxCANCEL)
-             resourceID = kMacOKAlertResourceID; // wrong
-           else
-             resourceID = kMacOKAlertResourceID;
-         }
-               else
-               {
-                       return resultbutton ;
-               }
-       /*
-         if (hWnd)
-           msStyle |= MB_APPLMODAL;
-         else
-           msStyle |= MB_TASKMODAL;
-       */
-
-               ParamText( pascalTitle , pascalText , NULL , NULL ) ;
-
-         if (m_dialogStyle & wxICON_EXCLAMATION)
-                               result = Alert( resourceID , NULL ) ;
-         else if (m_dialogStyle & wxICON_HAND)
-                       result = StopAlert( resourceID , NULL ) ;
-         else if (m_dialogStyle & wxICON_INFORMATION)
-                               result = NoteAlert( resourceID , NULL ) ;
-         else if (m_dialogStyle & wxICON_QUESTION)
-                               result = CautionAlert( resourceID , NULL ) ;
-               else
-                               result = Alert( resourceID , NULL ) ;
-
-               resultbutton = result ;
-               
-         if (m_dialogStyle & wxYES_NO)
-         {
-           if (m_dialogStyle & wxCANCEL)
-           {
-                               switch( result )
-                               {
-                                       case 1 :
-                                               resultbutton = wxID_YES ;
-                                               break ;
-                                       case 2 :
-                                               resultbutton = wxID_NO ;
-                                               break ;
-                                       case 3 :
-                                               resultbutton = wxID_CANCEL ;
-                                               break ;
-                               }
-           }
-           else
-           {
-                               switch( result )
-                               {
-                                       case 1 :
-                                               resultbutton = wxID_YES ;
-                                               break ;
-                                       case 2 :
-                                               resultbutton = wxID_NO ;
-                                               break ;
-                                       case 3 :
-                                               break ;
-                               }
-                       }
-               }
-       }
-       else
-       {
-               AlertStdAlertParamRec   param;
-
-               param.movable           = true;
-               param.filterProc        = NULL ;
-               
-         if (m_dialogStyle & wxYES_NO)
-         {
-           if (m_dialogStyle & wxCANCEL)
-           {
-                               param.defaultText       = "\pYes" ;
-                               param.cancelText        = (StringPtr) kAlertDefaultCancelText;
-                               param.otherText         = "\pNo";
-                               param.helpButton        = false ;
-                               param.defaultButton = kAlertStdAlertOKButton;
-                               param.cancelButton      = kAlertStdAlertCancelButton;
-           }
-           else
-           {
-                               param.defaultText       = "\pYes" ;
-                               param.cancelText        = NULL;
-                               param.otherText         = "\pNo";
-                               param.helpButton        = false ;
-                               param.defaultButton = kAlertStdAlertOKButton;
-                               param.cancelButton      = 0;
-           }
-         }
-         else if (m_dialogStyle & wxOK)
-         {
-           if (m_dialogStyle & wxCANCEL)
-           {
-               // thats a cancel missing
-                               param.defaultText       = (StringPtr) kAlertDefaultOKText ;
-                               param.cancelText        = NULL;
-                               param.otherText         = NULL;
-                               param.helpButton        = false ;
-                               param.defaultButton = kAlertStdAlertOKButton;
-                               param.cancelButton      = 0;
-           }
-           else
-           {
-                               param.defaultText       = (StringPtr) kAlertDefaultOKText ;
-                               param.cancelText        = NULL;
-                               param.otherText         = NULL;
-                               param.helpButton        = false ;
-                               param.defaultButton = kAlertStdAlertOKButton;
-                               param.cancelButton      = 0;
-           }
-         }
-               else
-               {
-                       return resultbutton ;
-               }
-
-               param.position          = 0;
-
-         if (m_dialogStyle & wxICON_EXCLAMATION)
-                               StandardAlert( kAlertNoteAlert, pascalTitle, pascalText, &param, &result );
-         else if (m_dialogStyle & wxICON_HAND)
-                               StandardAlert( kAlertStopAlert, pascalTitle, pascalText, &param, &result );
-         else if (m_dialogStyle & wxICON_INFORMATION)
-                       StandardAlert( kAlertNoteAlert, pascalTitle, pascalText, &param, &result );
-         else if (m_dialogStyle & wxICON_QUESTION)
-                               StandardAlert( kAlertCautionAlert, pascalTitle, pascalText, &param, &result );
-               else
-                               StandardAlert( kAlertPlainAlert, pascalTitle, pascalText, &param, &result );
-
-               if (m_dialogStyle & wxOK)
-         {
-           if (m_dialogStyle & wxCANCEL)                               
-           {
-               //TODO add Cancelbutton
-               switch( result )
-                               {
-                                       case 1 :
-                                               resultbutton = wxID_OK ;
-                                               break ;
-                                       case 2 :
-                                               break ;
-                                       case 3 :
-                                               break ;
-                               }
-                       }
-                       else
-                       {
-               switch( result )
-                               {
-                                       case 1 :
-                                               resultbutton = wxID_OK ;
-                                               break ;
-                                       case 2 :
-                                               break ;
-                                       case 3 :
-                                               break ;
-                               }
-                       }
-               }
-         else if (m_dialogStyle & wxYES_NO)
-         {
-           if (m_dialogStyle & wxCANCEL)
-           {
-                               switch( result )
-                               {
-                                       case 1 :
-                                               resultbutton = wxID_YES ;
-                                               break ;
-                                       case 2 :
-                                               resultbutton = wxID_CANCEL ;
-                                               break ;
-                                       case 3 :
-                                               resultbutton = wxID_NO ;
-                                               break ;
-                               }
-           }
-           else
-           {
-                               switch( result )
-                               {
-                                       case 1 :
-                                               resultbutton = wxID_YES ;
-                                               break ;
-                                       case 2 :
-                                               break ;
-                                       case 3 :
-                                               resultbutton = wxID_NO ;
-                                               break ;
-                               }
-                       }
-               } 
-       }
-       return resultbutton ;
+    m_ok = ok;
+    return true;
 }
 
+bool wxMessageDialog::SetOKCancelLabels(const wxString& ok, const wxString& cancel)
+{
+    m_ok = ok;
+    m_cancel = cancel;
+    return true;
+}
+
+int wxMessageDialog::ShowModal()
+{
+    int resultbutton = wxID_CANCEL;
+
+    const long style = GetMessageDialogStyle();
+
+    wxASSERT_MSG( (style & 0x3F) != wxYES, wxT("this style is not supported on Mac") );
+
+    AlertType alertType = kAlertPlainAlert;
+    if (style & wxICON_EXCLAMATION)
+        alertType = kAlertNoteAlert;
+    else if (style & wxICON_HAND)
+        alertType = kAlertStopAlert;
+    else if (style & wxICON_INFORMATION)
+        alertType = kAlertNoteAlert;
+    else if (style & wxICON_QUESTION)
+        alertType = kAlertCautionAlert;
+
+
+    // 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
+
+    wxString msgtitle,msgtext;
+    if(m_extendedMessage.IsEmpty())
+    {
+        msgtitle = m_caption;
+        msgtext  = m_message;
+    }
+    else
+    {
+        msgtitle = m_message;
+        msgtext  = m_extendedMessage;
+    }
+
+
+#if TARGET_API_MAC_OSX
+    if ( !wxIsMainThread() )
+    {
+        CFStringRef defaultButtonTitle = NULL;
+        CFStringRef alternateButtonTitle = NULL;
+        CFStringRef otherButtonTitle = NULL;
+
+        wxMacCFStringHolder cfTitle( msgtitle, m_font.GetEncoding() );
+        wxMacCFStringHolder cfText( msgtext, m_font.GetEncoding() );
+
+        wxMacCFStringHolder cfNoString( m_no.c_str(), m_font.GetEncoding() );
+        wxMacCFStringHolder cfYesString( m_yes.c_str(), m_font.GetEncoding() );
+        wxMacCFStringHolder cfOKString( m_ok.c_str() , m_font.GetEncoding()) ;
+        wxMacCFStringHolder cfCancelString( m_cancel.c_str(), m_font.GetEncoding() );
+
+        int buttonId[4] = { 0, 0, 0, wxID_CANCEL /* time-out */ };
+
+        if (style & wxYES_NO)
+        {
+            if ( style & wxNO_DEFAULT )
+            {
+                defaultButtonTitle = cfNoString;
+                alternateButtonTitle = cfYesString;
+                buttonId[0] = wxID_NO;
+                buttonId[1] = wxID_YES;
+            }
+            else
+            {
+                defaultButtonTitle = cfYesString;
+                alternateButtonTitle = cfNoString;
+                buttonId[0] = wxID_YES;
+                buttonId[1] = wxID_NO;
+            }
+            if (style & wxCANCEL)
+            {
+                otherButtonTitle = cfCancelString;
+                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
+            defaultButtonTitle = cfOKString;
+            if (style & wxCANCEL)
+            {
+                alternateButtonTitle = cfCancelString;
+                buttonId[1] = wxID_CANCEL;
+            }
+        }
+
+        CFOptionFlags exitButton;
+        OSStatus err = CFUserNotificationDisplayAlert(
+            0, alertType, NULL, NULL, NULL, cfTitle, cfText,
+            defaultButtonTitle, alternateButtonTitle, otherButtonTitle, &exitButton );
+        if (err == noErr)
+            resultbutton = buttonId[exitButton];
+    }
+    else
+#endif
+    {
+        short result;
+
+        AlertStdCFStringAlertParamRec param;
+        wxMacCFStringHolder cfNoString( m_no.c_str(), m_font.GetEncoding() );
+        wxMacCFStringHolder cfYesString( m_yes.c_str(), m_font.GetEncoding() );
+        wxMacCFStringHolder cfOKString( m_ok.c_str(), m_font.GetEncoding() );
+        wxMacCFStringHolder cfCancelString( m_cancel.c_str(), m_font.GetEncoding() );
+
+        wxMacCFStringHolder cfTitle( msgtitle, m_font.GetEncoding() );
+        wxMacCFStringHolder cfText( msgtext, m_font.GetEncoding() );
+
+        param.movable = true;
+        param.flags = 0;
+        param.version = kStdCFStringAlertVersionOne;
+
+        bool skipDialog = false;
+
+        if (style & wxYES_NO)
+        {
+            if (style & wxCANCEL)
+            {
+                param.defaultText = cfYesString;
+                param.cancelText = cfCancelString;
+                param.otherText = cfNoString;
+                param.helpButton = false;
+                param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton;
+                param.cancelButton = kAlertStdAlertCancelButton;
+            }
+            else
+            {
+                param.defaultText = cfYesString;
+                param.cancelText = NULL;
+                param.otherText = cfNoString;
+                param.helpButton = false;
+                param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton;
+                param.cancelButton = 0;
+            }
+        }
+        // the MSW implementation even shows an OK button if it is not specified, we'll do the same
+        else
+        {
+            if (style & wxCANCEL)
+            {
+                // that's a cancel missing
+                param.defaultText = cfOKString;
+                param.cancelText = cfCancelString;
+                param.otherText = NULL;
+                param.helpButton = false;
+                param.defaultButton = kAlertStdAlertOKButton;
+                param.cancelButton = 0;
+            }
+            else
+            {
+                param.defaultText = cfOKString;
+                param.cancelText = NULL;
+                param.otherText = NULL;
+                param.helpButton = false;
+                param.defaultButton = kAlertStdAlertOKButton;
+                param.cancelButton = 0;
+            }
+        }
+
+        param.position = kWindowDefaultPosition;
+        if ( !skipDialog )
+        {
+            DialogRef alertRef;
+            CreateStandardAlert( alertType, cfTitle, cfText, &param, &alertRef );
+            RunStandardAlert( alertRef, NULL, &result );
+        }
+        else
+        {
+            return wxID_CANCEL;
+        }
+
+        if (style & wxOK)
+        {
+            switch ( result )
+            {
+            case 1:
+                resultbutton = wxID_OK;
+                break;
+
+            case 2:
+                // TODO: add Cancel button
+                // if (style & wxCANCEL)
+                //     resultbutton = wxID_CANCEL;
+                break;
+
+            case 3:
+            default:
+                break;
+            }
+        }
+        else if (style & wxYES_NO)
+        {
+            switch ( result )
+            {
+            case 1:
+                resultbutton = wxID_YES;
+                break;
+
+            case 2:
+                if (!(style & wxCANCEL))
+                    resultbutton = wxID_CANCEL;
+                break;
+
+            case 3:
+                resultbutton = wxID_NO;
+                break;
+
+            default:
+                break;
+            }
+        }
+    }
+
+    return resultbutton;
+}