/**
 * axbyc1.java - jpq - 05/05/99 - jdk1.2 - double-buffering
 * ajout de main() le 20/12/17; modifications le 04, 12 et le 22/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.Random;
import geo.*;

public class axbyc1 extends JFrame implements ActionListener {
	static final long serialVersionUID = 220922L;
	static Repere R;
	static Image img;
	static Graphics g1;
	JButton npts, ok;
	JLabel message;
	Random rnd;
	static TextField ta, tb, tc;
	double a, b, c;
	String sbravo = "Bravo !";
	String squestion = "???";
	int gw, gh;
	Feuille dessin = new Feuille();

// on definit ici les objets mathématiques
	static PointLibre A, B;
	static Droite AB, AB1;
	int pas = 40;

	public axbyc1 (String titre) {
		Font f = new Font ("Arial", Font.PLAIN, 16);
		setLayout (new BorderLayout());
		JPanel jp = new JPanel();
		add (jp, BorderLayout.NORTH);

		jp.add (ta = new TextField ("", 8));
		jp.add (message = new JLabel (" x + "));
		message.setFont (f);
		jp.add (tb = new TextField ("", 8));
		jp.add (message = new JLabel (" y + "));
		message.setFont (f);
		jp.add (tc = new TextField ("", 8));
		jp.add (message = new JLabel (" = 0"));
		message.setFont (f);
		npts = new JButton ("Nouveaux points");
		npts.addActionListener (this);
		jp.add (npts);
		ok = new JButton ("Ok");
		ok.addActionListener (this);
		jp.add (ok);
		rnd = new Random ();
		message = new JLabel (sbravo);
		message.setFont (f);
		jp.add (message);
		add (dessin, BorderLayout.CENTER);
		setBackground (Color.WHITE);
	}

protected class Feuille extends Canvas implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220912L;

	public Feuille() {
		setBackground (Color.WHITE);
		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 ();

			R = new Repere (gw / 2, gh / 2, gw, gh, pas, pas);
			A = new PointLibre (1.0, 3.0);
			B = new PointLibre (-1.0, -1.0);
			AB = new Droite();
			AB1 = new Droite();
			a = b = c = 0.0;
			message.setVisible (false);
		}

// on recalcule les objets liés
		A.MAJ (0.5 * Math.round (2.0 * A.x), 0.5 * Math.round (2.0 * A.y));
		B.MAJ (0.5 * Math.round (2.0 * B.x), 0.5 * Math.round (2.0 * B.y));
		AB.MAJ (A, B);

		g1.setFont (new Font (Font.SANS_SERIF, Font.PLAIN, 10));

		g1.setColor (getBackground ());
		g1.fillRect (0, 0, R.XMAX, R.YMAX);

// on trace
		g1.setColor (Color.YELLOW);
		R.trace_grille (0.5, 0.5, g1);

		g1.setColor (Color.BLACK);
		R.cadre (g1);

		g1.setColor (Color.RED);
		R.trace (g1);
		R.trace_repere_gradue (1.0, 1.0, g1);
	
		g1.setColor (Color.GREEN);
		AB1.trace ("", R, g1);

		g1.setColor (Color.BLUE);
		AB.trace ("", R, g1);

		g1.setColor (Color.RED);
		A.trace ("A", R, g1);
		B.trace ("B", 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)) {
		}
	}
 
	public void mouseDragged (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		A.bouge (X, Y, R);
		B.bouge (X, Y, R);
		repaint ();
	}

	public void mouseReleased (MouseEvent e) {
		A.deplace = B.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)) {
			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 de protected class Feuille

	public void actionPerformed (ActionEvent e) {
		if (e.getSource() == npts) {
			do {
				A.MAJ ((double)(rnd.nextInt () % 8), (double)(rnd.nextInt () % 6));
				B.MAJ ((double)(rnd.nextInt () % 8), (double)(rnd.nextInt () % 6));
				AB.MAJ (A, B);
			}
			while (!AB.defini);
			ta.setText ("");
			tb.setText ("");
			tc.setText ("");
			a = b = c = 0.0;
			AB1.MAJ (a, b, c);
			message.setVisible (false);
		} else if (e.getSource() == ok) {
			a = b = c = 0.0;
			try {
				a = Double.parseDouble (ta.getText().trim());
				b = Double.parseDouble (tb.getText().trim());
				c = Double.parseDouble (tc.getText().trim());
			}
			catch (NumberFormatException excp) {; }
			ta.setText (Double.toString (a));
			tb.setText (Double.toString (b));
			tc.setText (Double.toString (c));
			AB1.MAJ (a, b, c);
			if ((a == 0.0) && (b == 0.0) || !AB.defini) {
				message.setText (squestion);
				message.setVisible (true);
			} else if ((a * A.x + b * A.y + c == 0.0) && (a * B.x + b * B.y + c == 0.0)) {
				message.setText (sbravo);
				message.setVisible (true);
			} else message.setVisible (false);
		}
		dessin.repaint ();
	}

	public static void main (String [] args) {
		axbyc1 a = new axbyc1("axbyc1");
		a.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		a.setSize (700, 600);
		a.setVisible (true);
	}

}
