/*
   GadTools.c
 
   Scritto da Antonello Biancalana per Amiga Magazine
 
*/

#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <proto/all.h>
#include <stdio.h>
#include <stdlib.h>

/* Valori di identificazione gadgets */

#define BUTTON      1
#define STRING      2
#define INTEGER     3
#define CHECKBOX1   4
#define CHECKBOX2   5
#define CHECKBOX3   6
#define MX          7
#define CYCLE       8
#define SLIDER      9
#define SCROLLER    10
#define LISTVIEW    11
#define PALETTE     12
#define TEXT        13
#define NUMBER      14

void CleanUp(char *);

struct IntuitionBase *IntuitionBase=NULL;
struct Library *GadToolsBase=NULL;
struct Window *GadWindow=NULL;
struct Screen *PubScreen=NULL;
struct NewGadget NewGad;
struct Gadget *MyGadList, *PrevGad, *StrGad, *RadioGad, *CycleGad;

APTR VInfo=NULL;

/* Usati per la creazione della lista per il listview gadget */

struct Node *nodo;
struct List ExecList;
struct Remember *RemKey = NULL;

struct IntuiMessage *imsg;
struct Gadget *gad, *IntGad, *NumGad, *TxtGad;
ULONG imsgClass;
UWORD imsgCode;

struct Menu *MyMenu;
struct MenuItem *MItem;

struct TextAttr topaz8 = { ( STRPTR )"topaz.font",
                           8,
                           0x00, 0x41
                         };

/* Etichette per il gadget ad esclusione reciproca (radio buttons) */

unsigned char *RadioLabels[]={ "Piccolo",
                               "Medio",
                               "Grande",
                               NULL
                             };

/* Etichette per il cycle gadget */

unsigned char *Giorni[]={ "  Lunedì   ",
                          "  Martedì  ",
                          " Mercoledì ",
                          "  Giovedì  ",
                          "  Venerdì  ",
                          "  Sabato   ",
                          " Domenica  ",
                          NULL
                        };

/* Etichette per il listview gadget */

unsigned char *Lista[]={ "Ancona",
                         "Aosta",
                         "Bari",
                         "Bologna",
                         "Cagliari",
                         "Campobasso",
                         "Catanzaro",
                         "Firenze",
                         "Genova",
                         "L'Aquila",
                         "Milano",
                         "Napoli",
                         "Palermo",
                         "Perugia",
                         "Potenza",
                         "Roma",
                         "Torino",
                         "Trento",
                         "Trieste",
                         "Venezia",
                         NULL
                       };

/* Definizione della struttura dei menu */

struct NewMenu GadMenu[] = {
                            { NM_TITLE, "Progetto", 0, 0, 0, 0,},
                            {   NM_ITEM, "Fine", "Q", 0, 0, 0,},

                            { NM_TITLE, "Azioni", 0, 0, 0, 0,},
                            {   NM_ITEM, "Dimensioni", 0, 0, 0, 0,},
                            {     NM_SUB, "Piccolo", "P", 0, 0, 0,},
                            {     NM_SUB, "Medio","M", 0, 0, 0,},
                            {     NM_SUB, "Grande","G", 0, 0, 0,},
                            {   NM_ITEM, NM_BARLABEL, 0 , 0, 0, 0,},
                            {   NM_ITEM, "Giorni", 0 , 0, 0, 0,},
                            {     NM_SUB, "Lunedì", "1" , 0, 0, 0,},
                            {     NM_SUB, "Martedì", "2" , 0, 0, 0,},
                            {     NM_SUB, "Mercoledì", "3" , 0, 0, 0,},
                            {     NM_SUB, "Giovedì", "4" , 0, 0, 0,},
                            {     NM_SUB, "Venerdì", "5" , 0, 0, 0,},
                            {     NM_SUB, "Sabato", "6" , 0, 0, 0,},
                            {     NM_SUB, "Domenica", "7" , 0, 0, 0,},

                            {   NM_END, 0,       0 , 0, 0, 0},
                           };

