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 AltVisitor 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; }
  AltVisitor() { super(); }
  public AltVisitor(String return_val, Hashtable vtable, Hashtable etable) {
    super(return_val);
    set_vtable(vtable);
    set_etable(etable);
  }

		String vname = "";
		String alts = "";
		String parts = "";
		String bef = "";
		String aft = "";
		boolean isrep = false;
		String srep = "";
		String ext = "";
		String impl = "";
		boolean incoming = true;
	  public void before(UVertex host) {
	
		vname = "";
		alts = null;
		parts = "";
		bef = "";
		aft = "";
		isrep = false;
		srep = "";
		ext = "" ;
		impl = "" ;
		incoming = true;
	}
  public void before(UVertexName host) {
		vname = host.get_name().toString();
	}
  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
		{
			if (ue instanceof UConstEdge)
			{
				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;

				tempresult = pname ;
					
				tempresult = (ename!=null?("<"+ename+">"):" ") + tempresult;
				tempresult = (ebef!=null ? ("\""+ebef+"\"") : " ")  + tempresult ;				
				tempresult += (eaft!=null ? ("\""+eaft+"\"") : " ") ;				
				if(opt == true)
					tempresult = "[" + tempresult + "] ";
				parts = (parts != null ? parts : " ") + tempresult;
			}
			else if (ue instanceof UAltEdge )//instance of UAltEdge
			{
				UVertex uv = (UVertex)vtable.get(ue.get_toVertex());
				pname = uv.get_vertexname().get_name().toString();
				alts = (alts != null ? (alts + " | ") : " ") + pname ; 
			}
		}
	}
  public void after(UVertex host) {
		return_val = vname + " : " + (alts!=null ? alts : ""); 
		return_val += (parts!=null? (" *common* " + parts) : "");
		if(ext != "")
			return_val += " *extends* " + ext ;
		if(impl != "")
			return_val += " *implments* " + impl ;
		return_val +=  ".\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_);
  }
}

