/**
 * azbarreplusb.java - jpq - 08/12/98
 * double-buffering
 * 28/03/99 - jdk1.2
 * main() ajouté le 21/12/17 et modification le 04 et le 09/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class azbarreplusb extends JFrame implements ActionListener {
	static final long serialVersionUID = 220909L;
	JTextField tfax = new JTextField ("0.7", 5);
	JTextField tfay = new JTextField ("0.7", 5);
	JTextField tfbx = new JTextField ("0.0", 5);
	JTextField tfby = new JTextField ("0.0", 5);
	double ax = 0.7, ay = 0.7, bx = 0.0, by = 0.0;
	JButton ok;
	Feuille dessin = new Feuille();

	public azbarreplusb (String titre) {
		super (titre);
		setLayout (new BorderLayout());
		JPanel jp = new JPanel();
		add (jp, BorderLayout.NORTH);

		jp.add (new JLabel ("z' = ("));
		jp.add (tfax);
		jp.add (new JLabel ("+ i"));
		jp.add (tfay);
		jp.add (new JLabel (") conj (z) +"));
		jp.add (tfbx);
		jp.add (new JLabel ("+ i"));
		jp.add (tfby);
		jp.add (ok = new JButton ("Ok"));
		ok.addActionListener (this);

		add (dessin, BorderLayout.CENTER);
	}

protected class Feuille extends Canvas implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220904L;
	static Image img;
	static Graphics g1;
	int gw, gh;

// on definit ici les objets mathématiques
	static Repere R;
	static PointLibre vo, ve, O1, O2, A, B, C, D, E;
	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 AA1, BB1, CC1;
	static Droite DE;

	public Feuille () {
		setBackground (Color.WHITE);
		addMouseMotionListener (this);
		addMouseListener (this);
	}

	public void update (Graphics g) {
		paint (g);
	}

	public void paint (Graphics g) {
		boolean bimgnull = img == null;
		if (bimgnull || 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, 20.0, 20.0);
				vo = new PointLibre (-12.0, 7.0);
				ve = new PointLibre (-8.0, 7.0);
				A = new PointLibre (-1.5, -3.5);
				B = new PointLibre (4.0, -3.5);
				C = new PointLibre (4.0, -1.0);
				D = new PointLibre (-5.0, -5.0);
				E = new PointLibre (-3.0, 7.0);
				v = new Vecteur();
				A3 = new Pt();
				B3 = new Pt();
				C3 = new Pt();
				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();
				AA1 = new Segment();
				BB1 = new Segment();
				CC1 = new Segment();
				A1A2 = new Vecteur();
				B1B2 = new Vecteur();
				C1C2 = new Vecteur();
				DE = new Droite();
			} else {
				R.MAJ (gw / 2, gh / 2, gw, gh, 20.0, 20.0);
			}
		}
		g1.setFont (new Font ("Arial", Font.PLAIN, 10));

// on efface tout
		g1.setColor (Color.WHITE);
		g1.fillRect (0, 0, R.XMAX, R.YMAX);

// on recalcule les objets liés
			v.MAJ (vo, ve);
			DE.MAJ (D, E);
			A1 = A.symetrie (DE);
			B1 = B.symetrie (DE);
			C1 = C.symetrie (DE);
			A2 = A1.translation (v);
			B2 = B1.translation (v);
			C2 = C1.translation (v);
			A3.MAJ (ax * A.x + ay * A.y + bx, ay * A.x - ax * A.y + by);
			B3.MAJ (ax * B.x + ay * B.y + bx, ay * B.x - ax * B.y + by);
			C3.MAJ (ax * C.x + ay * C.y + bx, ay * C.x - ax * C.y + by);
			AA1.MAJ (A, A1);
			BB1.MAJ (B, B1);
			CC1.MAJ (C, C1);
			A1A2.MAJ (A1, A2);
			B1B2.MAJ (B1, B2);
			C1C2.MAJ (C1, C2);
			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);

// on trace
		g1.setColor (Color.YELLOW);
		AA1.trace ("", R, g1);
		BB1.trace ("", R, g1);
		CC1.trace ("", R, g1);
		A1A2.trace (A1, "", R, g1);
		B1B2.trace (B1, "", R, g1);
		C1C2.trace (C1, "", R, g1);

		g1.setColor (Color.BLACK);
		R.cadre (g1);
		v.trace (vo, "v", R, g1);
		DE.trace ("", 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.GREEN);
		A3B3.trace ("", R, g1);
		B3C3.trace ("", R, g1);
		C3A3.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);
		D.trace ("D", R, g1);
		E.trace ("E", R, g1);
		vo.trace ("", R, g1);
		ve.trace ("", R, g1);

		g.drawImage (img, 0, 0, this);
	}

	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 (D.deplace = D.zone (X, Y, R)) {
		} else if (E.deplace = E.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);
		D.bouge (X, Y, R);
		E.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 = vo.deplace = ve.deplace = D.deplace = E.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) || D.zone (X, Y, R) || E.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) {}


} // fin protected class Feuille

	public void actionPerformed (ActionEvent e) {
		if (e.getSource() == ok) {
			try {
				ax = Double.parseDouble (tfax.getText());
				ay = Double.parseDouble (tfay.getText());
				bx = Double.parseDouble (tfbx.getText());
				by = Double.parseDouble (tfby.getText());

// normalisation
				double r = Math.sqrt (ax * ax + ay * ay);
				if (r == 0.0) {
					ax = 1.0;
					ay = 0.0;
				} else {
					ax = ax / r;
					ay = ay / r;
				}
				tfax.setText (Double.toString (ax));
				tfay.setText (Double.toString (ay));
				tfbx.setText (Double.toString (bx));
				tfby.setText (Double.toString (by));
				dessin.repaint();
			}
			catch (NumberFormatException nfe) {}
		}
	}


	public static void main (String [] args) {
		azbarreplusb a = new azbarreplusb ("azbarreplusb");
		a.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
		a.setSize (600, 600);
		a.setVisible (true);
	}

}
