Updated list of subprojects.
[wxWidgets.git] / src / mac / carbon / msgdlg.cpp
index 7b7109b668698fe47d0ba9e311c6ce83dc1b8a8b..fe6cf21729473505da280cda686b889a70f02737 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/app.h"
 #include "wx/msgdlg.h"
-#include "wx/intl.h"
-#include "wx/mac/uma.h"
 
-#if !USE_SHARED_LIBRARY
-IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
+#ifndef WX_PRECOMP
+    #include "wx/intl.h"
+    #include "wx/app.h"
 #endif
 
-short language = 0 ;
+#include "wx/mac/uma.h"
 
-void wxMacConvertNewlines( const char *source , char * destination ) ;
-void wxMacConvertNewlines( const char *source , char * destination )
-{
-       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 ;
-}
 
-wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
-        long style, const wxPoint& pos)
+IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
+
+
+wxMessageDialog::wxMessageDialog(
+    wxWindow *parent, const wxString& message, const wxString& caption,
+    long style, const wxPoint& pos )
 {
     m_caption = caption;
     m_message = message;
-    m_dialogStyle = style;
     m_parent = parent;
+    SetMessageDialogStyle(style);
 }
 
 int wxMessageDialog::ShowModal()
 {
-       int resultbutton = wxID_CANCEL ;
-
-       short result ;
-       Str255 pascalTitle ;
-       Str255 pascalText ;
-       char   cText[2048] ;
-
-       Str255 yesPString ;
-       Str255 noPString ;
-       
-       wxMacStringToPascal( m_caption , pascalTitle ) ;
-       wxMacStringToPascal( _("Yes") , yesPString ) ;
-       wxMacStringToPascal(  _("No") , noPString ) ;
-       
-       if (wxApp::s_macDefaultEncodingIsPC)
-       {
-               strcpy(cText , wxMacMakeMacStringFromPC( m_message) ) ;
-       }
-       else
-       {
-               strcpy( cText , m_message ) ;
-       }
-
-       wxMacConvertNewlines( cText , cText ) ;
-       CopyCStringToPascal( cText , pascalText ) ;
-
-       wxASSERT_MSG( ( m_dialogStyle & 0x3F ) != wxYES , "this style is not supported on mac" ) ;
-
-
-       AlertStdAlertParamRec   param;
-
-       param.movable           = true;
-       param.filterProc        = NULL ;
-       
-  if (m_dialogStyle & wxYES_NO)
-  {
-    if (m_dialogStyle & wxCANCEL)
+    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;
+
+#if TARGET_API_MAC_OSX
+    CFStringRef defaultButtonTitle = NULL;
+    CFStringRef alternateButtonTitle = NULL;
+    CFStringRef otherButtonTitle = NULL;
+
+    wxMacCFStringHolder cfTitle( m_caption, m_font.GetEncoding() );
+    wxMacCFStringHolder cfText( m_message, m_font.GetEncoding() );
+
+    wxMacCFStringHolder cfNoString( _("No"), m_font.GetEncoding() );
+    wxMacCFStringHolder cfYesString( _("Yes"), m_font.GetEncoding() );
+    wxMacCFStringHolder cfOKString( _("OK") , m_font.GetEncoding()) ;
+    wxMacCFStringHolder cfCancelString( _("Cancel"), m_font.GetEncoding() );
+
+    int buttonId[4] = { 0, 0, 0, wxID_CANCEL /* time-out */ };
+
+    if (style & wxYES_NO)
     {
-                       param.defaultText       = yesPString ;
-                       param.cancelText        = (StringPtr) kAlertDefaultCancelText;
-                       param.otherText         = noPString ;
-                       param.helpButton        = false ;
-                       param.defaultButton = kAlertStdAlertOKButton;
-                       param.cancelButton      = kAlertStdAlertCancelButton;
+        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
     {
-                       param.defaultText       = yesPString ;
-                       param.cancelText        = NULL;
-                       param.otherText         = noPString ;
-                       param.helpButton        = false ;
-                       param.defaultButton = kAlertStdAlertOKButton;
-                       param.cancelButton      = 0;
+        // 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;
+        }
     }
-  }
-  else if (m_dialogStyle & wxOK)
-  {
-    if (m_dialogStyle & wxCANCEL)
+
+    CFOptionFlags exitButton;
+    OSStatus err = CFUserNotificationDisplayAlert(
+        0, alertType, NULL, NULL, NULL, cfTitle, cfText,
+        defaultButtonTitle, alternateButtonTitle, otherButtonTitle, &exitButton );
+    if (err == noErr)
+        resultbutton = buttonId[exitButton];
+
+#else
+    short result;
+
+#if TARGET_CARBON
+    if ( UMAGetSystemVersion() >= 0x1000 )
     {
-       // thats a cancel missing
-                       param.defaultText       = (StringPtr) kAlertDefaultOKText ;
-                       param.cancelText        = NULL;
-                       param.otherText         = NULL;
-                       param.helpButton        = false ;
-                       param.defaultButton = kAlertStdAlertOKButton;
-                       param.cancelButton      = 0;
+        AlertStdCFStringAlertParamRec param;
+        wxMacCFStringHolder cfNoString( _("No"), m_font.GetEncoding() );
+        wxMacCFStringHolder cfYesString( _("Yes"), m_font.GetEncoding() );
+
+        wxMacCFStringHolder cfTitle( m_caption, m_font.GetEncoding() );
+        wxMacCFStringHolder cfText( m_message, 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 = (CFStringRef) kAlertDefaultCancelText;
+                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 = (CFStringRef) kAlertDefaultOKText;
+                param.cancelText = (CFStringRef) kAlertDefaultCancelText;
+                param.otherText = NULL;
+                param.helpButton = false;
+                param.defaultButton = kAlertStdAlertOKButton;
+                param.cancelButton = 0;
+            }
+            else
+            {
+                param.defaultText = (CFStringRef) kAlertDefaultOKText;
+                param.cancelText = NULL;
+                param.otherText = NULL;
+                param.helpButton = false;
+                param.defaultButton = kAlertStdAlertOKButton;
+                param.cancelButton = 0;
+            }
+        }
+#if 0
+        else
+        {
+            skipDialog = true;
+        }
+#endif
+
+        param.position = kWindowDefaultPosition;
+        if ( !skipDialog )
+        {
+            DialogRef alertRef;
+            CreateStandardAlert( alertType, cfTitle, cfText, &param, &alertRef );
+            RunStandardAlert( alertRef, NULL, &result );
+        }
+        else
+        {
+            return wxID_CANCEL;
+        }
     }
     else
+#endif
     {
-                       param.defaultText       = (StringPtr) kAlertDefaultOKText ;
-                       param.cancelText        = NULL;
-                       param.otherText         = NULL;
-                       param.helpButton        = false ;
-                       param.defaultButton = kAlertStdAlertOKButton;
-                       param.cancelButton      = 0;
+        AlertStdAlertParamRec param;
+        Str255 yesPString, noPString;
+        Str255 pascalTitle, pascalText;
+
+        wxMacStringToPascal( m_caption, pascalTitle );
+        wxMacStringToPascal( _("Yes"), yesPString );
+        wxMacStringToPascal( _("No"), noPString );
+        wxMacStringToPascal( m_message, pascalText );
+
+        param.movable = true;
+        param.filterProc = NULL;
+
+        if (style & wxYES_NO)
+        {
+            if (style & wxCANCEL)
+            {
+                param.defaultText = yesPString;
+                param.cancelText = (StringPtr) kAlertDefaultCancelText;
+                param.otherText = noPString;
+                param.helpButton = false;
+                param.defaultButton = kAlertStdAlertOKButton;
+                param.cancelButton = kAlertStdAlertCancelButton;
+            }
+            else
+            {
+                param.defaultText = yesPString;
+                param.cancelText = NULL;
+                param.otherText = noPString;
+                param.helpButton = false;
+                param.defaultButton = kAlertStdAlertOKButton;
+                param.cancelButton = 0;
+            }
+        }
+        else if (style & wxOK)
+        {
+            if (style & wxCANCEL)
+            {
+                param.defaultText = (StringPtr) kAlertDefaultOKText;
+                param.cancelText = (StringPtr) kAlertDefaultCancelText;
+                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;
+        StandardAlert( alertType, pascalTitle, pascalText, &param, &result );
     }
-  }
-       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)
+
+    if (style & wxOK)
     {
-                       switch( result )
-                       {
-                               case 1 :
-                                       resultbutton = wxID_YES ;
-                                       break ;
-                               case 2 :
-                                       resultbutton = wxID_CANCEL ;
-                                       break ;
-                               case 3 :
-                                       resultbutton = wxID_NO ;
-                                       break ;
-                       }
+        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
+    else if (style & wxYES_NO)
     {
-                       switch( result )
-                       {
-                               case 1 :
-                                       resultbutton = wxID_YES ;
-                                       break ;
-                               case 2 :
-                                       break ;
-                               case 3 :
-                                       resultbutton = wxID_NO ;
-                                       break ;
-                       }
-               }
-       } 
-
-       return resultbutton ;
-}
+        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;
+        }
+    }
+#endif
+
+    return resultbutton;
+}