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

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

  Universe u;
  
  public FrameFromInertial(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("Proper time at frame origin: "),
        Util.DEFAULT); 

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

    Util.add(this,
        new Label("Location of frame origin: "),
        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("Frame name: "),
        Util.DEFAULT); 

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

    int i;

    for (i = 0; i < u.inertialObjects.size(); i++) 
      objectChoice.add(u.inertialAt(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();
      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;
     } 

    ReferenceFrame frame = new ReferenceFrame(obj.location(x,t),obj.velocity(t));
    frame.name = name.getText();
    u.addFrame(frame);
    w.reset();
   }
 }
