//
//  SketcherView.java
//  
//
//  Created by cathy on Tue Jul 31 2001.
//  Copyright (c) 2001 __CompanyName__. All rights reserved.
//

import javax.swing.*;
import javax.swing.event.*; 	// pour MouseInputAdapter
import java.util.*;		// pour Observer
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

class SketcherView extends JPanel implements Observer, Constants {
	private Sketcher theApp;	// Objet Application

	public SketcherView(Sketcher theApp) {
		this.theApp = theApp;

                setBackground(Color.white);
                setOpaque(true);
                setBorder(BorderFactory.createLineBorder(Color.black));
               
                
                MouseHandler handler = new MouseHandler();
                addMouseListener(handler);
                addMouseMotionListener(handler);

	}
	public void update(Observable o, Object rectangle) {
		// code correspondant aux modifs du modle
                if (rectangle == null)
                    repaint();
                else repaint( (Rectangle) rectangle);
	}
        public void paintComponent(Graphics g) {
        
            super.paintComponent(g); // pour reafficher le fond
            
            Graphics2D g2D = (Graphics2D) g;
            Iterator elements = theApp.getModel().getIterator();
            Element element;
            
            while (elements.hasNext()) {
                element = (Element) elements.next();
                g2D.setPaint(element.getColor());
                g2D.draw(element.getShape());
            }
        }
        
        class MouseHandler extends MouseInputAdapter {
            private Point debut;	// position de la souris au clic
            private Point dernier;	// position de la souris en drag
            private Element tempElement ; // stocker l'element temporaire
            private Graphics2D g2D;	// contexte graphique du handler

            
            public void mousePressed (MouseEvent e) {
                // clic du bouton de souris
                debut = e.getPoint();
                System.out.println("premier clic");
                
                g2D = (Graphics2D) getGraphics();
                g2D.setPaint(theApp.getWindow().getElementColor());
                g2D.setXORMode(Color.white); // ca bug sur le Mac avec OS 10.3 !!
            }
            
            public void mouseDragged (MouseEvent e) {
                // deplacement de souris
                dernier = e.getPoint();
                if (tempElement == null) {
                    tempElement = createElement(debut, dernier);
                }
                else { 
                    g2D.draw(tempElement.getShape());	// effacer le precedent
                    tempElement.modify(debut, dernier); // modifier l'element
                }
                g2D.draw(tempElement.getShape()); // dessiner le nouveau
            }
            
            public void mouseReleased (MouseEvent e) {
                // relachement de la souris
                System.out.println("souris relachee");

                if (tempElement != null) {
                    theApp.getModel().add(tempElement);
                    tempElement = null;
                }
                if (g2D != null) {
                    g2D.dispose();
                    g2D = null;
                }
                debut = dernier = null;	
            }
            
            private Element createElement(Point debut, Point fin) {
                switch(theApp.getWindow().getElementType()) {
                    case LIGNE: return new Element.Ligne(debut, fin,
                                    theApp.getWindow().getElementColor());
                    case RECTANGLE: return new Element.Rectangle(debut, fin,
                                    theApp.getWindow().getElementColor());
                    case CERCLE: return new Element.Cercle(debut, fin,
                                theApp.getWindow().getElementColor());
                    case COURBE: return new Element.Courbe(debut, fin,
                                theApp.getWindow().getElementColor());
                }
                return null;
            }
        }
}

