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 Program {
  protected GlobalImports globalimports;
  public GlobalImports get_globalimports() { return globalimports; }
  public void set_globalimports(GlobalImports new_globalimports)
    { globalimports = new_globalimports; }
  protected ClassGraph cg;
  public ClassGraph get_cg() { return cg; }
  public void set_cg(ClassGraph new_cg)
    { cg = new_cg; }
  Program() { super(); }
  public Program(GlobalImports globalimports, ClassGraph cg) {
    super();
    set_globalimports(globalimports);
    set_cg(cg);
  }
  public static Program parse(java.io.InputStream in) throws ParseException
    { return new Parser(in)._Program(); }
  public static Program parse(String s) {
    try { return parse(new java.io.ByteArrayInputStream(s.getBytes())); }
    catch (ParseException e) { throw new RuntimeException(e.toString()); }
  }

		/**
		Converts the cd object(Program) to a gcd object(UGraph)
		input - none
		output - UGraph corresponding to the class dictionary
		*/
		public UGraph print_edges () 
		{
			ClassNameTranspVisitor cntv = new ClassNameTranspVisitor();
			UGraph ug = new UGraph(); 
			EdgeDistinctionVisitor edv 	= new EdgeDistinctionVisitor();
			EdgeVisitor aev	= new EdgeVisitor(edv , cntv , ug); 
			this.toAllSubclasses(cntv,aev);
//			System.out.println("Text-Uml conversion done....\n");
			PlacementVisitor placev = new PlacementVisitor(ug);
			placev.PositionThem();
//			System.out.println("Placement done....\n");
			//ug.universal_trv0(new DisplayVisitor() ); //for debug
//			System.out.println(ug.GetGraphString()); //for debug
			return ug ;	//this to be used by the GUI
		}
	   
		/**
		a debug entry point. 
		Invokes the cd-gcd conversion
		input - cd file redirected
		command line - EDU..Program.main < someCd.cd
		*/
		public static void main(String args[]) throws Exception
		{
			Program p = parse(System.in);
			p.print_edges();
        }
	
		public void check_classparents()
		{
			DummyVisitor dv= new DummyVisitor();
			checkParents(dv);
		}
	  void universal_trv0_bef(UniversalVisitor _v_) {
    _v_.before(this);
  }
  void universal_trv0_aft(UniversalVisitor _v_) {
    _v_.after(this);
  }
  void universal_trv0(UniversalVisitor _v_) {
    universal_trv0_bef(_v_);
    _v_.before_globalimports(this, globalimports);
    globalimports.universal_trv0(_v_);
    _v_.after_globalimports(this, globalimports);
    _v_.before_cg(this, cg);
    cg.universal_trv0(_v_);
    _v_.after_cg(this, cg);
    universal_trv0_aft(_v_);
  }
  public void toAllSubclasses(ClassNameTranspVisitor cntv, EdgeVisitor aev) {
    toAllSubclasses_Program_trv(cntv, aev);
  }
  void toAllSubclasses_Program_trv_bef(ClassNameTranspVisitor cntv, EdgeVisitor aev) {
    aev.before(this);
  }
  void toAllSubclasses_Program_trv_aft(ClassNameTranspVisitor cntv, EdgeVisitor aev) {
    aev.after(this);
  }
  void toAllSubclasses_Program_trv(ClassNameTranspVisitor cntv, EdgeVisitor aev) {
    toAllSubclasses_Program_trv_bef(cntv, aev);
    cg.toAllSubclasses_Program_trv(cntv, aev);
    toAllSubclasses_Program_trv_aft(cntv, aev);
  }
  public void checkParents(DummyVisitor dv) {
    checkParents_Program_trv(dv);
  }
  void checkParents_Program_trv_bef(DummyVisitor dv) {  }
  void checkParents_Program_trv_aft(DummyVisitor dv) {  }
  void checkParents_Program_trv(DummyVisitor dv) {
    checkParents_Program_trv_bef(dv);
    cg.checkParents_Program_trv(dv);
    checkParents_Program_trv_aft(dv);
  }
}

