]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/msgdlg.cpp
make sure we always restore the passed in cg in a paint event
[wxWidgets.git] / src / mac / carbon / msgdlg.cpp
index 315012b368d53923a214693660bb77ab1e71bc40..fe6cf21729473505da280cda686b889a70f02737 100644 (file)
 
 #include "wx/wxprec.h"
 
-#include "wx/app.h"
 #include "wx/msgdlg.h"
-#include "wx/intl.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/intl.h"
+    #include "wx/app.h"
+#endif
+
 #include "wx/mac/uma.h"
 
+
 IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
 
-wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
-                                 long style, const wxPoint& pos)
+
+wxMessageDialog::wxMessageDialog(
+    wxWindow *parent, const wxString& message, const wxString& caption,
+    long style, const wxPoint& pos )
 {
     m_caption = caption;
     m_message = message;
@@ -29,233 +36,268 @@ wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, cons
 
 int wxMessageDialog::ShowModal()
 {
-    int resultbutton = wxID_CANCEL ;
-
-    short result ;
+    int resultbutton = wxID_CANCEL;
 
     const long style = GetMessageDialogStyle();
 
-    wxASSERT_MSG( ( style & 0x3F ) != wxYES , wxT("this style is not supported on mac") ) ;
+    wxASSERT_MSG( (style & 0x3F) != wxYES, wxT("this style is not supported on Mac") );
 
-    AlertType alertType = kAlertPlainAlert ;
+    AlertType alertType = kAlertPlainAlert;
     if (style & wxICON_EXCLAMATION)
-        alertType = kAlertNoteAlert ;
+        alertType = kAlertNoteAlert;
     else if (style & wxICON_HAND)
-        alertType = kAlertStopAlert ;
+        alertType = kAlertStopAlert;
     else if (style & wxICON_INFORMATION)
-        alertType = kAlertNoteAlert ;
+        alertType = kAlertNoteAlert;
     else if (style & wxICON_QUESTION)
-        alertType = kAlertCautionAlert ;
+        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)
+    {
+        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
+    short result;
 
 #if TARGET_CARBON
     if ( UMAGetSystemVersion() >= 0x1000 )
     {
-        AlertStdCFStringAlertParamRec param ;
-        wxMacCFStringHolder cfNoString(_("No") , m_font.GetEncoding()) ;
-        wxMacCFStringHolder cfYesString( _("Yes") , m_font.GetEncoding()) ;
+        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());
+        wxMacCFStringHolder cfTitle( m_caption, m_font.GetEncoding() );
+        wxMacCFStringHolder cfText( m_message, m_font.GetEncoding() );
 
         param.movable = true;
-        param.flags = 0 ;
-        param.version = kStdCFStringAlertVersionOne ;
+        param.flags = 0;
+        param.version = kStdCFStringAlertVersionOne;
 
-        bool skipDialog = false ;
+        bool skipDialog = false;
 
         if (style & wxYES_NO)
         {
             if (style & wxCANCEL)
             {
-                param.defaultText     = cfYesString ;
-                param.cancelText     = (CFStringRef) kAlertDefaultCancelText;
-                param.otherText     = cfNoString ;
-                param.helpButton     = false ;
+                param.defaultText = cfYesString;
+                param.cancelText = (CFStringRef) kAlertDefaultCancelText;
+                param.otherText = cfNoString;
+                param.helpButton = false;
                 param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton;
-                param.cancelButton     = kAlertStdAlertCancelButton;
+                param.cancelButton = kAlertStdAlertCancelButton;
             }
             else
             {
-                param.defaultText     = cfYesString ;
-                param.cancelText     = NULL;
-                param.otherText     = cfNoString ;
-                param.helpButton     = false ;
+                param.defaultText = cfYesString;
+                param.cancelText = NULL;
+                param.otherText = cfNoString;
+                param.helpButton = false;
                 param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton;
-                param.cancelButton     = 0;
+                param.cancelButton = 0;
             }
         }
-        // the msw implementation even shows an ok button if it is not specified, we'll do the same
+        // the MSW implementation even shows an OK button if it is not specified, we'll do the same
         else
         {
             if (style & wxCANCEL)
             {
-                // thats a cancel missing
-                param.defaultText     = (CFStringRef) kAlertDefaultOKText ;
-                param.cancelText     = (CFStringRef) kAlertDefaultCancelText ;
-                param.otherText     = NULL;
-                param.helpButton     = false ;
+                // 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;
+                param.cancelButton = 0;
             }
             else
             {
-                param.defaultText     = (CFStringRef) kAlertDefaultOKText ;
-                param.cancelText     = NULL;
-                param.otherText     = NULL;
-                param.helpButton     = false ;
+                param.defaultText = (CFStringRef) kAlertDefaultOKText;
+                param.cancelText = NULL;
+                param.otherText = NULL;
+                param.helpButton = false;
                 param.defaultButton = kAlertStdAlertOKButton;
-                param.cancelButton     = 0;
+                param.cancelButton = 0;
             }
         }
-        /*
+#if 0
         else
         {
-            skipDialog = true ;
+            skipDialog = true;
         }
-        */
+#endif
 
         param.position = kWindowDefaultPosition;
         if ( !skipDialog )
         {
-            DialogRef alertRef ;
-            CreateStandardAlert( alertType , cfTitle , cfText , &param , &alertRef ) ;
-            RunStandardAlert( alertRef , NULL , &result ) ;
+            DialogRef alertRef;
+            CreateStandardAlert( alertType, cfTitle, cfText, &param, &alertRef );
+            RunStandardAlert( alertRef, NULL, &result );
+        }
+        else
+        {
+            return wxID_CANCEL;
         }
-        if ( skipDialog )
-            return wxID_CANCEL ;
     }
     else
 #endif
     {
-        AlertStdAlertParamRec    param;
+        AlertStdAlertParamRec param;
+        Str255 yesPString, noPString;
+        Str255 pascalTitle, pascalText;
 
-        Str255 yesPString ;
-        Str255 noPString ;
+        wxMacStringToPascal( m_caption, pascalTitle );
+        wxMacStringToPascal( _("Yes"), yesPString );
+        wxMacStringToPascal( _("No"), noPString );
+        wxMacStringToPascal( m_message, pascalText );
 
-        Str255 pascalTitle ;
-        Str255 pascalText ;
-        wxMacStringToPascal( m_caption , pascalTitle ) ;
-        wxMacStringToPascal( _("Yes") , yesPString ) ;
-        wxMacStringToPascal(  _("No") , noPString ) ;
-        wxMacStringToPascal( m_message , pascalText ) ;
+        param.movable = true;
+        param.filterProc = NULL;
 
-        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.defaultText = yesPString;
+                param.cancelText = (StringPtr) kAlertDefaultCancelText;
+                param.otherText = noPString;
+                param.helpButton = false;
                 param.defaultButton = kAlertStdAlertOKButton;
-                param.cancelButton     = kAlertStdAlertCancelButton;
+                param.cancelButton = kAlertStdAlertCancelButton;
             }
             else
             {
-                param.defaultText     = yesPString ;
-                param.cancelText     = NULL;
-                param.otherText     = noPString ;
-                param.helpButton     = false ;
+                param.defaultText = yesPString;
+                param.cancelText = NULL;
+                param.otherText = noPString;
+                param.helpButton = false;
                 param.defaultButton = kAlertStdAlertOKButton;
-                param.cancelButton     = 0;
+                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.defaultText = (StringPtr) kAlertDefaultOKText;
+                param.cancelText = (StringPtr) kAlertDefaultCancelText;
+                param.otherText = NULL;
+                param.helpButton = false;
                 param.defaultButton = kAlertStdAlertOKButton;
-                param.cancelButton     = 0;
+                param.cancelButton = 0;
             }
             else
             {
-                param.defaultText     = (StringPtr) kAlertDefaultOKText ;
-                param.cancelText     = NULL;
-                param.otherText     = NULL;
-                param.helpButton     = false ;
+                param.defaultText = (StringPtr) kAlertDefaultOKText;
+                param.cancelText = NULL;
+                param.otherText = NULL;
+                param.helpButton = false;
                 param.defaultButton = kAlertStdAlertOKButton;
-                param.cancelButton     = 0;
+                param.cancelButton = 0;
             }
         }
         else
         {
-            return resultbutton ;
+            return resultbutton;
         }
 
-        param.position         = 0;
-
+        param.position = 0;
         StandardAlert( alertType, pascalTitle, pascalText, &param, &result );
     }
 
     if (style & wxOK)
     {
-        if (style & wxCANCEL)
+        switch ( result )
         {
-            //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 ;
-            }
+        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)
     {
-        if (style & wxCANCEL)
-        {
-            switch( result )
-            {
-            case 1 :
-                resultbutton = wxID_YES ;
-                break ;
-            case 2 :
-                resultbutton = wxID_CANCEL ;
-                break ;
-            case 3 :
-                resultbutton = wxID_NO ;
-                break ;
-            }
-        }
-        else
+        switch ( result )
         {
-            switch( result )
-            {
-            case 1 :
-                resultbutton = wxID_YES ;
-                break ;
-            case 2 :
-                break ;
-            case 3 :
-                resultbutton = wxID_NO ;
-                break ;
-            }
+        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 ;
+    return resultbutton;
 }
-