package EDU.neu.ccs.demeter.tools.apstudio.graphedit;
import java.awt.*;
import java.io.*;
import java.util.*;
import EDU.neu.ccs.demeter.*;
import EDU.neu.ccs.demeter.common.tg.*;


import EDU.neu.ccs.demeter.*;
abstract class UEdge extends NetPrimitive {
  protected UID eid;
  public UID get_eid() { return eid; }
  public void set_eid(UID new_eid)
    { eid = new_eid; }
  protected UID fromVertex;
  public UID get_fromVertex() { return fromVertex; }
  public void set_fromVertex(UID new_fromVertex)
    { fromVertex = new_fromVertex; }
  protected UID toVertex;
  public UID get_toVertex() { return toVertex; }
  public void set_toVertex(UID new_toVertex)
    { toVertex = new_toVertex; }
  protected Decorator edeco;
  public Decorator get_edeco() { return edeco; }
  public void set_edeco(Decorator new_edeco)
    { edeco = new_edeco; }
  protected BendPoint bendpoint;
  public BendPoint get_bendpoint() { return bendpoint; }
  public void set_bendpoint(BendPoint new_bendpoint)
    { bendpoint = new_bendpoint; }
  protected ArcPerspective persp;
  public ArcPerspective get_persp() { return persp; }
  public void set_persp(ArcPerspective new_persp)
    { persp = new_persp; }
  UEdge() { super(); }
  public UEdge(UID eid, UID fromVertex, UID toVertex, Decorator edeco, BendPoint bendpoint, ArcPerspective persp) {
    super();
    set_eid(eid);
    set_fromVertex(fromVertex);
    set_toVertex(toVertex);
    set_edeco(edeco);
    set_bendpoint(bendpoint);
    set_persp(persp);
  }

		public Rectangle getBoundingBox(){return get_persp().getBoundingBox();}
		public void set_label(Document d,String name)
		{
			d.net().modifyEdgeName(name,eid);
		}

		public Perspective  get_sourcePerspective(Document d)
		{
			UVertex nn=d.net().getNode(fromVertex);
			return nn.get_Perspective();
		}
		
		public Perspective get_destPerspective(Document d)
		{
			UVertex nn=d.net().getNode(toVertex);
			return nn.get_Perspective();
		}
 
  /** Connect the source and destination ports, iff they agree to
   * being connected (i.e., canConnectTo() returns true). Reply true
   * on success. This method is normally called after a new arc
   * instance is made. Maybe this behavior should be in a constructor,
   * but I want to use Class#newInstancel so constructors do not get
   * any arguments. */
		public void connect(UVertex s, UVertex d) 
		{
			set_fromVertex(s.get_vid());
			set_toVertex(d.get_vid());
			s.addOutArc(eid);
			d.addInArc(eid);
		}
		public void connectAlternation(UVertex s, UVertex d) 
		{
			set_fromVertex(s.get_vid());
			set_toVertex(d.get_vid());
			((UAltVertex)s).addAlternationVertex(eid);
			d.addInArc(eid);
		}

		
  /** Remove this NetArc from the underlying connected graph model. */
		public void dispose(Document d) 
		{
			System.out.println("Arc disposing: " + toString());
			if (get_fromVertex() != null && get_toVertex() != null) 
				d.net().removeArc(eid);
		}

