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 PlacementVisitor extends UniversalVisitor {
  protected UGraph ugraph;
  public UGraph get_ugraph() { return ugraph; }
  public void set_ugraph(UGraph new_ugraph)
    { ugraph = new_ugraph; }
  PlacementVisitor() { super(); }
  public PlacementVisitor(UGraph ugraph) {
    super();
    set_ugraph(ugraph);
  }

		private Hashtable vtable;
		private Hashtable etable;
		
		void PositionThem()
		{
			this.Init();
			Coordinates pos = new Coordinates(50 , 50);
			PlaceVertexVisitor pvv = new PlaceVertexVisitor( pos , vtable , etable);
			
			if(this.get_ugraph().get_firstuid() != null )
			{
				Coordinates cc = new Coordinates(pos.get_xvalue(), pos.get_yvalue());
				UVertex uvert = (UVertex)vtable.get(this.get_ugraph().get_firstuid());
				uvert.set_position(cc);
				int rightmost = pvv.place(uvert);
				pos = new Coordinates( (rightmost + 70 ), pos.get_yvalue()) ; //default vertex = 45-35
			}
			pvv = new PlaceVertexVisitor( pos , vtable , etable);
			this.toUVertex(pvv);
		}

		void Init() //mark all as 0 (white)
		{
			superInitVisitor  inv = new InitVisitor();
			toAllEnds(inv);
			vtable = new Hashtable( (((InitVisitor)inv).get_vcount() + 10) );
			etable = new Hashtable(((InitVisitor)inv).get_ecount() + 10);
			superInitVisitor  hcv = new HashCreateVisitor(vtable , etable);
			toAllEnds(hcv);
		}
	  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_);
    ugraph.universal_trv0(_v_);
    super.universal_trv0(_v_);
    universal_trv0_aft(_v_);
  }
  public void toUVertex(PlaceVertexVisitor pvv) {
    toUVertex_PlacementVisitor_trv(pvv);
  }
  void toUVertex_PlacementVisitor_trv_bef(PlaceVertexVisitor pvv) {  }
  void toUVertex_PlacementVisitor_trv_aft(PlaceVertexVisitor pvv) {  }
  void toUVertex_PlacementVisitor_trv(PlaceVertexVisitor pvv) {
    toUVertex_PlacementVisitor_trv_bef(pvv);
    ugraph.toUVertex_PlacementVisitor_trv(pvv);
    toUVertex_PlacementVisitor_trv_aft(pvv);
  }
  public void toAllEnds(superInitVisitor siv) {
    toAllEnds_PlacementVisitor_trv(siv);
  }
  void toAllEnds_PlacementVisitor_trv_bef(superInitVisitor siv) {  }
  void toAllEnds_PlacementVisitor_trv_aft(superInitVisitor siv) {  }
  void toAllEnds_PlacementVisitor_trv(superInitVisitor siv) {
    toAllEnds_PlacementVisitor_trv_bef(siv);
    ugraph.toAllEnds_PlacementVisitor_trv(siv);
    toAllEnds_PlacementVisitor_trv_aft(siv);
  }
}

