/***************************************************************************/
/*                                                                         */
/*        demo.c  -  v. 1.0  -  1.7.88  -  Antonio Ferrillo                */
/*                                                                         */
/*     programma dimostrativo dell'utilizzo delle funzioni di              */ 
/*     apertura di schermo e di finestra residenti in libreria privata     */ 
/*                                                                         */
/*         versione Aztec v. 3.4     Lattice-compatibile                   */
/*                                                                         */
/***************************************************************************/ 
  
  #include <functions.h>  /* rimuovere questa  linea se si usano i
                             compilatori Lattice v.3.XX                    */
  #include <exec/types.h>
  #include <intuition/intuition.h>
  #include <stdio.h>
  #include <graphics/gfx.h>
  #include <graphics/gfxbase.h>
  #include <graphics/rastport.h>

/* definizione puntatori alle librerie contenenti le routines grafiche e 
   per la gestione di intuition residenti in ROM                           */

  struct IntuitionBase *IntuitionBase;
  struct  GfxBase *GfxBase;

/* definizione campi per la gestione dei messaggi ricevuti da Intuition 
   mediante IDCMP. ULONG e USHORT sono ridefinizioni di tipo di dato 
   contenute nella <exec.types.h>                                          */

  struct IntuiMessage *messaggio;
  ULONG TipoMessaggio;  
  USHORT numes;         

/* definizione della funzione esterna Window_Addr()  residente in 
   libreria privata che fornisce l'indirizzo della struct Window           */       

  struct  Window  *Window_Addr();

/* definizione del puntatore alla struct ViewPort per il richiamo di 
   alcune routines grafiche                                                */

  struct  ViewPort    *vp_addr;

  char *cosa;	             /*      puntatori alle stringhe               */
  char *al_mess[4];          /*      per il display Alert                  */ 
 
  long rosso, verde, blu, ; /*      interi per la gestione del 
                                    colore del display                     */

/*         corpo principale del programma                                  */  
 
  main()
  {
  OpenIntuiLib();
  OpenGfxLib();
  OpenScreen1();
  OpenFinestra1();
  OpenFinestra2();
  OpenFinestra3();
  OpenScreen2();
  FlipFlop();
  DispAlert();
  CloseScreen1();
  OpenFinestra4();
  CambioTitoli();
  GestMessaggi();
  }

/* routine elaborative richiamate nel corpo principale, quelle di 
   apertura di librerie, schermi e finestre comprendono il controllo
   di successo dell'operazione con il display di un Alert di tipo 
   0'RECOVERY' e uscita dall'elaborazione in caso di fallimento            */

/* routine apertura della libreria delle routines per la gestione di 
   Intuition residenti in ROM richiamate durante l'esecuzione              */
	
    OpenIntuiLib()
    {
    IntuitionBase =  (struct IntuitionBase *)
                     OpenLibrary("intuition.library", 0L);
        if (IntuitionBase == NULL)
        {
        cosa="intuition.library";
        Call_Al(al_mess,cosa);
        exit(1L); 	
        } 
    }

/* apertura della libreria contenente le routines grafiche di base         */

    OpenGfxLib()
    {
    GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0L);
        if(GfxBase == NULL)
        {
        cosa="graphics.library";
        Call_Al(al_mess,cosa);
        CloseLibrary(IntuitionBase);
        exit(1L); 	
        } 
    }

/* apertura dello schermo n.1 mediante il richiamo della routine 
   Screen_Open() scritta da noi e catalogata in libreria privata           */

    OpenScreen1()
    {
        if(Screen_Open (1,"BASSA RISOLUZIONE ",0,120,2,1,1,5)==NULL) 
        {
        cosa="SCHERMO 1";
        Call_Al(al_mess,cosa);
        CloseLibrary(IntuitionBase);
        exit(2L); 
        }
        Delay(100L);
    } 

/* apertura finestra 1                                                     */

    OpenFinestra1()
    {
        if ( Window_Open (1,"FINESTRA-1",0,10,150,50,2,3,1)==NULL)
        {
        cosa="FINESTRA 1";
        Call_Al(al_mess,cosa);
        Screen_Close(1);
        CloseLibrary(IntuitionBase);
        exit(3L);
        }
    Delay(100L);
    } 

/* apertura finestra 2                                                     */

    OpenFinestra2()
    {
       if ( Window_Open (2,"FINESTRA-2",160,10,160,50,4,5,1)==NULL)
       {
       cosa="FINESTRA 2";
       Call_Al(al_mess,cosa);
       Window_Close(1);
       Screen_Close(1);
       CloseLibrary(IntuitionBase);
       exit(4L);
       }
    Delay(100L);
    } 

/* apertura finestra 3                                                     */

   OpenFinestra3()
   {
       if ( Window_Open (3,"FINESTRA-3",0,70,320,50,6,7,1)==NULL)
       {
       cosa="FINESTRA 3";
       Call_Al(al_mess,cosa);
       Window_Close(1);
       Window_Close(2);
       Screen_Close(1);
       CloseLibrary(IntuitionBase);
       exit(5L);
       }
   Delay(150L);
   }

