/**
 * aire1.java - jpq - 25/10/2000
 * jdk 1.2
 * modification et ajout de main() le 19/02/18
 */

import java.awt.event.*;
import java.awt.*;
import java.applet.*;
import geo.*;

public class aire1 extends Applet implements MouseListener, MouseMotionListener {
  static final long serialVersionUID = 180219L;

//---------- définition et initialisation des objets mathématiques

  Repere R;
  Segment AB, BC, CD, DA, MN, PQ;
  Droite d, dAB, dBC, dCD, dDA, dMN, dPQ, dorth;
  Polygone poly;
  pt A, B, C, D;
  point M, N, P, Q;
  pt Z [];
  PointSurDroite I, J;
  int n, X, Y, Xp, Yp;
  Image img;
  Graphics g1;
  int w, h, modepaint;

  public void init ()
  { setBackground (Color.white);
    addMouseMotionListener (this);
    addMouseListener (this);
  }

//----------------------------------------------------------------------------

public void update (Graphics g)
  { paint (g); }

//----------------------------------------------------------------------------

  public void paint (Graphics g) {
	if (img == null || w != getSize().width || h != getSize().height) {
	  w = getSize().width;
      h = getSize().height;
      img = createImage (w, h);
      g1 = img.getGraphics(); 
	  Font f = new Font ("Arial", Font.PLAIN, 12);
      g1.setFont (f);
    R = new Repere (getSize().width / 2, getSize().height / 2, getSize().width, getSize().height, 50.0, 50.0);
    A = new pt (-1.0, -1.0, "A", R);
    B = new pt (-1.0, 1.0, "B", R);
    C = new pt (1.0, 1.0, "C", R);
    D = new pt (1.0, -1.0, "D", R);
    M = new point ("", R);
    N = new point ("", R);
    P = new point ("", R);
    Q = new point ("", R);
    d = new Droite (1.0, -1.0, 0.0, "", R);
    AB = new Segment (A, B, "", R);
    BC = new Segment (B, C, "", R);
    CD = new Segment (C, D, "", R);
    DA = new Segment (D, A, "", R);
    I = new PointSurDroite (-0.5, -0.5, d, "I", R);
    J = new PointSurDroite (-1.0, -1.0, d, "J", R);
    MN = new Segment (-1.0, -1.0, -1.0, 1, "", R);
    PQ = new Segment (-1.0, -1.0, -1.0, 1, "", R);
    dAB = new Droite (1.0, 0.0, 1.0, "", R);
    dBC = new Droite (0.0, 1.0, -1.0, "", R);
    dCD = new Droite (1.0, 0.0, -1.0, "", R);
    dDA = new Droite (0.0, 1.0, 1.0, "", R);
    dorth = new Droite ("", R);
    n = 6;
    Z = new pt [6];
    for (int i = 0; i < n; i ++) Z [i] = new pt ("", R);
    poly = new Polygone ("", R);
    modepaint = -1;
	}
    g1.setColor (Color.white);
    g1.fillRect (0, 0, R.XMAX, R.YMAX);
    if (modepaint == -1) modepaint = 0;
    if (modepaint == 0)
    { dorth.Perpendiculaire (d, I);
      if (I.x > 0)
      { M.Intersection (dBC, dorth);
        N.Intersection (dCD, dorth);
      }
      else
      { M.Intersection (dAB, dorth);
        N.Intersection (dDA, dorth);
      }
      dorth.Perpendiculaire (d, J);
      if (J.x > 0)
      { P.Intersection (dBC, dorth);
        Q.Intersection (dCD, dorth);
      }
      else
      { P.Intersection (dAB, dorth);
        Q.Intersection (dDA, dorth);
      }
      MN.Segment (M, N);
      PQ.Segment (P, Q);
      if ((I.x > 0) && (J.x < 0))
      { n = 6;
        Z[0].point (-1.0, 1.0);
        Z[1].point (M.x, M.y);
        Z[2].point (N.x, N.y);
        Z[3].point (1.0, -1.0);
        Z[4].point (Q.x, Q.y);
        Z[5].point (P.x, P.y);
      }
      else
      { n = 4;
        Z[0].point (M.x, M.y);
        Z[1].point (N.x, N.y);
        Z[2].point (Q.x, Q.y);
        Z[3].point (P.x, P.y);
      }
      poly.Polygone (Z, n, true);
    }
    g1.setColor (Color.black);
    AB.trace (g1);
    BC.trace (g1);
    CD.trace (g1);
    DA.trace (g1);
/*  A.traceNom (g1);
    B.traceNom (g1);
    C.traceNom (g1);
    D.traceNom (g1); */
    g1.setColor (Color.blue);
    poly.trace (g1);
    g1.setColor (Color.red);
    I.trace (g1);
    J.trace (g1);
    g1.setColor (Color.black);
    if ((modepaint == 1) && (X > 0))
    { g1.drawString ("point mobile", X, Y);
      Xp = X; Yp = Y; X = -1;
    }
    xij.i = I.x + 1;
    xij.j = J.x + 1;
    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)
    { e.consume ();
      if (I.zone (e.getX (), e.getY ()) || J.zone (e.getX (), e.getY ()))
      { modepaint = 0;
        X = -1;
      }
    }

//---------- bouge le point sélectionné

    public void mouseDragged (MouseEvent e)
    { e.consume ();
      I.bouge (e.getX (), e.getY ());
      J.bouge (e.getX (), e.getY ());
      if (I.deplace)
      { if (I.x < J.x) I.point (J.x, J.y);
        else if (I.x > 1.0) I.point (1.0, 1.0);
      }
      else if (J.deplace)
      { if (J.x > I.x) J.point (I.x, I.y);
        else if (J.x < -1.0) J.point (-1.0, -1.0);
      }
      repaint ();
    }

//---------- points refixés

    public void mouseReleased (MouseEvent e)
    { e.consume ();
      I.deplace = I.deplace = false;
      modepaint = 0;
    }

  public void mouseMoved (MouseEvent e)
  { e.consume ();
    if (modepaint == -1) repaint (); else modepaint = 1;
    if (I.zone (e.getX (), e.getY ()) || J.zone (e.getX (), e.getY ())) 
    { X = e.getX () + 2; Y = e.getY () + 2;
      I.deplace = J.deplace = false;
    }
  repaint ();
  }

    public void mouseClicked(MouseEvent e)
    { }

    public void mouseEntered(MouseEvent e)
    { }

    public void mouseExited(MouseEvent e)
    { }

    public String getAppletInfo ()
    { return "aire1 par j.-p. Quelen"; }


////////////////////////////////////////////////////////////////////////////////

    public static void main (String [] args) {

        aire1 a = new aire1();
        a.init ();
        a.start ();

        aire2 a2 = new aire2();
        a2.init ();
        a2.start ();

        Frame f = new Frame ("aire1");
        f.addWindowListener (new fermer ());
        f.add (a);
        f.setSize (200, 200);
        f.setVisible (true);

        Frame f2 = new Frame ("aire2");
        f2.addWindowListener (new fermer ());
        f2.add (a2);
        f2.setSize (300, 200);
        f2.setVisible (true);
		}

// Permet la fermeture de la fenêtre contenant l'applet
    protected static final class fermer extends WindowAdapter {
        public void windowClosing (WindowEvent e) {
            System.exit (0);
        }
    }

}

/**
 * Sert à la liaison entre les différents Applets
 */

class xij
{ static double i;
  static double j;
}
