]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/msgdlg.cpp
applied correction from Marc Newsam in calculations of linesize
[wxWidgets.git] / src / mac / carbon / msgdlg.cpp
index 775ac8f06415ee18d97780f8b10682c349a62bb6..064d9bbba6076aa4a82ad3e515eadc4f0e06e217 100644 (file)
 #pragma implementation "msgdlg.h"
 #endif
 
+#include "wx/app.h"
 #include "wx/msgdlg.h"
+#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 ;
+
+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 +67,252 @@ wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, cons
 
 int wxMessageDialog::ShowModal()
 {
-    // TODO
-    return wxID_CANCEL;
+       int resultbutton = wxID_CANCEL ;
+
+       short result ;
+       Str255 pascalTitle ;
+       Str255 pascalText ;
+       char   cText[256] ;
+       
+       if (wxApp::s_macDefaultEncodingIsPC)
+       {
+#if TARGET_CARBON
+               c2pstrcpy( (StringPtr) pascalTitle , wxMacMakeMacStringFromPC( m_caption ) ) ;
+#else
+               strcpy( (char *) pascalTitle , wxMacMakeMacStringFromPC( m_caption ) ) ;
+               c2pstr( (char *) pascalTitle ) ;
+#endif
+               strcpy(cText , wxMacMakeMacStringFromPC( m_message) ) ;
+       }
+       else
+       {
+#if TARGET_CARBON
+               c2pstrcpy( (StringPtr) pascalTitle , m_caption ) ;
+#else
+               strcpy( (char *) pascalTitle , m_caption ) ;
+               c2pstr( (char *) pascalTitle ) ;
+#endif
+               strcpy( cText , m_message ) ;
+       }
+
+       wxMacConvertNewlines( cText , cText ) ;
+#if TARGET_CARBON
+       c2pstrcpy( (StringPtr) pascalText , cText ) ;
+#else
+       strcpy( (char *) pascalText , cText ) ;
+       c2pstr( (char *) pascalText ) ;
+#endif
+
+       wxASSERT_MSG( ( m_dialogStyle & 0x3F ) != wxYES , "this style is not supported on mac" ) ;
+
+       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 ;
 }