/* apertura schermo 2                                                      */   

   OpenScreen2()
   {
       if ( Screen_Open (2,"ALTA RISOLUZIONE ",0,256,0,1,2,4)==NULL)
       {
       cosa="SCHERMO 2";
       Call_Al(al_mess,cosa);
       Window_Close(1);
       Window_Close(2);
       Window_Close(3);
       Window_Close(4);
       Screen_Close(1);
       CloseLibrary(IntuitionBase);
       exit(7L); 
       }
   Delay(100L);
   }

/* alternanza di apparizioni in primo piano sul display dei 2 schermi 
   ottenuta con delle Calls a Screen_Front() della libreria privata        */ 

   FlipFlop()
   {
   Screen_Front(1);
   Delay(100L);
   Screen_Front(2);
   Delay(100L);
   Screen_Front(1);
   Delay(200L);
   }

/* display di un Alert dimostrativo ottenuto con richiamo a routine 
   contenuta in questo sorgente                                            */

   DispAlert()
   {
   al_mess[0] ="NIENTE PAURA ! SI TRATTA DI UNA DIMOSTRAZIONE";
   al_mess[1] ="DI DISPLAY DI UN ALERT DI TIPO RICOVERABILE. ";
   al_mess[2] ="IL PROGRAMMA E IL SISTEMA SONO ANCORA IN PIEDI.";
   al_mess[3] = "CLICKARE SU UNO DEI PULSANTI DEL MOUSE.";
   Alert_Dis(al_mess);
   Delay(100L);
   }

/* chiusura dello schermo n. 1 e finestre relative                         */
 
   CloseScreen1()
   {
   Window_Close(3);
   Delay(100L);
   Window_Close(2);
   Delay(100L);
   Window_Close(1);
   Delay(100L);
   Screen_Close(1);
   Delay(100L);
   }

/* apertura finestra 4                                                     */ 
   
   OpenFinestra4()
   {
      if( Window_Open (4,"<---  CLICKARE PER CHIUDERE",
                                0,10,640,246,2,5,2) == NULL)   
      {
      cosa="FINESTRA 4";
      Call_Al(al_mess,cosa);
      Window_Close(4);
      Screen_Close(2);
      CloseLibrary(IntuitionBase);
      exit(8L);
      }
   }

/* cambio del titolo dello schermo il secondo argomento (-1L) 
   fa lasciare inalterato il titolo della Window                           */  

   CambioTitoli()
   {
    SetWindowTitles(Window_Addr(4),
    -1L,"MUOVERE IL MOUSE NELLE 4 DIREZIONI");
   }


/* intercettazione dei messaggi riguardanti la chiusura della finestra 
   e dei movimenti del mouse inviati da Intuition tramite IDCMP            */ 

   GestMessaggi()
   {
   vp_addr = ViewPortAddress(Window_Addr(4));
      for (;;)
      {
         if ((messaggio = (struct IntuiMessage *)
                GetMsg(Window_Addr(4)->UserPort)) == 0L)
	 {
	     Wait(1L << Window_Addr(4)->UserPort->mp_SigBit);
             continue;
	 }
         TipoMessaggio = messaggio->Class;
         numes = messaggio->Code;
         ReplyMsg(messaggio);
           switch (TipoMessaggio)
           {
           case CLOSEWINDOW :   Window_Close(4);
                                Screen_Close(2);
                                CloseLibrary(IntuitionBase);
                                printf("\n FINE TASK \n");
                                exit(9L);
           case MOUSEMOVE   :   if(messaggio->MouseX < 320)
	                              blu = (320 - messaggio->MouseX) / 21; 	
                                if(messaggio->MouseX > 320)
                                      rosso = (messaggio->MouseX-320) / 21; 	
		                      verde = messaggio->MouseY / 17;
        
                                SetRGB4(vp_addr,0L,rosso,verde,blu);
                                break;
           }   /* switch */
      }   /* for */
   }   /* GestMessaggi() */
      
/* routine di arrangiamento prima riga di messaggio dell'Alert             */       

   Call_Al(al_mess,cosa)
     char *al_mess[];
     char *cosa;
   {
   int k;
   al_mess[0] = "ERRORE IN APERTURA                    ";
   al_mess[1] = "PROSECUZIONE IMPOSSIBILE";
   al_mess[2] = "CLICKARE SU UNO DEI PULSANTI DEL MOUSE";
   while(*(al_mess[0]+19+k) = *cosa++) k++;
   al_mess[3] = '\0';
   Alert_Dis(al_mess);
   }

/* routine di arrangiamento degli argomenti richiesti dalla funzione di 
   Intuition  DisplayAlert()                                               */
 
   int
   Alert_Dis(testo)
     char  *testo[];
   {
   short colonna=84;
   char dispmess[260];
   char *mess, *col;
   int rit;
   int n;
   long tipo = RECOVERY_ALERT;
   col = &colonna;
   mess = &dispmess[0];
      for ( n=0; n<4; n++ )
      {
      if(*testo[n] == '\0') break;
      *mess = *col;
      *++mess = *(col+1);
      *++mess = (char)3+(9*(n+1));
      while(*++mess = *testo[n]++); 
      *++mess = (char)1;
      mess++;
      }
   *mess = '\0';
   rit = DisplayAlert(tipo,&dispmess,50L);
   }

