package jaist.css.covis.mi;
import jaist.css.covis.cls.Anchor;
import jaist.css.covis.cls.Covis_Object;
import jaist.css.covis.cls.Variable;
import java.awt.event.ActionEvent;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.Map.Entry;
import javax.swing.AbstractAction;
import org.piccolo2d.PNode;
public class WrapMethod extends AbstractAction {
private static final long serialVersionUID = -3933799327221553449L;
Method method;
Covis_Object obj;
Variable variable;
public WrapMethod(Method m, Covis_Object o, String mname, Variable var){
super(mname);
obj = o; method = m; variable = var;
}
Class<?>[] paramClses;
HashMap<Class<?>,HashMap<String,Object>> candidates;
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println(method.toString());
paramClses = method.getParameterTypes();
if (paramClses.length==0){ //引数なければ,そのまま実行!
Object[] arg = null;
MethodInvocationDialog mid = new MethodInvocationDialog(obj.buffer.getWindow().frame, "invoke method", this, "select arguments", variable);
//メソッドコールを文字列に
StringBuffer sb = new StringBuffer();
sb.append(Variable.getShortestName(variable.getVarNamesAry())+"."+method.getName().replace("covis_", "")+"();");
mid.invokeMethod(arg, sb.toString());
return;
}
candidates = new HashMap<Class<?>, HashMap<String,Object>>();
for(Class<?> c: paramClses){
if (candidates.containsKey(c)) continue;
// System.out.println(c.toString()+"を探索");
//格納容器
HashMap<String, Object> temp = new HashMap<String, Object>();
for(var oo: obj.buffer.objField.getAllNodes().toArray()){
PNode pn = (PNode) oo;
if (c.isInstance(pn)){
Covis_Object o = (Covis_Object)pn;
TreeMap<String,Anchor> map = o.referenceAnchors();
for(Entry<String,Anchor> set: map.entrySet()){
String s = set.getKey();
Anchor a = set.getValue();
// System.out.println("a "+a.getVarClass());
// System.out.println("c "+c.getName());
if (c.isAssignableFrom(a.getVarClass())){
temp.put(Variable.getShortestName(a.srcVariable.getVarNamesAry()), a.destObject);
System.out.println(s);
}
}
}
}
candidates.put(c,temp);
}
//オブジェクトの候補(参照のための変数)はあつまった.
MethodInvocationDialog.showDialog(obj.buffer.getWindow().frame, "invoke method", this, "select arguments", variable);
}
}