]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/msgdlg.cpp
crash upon hide fix
[wxWidgets.git] / src / mac / msgdlg.cpp
index cf229e520008140529f009f37dd7cbfedda33d15..01d1d731ea875a8ae5fe4e30fe6e6eeee610504a 100644 (file)
 #pragma implementation "msgdlg.h"
 #endif
 
+#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)
-
-#define kMacOKAlertResourceID 128
-#define kMacYesNoAlertResourceID 129
-#define kMacYesNoCancelAlertResourceID 130
-#define kMacNoYesAlertResourceID 131
-#define kMacNoYesCancelAlertResourceID 132
+#endif
 
 short language = 0 ;
 
+void wxMacConvertNewlines( const char *source , char * destination ) ;
 void wxMacConvertNewlines( const char *source , char * destination )
 {
        const char *s = source ;
@@ -67,136 +66,158 @@ int wxMessageDialog::ShowModal()
        int resultbutton = wxID_CANCEL ;
 
        short result ;
-       Str255 pascalTitle ;
-       Str255 pascalText ;
-       
-       
-       if (wxApp::s_macDefaultEncodingIsPC)
-       {
-               strcpy( (char*) pascalTitle , wxMacMakeMacStringFromPC( m_caption ) ) ;
-               strcpy( (char*) pascalText , wxMacMakeMacStringFromPC( m_message) ) ;
-       }
-       else
-       {
-               strcpy( (char*) pascalTitle , m_caption ) ;
-               strcpy( (char*) pascalText , m_message ) ;
-       }
-
-       c2pstr( (char*) pascalTitle ) ;
-       wxMacConvertNewlines( (char*)pascalText ,(char*) pascalText) ;
-       c2pstr( (char*) pascalText ) ;
 
        wxASSERT_MSG( ( m_dialogStyle & 0x3F ) != wxYES , "this style is not supported on mac" ) ;
 
-       if ( !UMAHasAppearance() )
+       AlertType alertType = kAlertPlainAlert ;
+       if (m_dialogStyle & wxICON_EXCLAMATION)
+               alertType = kAlertNoteAlert ;
+       else if (m_dialogStyle & wxICON_HAND)
+               alertType = kAlertStopAlert ;
+       else if (m_dialogStyle & wxICON_INFORMATION)
+               alertType = kAlertNoteAlert ;
+       else if (m_dialogStyle & wxICON_QUESTION)
+               alertType = kAlertCautionAlert ;
+
+#if TARGET_CARBON
+       if ( UMAGetSystemVersion() >= 0x1000 )
        {
-               int resourceID ;
+               AlertStdCFStringAlertParamRec param ;
+               CFStringRef cfNoString = NULL ;
+               CFStringRef cfYesString = NULL ;
+
+               CFStringRef cfTitle = NULL;
+               CFStringRef cfText = NULL;
                
-         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
+               cfTitle = wxMacCreateCFString( m_caption ) ;
+               cfText = wxMacCreateCFString( m_message ) ;
+               cfNoString = wxMacCreateCFString( _("No") ) ;
+               cfYesString = wxMacCreateCFString( _("Yes") ) ;
+               
+               param.movable = true;
+               param.flags = 0 ;
+               
+               bool skipDialog = false ;
+               
+               if (m_dialogStyle & wxYES_NO)
+               {
+                   if (m_dialogStyle & wxCANCEL)
+                   {
+                               param.defaultText       = cfYesString ;
+                               param.cancelText        = (CFStringRef) kAlertDefaultCancelText;
+                               param.otherText         = cfNoString ;
+                               param.helpButton        = false ;
+                               param.defaultButton = kAlertStdAlertOKButton;
+                               param.cancelButton      = kAlertStdAlertCancelButton;
+                   }
+                   else
+                   {
+                               param.defaultText       = cfYesString ;
+                               param.cancelText        = NULL;
+                               param.otherText         = cfNoString ;
+                               param.helpButton        = false ;
+                               param.defaultButton = kAlertStdAlertOKButton;
+                               param.cancelButton      = 0;
+                   }
+               }
+               else if (m_dialogStyle & wxOK)
                {
-                       return resultbutton ;
+                   if (m_dialogStyle & wxCANCEL)
+                   {
+               // thats a cancel missing
+                               param.defaultText       = (CFStringRef) kAlertDefaultOKText ;
+                               param.cancelText        = NULL;
+                               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 (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 ;
+               {
+                       skipDialog = true ;
+               }
                
-         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 ;
-                               }
-                       }
+               param.position = kWindowDefaultPosition;
+               if ( !skipDialog )
+               {
+                       DialogRef alertRef ;
+                       CreateStandardAlert( alertType , cfTitle , cfText , &param , &alertRef ) ;
+                       RunStandardAlert( alertRef , NULL , &result ) ;
                }
-       }
-       else
-       {
-               AlertStdAlertParamRec   param;
+               if(cfTitle != NULL)
+               CFRelease(cfTitle);   
+               if(cfText != NULL)
+               CFRelease(cfText);   
+               if(cfNoString != NULL)
+               CFRelease(cfNoString);   
+               if(cfYesString != NULL)
+               CFRelease(cfYesString);   
+       if ( skipDialog )
+               return wxID_CANCEL ;
+  }
+  else
+#endif
+  {
+               AlertStdAlertParamRec   param;
+               char   cText[2048] ;
+               
+               if (wxApp::s_macDefaultEncodingIsPC)
+               {
+                       strcpy(cText , wxMacMakeMacStringFromPC( m_message) ) ;
+               }
+               else
+               {
+                       strcpy( cText , m_message ) ;
+               }
+               wxMacConvertNewlines( cText , cText ) ;
+       
+               Str255 yesPString ;
+               Str255 noPString ;
 
-               param.movable           = true;
-               param.filterProc        = NULL ;
+               Str255 pascalTitle ;
+               Str255 pascalText ;
+               wxMacStringToPascal( m_caption , pascalTitle ) ;
+               wxMacStringToPascal( _("Yes") , yesPString ) ;
+               wxMacStringToPascal(  _("No") , noPString ) ;
+               CopyCStringToPascal( cText , pascalText ) ;
                
-         if (m_dialogStyle & wxYES_NO)
-         {
-           if (m_dialogStyle & wxCANCEL)
-           {
-                               param.defaultText       = "\pYes" ;
+               param.movable           = true;
+       param.filterProc        = NULL ;
+               if (m_dialogStyle & wxYES_NO)
+               {
+                   if (m_dialogStyle & wxCANCEL)
+                   {
+                               param.defaultText       = yesPString ;
                                param.cancelText        = (StringPtr) kAlertDefaultCancelText;
-                               param.otherText         = "\pNo";
+                               param.otherText         = noPString ;
                                param.helpButton        = false ;
                                param.defaultButton = kAlertStdAlertOKButton;
                                param.cancelButton      = kAlertStdAlertCancelButton;
-           }
-           else
-           {
-                               param.defaultText       = "\pYes" ;
+                   }
+                   else
+                   {
+                               param.defaultText       = yesPString ;
                                param.cancelText        = NULL;
-                               param.otherText         = "\pNo";
+                               param.otherText         = noPString ;
                                param.helpButton        = false ;
                                param.defaultButton = kAlertStdAlertOKButton;
                                param.cancelButton      = 0;
-           }
-         }
-         else if (m_dialogStyle & wxOK)
-         {
-           if (m_dialogStyle & wxCANCEL)
-           {
+                   }
+               }
+               else if (m_dialogStyle & wxOK)
+               {
+                   if (m_dialogStyle & wxCANCEL)
+                   {
                // thats a cancel missing
                                param.defaultText       = (StringPtr) kAlertDefaultOKText ;
                                param.cancelText        = NULL;
@@ -204,17 +225,17 @@ int wxMessageDialog::ShowModal()
                                param.helpButton        = false ;
                                param.defaultButton = kAlertStdAlertOKButton;
                                param.cancelButton      = 0;
-           }
-           else
-           {
+                   }
+                   else
+                   {
                                param.defaultText       = (StringPtr) kAlertDefaultOKText ;
                                param.cancelText        = NULL;
                                param.otherText         = NULL;
                                param.helpButton        = false ;
                                param.defaultButton = kAlertStdAlertOKButton;
                                param.cancelButton      = 0;
-           }
-         }
+                       }
+               }
                else
                {
                        return resultbutton ;
@@ -222,80 +243,72 @@ int wxMessageDialog::ShowModal()
 
                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 );
+               StandardAlert( alertType, 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
+       if (m_dialogStyle & wxOK)
+       {
+               if (m_dialogStyle & wxCANCEL)                           
+               {
+                       //TODO add Cancelbutton
+                       switch( result )
                        {
-               switch( result )
-                               {
-                                       case 1 :
-                                               resultbutton = wxID_OK ;
-                                               break ;
-                                       case 2 :
-                                               break ;
-                                       case 3 :
-                                               break ;
-                               }
+                               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 ;
-                               }
+               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 ;
 }