package jaist.css.covis.cls; import jaist.css.covis.CoVisBuffer; import jaist.css.covis.PPPath; import jaist.css.covis.ToolTipProvider; import jaist.css.covis.fm.FlowMenu_TMRG; import java.awt.Color; import java.awt.Font; import java.awt.geom.Point2D; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.TreeMap; import org.piccolo2d.PNode; import org.piccolo2d.event.PInputEvent; import org.piccolo2d.nodes.PPath; import org.piccolo2d.nodes.PText; import org.piccolo2d.util.PBounds; import org.piccolo2d.util.PDimension; public class ObjectField extends PPPath 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 CoVisBuffer buffer; public ObjectField(String _typeName, Color c, CoVisBuffer buf){ color = c; typeName = _typeName; buffer = buf; setPathToRectangle(0, 0, 200, 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); } public void layout(int dur){ layoutExceptOne(null, dur); } public void layoutExceptOne(PNode operationNode, int dur) { ListIterator lite = getChildrenIterator(); TreeMap<Integer,PNode> map = new TreeMap<Integer, PNode>(); while(lite.hasNext()){ PNode p = (PNode)lite.next(); if (p != caption) map.put((int)p.getYOffset(), p); } double offsetx = 10; double endx = 10; double offsety = 10; double endy = 10; double maxx = 0, maxy = 0; for(PNode p : map.values()){ // p.setOffset(offsetx, offsety); double px = p.getFullBounds().width; double py = p.getFullBounds().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); offsety += py; offsety += 10; } animateToBounds(0, 0, maxx, maxy+top, dur); } public PNode getToolTipNode() { if (ClassStamp.selectedType == null) return nullToolTip; PNode p = ClassStamp.selectedType.getToolTipNode(); p.setTransparency(0.6f); return p; } public void clicked(PInputEvent e, FlowMenu_TMRG fmenu) { // if (e.isShiftDown()){ // SrcExecutor s = new SrcExecutor(buffer); // String f = JOptionPane.showInputDialog(null); // s.execute(f); // return; // } if (ClassStamp.selectedType == null) { Informer.playSound("RecEnd.wav"); return; } else { boolean isAuto = buffer.getWindow().isAutoMode_obj.isSelected(); //SHIFT押していたら,マニュアル/オートをトグル if (e.isShiftDown()) isAuto = !isAuto; Covis_Object o = null; try { o = (Covis_Object) ClassStamp.selectedType.cv_type.createNew(fmenu.window.frame, isAuto); } catch (InvocationTargetException e1) { // e1.printStackTrace(); } if (o == null) { Informer.playSound("RecEnd.wav"); return; } if (o.getVisible()==false) return;//TODO:ここは,コンストラクタダイアログがキャンセルされたときに使う addChild(o); buffer.putHistoryNew("new", o); // Informer.playSound("hwandsw.wav"); o.addAttribute("moveTarget", o); o.addAttribute("selectable", o); o.setOffset(e.getPositionRelativeTo(this)); if (o instanceof Covis_Object) ((Covis_Object)o).tc.transparencyThread_Start(0, this, 100); Informer.playSound("Fairydust.wav"); } } public void move(PDimension d){ translate(d.getWidth(), d.getHeight()); //履歴に関係ない動作 var lite = getChildrenIterator(); while(lite.hasNext()){ PNode p = (PNode)lite.next(); if (p instanceof Move) ((Move)p).move(new PDimension()); } } public void addObject(ClassStamp f) { boolean isAuto = buffer.getWindow().isAutoMode_obj.isSelected(); addObject(f, isAuto); } public Point2D getNextNewObjectPosition(){ //まず,下方向の余裕をさがす double ycandidate = 0; List<PNode> col = new ArrayList<PNode>(getChildrenReference()); for(PNode p: col) { double tempy = p.getYOffset()+p.getHeight(); if (ycandidate < tempy) ycandidate = tempy; } if (ycandidate < this.getHeight()- 60){ return new Point2D.Double(20,ycandidate+20); } //次に,右方向でさがす // PPath checkPath = PPath.createRectangle(0, 0, 110, 55); for(int y = 1; y< (this.getHeight()/20)-4; y++){ for(int x = 1; x< (this.getWidth()/20)-1; x++){ // checkPath.setOffset(x*120,y*60); PNodeBoundsIntersectsFilter rpf = new PNodeBoundsIntersectsFilter( new PBounds(x*20+getX()+getOffset().getX()-10,y*20+getY()+getOffset().getY()+10,120,80)); ArrayList<PNode> pnbuf = new ArrayList<PNode>(); this.getAllNodes(rpf, pnbuf); for(PNode pn: pnbuf){ System.out.println("x="+x+" y="+y+" "+pn.toString()); } if (pnbuf.size()==0) { System.out.println("found x="+x+" y="+y); return new Point2D.Double(x*20,y*20+30); } } } return new Point2D.Double(getWidth()/3, getHeight()/3); } public void addObject(ClassStamp f, boolean isAuto) { Covis_Object o = null; try { o = (Covis_Object) f.cv_type.createNew(buffer.getWindow().frame, isAuto); } catch (InvocationTargetException e1) { // e1.printStackTrace(); } if (o == null) { Informer.playSound("RecEnd.wav"); return; } addChild(o); buffer.putHistoryNew("new", o); // Informer.playSound("hwandsw.wav"); o.addAttribute("moveTarget", o); o.addAttribute("selectable", o); o.setOffset(getNextNewObjectPosition()); if (o instanceof Covis_Object) ((Covis_Object)o).tc.transparencyThread_Start(0, this, 100); Informer.playSound("Fairydust.wav"); } //メソッド内でよばれたとき,200%の時間をかけて,ゆっくりとフェードアウト public void addObject(Covis_Object o){ addChild(o); // buffer.putHistoryNew("new", o); // Informer.playSound("hwandsw.wav"); o.addAttribute("moveTarget", o); o.addAttribute("selectable", o); if (o.anchors_incoming.size()<1){ o.setOffset(getNextNewObjectPosition()); ((Covis_Object)o).tc.transparencyThread_Start(0, this, 200); Informer.playSound("Fairydust.wav"); } } public void clearObjVarName(){ List<PNode> col = new ArrayList<PNode>(getChildrenReference()); for(PNode p: col) { if (p instanceof Covis_Object){ Covis_Object co= (Covis_Object)p; // v.myrefs.clear(); for(Anchor a: co.anchors_member){ a.srcVariable.clearVarNamesAry(); } } } } }