/** homo2.java - jpq - 29/11/98
 * double-buffering
 * 21/03/99 - jdk1.2
 * ajout de main() le 22/12/17. Modification le 05 et le 09/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class homo2 extends Panel implements MouseListener, MouseMotionListener, ActionListener {
	static final long serialVersionUID = 220909L;
	static Repere R;
	static Image img;
	static Graphics g1;
	int gw, gh;

	static PointLibre O1, O2, O3, A, B, C;
	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, O2A1, O2A2, O3A, O3A3;
	static Segment O1B, O1B1, O2B1, O2B2, O3B, O3B3;
	static Segment O1C, O1C1, O2C1, O2C2, O3C, O3C3;
	double rapport = 1.5, rapport1 = 0.4, rapport2 = 0.8;
	TextField tf = new TextField ("1.5 0.4 0.8");
	Button ok = new Button ("Ok");

	public homo2() {
		addMouseMotionListener (this);
		addMouseListener (this);
		add (new Label ("rapport de h1, de h2 et de h3"));
		add (tf);
		add (ok);
		ok.addActionListener (this);
		setBackground (Color.WHITE);
	}

	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();
		
// on initialise ici les objets mathématiques
			if (R == null) {
				R = new Repere (gw / 2, gh / 2, gw, gh, 10.0, 10.0);
				O1 = new PointLibre (-10.0, -12.5);
				O2 = new PointLibre (8.0, -12.0);
				O3 = new PointLibre (-12.0, 4.0);
				A = new PointLibre (-1.5, -2.5);
				B = new PointLibre (4.0, -2.5);
				C = new PointLibre (4.0, 0.0);
				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();
				O1A = new Segment();
				O1A1 = new Segment();
				O2A1 = new Segment();
				O2A2 = new Segment();
				O3A = new Segment();
				O3A3 = new Segment();
				O1B = new Segment();
				O1B1 = new Segment();
				O2B1 = new Segment();
				O2B2 = new Segment();
				O3B = new Segment();
				O3B3 = new Segment();
				O1C = new Segment();
				O1C1 = new Segment();
				O2C1 = new Segment();
				O2C2 = new Segment();
				O3C = new Segment();
				O3C3 = new Segment();
			} else {
				R.MAJ (gw / 2, gh / 2, gw, gh, 10.0, 10.0);
			}
		}

// on recalcule les objets liés
			A1 = A.homothetie (O1, rapport);
			B1 = B.homothetie (O1, rapport);
			C1 = C.homothetie (O1, rapport);
			A2 = A1.homothetie (O2, rapport1);
			B2 = B1.homothetie (O2, rapport1);
			C2 = C1.homothetie (O2, rapport1);
			A3 = A.homothetie (O3, rapport2);
			B3 = B.homothetie (O3, rapport2);
			C3 = C.homothetie (O3, rapport2);
			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);
			O1A.MAJ (O1, A);
			O1A1.MAJ (O1, A1);
			O2A1.MAJ (O2, A1);
			O2A2.MAJ (O2, A2);
			O3A.MAJ (O3, A);
			O3A3.MAJ (O3, A3);
			O1B.MAJ (O1, B);
			O1B1.MAJ (O1, B1);
			O2B1.MAJ (O2, B1);
			O2B2.MAJ (O2, B2);
			O3B.MAJ (O3, B);
			O3B3.MAJ (O3, B3);
			O1C.MAJ (O1, C);
			O1C1.MAJ (O1, C1);
			O2C1.MAJ (O2, C1);
			O2C2.MAJ (O2, C2);
			O3C.MAJ (O3, C);
			O3C3.MAJ (O3, C3);

// on trace
		g1.setFont (new Font (Font.SANS_SERIF, Font.PLAIN, 12));
		g1.setColor (getBackground());
		g1.fillRect (0, 0, R.XMAX, R.YMAX);

		g1.setColor (Color.YELLOW);
		O1A.trace ("", R, g1);
		O1A1.trace ("", R, g1);
		O2A1.trace ("", R, g1);
		O2A2.trace ("", R, g1);
		O1B.trace ("", R, g1);
		O1B1.trace ("", R, g1);
		O2B1.trace ("", R, g1);
		O2B2.trace ("", R, g1);
		O1C.trace ("", R, g1);
		O1C1.trace ("", R, g1);
		O2C1.trace ("", R, g1);
		O2C2.trace ("", R, g1);

		g1.setColor (Color.CYAN);
		O3A.trace ("", R, g1);
		O3A3.trace ("", R, g1);
		O3B.trace ("", R, g1);
		O3B3.trace ("", R, g1);
		O3C.trace ("", R, g1);
		O3C3.trace ("", R, g1);

		g1.setColor (Color.BLACK);
		R.cadre (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.GREEN);
		A3B3.trace ("", R, g1);
		B3C3.trace ("", R, g1);
		C3A3.trace ("", R, g1);

		g1.setColor (Color.RED);
		A.trace ("A", R, g1);
		B.trace ("B", R, g1);
		C.trace ("C", R, g1);
		O1.trace ("o1", R, g1);
		O2.trace ("o2", R, g1);
		O3.trace ("o3", R, g1);

		g.drawImage (img, 0, 0, this);
	}

	public void actionPerformed (ActionEvent e) {
		if (e.getSource() == ok) {
			double r = rapport;
			double r1 = rapport1;
			double r2 = rapport2;
			String s = tf.getText().trim();
			String s1 = "";
			String s2 = "";
			int i = s.indexOf (' ');
			int j = -1;
			if (i != -1) {
				s1 = s.substring(i).trim();
				j = s1.indexOf(' ');
			}
			if (i == -1) {
				try {
					r2 = Double.parseDouble (s);
				}
				catch (NumberFormatException exc) {}
			} else if (j == -1) {
				try {
					r = Double.parseDouble (s.substring (0, i));
					r1 = Double.parseDouble (s.substring (i));
				}
				catch (NumberFormatException exc) {}
			} else {
				try {
					r = Double.parseDouble (s.substring (0, i));
					r1 = Double.parseDouble (s1.substring (0, j));
					r2 = Double.parseDouble (s1.substring (j));
				}
				catch (NumberFormatException exc) {}
			}
			rapport = r;
			rapport1 = r1;
			rapport2 = r2;
			tf.setText (rapport + " " + rapport1 + " " + rapport2);
			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 (O3.deplace = O3.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);
		O3.bouge (X, Y, R);
		repaint();
	}

	public void mouseReleased (MouseEvent e) {
		A.deplace = B.deplace = C.deplace = O1.deplace = O2.deplace = O3.deplace = false;
	}

	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) || O1.zone (X, Y, R) || O2.zone (X, Y, R)	|| O3.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) {
		homo2 h2 = new homo2();
		JFrame f = new JFrame ("homo2");
		f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		f.add (h2);
		f.setSize (400, 400);
		f.setVisible (true);
	}

}
