/**
 * testgeo3.java	22/09/22
 * auteur : Jean-Paul Quelen
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class testgeo3 extends JFrame implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220922L;
	int w, h;
	static Image img;
	static Graphics g1;
	static Repere R;
	static PointLibre A, B, O;
	static PointSurDroite U;
	static Droite AB, OU;
	static PointSurDroite M;

	public testgeo3 (String titre) {
		super (titre);
		setFont (new Font ("Arial", Font.PLAIN, 12));
		addMouseMotionListener (this);
		addMouseListener (this);
	}

	public void update (Graphics g) {
		paint (g);
	}

	public void paint (Graphics g) {
		int w1 = getWidth();
		int h1 = getHeight();
		if ((img == null) || (w1 != w) || (h1 != h)) {
			w = w1;
			h = h1;
			img = createImage (w, h);
			g1 = img.getGraphics();
			if (R == null) {
				R = new Repere (w / 2, h / 2, w, h, 10.0, 10.0);
				A = new PointLibre (5.0, 0.0);
				B = new PointLibre (0.0, 5.0);
				O = new PointLibre (0.0, 0.0);
				OU = new Droite (0.0, 1.0, 0.0);					// axe des x
				U = new PointSurDroite (1.0, 0.0, OU);
				AB = new Droite (A, B);
				M = new PointSurDroite (0.0, 0.0, AB);
			}
		}

		R.MAJ (R.X (O.x), R.Y (O.y), w, h, R.unitex, R.unitex);
		O.MAJ (0.0, 0.0);
		if (U.deplace && (U.x > 0)) {
			R.unitex = R.unitey = O.distance (U) * R.unitex;
		}
		U.MAJ (1.0, 0.0);
		AB.MAJ (A, B);
		M.MAJ();

		g1.setColor (Color.WHITE);
		g1.fillRect (0, 0, R.XMAX, R.YMAX);

		g1.setColor (Color.YELLOW);
		R.trace_grille (5.0, 5.0, g1);

		g1.setColor (Color.GREEN);
		R.trace_repere_gradue (5.0, 5.0, g1);

		g1.setColor (Color.BLUE);
		AB.trace ("", R, g1);

		g1.setColor (Color.RED);
		A.trace ("A", R, g1);
		B.trace ("B", R, g1);
		O.trace ("O", R, g1);
		U.trace ("U", R, g1);
		M.trace ("M", R, g1);
		
		g.drawImage (img, 0, 0, this);
	}

	public void mousePressed (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		if (U.deplace = U.zone (X, Y, R)) {
		} else if (O.deplace = O.zone (X, Y, R)) {
		} else if (A.deplace = A.zone (X, Y, R)) {
		} else if (B.deplace = B.zone (X, Y, R)) {
		} else if (M.deplace = M.zone (X, Y, R)) {
		}
	}

	public void mouseDragged (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		U.bouge (X, Y, R);
		O.bouge (X, Y, R);
		A.bouge (X, Y, R);
		B.bouge (X, Y, R);
		M.bouge (X, Y, R);
		repaint();
	}

	public void mouseReleased (MouseEvent e) {
		U.deplace = O.deplace = A.deplace = B.deplace = false;
	}

	public void mouseMoved (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		if (U.zone (X, Y, R) || O.zone (X, Y, R) || A.zone (X, Y, R) || B.zone (X, Y, R) || M.zone (X, Y, R)) {
			setCursor (new Cursor (Cursor.HAND_CURSOR));
		} else {
			setCursor (new Cursor (Cursor.DEFAULT_CURSOR));
		}
	}

public void mouseClicked (MouseEvent e) {}
public void mouseEntered (MouseEvent e) {}
public void mouseExited (MouseEvent e) {}

	public static void main (String args[]) {
		testgeo3 appl = new testgeo3 ("testgeo");
		appl.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
		appl.setSize (400, 300);
		appl.setVisible (true);
	}
}
