/*****************************************************************************
 *                                                                           *
 * Module : INVITE.C                                                         *
 *                                                                           *
 * Fenêtre d'invite avant le lancement d'AMI-CPC                             *
 *                                                                           *
 *****************************************************************************/


#include  <Workbench/workbench.h>
#include  <Intuition/Intuition.h>
#include  <Workbench/startup.h>
#include  <Exec/Types.h>
#include  <Proto/Intuition.h>
#include  <Proto/Gadtools.h>
#include  <Proto/Graphics.h>
#include  <Proto/Exec.h>
#include  <Proto/Icon.h>
#include  <Proto/Asl.h>
#include  <Proto/Dos.h>
#include  <String.h>

#include  "Invite.h"
#include  "Main.h"


static char * NomTypeCPC[] =
    {
    "Isp", 
    "Triumph",
    "Saisho",
    "Solavox",
    "Awa",
    "Schneider",
    "Orion",
    "Amstrad",
    NULL
    };


static struct Gadget * GadgetText = NULL;


/*
// Conversion de l'ID du mode écran en chaine.
*/
static UBYTE * GetModeName( ULONG DisplayID )
{
    static struct NameInfo Buffer;

    GetDisplayInfoData( FindDisplayInfo( DisplayID )
                      , ( UBYTE * )&Buffer
                      , sizeof( Buffer )
                      , DTAG_NAME
                      , DisplayID
                      );

    return( Buffer.Name );
}


/*
// Sélection du mode écran
*/
static ULONG GetDisplayID( struct Screen * WbenchScreen, BOOL Selection )
{
    struct ScreenModeRequester * smr;
    ULONG mask = DIPF_IS_DUALPF
               | DIPF_IS_PF2PRI
               | DIPF_IS_HAM
               | DIPF_IS_EXTRAHALFBRITE;

    if ( smr = AllocAslRequestTags( ASL_ScreenModeRequest
                                  , ASLSM_PropertyFlags, ~mask
                                  , ASLSM_PropertyMask, mask
                                  , TAG_DONE 
                                  ) 
       )
        {
        if ( ! DisplayID )
            smr->sm_DisplayID = GetVPModeID( &WbenchScreen->ViewPort ) 
                              & ~HAMLACE_KEY;
        else
            smr->sm_DisplayID = DisplayID;

        if ( Selection )
            AslRequest( smr, NULL );
        DisplayID = smr->sm_DisplayID;
        FreeAslRequest( smr );
        }
    return( DisplayID );
}


/*
// Boucle de gestion des messages...
*/
static int GestionMessages( struct Screen * Ecran, struct Window * Fenetre )
{
    struct IntuiMessage * message;
    struct Gadget * gadget;
    int retour = 0;

    GT_SetGadgetAttrs( GadgetText
                     , Fenetre
                     , NULL
                     , GTTX_Text
                     , GetModeName( DisplayID )
                     , TAG_DONE
                     );
    while ( ! retour )
        {
        /*
        // Attente messages
        */
        WaitPort( Fenetre->UserPort );
        while ( message = GT_GetIMsg( Fenetre->UserPort ) )
            {
            gadget = ( struct Gadget * )message->IAddress;
            GT_ReplyIMsg( message );
            switch ( message->Class )
                {
                case GADGETDOWN :
                    switch( gadget->GadgetID )
                        {
                        case TYPE_CPC:
                            Constructeur = message->Code << 1;
                            break;
                        }
                    break;

                case GADGETUP :
                    switch( gadget->GadgetID )
                        {
                        case BOUTON_OK:
                            retour = BOUTON_OK;
                            break;

                        case BOUTON_SONS:
                            IsSound = message->Code;
                            break;

                        case BOUTON_MODE:
                            DisplayID = GetDisplayID( Ecran, TRUE );
                            GT_SetGadgetAttrs( GadgetText
                                             , Fenetre
                                             , NULL
                                             , GTTX_Text
                                             , GetModeName( DisplayID )
                                             , TAG_DONE
                                             );
                            break;
                        }
                    break;

                case CLOSEWINDOW : 
                    retour = FIN;
                    break;
                }
            }
        }
    return( retour );
}


