import java.applet.Applet;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.ScrollPane;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;


// Applet principale
public class program extends Applet {

	// Serializable
	private static final long serialVersionUID = 1L;
	
	// Canvas
	CircuitCanvas ff;
	
	public void init (){
		// Initialisation du canvas
		ff = new CircuitCanvas();
		
		/*Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { // Gestion de toutes les exceptions non gérées
			public void uncaughtException(Thread thr, Throwable ex) {}
		});*/
	}
	
	boolean started = false;
	public void start(){
		if(started) return; // Des fois, plusieurs appels de start() avec le AppletViewer... pourquoi ??
		started = true;
	
		// Pobleme de focus sous Linux
		setFocusable(true);
		
		// Taille du circuit
		int width = 1024, height = 1024; // 1024*1024 par défaut
		try{
			width	= Integer.parseInt(this.getParameter("circuit_width"));	 // Tentative de recuperation de la largeur du circuit depuis le code HTML
			height	= Integer.parseInt(this.getParameter("circuit_height")); // Tentative de recuperation de la hauteur du circuit depuis le code HTML
		}catch(Exception ex){}
		// Si la taille du circuit voulue est trop petite par rapport a la taille de l'applet, taille du circuit = taille de l'applet
		width  = Math.max(this.getWidth(), width);
		height = Math.max(this.getHeight(), height);
		
		// Initialisation de l'applet
		setVisible(true);
		this.setLayout(null);
		ff.setBounds(0, 0, this.getWidth(), this.getHeight());
		// Creation d'un panel scrollable
		final ScrollPane scroller = new ScrollPane();
		scroller.add(ff);
		// Raccourcis clavier, utilisation des flèches, end/home, page up/down pour bouger le scroll
		ff.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent ke){
				if(ke.getKeyCode() == KeyEvent.VK_RIGHT){
					Point pt = scroller.getScrollPosition();
					scroller.setScrollPosition((int)pt.getX()+(ke.isControlDown()?100:10), (int)pt.getY());
					ke.consume();
				}else if(ke.getKeyCode() == KeyEvent.VK_LEFT){
					Point pt = scroller.getScrollPosition();
					scroller.setScrollPosition((int)pt.getX()-(ke.isControlDown()?100:10), (int)pt.getY());
					ke.consume();
				}else if(ke.getKeyCode() == KeyEvent.VK_UP){
					Point pt = scroller.getScrollPosition();
					scroller.setScrollPosition((int)pt.getX(), (int)pt.getY()-(ke.isControlDown()?100:10));
					ke.consume();
				}else if(ke.getKeyCode() == KeyEvent.VK_DOWN){
					Point pt = scroller.getScrollPosition();
					scroller.setScrollPosition((int)pt.getX(), (int)pt.getY()+(ke.isControlDown()?100:10));
					ke.consume();
				}else if(ke.getKeyCode() == KeyEvent.VK_PAGE_DOWN){
					Point pt = scroller.getScrollPosition();
					scroller.setScrollPosition((int)pt.getX(), ff.getHeight());
					ke.consume();
				}else if(ke.getKeyCode() == KeyEvent.VK_PAGE_UP){
					Point pt = scroller.getScrollPosition();
					scroller.setScrollPosition((int)pt.getX(), 0);
					ke.consume();
				}else if(ke.getKeyCode() == KeyEvent.VK_HOME){
					Point pt = scroller.getScrollPosition();
					scroller.setScrollPosition(0, (int)pt.getY());
					ke.consume();
				}else if(ke.getKeyCode() == KeyEvent.VK_END){
					Point pt = scroller.getScrollPosition();
					scroller.setScrollPosition(ff.getWidth(), (int)pt.getY());
					ke.consume();
				}
			}
		});
		// Definition de la taille du panel scrollable
		scroller.setSize(new Dimension(this.getWidth(),this.getHeight()));
		// Et ajout a l'applet
		this.add(scroller);
		// Le rendre visible
		scroller.setVisible(true);
		
		// Rendre visible puis initialiser le canvas
		ff.setVisible(true);
		ff.Initialize(width, height);
		
		// Afficher le contenu du canvas
		ff.refresh();
	}
	
}
