]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/msgdlg.cpp
cleanup - reformat
[wxWidgets.git] / src / mac / carbon / msgdlg.cpp
index 775ac8f06415ee18d97780f8b10682c349a62bb6..655d74bc43e0da80e3091d4fe0d271b22d881605 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)
-#endif
 
 wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
-        long style, const wxPoint& pos)
+                                 long style, const wxPoint& pos)
 {
     m_caption = caption;
     m_message = message;
-    m_dialogStyle = style;
     m_parent = parent;
+    SetMessageDialogStyle(style);
 }
 
 int wxMessageDialog::ShowModal()
 {
-    // TODO
-    return wxID_CANCEL;
+    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 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 ;
+        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()) ;
+
+        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)
+            {
+                // thats 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;
+            }
+        }
+        /*
+        else
+        {
+            skipDialog = true ;
+        }
+        */
+
+        param.position = kWindowDefaultPosition;
+        if ( !skipDialog )
+        {
+            DialogRef alertRef ;
+            CreateStandardAlert( alertType , cfTitle , cfText , &param , &alertRef ) ;
+            RunStandardAlert( alertRef , NULL , &result ) ;
+        }
+        if ( skipDialog )
+            return wxID_CANCEL ;
+    }
+    else
+#endif
+    {
+        AlertStdAlertParamRec    param;
+
+        Str255 yesPString ;
+        Str255 noPString ;
+
+        Str255 pascalTitle ;
+        Str255 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 );
+    }
+
+    if (style & wxOK)
+    {
+        if (style & 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 (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 )
+            {
+            case 1 :
+                resultbutton = wxID_YES ;
+                break ;
+            case 2 :
+                break ;
+            case 3 :
+                resultbutton = wxID_NO ;
+                break ;
+            }
+        }
+    }
+#endif
+    
+    return resultbutton ;
 }