/*
  test8: applet multithread 
  Autore: Pietro Frasca, Luglio 2002.
*/
	
import java.awt.*;
import java.applet.*;

import java.awt.event.*;
import javax.swing.*;

public class test8 extends JApplet implements ActionListener{  
  private JPanel panAnim; // pannello per l'animazione
  private Image figura;  // oggetto per l'immagine
  private AudioClip musica; // oggetto per il suono
  private JButton start,chiudi; // pulsanti di start e stop
  private Animazione a; 
 public void init(){  
     
      figura=getImage(getDocumentBase(),"logo.gif"); // carica l'immagine logo.gif
      musica=getAudioClip(getDocumentBase(),"musica.wav");// carica il file audio musica.wav
      Container contentPane = getContentPane(); // pannello del contenuto dell'applet
      panAnim = new JPanel(); // crea pannello per l'animazione
     
      JPanel p = new JPanel(); // crea pannello per i pulsanti
      start=new JButton("Start"); // bottone di start
      chiudi=new JButton("Chiudi"); // bottone chiudi
      p.add(start); // aggiunge il pulsante start nel pannello p
      p.add(chiudi);// aggiunge il pulsante chiudi nel pannello p
      start.addActionListener(this); // attiva un ascoltatore di eventi per il pulsante start
      chiudi.addActionListener(this);// attiva un ascoltatore di eventi per il pulsante chiudi
      contentPane.add(p, "South"); // aggiunge il pannello p al pannello del contenuto nella posizione "South"
      a=new Animazione(panAnim,figura);
      contentPane.add(panAnim,"Center");  // aggiunge il pannello panAnim al pannello del contenuto nella posizione "Center"

   }

   public void actionPerformed (ActionEvent e) {
     Object sorgente=e.getSource();
     if (sorgente==start) {
        /* il pulsante premuto č start
           viene creato un nuovo thread: una nuova figura si muoverą all'interno del pannello
	     quando sarą eseguito il metodo a.start()
        */
        a=new Animazione(panAnim, figura);
        a.start();
     } else {
       // ferma il suono 
        musica.stop();
     } 
   } 
  public void start(){
    // il metodo start viene eseguito ogni volta che si visita la pagina contenente l'applet
    // avvia il suono
    musica.play();
   
  }
  public void stop(){
    // il metodo stop viene eseguito ogni volta che si lascia l'applet
    // ferma il suono
    musica.stop();
  }        
}

class Animazione extends Thread {

   private Image figura; // immagine da animare 
   private JPanel box; //pannello contenente l'immagine
   private static final int XSIZE = 10; 
   private static final int YSIZE = 10;
   private int x = 0; // coordinata x dell'immagine (vertice alto a sinistra)
   private int y = 0; // coordinata y dell'immagine
   private int dx = 2;// incremento orizzontale della posizione dell'immagine
   private int dy = 2;// incremento verticale della posizione dell'immagine

  public Animazione(JPanel b,Image im) { 
     // costruttore 
     box = b; // pannello che contiene l'immagine
     box.setBackground(Color.white);
     figura=im;// immagine da animare
  }

   public void traccia(){  
     Graphics g = box.getGraphics(); // oggetto grafico g 
     g.drawImage(figura,x,y,null); // disegna l'immagine figura nella posizione x,y
     g.dispose();// rilascia la risorsa grafica
   }

   public void muovi(){  
     if (!box.isVisible()) return;
     Graphics g = box.getGraphics(); // oggetto graphics
     g.setXORMode(box.getBackground()); // setta la modalitą XOR per disegno
     g.drawImage(figura,x,y,null); // visualizza immagine nella posizione x,y
     x += dx; // incrementa la posizione orizzontale
     y += dy; // incrementa la posizione verticale
     Dimension d = box.getSize();
     if (x < 0){ 
       /* l'immagine si trova sul margine sinistro: si cambia il segno all'incremento dx
          in modo da ottenere il rimbalzo */
       x = 0; dx = -dx;} 
     if (x + XSIZE >= d.width){ 
       /* l'immagine si trova sul margine destro del pannello : si cambia il segno all'incremento dx
          in modo da ottenere il rimbalzo */

        x = d.width - XSIZE; dx = -dx; }
     if (y < 0){ 
       /* l'immagine si trova sul margine alto del pannello : si cambia il segno all'incremento dy
          in modo da ottenere il rimbalzo */
        y = 0; dy = -dy; }
     if (y + YSIZE >= d.height){ 
       /* l'immagine si trova sul margine destro del pannello : si cambia il segno all'incremento dx
          in modo da ottenere il rimbalzo */
        y = d.height - YSIZE; dy = -dy; }
     g.drawImage(figura,x,y,null); // disegna l'immagine nel punto di coordinate x,y
     g.dispose(); // rilascia la risorsa grafica
   }

   public void run()
   {  try
      { 
       while(true)  
       {  muovi(); // chiama il metodo muovi per muovere l'immagine
         sleep(5);
         }
      }
       catch(InterruptedException e) {}
   }
  
}
