import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 
 * @author capolsin
 *
 * Chargement et affichage de deux images, l'une en image de fond d'un JPanel, l'autre par dessus
 * Utilisation du Toolkit du JPanel pour charger les images 
 * Utilisation d'un MediaTarcker pour :
 * 		1) surveiller le chargement de l'image
 * 		2) donner au JPanel la taille exacte de l'image de fond 
 * Utilisation d'un Timer pour le défilement de l'image de gauche à droite
 * 		
 */
class AfficheDefile extends JPanel implements ActionListener
{
    // Eviter un Warning
	private static final long serialVersionUID = 10L;
	private Image fond, monde;
	private MediaTracker tracker;
	public  Timer timer;
	private int largeurfond, hauteurfond;
	private int largeurimage;
	private int hauteurimage;
	private JButton arret;
    private JButton reprise;
	private int x = 100, y = 100;
	private Rectangle vieuxRectangle;
	  
  AfficheDefile(URL url, String s1, String s2)
    {
      // LES IMAGES  
  	  // getImage attend un nom de fichier pour une application et une URL pour une Applet
  	
      try{
      		this.fond = this.getToolkit().getImage(new URL(url.toString()+s1));
      		this.monde = this.getToolkit().getImage(new URL(url.toString()+s2));
    	}catch (MalformedURLException e) {}
    	
      //Lancer et surveiller le chargement des images
      this.tracker = new MediaTracker(this);
      this.tracker.addImage(this.fond, 1);
      this.tracker.addImage(this.monde, 2);
      // Attendre le chargement de toutes les images
      try
	  {
    	  this.tracker.waitForAll();
	  }
      catch (InterruptedException e){}
      
      
      // Si toutes les images n'ont pas été chargées avec succès
      if (this.tracker.statusAll(true) != MediaTracker.COMPLETE)
      	{
      		// Donne au JPanel une taille par défaut
      		this.setPreferredSize(new Dimension(300, 200));	
      		this.setSize(new Dimension(300, 200));	
      		System.out.println("Problème de chargement des images");
      	}
      else
      {
      	this.largeurimage = this.monde.getWidth(this);
      	this.hauteurimage = this.monde.getHeight(this);
      	this.largeurfond = this.fond.getWidth(this);
      	this.hauteurfond = this.fond.getHeight(this);
      	// Donne au JPanel la taille de l'image de fond
      	this.setPreferredSize(new Dimension(this.largeurfond, this.hauteurfond));
      	this.setSize(new Dimension(this.largeurfond, this.hauteurfond));
      }   	
      
      // LES BOUTTONS
      this.arret = new JButton("arret");
      this.reprise = new JButton("reprendre");
      arret.setActionCommand("arret");
      arret.addActionListener(this);
      reprise.setActionCommand("reprendre");
      reprise.addActionListener(this);
      reprise.setEnabled(false);
      
      JPanel p = new JPanel();
      p.add(arret);
      p.add(reprise);
      this.add(p);
      
      this.x = -this.largeurimage - 5;
      this.vieuxRectangle = new Rectangle(0, 0, 0, 0); 
      this.timer = new Timer(100, this);
      this.timer.start();
    }
  
  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    
    g.drawImage(this.fond, 0, 0, this);
    
    g.drawImage(this.monde, this.x, this.y, this.largeurimage, this.hauteurimage, this);
  }

  public void actionPerformed(ActionEvent e)
  {
  	if (e.getSource() == this.timer)
	{
   	  this.x += 10;
	  if (this.x > this.largeurfond) x = -this.largeurimage;
	  this.y = this.hauteurfond/3;
	  Rectangle nouveauRectangle = 
	    new Rectangle(x, y, this.largeurimage , this.hauteurimage);
	  Rectangle rect = nouveauRectangle.union(vieuxRectangle);
	  vieuxRectangle = nouveauRectangle;
	  repaint(rect.x, rect.y, rect.width, rect.height);
	}
  	
  	else if (e.getActionCommand().equals("arret"))
	{
	  this.arret.setEnabled(false);
	  this.reprise.setEnabled(true);
	  this.timer.stop();
	}
    else if (e.getActionCommand().equals("reprendre"))
	{
	  this.arret.setEnabled(true);
	  this.reprise.setEnabled(false);
	  this.timer.restart();
	}
    
    
    repaint();
  }
  
} 