/*
// Lecture des toolstypes depuis l'icone du programme
*/
static int ExtraitToolsTypes( int * argc, char ** argv )
{
    static char NomFichier[ 256 ];
    struct DiskObject * dobj;
    struct WBStartup * WBenchMsg;
    struct WBArg * wbarg;
    char ** toolarray;
    char * s;
    int i, j, retour = 0;

    if ( * argc == 0 )
        {
        WBenchMsg = ( struct WBStartup * )argv;
        wbarg = WBenchMsg->sm_ArgList;
        for ( i = 0;i < WBenchMsg->sm_NumArgs; i++ )
            {
            if ( ( * wbarg->wa_Name ) && 
                 ( dobj = GetDiskObject( wbarg->wa_Name ) ) 
               )
                {
                toolarray = ( char ** )dobj->do_ToolTypes;
                /*
                // Recherche type de CPC...
                */
                if ( s = ( char * )FindToolType( toolarray, "TYPE" ) )
                    for ( j = 0; j < 8; j++ )
                        if ( MatchToolValue( s, NomTypeCPC[ j ] ) )
                            Constructeur = j << 1;

                /*
                // Recherche fichier disquette par défaut
                */
                if ( s = ( char * )FindToolType( toolarray, "DISC" ) )
                    {
                    strcpy( NomFichier, s );
                    * argc = 2;
                    argv[ 1 ] = NomFichier;
                    }

                /*
                // Gestion du son : ON/OFF ?
                */
                if ( s = ( char * )FindToolType( toolarray, "SOUND" ) )
                    IsSound = (  MatchToolValue( s, "ON" ) 
                              || MatchToolValue( s, "1" )
                              );

                /*
                // Rom Inf
                */
                if ( s = ( char * )FindToolType( toolarray, "LROM" ) )
                    strcpy( NomLrom, s );

                /*
                // Rom Sup
                */
                if ( s = ( char * )FindToolType( toolarray, "UROM" ) )
                    strcpy( NomUrom, s );

                /*
                // Rom Disc
                */
                if ( s = ( char * )FindToolType( toolarray, "ROM7" ) )
                    strcpy( NomRom7, s );

                /*
                // Fréquence d'interruptions
                */
                if ( s = ( char * )FindToolType( toolarray, "INT" ) )
                    {
                    if ( MatchToolValue( s, "1" ) )
                        FreqInt = FREQ_1;

                    if ( MatchToolValue( s, "2" ) )
                        FreqInt = FREQ_2;

                    if ( MatchToolValue( s, "3" ) )
                        FreqInt = FREQ_3;

                    if ( MatchToolValue( s, "4" ) )
                        FreqInt = FREQ_4;
                    }

                /*
                // Mode écran
                */
                if ( s = ( char * )FindToolType( toolarray, "SMODE" ) )
                    sscanf( s, "%x", &DisplayID );

                FreeDiskObject( dobj );
                }
            wbarg++;
            }
        }
    return( retour );
}


