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 ConstVisitor extends cdStringVisitor {
  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; }
  ConstVisitor() { super(); }
  public ConstVisitor(String return_val, Hashtable vtable, Hashtable etable) {
    super(return_val);
    set_vtable(vtable);
    set_etable(etable);
  }

		String vname = "";
		String parts = "";
		String bef = "";
		String aft = "";
		boolean isrep = false;
		String srep = "";
		String ext = "";
		String impl = "";
		boolean incoming = true;
	  public void before(UVertex host) {
	
		vname = "";
		parts = "";
		bef = "";
		aft = "";
		isrep = false;
		srep = "";
		ext = "" ;
		impl = "" ;
		incoming = true;
		//System.out.println("in *************Visitor:: before UVert");

	
	}
  public void before(UVertexName host) {
		//System.out.println("in visitor:UconstVisitor: for - " + host.get_name());
		vname = host.get_name().toString();
	}
  public void before(UConstVertex host) {
		//System.out.println("in *************Visitor:: before UConstVert");
		bef = host.get_beforeSyntax();
		aft = host.get_afterSyntax();
	}
  public void before(IEdge_List host) {
		incoming = true;
	}
  public void before(OEdge_List host) {
		incoming = false;
	}
  public void before(UID host) {	
		UEdge ue = (UEdge)etable.get(host);
		String pname = "";
		String tempresult = "";
		if(incoming) //extends implements
		{
			UVertex uv = (UVertex)vtable.get(ue.get_fromVertex());
			pname = uv.get_vertexname().get_name().toString();
			if(ue instanceof UExtendEdge)
			{ 
				ext = pname; // no multiple inheritance
			}
			else if(ue instanceof UImplEdge)
			{
				impl = (impl !=null ? impl : " ") + pname;
			}
		}
		else	// parts repetition
		{
			boolean opt = false;
			UVertex uv = (UVertex)vtable.get(ue.get_toVertex());
			pname = uv.get_vertexname().get_name().toString();
			Integer lower = ((UConstEdge)ue).get_card().get_lower().get_l();
			String ebef = ((UConstEdge)ue).get_beforeSyntax();
			String eaft = ((UConstEdge)ue).get_afterSyntax();
			String ename = "";
			if(((UConstEdge)ue).get_edgename()!=null)
				ename = ((UConstEdge)ue).get_edgename().get_name().toString();
			
			if(lower.equals(new Integer(0)))
				opt = true;
			else 
				opt = false;

			String upper = "";
			if(((UConstEdge)ue).get_card().get_upper() != null)
			{
				upper = ((UConstEdge)ue).get_card().get_upper().get_u().toString();
				if(upper.equals("*"))
					isrep = true;
			}

			tempresult = pname ;
				
			if(isrep)
			{
				tempresult = (ebef!=null ? ("\""+ebef+"\"") : " ")  + tempresult ;
				tempresult += (eaft!=null ? ("\""+eaft+"\"") : " ") ;
				tempresult = "{" + tempresult + "}" ;
				if(opt == false)
					tempresult = pname + tempresult ;
				srep = tempresult;
			}
			else
			{
				tempresult = (ename!=null?("<"+ename+">"):" ") + tempresult;
				tempresult = (ebef!=null ? ("\""+ebef+"\"") : " ")  + tempresult ;				
				tempresult += (eaft!=null ? ("\""+eaft+"\"") : " ") ;				
				if(opt == true)
					tempresult = "[" + tempresult + "] ";
				parts = (parts != null ? parts : " ") + tempresult;
			}
			
		}
	}
  public void after(UVertex host) {
		if(isrep)
		{
			return_val = vname + " ~ " + (bef!=null?("\""+bef+"\" "):" ")
				+ srep + (aft!=null? (" \""+aft+"\""):" ") + ".\n";
		}
		else
		{
			return_val = vname + " = " + (bef!=null?("\""+bef+"\""):" ")+ parts;
			if(ext != "")
				return_val += " *extends* " + ext ;
			if(impl != "")
				return_val += " *implments* " + impl ;
			return_val += (aft!=null? ("\""+aft+"\""):" ") + ".\n";
		}
	}
  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_);
    super.universal_trv0(_v_);
    universal_trv0_aft(_v_);
  }
}

