package jaist.css.covis.cls; import jaist.css.covis.CoVisBuffer; import jaist.css.covis.ToolTipProvider; import jaist.css.covis.fm.FlowMenu_TMRG; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.TreeMap; import javax.swing.Timer; import edu.umd.cs.piccolo.PNode; import edu.umd.cs.piccolo.event.PInputEvent; import edu.umd.cs.piccolo.nodes.PPath; import edu.umd.cs.piccolo.nodes.PText; import edu.umd.cs.piccolo.util.PDimension; public class VarField extends PPath implements Layoutable , ToolTipProvider, ClickHandler, Move { private static final long serialVersionUID = 3524513728998576206L; public static PNode nullToolTip = new PNode(); public String typeName; // Variable, Object, Class public Color color; PText caption; public static Font bold = new Font("sansserif", Font.BOLD, 12); public static float top = 40; public Timer rewindTimer; public CoVisBuffer buffer; public static ArrayList<VarField> vflist; static { vflist = new ArrayList<VarField>(); } /** * VarField複数化計画 * Buffer.setHistLinkCode_ConcatinateVarDefAndNew がうまく探せるように再設計する * @param _typeName * @param c * @param buf */ public VarField(String _typeName, Color c, CoVisBuffer buf){ color = c; typeName = _typeName; buffer = buf; setPathToRectangle(0, 0, 255, 100); setPaint(color); setStrokePaint(null); // setStroke(new BasicStroke(1)); scale(1); // setTransparency(0.4f); this.addAttribute("moveTarget", this); this.addAttribute("info", "Field "+toString()); this.addAttribute("selectable", this); caption = new PText(typeName); caption.scale(3); caption.setFont(bold); caption.setOffset(10,0); caption.addAttribute("moveTarget", this); caption.addAttribute("dragLayout", this); addChild(caption); this.addAttribute("clickHandler", this); rewindTimer = new Timer(100, new ActionListener(){ public void actionPerformed(ActionEvent e){ move(new PDimension()); rewindTimer.stop(); } }); } public void layout(int dur){ layoutExceptOne(null, dur); } public void layoutExceptOne(PNode operationNode, int dur) { List<PNode> col = getChildrenReference(); TreeMap<Double,PNode> map = new TreeMap<Double, PNode>(); for(PNode p: col) { if (p != caption) map.put(p.getYOffset(), p); } double offsetx = 10; double endx = 10; double offsety = 10; double endy = 30; //少し余白をつくり,変数追加しやすく double maxx = 0, maxy = 0; for(PNode p : map.values()){ // p.setOffset(offsetx, offsety); double px = p.getBounds().width; double py = p.getBounds().height; if (maxx < offsetx + endx + px) maxx = offsetx + endx + px; if (maxy < offsety + endy + py) maxy = offsety + endy + py; if (operationNode != p) { p.animateToPositionScaleRotation(offsetx, offsety+top, 1, 0, dur); if (p instanceof Move) ((Move)p).move(new PDimension()); } offsety += py; offsety += 10; } if (maxx < 200) maxx = 200; if (maxy+top < 100) maxy = 100-top; animateToBounds(0, 0, maxx, maxy+top, dur); // System.out.println("Layout"); rewindTimer.start(); } public PNode getToolTipNode() { if (ClassStamp.selectedType == null) { PText p = new PText("First, select one ' Type '\non the left column"); p.setScale(1.4f); p.setTextPaint(Color.red); return p; // return nullToolTip; } PNode p = ClassStamp.selectedType.getToolTipNode_forVariable(); return p; } public void clicked(PInputEvent e, FlowMenu_TMRG fmenu) { if (ClassStamp.selectedType == null) return; else { Variable var = null; try { var = new Variable(ClassStamp.selectedType.cv_type.newInstance(true), fmenu.window.frame, buffer,false); } catch (InvocationTargetException e1) { e1.printStackTrace(); } if (var.type == null) return; var.setTransparency(0.0f); addChild(var); var.addAttribute("moveTargetY", var); // var.addAttribute("selectable", var); var.setOffset(e.getPositionRelativeTo(this)); layout(200); boolean isAuto = buffer.getWindow().isAutoMode.isSelected(); //SHIFT押していたら,マニュアル/オートをトグル if (e.isShiftDown()) isAuto = !isAuto; if (!isAuto) if (var.rename(buffer.getWindow().frame) == null) { var.dispose(); return; } if (!isAuto && var.cv_class instanceof Covis_primitive && !var.isArray) ((Covis_primitive)var.cv_class).edit(buffer.getWindow().frame,var,true); var.setTransparency(1.0f); // Informer.playSound("Default.wav"); Informer.playSound("Pop.wav"); buffer.putHistoryVar("var", var, true); } } public void addVariable(ClassStamp cs){ boolean isAuto = buffer.getWindow().isAutoMode.isSelected(); addVariable(cs,isAuto); } public void addVariable(ClassStamp cs, boolean isAuto){ Variable var = null; try { var = new Variable(cs.cv_type.newInstance(true), buffer.getWindow().frame, buffer,false); } catch (InvocationTargetException e1) { e1.printStackTrace(); } if (var.type == null) return; var.setTransparency(0.0f); addChild(var); var.addAttribute("moveTargetY", var); // var.addAttribute("selectable", var); var.setOffset(0,this.getHeight()); layout(200); if (!isAuto) if (var.rename(buffer.getWindow().frame) == null) { var.dispose(); return; } if (!isAuto && var.cv_class instanceof Covis_primitive && !var.isArray) ((Covis_primitive)var.cv_class).edit(buffer.getWindow().frame,var,true); var.setTransparency(1.0f); // Informer.playSound("Default.wav"); Informer.playSound("Pop.wav"); buffer.putHistoryVar("var", var, true); } public boolean checkExistName(String input, Variable variable) { List<PNode> col = getChildrenReference(); for(PNode p: col) { if (p instanceof Variable){ Variable v = (Variable)p; if (v.getBaseVarName().equals(input) && v != variable) return true; } } return false; } public void move(PDimension d){ translate(d.getWidth(), d.getHeight()); //履歴に関係ない動作 for(PNode p: getChildrenReference()) { if (p instanceof Move) ((Move)p).move(new PDimension()); } } public void removeAllVariables() { List<PNode> col = new ArrayList<PNode>(getChildrenReference()); for(PNode p: col) { if (p instanceof Variable){ Variable v = (Variable)p; v.dispose(); } } layout(500); } public Variable findVar(String head){ List<PNode> col = new ArrayList<PNode>(getChildrenReference()); for(PNode p: col) { if (p instanceof Variable){ Variable v = (Variable)p; if (head.startsWith(v.getBaseVarName())) return v; } } return null; } public void updateVarNameChain(){ List<PNode> col = new ArrayList<PNode>(getChildrenReference()); for(PNode p: col) { if (p instanceof Variable){ Variable v = (Variable)p; // System.out.println("start OrigVariable "+v.getVarName()); v.appendVarNameRecursive(new Hashtable<Integer,Object>());//具体的には,リンク先に名前を設定(追加).その先にVarMがあれば,さらに追加していく. } } layout(500); } }