/**
 * homotran.java - jpq - 29/11/98
 * double-buffering
 * 21/03/99 - jdk1.2
 * modification et ajout de main() le 22/12/17 ; modification le 05, 09 et le 22/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class homotran extends Panel implements MouseListener, MouseMotionListener, ActionListener {
	static final long serialVersionUID = 220922L;
	static Repere R;
	static Image img;
	static Graphics g1;
	int gw, gh;

	static PointLibre vo, ve, O1, O2, A, B, C;
	static Vecteur v, A1A2, B1B2, C1C2;
	static Pt A1, B1, C1, A2, B2, C2, A3, B3, C3;
	static Segment AB, BC, CA, A1B1, B1C1, C1A1, A2B2, B2C2, C2A2, A3B3, B3C3, C3A3;
	static Segment O1A, O1A1, O2A, O2A3, O1B, O1B1, O2B, O2B3, O1C, O1C1, O2C, O2C3;
	double rapport = 1.5, rapport1 = 0.8;
	TextField tf;
	Button ok;

	public homotran() {
		addMouseMotionListener (this);
		addMouseListener (this);
		add (new Label ("rapport de h1 et de h2"));
		add (tf = new TextField ("1.5 0.8", 10));
		add (ok = new Button ("Ok"));
		ok.addActionListener (this);
		setBackground (Color.WHITE);
	}
	
	private double nombre (String s, double d) {
		if (s != null) {
			try {
				d = Double.parseDouble (s);
			}
			catch (NumberFormatException e) {}
		}
		return d;
	}

	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();
			g1.setFont (new Font ("Arial", Font.PLAIN, 12));

// on initialise ici les objets mathématiques
			if (R == null) {
				R = new Repere (gw / 2, gh / 2, gw, gh, 10.0, 10.0);
				vo = new PointLibre (-17.0, 14.5);
				ve = new PointLibre (-12.0, 12.0);
				v = new Vecteur();
				O1 = new PointLibre (-2.0, -12.5);
				O2 = new PointLibre (-12.0, 4.0);
				A = new PointLibre (-1.5, -3.5);
				B = new PointLibre (4.0, -3.5);
				C = new PointLibre (4.0, -1.0);
				O1A = new Segment();
				O1A1 = new Segment();
				A1A2 = new Vecteur();
				O2A = new Segment();
				O2A3 = new Segment();
				O1B = new Segment();
				O1B1 = new Segment();
				B1B2 = new Vecteur();
				O2B = new Segment();
				O2B3 = new Segment();
				O1C = new Segment();
				O1C1 = new Segment();
				C1C2 = new Vecteur();
				O2C = new Segment();
				O2C3 = new Segment();
				AB = new Segment();
				BC = new Segment();
				CA = new Segment();
				A1B1 = new Segment();
				B1C1 = new Segment();
				C1A1 = new Segment();
				A2B2 = new Segment();
				B2C2 = new Segment();
				C2A2 = new Segment();
				A3B3 = new Segment();
				B3C3 = new Segment();
				C3A3 = new Segment();
				tf.setText (rapport + " " + rapport1);
			} else {
				R.MAJ (gw / 2, gh / 2, gw, gh, 10.0, 10.0);
			}
		}

// on recalcule les objets liés
		v.MAJ (vo, ve);
		A1 = A.homothetie (O1, rapport);
		B1 = B.homothetie (O1, rapport);
		C1 = C.homothetie (O1, rapport);
		A2 = A1.translation (v);
		B2 = B1.translation (v);
		C2 = C1.translation (v);
		A3 = A.homothetie (O2, rapport1);
		B3 = B.homothetie (O2, rapport1);
		C3 = C.homothetie (O2, rapport1);
		O1A.MAJ (O1, A);
		O1A1.MAJ (O1, A1);
		A1A2.MAJ (vo, ve);
		O2A3.MAJ (O2, A3);
		O1B.MAJ (O1, B);
		O1B1.MAJ (O1, B1);
		B1B2.MAJ (vo, ve);
		O2B3.MAJ (O2, B3);
		O1C.MAJ (O1, C);
		O1C1.MAJ (O1, C1);
		C1C2.MAJ (vo, ve);
		O2C3.MAJ (O2, C3);
		AB.MAJ (A, B);
		BC.MAJ (B, C);
		CA.MAJ (C, A);
		A1B1.MAJ (A1, B1);
		B1C1.MAJ (B1, C1);
		C1A1.MAJ (C1, A1);
		A2B2.MAJ (A2, B2);
		B2C2.MAJ (B2, C2);
		C2A2.MAJ (C2, A2);
		A3B3.MAJ (A3, B3);
		B3C3.MAJ (B3, C3);
		C3A3.MAJ (C3, A3);
		O2A.MAJ (O2, A);
		O2B.MAJ (O2, B);
		O2C.MAJ (O2, C);


// on trace
		g1.setColor (getBackground ());
		g1.fillRect (0, 0, R.XMAX, R.YMAX);

		g1.setColor (Color.YELLOW);
		O1A.trace ("", R, g1);
		O1A1.trace ("", R, g1);
		A1A2.trace (A1, "", R, g1);
		O1B.trace ("", R, g1);
		O1B1.trace ("", R, g1);
		B1B2.trace (B1, "", R, g1);
		O1C.trace ("", R, g1);
		O1C1.trace ("", R, g1);
		C1C2.trace (C1, "", R, g1);

		g1.setColor (Color.CYAN);
		O2A.trace ("", R, g1);
		O2A3.trace ("", R, g1);
		O2B.trace ("", R, g1);
		O2B3.trace ("", R, g1);
		O2C.trace ("", R, g1);
		O2C3.trace ("", R, g1);

		g1.setColor (Color.BLACK);
		R.cadre (g1);
		v.trace (vo, "v", R, g1);

		g1.setColor (Color.BLUE);
		AB.trace ("", R, g1);
		BC.trace ("", R, g1);
		CA.trace ("", R, g1);
		A1B1.trace ("", R, g1);
		B1C1.trace ("", R, g1);
		C1A1.trace ("", R, g1);
		A2B2.trace ("", R, g1);
		B2C2.trace ("", R, g1);
		C2A2.trace ("", R, g1);
		A1.traceNom ("A1", R, g1);
		B1.traceNom ("B1", R, g1);
		C1.traceNom ("C1", R, g1);
		A2.traceNom ("A2", R, g1);
		B2.traceNom ("B2", R, g1);
		C2.traceNom ("C2", R, g1);
		A3.traceNom ("A3", R, g1);
		B3.traceNom ("B3", R, g1);
		C3.traceNom ("C3", R, g1);

		g1.setColor (Color.RED);
		A.trace ("A", R, g1);
		B.trace ("B", R, g1);
		C.trace ("", R, g1);
		O1.trace ("o1", R, g1);
		O2.trace ("o2", R, g1);
		vo.trace ("", R, g1);
		ve.trace ("", R, g1);

		g1.setColor (Color.GREEN);
		A3B3.trace ("", R, g1);
		B3C3.trace ("", R, g1);
		C3A3.trace ("", R, g1);

		g.drawImage (img, 0, 0, this);
	}

	public void actionPerformed (ActionEvent e) {
		if (e.getSource () == ok) {
			double r = rapport;
			double r1 = rapport1;
			String s = tf.getText().trim ();
			int i = s.indexOf (' ');
			if (i == -1) {
				try {
					r1 = Double.parseDouble (s);
				}
				catch (NumberFormatException exc) {}
			} else {
				try {
					r = Double.parseDouble (s.substring (0, i));
					r1 = Double.parseDouble (s.substring (i));
				}
				catch (NumberFormatException exc) {}
			}
			rapport = r;
			rapport1 = r1;
			tf.setText (rapport + " " + rapport1);
			repaint();
		}
	}

	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 (O1.deplace = O1.zone (X, Y, R)) {
		} else if (O2.deplace = O2.zone (X, Y, R)) {
		} else if (vo.deplace = vo.zone (X, Y, R)) {
		} else if (ve.deplace = ve.zone (X, Y, R)) {
		}
	}

	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);
		O1.bouge (X, Y, R);
		O2.bouge (X, Y, R);
		vo.bouge (X, Y, R);
		ve.bouge (X, Y, R);
		repaint();
	}

	public void mouseReleased (MouseEvent e) {
		A.deplace = B.deplace = C.deplace = O1.deplace = O2.deplace = vo.deplace = ve.deplace = false;
	}

	public void mouseMoved (MouseEvent e) {
		if (A != null) {
			int X = e.getX();
			int Y = e.getY();
			if (A.zone (X, Y, R) || B.zone (X, Y, R) || C.zone (X, Y, R) || O1.zone (X, Y, R) || O2.zone (X, Y, R)	|| vo.zone (X, Y, R)	|| ve.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) {
		homotran ht = new homotran();
		JFrame f = new JFrame ("homot1c2");
		f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		f.add (ht);
		f.setSize (600, 600);
		f.setVisible (true);
	}

}
