import java.awt.*;
import java.awt.event.*;
import WizCard;
import Util;

public class EventFromProper extends WizCard implements ItemListener
 {
  Choice objectChoice, locationChoice;
  TextField tText, lText;
  TextField name;
  Choice colorChoice;

  Universe u;
  
  public EventFromProper(Wizard w, Universe u)
   {
    super(w);
    this.u = u;
//    isFinal = true;  // Done! instead of next>>

    setLayout(new GridBagLayout());

    Util.add(this,
        new Label("Please specify the following parameters."),
        Util.ENDL); 

    Util.add(this,
        new Label("Reference object: "),
        Util.DEFAULT); 

    Util.add(this,
        objectChoice = new Choice(),
        Util.ENDL);

    Util.add(this,
        new Label("Object proper time: "),
        Util.DEFAULT); 

    Util.add(this,
        tText = new TextField("0.0",10),
        Util.ENDL);

    Util.add(this,
        new Label("Spatial location: "),
        Util.DEFAULT); 

    Util.add(this,
        locationChoice = new Choice(),
        Util.DEFAULT);

    Util.add(this,
        lText = new TextField("0.0",10),
        Util.ENDL);

    Util.add(this,
        new Label("Event name: "),
        Util.DEFAULT); 

    Util.add(this,
        name = new TextField("Event " + Integer.toString(u.events.size()),40),
        Util.ENDL);

    Util.add(this,
        new Label("Display color: "),
        Util.DEFAULT);

    Util.add(this,
        colorChoice = Util.colorChoice(),
        Util.ENDL);

    int i;

    for (i = 0; i < u.inertialObjects.size(); i++) 
      objectChoice.add(u.inertialAt(i).name);

    for (i = 0; i < u.variableObjects.size(); i++) 
      objectChoice.add(u.variableAt(i).name);

    for (i = 0; i < u.longObjects.size(); i++) 
      objectChoice.add(u.longAt(i).name);

    locationChoice.add("Center of object");
    locationChoice.add("Left end of object");
    locationChoice.add("Right end of object");
    locationChoice.add("Position x = ");
    locationChoice.addItemListener(this);

    lText.setEditable(false);
   }

  public void itemStateChanged(ItemEvent e)
   {
    lText.setEditable(locationChoice.getSelectedIndex() == 3);
   }

  public void doNext()
   {
    int i = objectChoice.getSelectedIndex();

    PhysicalObject obj;

    if (i < u.inertialObjects.size())
      obj = u.inertialAt(i);
    else
     {
      i -= u.inertialObjects.size();
      if (i < u.variableObjects.size())
        obj = u.variableAt(i);
      else
       {
        i -= u.variableObjects.size();
        obj = u.longAt(i);
       }
     }
     
    double t;

    try
     {
      t = Util.doubleValue(tText);
     }
    catch (NumberFormatException e)
      {
       System.out.println("Error: proper time must be a number");
       return;
      }

    double x = 0;

    switch (locationChoice.getSelectedIndex())
     {
      case 0: x = 0; break;
      case 1: x = -obj.length/2; break;
      case 2: x = obj.length/2; break;
      case 3: try
               {
                x = Util.doubleValue(lText);
               } 
              catch (NumberFormatException e)
               {
                System.out.println("Error: position must be a number");
                return;
               }
     } 

    if (!obj.existsAt(t))
     {
      System.out.println("Error: object does not exist at this time!");
      return;
     } 

    SpacetimeEvent e = new SpacetimeEvent(obj.location(x,t));
    e.name = name.getText();
    e.color = Util.colorOf(colorChoice);
    u.addEvent(e);
    w.reset();
   }
 }
