import java.awt.*;
import java.util.*;
import ReferenceFrame;
import SpacetimeEvent;
import InertialObject;
import VariableObject;
import LongObject;
import MyCanvas;

public class Universe extends Object
 {
  Vector frames;
  Vector events;
  Vector inertialObjects;
  Vector variableObjects;
  Vector longObjects;
  Vector rays;
  MyCanvas g;
  RelApp app;

  boolean translation_freedom; // whether the universe is translation invariant
  boolean lorentz_freedom;     // whether the universe is boost invariant

  Universe(MyCanvas g, RelApp app)
   {
    frames = new Vector();
    events = new Vector();
    inertialObjects = new Vector();
    variableObjects = new Vector();
    longObjects = new Vector();
    rays = new Vector();
    translation_freedom = true;
    lorentz_freedom = true;
    this.g = g;
    g.u = this;
    this.app = app;
   }

  public ReferenceFrame frameAt(int i)
   {
    return (ReferenceFrame) frames.elementAt(i);
   }

  public SpacetimeEvent eventAt(int i)
   {
    return (SpacetimeEvent) events.elementAt(i);
   }

  public InertialObject inertialAt(int i)
   {
    return (InertialObject) inertialObjects.elementAt(i);
   }

  public VariableObject variableAt(int i)
   {
    return (VariableObject) variableObjects.elementAt(i);
   }

  public LongObject longAt(int i)
   {
    return (LongObject) longObjects.elementAt(i);
   }

  public void addFrame(ReferenceFrame f)
   {
    frames.addElement(f);
    translation_freedom = false;
    lorentz_freedom = false;
    app.gotoChoice.insert(f.name, frames.size()-1);
    app.frameChoice.add(f.name);
   }

  public void addEvent(SpacetimeEvent e)
   {
    events.addElement(e);
    translation_freedom = false;
    if (e.x != 0 || e.t != 0)
      lorentz_freedom = false;

    app.gotoChoice.add(e.name);
    g.redraw();
   }

  public int getNumObjects()
   {
    return inertialObjects.size() + variableObjects.size() + longObjects.size();
   }

  public void addInertialObject(InertialObject o)
   {
    inertialObjects.addElement(o);
    translation_freedom = false;
    lorentz_freedom = false;

    app.gotoChoice.insert(o.name, frames.size() + inertialObjects.size() - 1);
    g.redraw();
   }

  public void addVariableObject(VariableObject o)
   {
    variableObjects.addElement(o);
    translation_freedom = false;
    lorentz_freedom = false;

    app.gotoChoice.insert(o.name, frames.size() + inertialObjects.size() + variableObjects.size() - 1);
    g.redraw();
   }

  public void addLongObject(LongObject o)
   {
    longObjects.addElement(o);
    translation_freedom = false;
    lorentz_freedom = false;

    app.gotoChoice.insert(o.name, frames.size() + getNumObjects() - 1);
    g.redraw();
   }

 }
