import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

import Composants.*;

public class SplineTest  {
  public static void main(String argv[]) {
		JFrame f = new JFrame("Splines");
		f.addWindowListener(new Fermeur());
		f.setContentPane(new Splines());
		f.setSize(400, 500);
		f.setVisible(true);
	}
}

class Splines extends JPanel 
  implements MouseListener, MouseMotionListener {
  protected Point2D[] points = new Point2D[7];
  protected Point2D selectedPoint = null;
  CubicCurve2D c = new CubicCurve2D.Double();  
  QuadCurve2D q = new QuadCurve2D.Double();
	Line2D tangent1 = new Line2D.Double();
	Line2D tangent2 = new Line2D.Double();
	Rectangle2D squareRect = new Rectangle2D.Double();
  public Splines() {    
    points[0] = new Point2D.Double(50, 100);
    points[1] = new Point2D.Double(100, 150);
    points[2] = new Point2D.Double(300, 50);
    points[3] = new Point2D.Double(350, 100);
    points[4] = new Point2D.Double(50, 250);
    points[5] = new Point2D.Double(250, 350);
    points[6] = new Point2D.Double(350, 250);
    addMouseListener(this);
    addMouseMotionListener(this);
		setBackground(Color.yellow);
  }

  public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    super.paintComponent(g);
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
												RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setRenderingHint(RenderingHints.KEY_RENDERING,
												RenderingHints.VALUE_RENDER_QUALITY);
		g2.setStroke(new BasicStroke(4));

    tangent1.setLine(points[0], points[1]);
    tangent2.setLine(points[2], points[3]);
    g2.setPaint(Color.gray);
    g2.draw(tangent1);
    g2.draw(tangent2);
		c.setCurve(points, 0);
    g2.setPaint(Color.black);
    g2.draw(c);

    tangent1.setLine(points[4], points[5]);
    tangent2.setLine(points[5], points[6]);
    g2.setPaint(Color.gray);
    g2.draw(tangent1);
    g2.draw(tangent2);
    q.setCurve(points, 4);
    g2.setPaint(Color.black);
    g2.draw(q);

    for (int i = 0; i < points.length; i++) {
      // If the point is selected, use the selected color.
      if (points[i] == selectedPoint)
        g2.setPaint(Color.red);
      else
        g2.setPaint(Color.blue);
      // Draw the point.
      g2.fill(getSquare(points[i]));
    }
  }
  
  protected Shape getSquare(Point2D p) {
    int side = 10;
		squareRect.setRect(p.getX() - side / 2, p.getY() - side / 2,
      side, side);
		return squareRect;
  }
  
  public void mouseClicked(MouseEvent me) {}
  public void mousePressed(MouseEvent me) {
    selectedPoint = null;
    for (int i = 0; i < points.length; i++) {
      Shape s = getSquare(points[i]);
      if (s.contains(me.getPoint())) {
        selectedPoint = points[i];
        break;
      }
    }
    repaint();
  }
  public void mouseReleased(MouseEvent me) { 
		selectedPoint = null; 
		repaint();
	}
  public void mouseMoved(MouseEvent me) {}
  public void mouseDragged(MouseEvent me) {
    if (selectedPoint != null) {
      selectedPoint.setLocation(me.getPoint());
      repaint();
    }
  }

  public void mouseEntered(MouseEvent me) {}
  public void mouseExited(MouseEvent me) {}
}