/*
// Création de la fenêtre d'invite avec les différent gadgets,
// attends l'appui sur le bouton <OK> ou la fermeture de la fenêtre.
*/
int AfficheInvite( int * argc, char ** argv )
{
    struct Window * Fenetre;
    struct Screen * Ecran;
    struct Gadget * GList;
    int retour = FIN;
    APTR VisualInfo;

    static struct IntuiText Textes[] = 
        {
        1, 0, JAM1, 245, 1, &topaz8, ( UBYTE * )"Selection type CPC", NULL
        };

    struct NewGadget ng1 =
        {
        5, 40, 237, 13, NULL, &topaz8, CHAINE_MODE, 0, NULL, NULL
        };
    struct NewGadget ng2 =
        {
        249, 24, 17, 9, NULL, &topaz8, TYPE_CPC, PLACETEXT_RIGHT ,NULL, NULL
        };
    struct NewGadget ng3 =
        {
        21, 78, 52, 14, (UBYTE *)"OK", &topaz8, BOUTON_OK, PLACETEXT_IN ,NULL, NULL
        };
    struct NewGadget ng4 =
        {
        14, 58, 26, 11, (UBYTE *)"Avec sons", &topaz8, BOUTON_SONS, PLACETEXT_RIGHT ,NULL, NULL
        };

    struct NewGadget ng5 =
        {
        6, 18, 126, 16, (UBYTE *)"Mode écran", &topaz8, BOUTON_MODE, PLACETEXT_IN, NULL, NULL
        };
    struct Gadget * g;

    /*
    // Lancement depuis le Workbench ?
    */
    if ( ! ExtraitToolsTypes( argc, argv ) )
        {
        if ( Ecran = LockPubScreen((UBYTE * )"Workbench" ) )
            {
            DisplayID = GetDisplayID( Ecran, FALSE );
            if ( VisualInfo = GetVisualInfo( Ecran, TAG_DONE ) )
                {
                if ( g = CreateContext( &GList ) )
                    {
                    ng1.ng_VisualInfo = 
                    ng2.ng_VisualInfo = 
                    ng3.ng_VisualInfo = 
                    ng4.ng_VisualInfo = 
                    ng5.ng_VisualInfo = VisualInfo;
                    g = CreateGadget( TEXT_KIND
                                    , g
                                    , &ng1
                                    , GTTX_Border, TRUE
                                    , TAG_DONE
                                    );
                    GadgetText = g;
                    g = CreateGadget( MX_KIND
                                    , g
                                    , &ng2
                                    , GTMX_Labels, NomTypeCPC
                                    , GTMX_Active, Constructeur >> 1
                                    , TAG_DONE
                                    );
                    g = CreateGadget( BUTTON_KIND, g, &ng3, TAG_DONE );
                    g = CreateGadget( CHECKBOX_KIND
                                    , g
                                    , &ng4
                                    , GTCB_Checked
                                    , IsSound
                                    , TAG_DONE 
                                    );
                    g = CreateGadget( BUTTON_KIND, g, &ng5, TAG_DONE );
                    if ( Fenetre = OpenWindowTags( NULL
                                                 , WA_Left,     76
                                                 , WA_Top,      34
                                                 , WA_Width,    411
                                                 , WA_Height,   100
                                                 , WA_IDCMP,    MXIDCMP |
                                                                BUTTONIDCMP |
                                                                IDCMP_CLOSEWINDOW |
                                                                IDCMP_REFRESHWINDOW
                                                 , WA_Flags,    WFLG_DRAGBAR |
                                                                WFLG_DEPTHGADGET |
                                                                WFLG_ACTIVATE |
                                                                WFLG_CLOSEGADGET |
                                                                WFLG_SMART_REFRESH
                                                 , WA_Gadgets,  GList
                                                 , WA_Title,    vers + 7
                                                 , TAG_DONE 
                                                 )
                       )
                        {
                        RefreshGList( GList, Fenetre, NULL, -1 );
                        PrintIText( Fenetre->RPort
                                  , Textes
                                  , ( LONG )Fenetre->BorderLeft
                                  , ( LONG )Fenetre->BorderTop
                                  );
                        /*
                        // Lecture choix utilisateur
                        */
                        retour = GestionMessages( Ecran, Fenetre );

                        CloseWindow( Fenetre );
                        FreeGadgets( GList );
                        }
                    }
                FreeVisualInfo( VisualInfo );
                }
            UnlockPubScreen( NULL, Ecran );
            }
        }
    else
        {
        /*
        // Lancement depuis une fenêtre SHELL...
        */
        retour = BOUTON_OK;
        }

    return( retour );
}
