package dessin;


import javax.swing.*;
import javax.swing.event.*; 	
import java.util.*;		
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 modèle
                if (rectangle == null)
                    repaint();
                else repaint( (Rectangle) rectangle);
	}
        public void paintComponent(Graphics g) {
        
            super.paintComponent(g); 
            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 au clic
            private Point dernier;	// position en drag
            private Element tempElement ; 
			private Graphics2D g2D;	
            
            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); 
			}
            
            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;
            }}} 
