/************************************************/
/*                                              */
/* demo.c - v. 1.0 - 1.7.88 - Antonio Ferrillo  */
/*                                              */
/* programma dimostrativo dell'utilizzo delle   */
/* 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 '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";
   k=0;
   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 
   DispayAlert()                              */
 
   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);
   }

