]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/msgdlg.cpp
crash upon hide fix
[wxWidgets.git] / src / mac / msgdlg.cpp
index 775ac8f06415ee18d97780f8b10682c349a62bb6..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)
 #endif
 
+short language = 0 ;
+
+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)
 {
@@ -30,7 +63,252 @@ wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, cons
 
 int wxMessageDialog::ShowModal()
 {
-    // TODO
-    return wxID_CANCEL;
+       int resultbutton = wxID_CANCEL ;
+
+       short result ;
+
+       wxASSERT_MSG( ( m_dialogStyle & 0x3F ) != wxYES , "this style is not supported on mac" ) ;
+
+       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 )
+       {
+               AlertStdCFStringAlertParamRec param ;
+               CFStringRef cfNoString = NULL ;
+               CFStringRef cfYesString = NULL ;
+
+               CFStringRef cfTitle = NULL;
+               CFStringRef cfText = NULL;
+               
+               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)
+               {
+                   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;
+                       }
+               }
+               else
+               {
+                       skipDialog = true ;
+               }
+               
+               param.position = kWindowDefaultPosition;
+               if ( !skipDialog )
+               {
+                       DialogRef alertRef ;
+                       CreateStandardAlert( alertType , cfTitle , cfText , &param , &alertRef ) ;
+                       RunStandardAlert( alertRef , NULL , &result ) ;
+               }
+               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 ;
+
+               Str255 pascalTitle ;
+               Str255 pascalText ;
+               wxMacStringToPascal( m_caption , pascalTitle ) ;
+               wxMacStringToPascal( _("Yes") , yesPString ) ;
+               wxMacStringToPascal(  _("No") , noPString ) ;
+               CopyCStringToPascal( cText , pascalText ) ;
+               
+               param.movable           = true;
+       param.filterProc        = NULL ;
+               if (m_dialogStyle & wxYES_NO)
+               {
+                   if (m_dialogStyle & 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 (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;
+
+               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
+               {
+                       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 ;
 }