/////////////////////////////////////////////////////////////////////////////
// Name:        src/mac/carbon/msgdlg.cpp
// Purpose:     wxMessageDialog
// Author:      Stefan Csomor
// Modified by:
// Created:     04/01/98
// RCS-ID:      $Id: msgdlg.cpp,v 1.32 2006/04/28 12:43:57 ABX Exp $
// Copyright:   (c) Stefan Csomor
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

#include "wx/wxprec.h"

#include "wx/msgdlg.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 )
{
    m_caption = caption;
    m_message = message;
    m_parent = parent;
    SetMessageDialogStyle(style);
}

int wxMessageDialog::ShowModal()
{
    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 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() );

        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)
            {
                // 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;
            }
            else
            {
                param.defaultText = (CFStringRef) kAlertDefaultOKText;
                param.cancelText = NULL;
                param.otherText = NULL;
                param.helpButton = false;
                param.defaultButton = kAlertStdAlertOKButton;
                param.cancelButton = 0;
            }
        }
#if 0
        else
        {
            skipDialog = true;
        }
#endif

        param.position = kWindowDefaultPosition;
        if ( !skipDialog )
        {
            DialogRef alertRef;
            CreateStandardAlert( alertType, cfTitle, cfText, &param, &alertRef );
            RunStandardAlert( alertRef, NULL, &result );
        }
        else
        {
            return wxID_CANCEL;
        }
    }
    else
#endif
    {
        AlertStdAlertParamRec param;
        Str255 yesPString, noPString;
        Str255 pascalTitle, 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)
    {
        switch ( result )
        {
        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)
    {
        switch ( result )
        {
        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;
}
