import java.applet.Applet;

import java.util.*;
import java.awt.*;
import java.awt.event.*;

public class StarFieldDemo extends Applet
{

    private TextArea textarea;
    private StarField starfield1, starfield2, starfield3;
    private Hashtable HT;

/** To run as an application,
 * construct it and show it in a frame.
 * This must be a static (class not instance) method,
 * because the instance won't exist until we construct it here. */

  public static void main (String []argv) {

      Frame ff = new Frame ("StarFieldDemo 1.0.2");
      ff.setBounds (20, 20, 500, 450);

      StarFieldDemo cd = new StarFieldDemo ();
      ff.add (cd);

      cd.init ();

      ff.pack ();
      ff.show ();

      cd.invalidate ();
      cd.validate ();
  }

    public StarFieldDemo () {

        HT = new Hashtable ();

	setLayout (new GridLayout (2, 2, 5, 5));

/* Construct a few starfields,
 * showing the different selection modes.
 * ACTION -- Click draws down-and-up and reports "Action"
 * SINGLE -- Click toggles down-up and reports "Select" or "Deselect"
 * MULTIPLE -- Like SINGLE but allows multiple selections */

  add (starfield1 = new StarField (StarField.ACTION, 0, 100, -100, 100));
  add (starfield2 = new StarField (StarField.SINGLE, 0, 100, -100, 100));
  add (starfield3 = new StarField (StarField.MULTIPLE, 0, 100, -100, 100));

/* Will report events here */

        add (textarea = new TextArea (12,60));

/* Set some Colors */

starfield1.setForeground (Color.red);
starfield2.setForeground (Color.green);
starfield3.setForeground (Color.blue);

starfield1.setEnterExpand (true);
starfield2.setEnterExpand (true);
starfield3.setEnterExpand (true);

/* Add some markers to the starfields.
 * Any given marker cannot belong to more than one starfield. */

populate (starfield1, "One");
starfield1.add (new StarMarker ("ACTION", "A")).setXY (50, 10);

populate (starfield2, "Two");
starfield2.add (new StarMarker ("SINGLE", "S")).setXY (50, 10);

populate (starfield3, "Three");
starfield3.add (new StarMarker ("MULTIPLE", "M")).setXY (50, 10);

    }

/* Illustrate using StarMarker as --key-- in a Hashtable */

    protected void populate (StarField sf, String SN) {
	StarMarker sm;
	sf.add (sm = new StarMarker ("Yo")).setXY (20, 70);
	sm.setShape (StarMarker.CIRCLE);
	HT.put (sm, SN+"Yo");
	sf.add (sm = new StarMarker ("Java")).setXY (70, -20);
	sm.setShape (StarMarker.UP_POINT);
	HT.put (sm, SN+"Java");
	sf.add (sm = new StarMarker ("Hello")).setXY (30, 50);
	HT.put (sm, SN+"Hello");
	sf.add (sm = new StarMarker ("World")).setXY (50, -30);
	sm.setShape (StarMarker.PLUS);
	HT.put (sm, SN+"World");
	sf.add (sm = new StarMarker ("Moo")).setXY (80, -10);
	sm.setShape (StarMarker.DIAMOND);
	HT.put (sm, SN+"Moo");
	sf.add (sm = new StarMarker ("Boo")).setXY (40, 40);
	sm.setShape (StarMarker.DOWN_POINT);
	HT.put (sm, SN+"Moo");
    }

    public void init () {
	textarea.setText (textarea.getText ()+"StarFieldDemo\n");
    }

    public boolean action (Event evt, Object arg) {
	textarea.setText (textarea.getText ()+"\n"+evt);
	StarMarker sm = (StarMarker)evt.target;
	String tag = (String)(HT.get (sm));
	textarea.setText (textarea.getText ()+"\n"+tag);
	return true;
    }

}
