/**
 * 11/11/98 - modifié pour jdk1.2 le 20/03/99
 * 4/05/99 - double buffering
 * modification et ajout de main() le 22/12/17 ; modification le 05,12 et le 22/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class geovect extends Panel implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220922L;
	static Image img;
	static Graphics g1;
	int gw, gh;

	static Repere R;
	static PointLibre A, B, C, D, O;
	static Vecteur u, v, w;
	static Segment Ou, Ov;
	int X, Y, Xp, Yp;

	public geovect() {
		addMouseMotionListener (this);
		addMouseListener (this);
	}

	public void update (Graphics g) {
		paint (g);
	}

	public void paint (Graphics g) {
		if (img == null || gw != getSize().width || gh != getSize().height) {
			gw = getSize().width;
			gh = getSize().height;
			img = createImage (gw, gh);
			g1 = img.getGraphics ();

			if (R == null) {
				R = new Repere (gw / 2, gh / 2, gw, gh, 10.0, 10.0);
				A = new PointLibre (-16.0, 10.0);
				B = new PointLibre (-8.0, 10.0);
				C = new PointLibre (-1.0, 2.0);
				O = new PointLibre (-2.0, -2.0);
				u = new Vecteur (A, B);
				v = new Vecteur (B, C);
				w = new Vecteur (A, C);
				Ou = new Segment (O.x + u.x, O.y + u.y, O.x + u.x + v.x, O.y + u.y + v.y, "", R);
				Ov = new Segment (O.x + v.x, O.y + v.y, O.x + u.x + v.x, O.y + u.y + v.y, "", R);
			} else {
				R.MAJ (gw / 2, gh / 2, gw, gh, 10.0, 10.0);
			}
			g1.setFont (new Font ("Arial", Font.PLAIN, 12));
		}

// on trace dans la couleur du fond
		setBackground (Color.WHITE);
		g1.setColor (getBackground());
		g1.fillRect (0, 0, R.XMAX, R.YMAX);

//---------- recalcul des objets liés
		u.MAJ (A, B);
		v.MAJ (B, C);
		w.MAJ (A, C);
		Ou.MAJ (O.x + u.x, O.y + u.y, O.x + u.x + v.x, O.y + u.y + v.y);
		Ov.MAJ (O.x + v.x, O.y + v.y, O.x + u.x + v.x, O.y + u.y + v.y);

//---------- traçage des objets
		g1.setColor (Color.BLACK);
		R.cadre (g1);

		g1.setColor (Color.BLUE);
		u.trace (A, "u", R, g1);
		v.trace (B, "v", R, g1);
		w.trace (A, "w", R, g1);
		u.trace (O, "u", R, g1);
		v.trace (O, "v", R, g1);
		w.trace (O, "w", R, g1);

		g1.setColor (Color.GREEN);
		Ou.trace ("", R, g1);
		Ov.trace ("", R, g1);

		g1.setColor (Color.RED);
		R.trace (g1);
		A.trace ("A", R, g1);
		B.trace ("B", R, g1);
		C.trace ("C", R, g1);
		O.trace ("O", R, g1);

		g.drawImage (img, 0, 0, this);
	}

//---------- contrôle proximité d'un point libre ou libre sur objet d'un point
	public void mousePressed (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		if (A.deplace = A.zone (X, Y, R)) {
		} else if (B.deplace = B.zone (X, Y, R)) {
		} else if (C.deplace = C.zone (X, Y, R)) {
		} else if (O.deplace = O.zone (X, Y, R)) {
		}
	}

//---------- bouge le point sélectionné
	public void mouseDragged (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		A.bouge (X, Y, R);
		B.bouge (X, Y, R);
		C.bouge (X, Y, R);
		O.bouge (X, Y, R);
		repaint ();
	}

//---------- points refixés
	public void mouseReleased (MouseEvent e) {
		A.deplace = B.deplace = C.deplace = O.deplace = false;
	}

// déplacement de la souris

	public void mouseMoved (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		if (A.zone (X, Y, R) || B.zone (X, Y, R) || C.zone (X, Y, R) || O.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) {
		geovect g = new geovect();
		JFrame f = new JFrame ("Somme de deux vecteurs");
		f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		f.add (g);
		f.setSize (400, 400);
		f.setVisible (true);
	}

}
