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.*;
class PlaceVertexVisitor extends UniversalVisitor {
  protected Coordinates pos;
  public Coordinates get_pos() { return pos; }
  public void set_pos(Coordinates new_pos)
    { pos = new_pos; }
  protected Hashtable vtable;
  public Hashtable get_vtable() { return vtable; }
  public void set_vtable(Hashtable new_vtable)
    { vtable = new_vtable; }
  protected Hashtable etable;
  public Hashtable get_etable() { return etable; }
  public void set_etable(Hashtable new_etable)
    { etable = new_etable; }
  PlaceVertexVisitor() { super(); }
  public PlaceVertexVisitor(Coordinates pos, Hashtable vtable, Hashtable etable) {
    super();
    set_pos(pos);
    set_vtable(vtable);
    set_etable(etable);
  }
  public void before(UVertex host) {
	if( host.get_vdeco().isSet(true))
		return;
	//for all outgoing, call place
	Coordinates cc = new Coordinates(pos.get_xvalue(), pos.get_yvalue());
	host.set_position(cc);
	int rightmost = place(host);
	pos = new Coordinates( (rightmost + 70 ), pos.get_yvalue()) ; //default vertex = 45-35
	}

		int  place(UVertex uv)
		{
			int rightmost = uv.get_position().get_xvalue();
			int x = rightmost;
			int y = uv.get_position().get_yvalue();
			uv.get_vdeco().setMark(true);
			UEdge loopue;
			UVertex loopuv;
			UID loopuidv;
			UID loopuide;
			Nonempty_OEdge_List list;
    		if(uv.get_outgoing() != null)
       		{
				list = uv.get_outgoing().get_first();	
				while(list != null)
				{
					loopuide = list.get_it();
					list = list.get_next();
					loopue = (UEdge)etable.get(loopuide);
					loopuidv=loopue.get_toVertex();
					loopuv = (UVertex)vtable.get(loopuidv);
				
					if(loopuv.get_vdeco().isSet(true) )
						continue;		//already marked
					else
					{
						loopuv.set_position(new Coordinates(rightmost , (y + 90)));
						loopuv.get_vdeco().setMark(true);
						rightmost = place(loopuv);	
						rightmost += 50;
					}
				}
			//	rightmost -= 50;
			}
			uv.get_position().get_x().set_x(new Integer(( x+rightmost)/2));
			return rightmost;
		}
	  void universal_trv0_bef(UniversalVisitor _v_) {
    super.universal_trv0_bef(_v_);
  }
  void universal_trv0_aft(UniversalVisitor _v_) {
    super.universal_trv0_aft(_v_);
  }
  void universal_trv0(UniversalVisitor _v_) {
    universal_trv0_bef(_v_);
    pos.universal_trv0(_v_);
    super.universal_trv0(_v_);
    universal_trv0_aft(_v_);
  }
}