		UEdge(UID source_id , UID dest_id)
		{
			set_eid( UniqueIDGenerator.get_NextUnique() );
			set_fromVertex(source_id);
			set_toVertex(dest_id); 
		}
	  boolean isMarked() {
    __V_UEdge_isMarked v0 = new __V_UEdge_isMarked();
    v0.start();
    __trav_isMarked(v0);
    v0.finish();
    return v0.get_return_val();
  }
  void universal_trv0_bef(UniversalVisitor _v_) {
    _v_.before(this);
  }
  void universal_trv0_aft(UniversalVisitor _v_) {
    _v_.after(this);
  }
  void universal_trv0(UniversalVisitor _v_) {
    _v_.before_eid(this, eid);
    eid.universal_trv0(_v_);
    _v_.after_eid(this, eid);
    _v_.before_fromVertex(this, fromVertex);
    fromVertex.universal_trv0(_v_);
    _v_.after_fromVertex(this, fromVertex);
    _v_.before_toVertex(this, toVertex);
    toVertex.universal_trv0(_v_);
    _v_.after_toVertex(this, toVertex);
    if (edeco != null) {
      _v_.before_edeco(this, edeco);
    edeco.universal_trv0(_v_);
      _v_.after_edeco(this, edeco);
    }
    if (bendpoint != null) {
      _v_.before_bendpoint(this, bendpoint);
    bendpoint.universal_trv0(_v_);
      _v_.after_bendpoint(this, bendpoint);
    }
    _v_.before_persp(this, persp);
    _v_.after_persp(this, persp);
  }
  void toVertEdge_UGraph_trv_bef(superInitVisitor v) {
    v.before(this);
  }
  void toVertEdge_UGraph_trv_aft(superInitVisitor v) {  }
  void toVertEdge_UGraph_trv(superInitVisitor v) {  }
  void saveGraph_UGraph_trv_bef(SaveGraphVisitor sgv) {  }
  void saveGraph_UGraph_trv_aft(SaveGraphVisitor sgv) {  }
  void saveGraph_UGraph_trv(SaveGraphVisitor sgv) {
    eid.saveGraph_UGraph_trv(sgv);
    fromVertex.saveGraph_UGraph_trv(sgv);
    toVertex.saveGraph_UGraph_trv(sgv);
    if (edeco != null) {
    edeco.saveGraph_UGraph_trv(sgv);
    }
    if (bendpoint != null) {
    bendpoint.saveGraph_UGraph_trv(sgv);
    }
  }
  void saveMarkedGraph_UGraph_trv_bef(SelectMarkedVisitor v) {  }
  void saveMarkedGraph_UGraph_trv_aft(SelectMarkedVisitor v) {  }
  void saveMarkedGraph_UGraph_trv_aro_UEdge(SelectMarkedVisitor v) {
    eid.saveMarkedGraph_UGraph_trv(v);
    fromVertex.saveMarkedGraph_UGraph_trv(v);
    toVertex.saveMarkedGraph_UGraph_trv(v);
    if (edeco != null) {
    edeco.saveMarkedGraph_UGraph_trv(v);
    }
    if (bendpoint != null) {
    bendpoint.saveMarkedGraph_UGraph_trv(v);
    }
  }
  static java.lang.reflect.Method saveMarkedGraph_UGraph_trv_aro_UEdge;
  static {
    try {
      saveMarkedGraph_UGraph_trv_aro_UEdge =
        UEdge.class.getDeclaredMethod("saveMarkedGraph_UGraph_trv_aro_UEdge",
          new Class[] { SelectMarkedVisitor.class });
    } catch (NoSuchMethodException e) {
      throw new RuntimeException(e.toString());
    }
  }
  void saveMarkedGraph_UGraph_trv(SelectMarkedVisitor v) {
    v.around(new __Subtraversal(saveMarkedGraph_UGraph_trv_aro_UEdge, this, new Object[] { v }), this);
  }
  void ReadAllEdges_UGraph_trv_bef(ReadEdgeVisitor rev) {  }
  void ReadAllEdges_UGraph_trv_aft(ReadEdgeVisitor rev) {  }
  void ReadAllEdges_UGraph_trv(ReadEdgeVisitor rev) {  }
  void toUEdgeVertex_UGraph_trv_bef(TGCreateVisitor tg) {  }
  void toUEdgeVertex_UGraph_trv_aft(TGCreateVisitor tg) {  }
  void toUEdgeVertex_UGraph_trv(TGCreateVisitor tg) {  }
  public void __trav_isMarked(__V_UEdge_isMarked __v0) {
    __trav_isMarked_UEdge_trv(__v0);
  }
  void __trav_isMarked_UEdge_trv_bef(__V_UEdge_isMarked __v0) {  }
  void __trav_isMarked_UEdge_trv_aft(__V_UEdge_isMarked __v0) {  }
  void __trav_isMarked_UEdge_trv(__V_UEdge_isMarked __v0) {
    if (edeco != null) {
    edeco.__trav_isMarked_UEdge_trv(__v0);
    }
  }
  void toAllEnds_PlacementVisitor_trv_bef(superInitVisitor siv) {
    siv.before(this);
  }
  void toAllEnds_PlacementVisitor_trv_aft(superInitVisitor siv) {  }
  void toAllEnds_PlacementVisitor_trv(superInitVisitor siv) {  }
}