void main(int argc, char **argv)
{
    unsigned char StrBuf[20];
    int i, select;
    ULONG menu, item, sub;
    BOOL valid;

    /* Apertura delle librerie */

    IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",37);

    if(!IntuitionBase)
        CleanUp("GadTools richiede Amiga OS 2.0 o superiori");

    GadToolsBase=(struct Library *)OpenLibrary("gadtools.library",37);

    if(!GadToolsBase)
        CleanUp("La libreria gadtools versione 37 non è presente");

    /* Creazione delle lista Exec necessaria per il listview gadget */

    NewList(&ExecList);
    i = 0;

    for(i=0; i<=19; i++)
    {
        nodo = (struct Node *)AllocRemember(&RemKey, sizeof(struct Node), MEMF_CLEAR);
        nodo->ln_Name = Lista[i];
        AddTail(&ExecList, nodo);
    }

    /* Inizio creazione dei gadget */

    MyGadList=NULL;

    /* Blocco dello schermo workbench */

    PubScreen=LockPubScreen(NULL);

    if(!PubScreen)
        CleanUp("Impossibile bloccare lo schermo pubblico");

    /* Prelevamento dei dati dello schermo */

    VInfo=GetVisualInfo(PubScreen,TAG_DONE);

    if(!VInfo)
        CleanUp("Impossibile ottenere informazioni sullo schermo");

    /* Creazione dei dati necessari al gadtools */

    PrevGad=CreateContext(&MyGadList);

    NewGad.ng_VisualInfo=VInfo;

    /* Creazione di un gadget stringa da associare al listview gadget */

    NewGad.ng_Width = 130;
    NewGad.ng_Height = 14;
    NewGad.ng_GadgetText = NULL;
    StrGad = PrevGad = CreateGadget(STRING_KIND, PrevGad, &NewGad,
                                    GTST_MaxChars, 50,
                                    TAG_DONE);
  
    /* Button gadget */

    NewGad.ng_LeftEdge=20;
    NewGad.ng_TopEdge=203;
    NewGad.ng_Width=70;
    NewGad.ng_Height=15;
    NewGad.ng_TextAttr=&topaz8;
    NewGad.ng_GadgetID = BUTTON;
    NewGad.ng_Flags=PLACETEXT_IN;
    NewGad.ng_GadgetText="Button";

    PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                         TAG_DONE); 

    /* Gadget ad esclusione reciproca (radio buttons) */

    NewGad.ng_LeftEdge=320;
    NewGad.ng_TopEdge=20;
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = MX;

    RadioGad = PrevGad = CreateGadget(MX_KIND, PrevGad, &NewGad,
                                      GTMX_Labels,RadioLabels,
                                      GTMX_Active,0,
                                      GTMX_Spacing,4,
                                      TAG_DONE);

    /* Cycle gadget */

    NewGad.ng_LeftEdge=80;
    NewGad.ng_TopEdge=60;
    NewGad.ng_Width=110;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText="Giorni";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = CYCLE;

    CycleGad = PrevGad = CreateGadget(CYCLE_KIND, PrevGad, &NewGad,
                                      GTCY_Labels,Giorni,
                                      GTCY_Active,2,
                                      TAG_DONE);

    /* Checkbox gadget */

    NewGad.ng_LeftEdge=315;
    NewGad.ng_TopEdge=65;
    NewGad.ng_Width=10;
    NewGad.ng_Height=10;
    NewGad.ng_GadgetText="Crea Icona";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = CHECKBOX1;

    PrevGad=CreateGadget(CHECKBOX_KIND, PrevGad, &NewGad,
                         GTCB_Checked,TRUE,
                         TAG_DONE);

    NewGad.ng_LeftEdge=315;
    NewGad.ng_TopEdge=77;
    NewGad.ng_Width=10;
    NewGad.ng_Height=10;
    NewGad.ng_GadgetText="IFF";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = CHECKBOX2;

    PrevGad=CreateGadget(CHECKBOX_KIND, PrevGad, &NewGad,
                         GTCB_Checked,FALSE,
                         TAG_DONE);

    NewGad.ng_LeftEdge=315;
    NewGad.ng_TopEdge=89;
    NewGad.ng_Width=10;
    NewGad.ng_Height=10;
    NewGad.ng_GadgetText="BitMap";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = CHECKBOX3;

    PrevGad=CreateGadget(CHECKBOX_KIND, PrevGad, &NewGad,
                         GTCB_Checked,TRUE,
                         TAG_DONE);

    /* Slider gadget */

    NewGad.ng_LeftEdge=80;
    NewGad.ng_TopEdge=40;
    NewGad.ng_Width=110;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText="Slider";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = SLIDER;

    PrevGad=CreateGadget(SLIDER_KIND, PrevGad, &NewGad,
                         GTSL_Min,1,
                         GTSL_Max,100,
                         GTSL_Level,24,
                         GTSL_LevelFormat,"%3ld",
                         GTSL_MaxLevelLen, 3,
                         GTSL_LevelPlace,PLACETEXT_RIGHT,
                         GA_IMMEDIATE, TRUE,
                         GA_RELVERIFY, TRUE,
                         TAG_DONE);

    /* String gadget */

    NewGad.ng_LeftEdge=80;
    NewGad.ng_TopEdge=83;
    NewGad.ng_Width=100;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText="Stringa";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = STRING;

    PrevGad=CreateGadget(STRING_KIND, PrevGad, &NewGad,
                         GTST_String,StrBuf,
                         GTST_MaxChars,20,
                         TAG_DONE);

    /* Integer gadget */

    NewGad.ng_LeftEdge=80;
    NewGad.ng_TopEdge=106;
    NewGad.ng_Width=60;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText="Numero";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = INTEGER;

    IntGad = PrevGad = CreateGadget(INTEGER_KIND, PrevGad, &NewGad,
                                    GTIN_Number, 0,
                                    GTIN_MaxChars, 5,
                                    TAG_DONE);

    /* Palette gadget */

    NewGad.ng_LeftEdge=209;
    NewGad.ng_TopEdge=200;
    NewGad.ng_Width=80;
    NewGad.ng_Height=20;
    NewGad.ng_GadgetText="Colori";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = PALETTE;

    PrevGad=CreateGadget(PALETTE_KIND, PrevGad, &NewGad,
                         GTPA_Depth,2,
                         GTPA_Color,2,
                         GTPA_IndicatorWidth, 20,
                         GTPA_IndicatorHeight, 20,
                         TAG_DONE);

    /* Display text gadget */

    NewGad.ng_LeftEdge=80;
    NewGad.ng_TopEdge=130;
    NewGad.ng_Width=100;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText="DispTxt";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = TEXT;

    TxtGad = PrevGad = CreateGadget(TEXT_KIND, PrevGad, &NewGad,
                                    GTTX_Text,"",
                                    GTTX_Border,TRUE,
                                    TAG_DONE);

    /* Display number gadget */

    NewGad.ng_LeftEdge=80;
    NewGad.ng_TopEdge=153;
    NewGad.ng_Width=40;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText="DispNum";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = NUMBER;

    NumGad = PrevGad = CreateGadget(NUMBER_KIND, PrevGad, &NewGad,
                                    GTNM_Number,0,
                                    GTNM_Border,TRUE,
                                    TAG_DONE);

    /* Scroller gadget */

    NewGad.ng_LeftEdge=80;
    NewGad.ng_TopEdge=20;
    NewGad.ng_Width=110;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText="Scroller";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = SCROLLER;

    PrevGad=CreateGadget(SCROLLER_KIND, PrevGad, &NewGad,
                         GTSC_Top,1,
                         GTSC_Total,255,
                         GTSC_Visible,25,
                         GTSC_Arrows,13,
                         GA_RELVERIFY, TRUE,
                         TAG_DONE);

    /* Listview gadget */

    NewGad.ng_LeftEdge=209;
    NewGad.ng_TopEdge=130;
    NewGad.ng_Width=130;
    NewGad.ng_Height=60;
    NewGad.ng_GadgetText="Città d'Italia";
    NewGad.ng_Flags=PLACETEXT_ABOVE;
    NewGad.ng_GadgetID = LISTVIEW;

    PrevGad=CreateGadget(LISTVIEW_KIND, PrevGad, &NewGad,
                         GTLV_Labels, &ExecList,
                         GTLV_Top, 11,
                         GTLV_ShowSelected, StrGad,
                         GTLV_Selected, 13,
                         GTLV_ScrollWidth, 18,
                         GTLV_ReadOnly, FALSE,
                         TAG_DONE);


    if(!PrevGad)
        CleanUp("Impossibile creare i gadget");
    
    /* Creazione dei menu */

    MyMenu=CreateMenus(GadMenu,
                       GTMN_FrontPen, 0,
                       TAG_DONE);

    if(!MyMenu)
        CleanUp("Impossibile creare un nuovo menu");

    /* Posizionamento degli elementi del menu */

    if(!LayoutMenus(MyMenu, VInfo, TAG_DONE))
        CleanUp("Impossibile creare un nuovo menu");

    /* Apertura della finestra */

    GadWindow=OpenWindowTags(NULL,
                             WA_Left,145,
                             WA_Top,10,
                             WA_Width,350,
                             WA_Height,230,
                             WA_Flags,WFLG_DRAGBAR|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
                             WA_IDCMP,IDCMP_MENUPICK|IDCMP_MOUSEBUTTONS|IDCMP_GADGETUP|IDCMP_GADGETDOWN|IDCMP_MOUSEMOVE|IDCMP_INTUITICKS,
                             WA_Title,"GadTools Window",
                             WA_Gadgets,MyGadList,
                             TAG_DONE);

    if(!GadWindow)
        CleanUp("Impossibile aprire una finestra");

    /* Refresh della finestra */

    GT_RefreshWindow(GadWindow,NULL);

    /* Collegamento dei menu sulla finestra */

    SetMenuStrip(GadWindow, MyMenu);

    valid=TRUE;

    while(valid)
    {
        /* Attende un evento intuition */

        Wait(1 << GadWindow->UserPort->mp_SigBit);

        while(valid && (imsg = GT_GetIMsg(GadWindow->UserPort)))
        {
            /* Prelevamento della classe e del codice */

            imsgClass = imsg->Class;
            imsgCode = imsg->Code;
    
            /* Indirizzo del gadget utilizzato */

            gad = (struct Gadget *)imsg->IAddress;
    
            GT_ReplyIMsg(imsg);

            if(imsgClass==IDCMP_MENUPICK) /* Uso dei menu? */
            {
                while(imsgCode!=MENUNULL) /* Lettura di tutti gli eventi menu */
                {
                    MItem=ItemAddress(MyMenu, imsgCode);

                    /* Selezione dei dati della scelta menu */

                    menu=MENUNUM(imsgCode);
                    item=ITEMNUM(imsgCode);
                    sub=SUBNUM(imsgCode);

                    if(menu==0) /* Primo menu? */
                    {
                        if(item==0) /* Primo item? (Fine) */
                            valid=FALSE;
                    }
                    else if(menu==1) /* Secondo menu? */
                    {
                        if(item==0) /* Primo item (Dimensioni) */
                        {
                            /* Imposta i radio buttons in accordo
                               alla scelta del submenu */

                            GT_SetGadgetAttrs(RadioGad, GadWindow, NULL,
                                              GTMX_Active, sub,
                                              TAG_DONE);
                        }

                        if(item==2) /* Terzo item? (Giorni) */
                        {
                            /* Imposta il cycle gadget in accordo
                               alla scelta del submenu */

                            GT_SetGadgetAttrs(CycleGad, GadWindow, NULL,
                                              GTCY_Active, sub,
                                              TAG_DONE);
                        }
                    }

                    /* Prossima scelta menu */

                    imsgCode = MItem->NextSelect;
                }
            }
            else if(imsgClass==IDCMP_GADGETUP) /* Uso dei gadget? */
            {
                switch(gad->GadgetID) /* Quale gadget? */
                {
                    case BUTTON     : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, 0,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "BUTTON", 
                                                        TAG_DONE);

                                      break;

                    case INTEGER    : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, ((struct StringInfo *)IntGad->SpecialInfo)->LongInt,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "INTEGER",
                                                        TAG_DONE);

                                      break;

                    case STRING     : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, 0,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "STRING",
                                                        TAG_DONE);

                                      break;

                    case CHECKBOX1  : if(!(gad->Flags & SELECTED))
                                          select=FALSE;
                                      else
                                          select=TRUE;

                                      GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, select,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "Crea Icona",
                                                        TAG_DONE);

                                      break;

                    case CHECKBOX2  : if(!(gad->Flags & SELECTED))
                                          select=FALSE;
                                      else
                                          select=TRUE;

                                      GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, select,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "IFF",
                                                        TAG_DONE);

                                      break;

                    case CHECKBOX3  : if(!(gad->Flags & SELECTED))
                                          select=FALSE;
                                      else
                                          select=TRUE;

                                      GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, select,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "BitMap",
                                                        TAG_DONE);

                                      break;

                    case CYCLE      : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, imsgCode,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "CYCLE",
                                                        TAG_DONE);

                                      break;

                    case SLIDER     : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, imsgCode,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "SLIDER",
                                                        TAG_DONE);

                                      break;

                    case PALETTE    : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, imsgCode,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "PALETTE",
                                                        TAG_DONE);

                                      break;

                    case LISTVIEW   : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, imsgCode,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "LISTVIEW",
                                                        TAG_DONE);

                                      break;

                    case SCROLLER   : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, imsgCode,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "SCROLLER",
                                                        TAG_DONE);

                                      break;

                    default         : break;

                }
            }
            else if(imsgClass==IDCMP_GADGETDOWN) /* Gadget correntemente selezionato? */
            {
                switch(gad->GadgetID) /* Quale gadget? */
                {
                    case MX         : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, imsgCode,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "MX",
                                                        TAG_DONE);

                                      break;

                    default         : break;
                }
            }
            else if(imsgClass==IDCMP_MOUSEMOVE) /* Movimento mouse? */
            {
                switch(gad->GadgetID) /* Su quale gadget? */
                {
                    case SLIDER     : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, imsgCode,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "SLIDER",
                                                        TAG_DONE);

                                      break;

                    case SCROLLER   : GT_SetGadgetAttrs(NumGad, GadWindow, NULL,
                                                        GTNM_Number, imsgCode,
                                                        TAG_DONE);

                                      GT_SetGadgetAttrs(TxtGad, GadWindow, NULL,
                                                        GTTX_Text, "SCROLLER",
                                                        TAG_DONE);

                                      break;

                    default         : break;
                }
            }
        }
    }
        
    CleanUp("Fine.");
}

void CleanUp(errmsg)
char *errmsg;
{
    /* Stampa il messaggio di chiusura */
    printf("%s\n",errmsg);

    /* Chiusura e deallocazione delle risorse utilizzate */

    if(GadWindow)
    {
        if(MyMenu)
            ClearMenuStrip(GadWindow);

        CloseWindow(GadWindow);
    }

    if(PubScreen)       UnlockPubScreen(NULL,PubScreen);
    if(MyMenu)          FreeMenus(MyMenu);
    if(MyGadList)       FreeGadgets(MyGadList);
    if(VInfo)           FreeVisualInfo(VInfo);
    if(RemKey)          FreeRemember(&RemKey,TRUE);
    if(IntuitionBase)   CloseLibrary((struct Library *)IntuitionBase);
    if(GadToolsBase)    CloseLibrary((struct Library *)GadToolsBase);

    exit(0);
}

