package jaist.css.covis.fm; import jaist.css.covis.AnchorGarden; import jaist.css.covis.PPPath; import java.awt.Font; import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; import java.awt.geom.Point2D; import org.piccolo2d.event.PInputEvent; import org.piccolo2d.nodes.PPath; import org.piccolo2d.nodes.PText; /** * ジョグダイアル状態 * * @author miuramo * */ public @SuppressWarnings("serial") class JogState extends State { protected int width = 10; protected int value = 0; protected static double[] limit = { SIZE / 4.0, SIZE / 2.0, SIZE / 4.0 * 5.0, SIZE / 4.0 * 5.0 }; // 無保証のフィールド AnchorGarden sview; public JogState(AbstractFlowMenu f, String n) { super(f, n); // 無保証のフィールドをセット sview = ((FlowMenu_TMRG) f).window; } public String getValue() { return String.valueOf(value); } public void updateMenu(int index) { @SuppressWarnings("unused") int temp = old_index; int diff; if (index != old_index) { if (index != 1) itempath[index].setPaint(choose); if (old_index != 1) itempath[old_index].setPaint(fill); if (index != 1 && old_index != 1) { diff = old_index - index; if (Math.abs(diff) > 14) { // 2->17 or 17->2 diff = -diff / 15; } sview.zoomPane(diff); } } old_index = index; } public int getPlace(int x, int y) { int xx, yy, id; int rr; int mx = owner.getX(); int my = owner.getY(); xx = x - mx; yy = my - y; distance = rr = (int) (Math.sqrt(xx * xx + yy * yy)); if (rr < limit[1]) { // メニューの中心 id = 1; } else { // メニューの外側 double r = Math.atan((double) yy / (double) xx) / RD; if (xx < 0) { r += 180.0; } if (r < 67.5) { r += 360.0; } id = (int) ((r - 67.5) / 22.5) + 2; } return id; } public void drag(PInputEvent e) { super.drag(e); Point2D cp = e.getPositionRelativeTo(owner.camera); index = getPlace((int) cp.getX(), (int) cp.getY()); updateMenu(index); // System.out.println("x: "+cp.getX()+" y: "+cp.getY() +" st "+index); } public void paint() { removeAllChildren(); int mx = owner.getX(); int my = owner.getY(); // int sx = 0, sy = 0; // for(int k=0; k<3; k++){ for (int k = 1; k < 2; k++) { Ellipse2D.Double ed2 = new Ellipse2D.Double(-limit[k] - 1, -limit[k] - 1, limit[k] * 2 + 2, limit[k] * 2 + 2); Arc2D.Double ac = new Arc2D.Double(-limit[k + 1], -limit[k + 1], limit[k + 1] * 2, limit[k + 1] * 2, 0, -21, Arc2D.PIE); // ^^^ Area a = new Area(); a.add(new Area(ac)); a.subtract(new Area(ed2)); AffineTransform at = new AffineTransform(); for (int i = 0; i < 16; i++) { // g2.setStroke(new // BasicStroke(2,BasicStroke.CAP_ROUND,BasicStroke.CAP_ROUND)); at.setToTranslation(mx, my); at.rotate(Math.toRadians(-89.5 - i * 22.5)); Area b = a.createTransformedArea(at); PPath bpath = new PPPath(b); // if(state == i+2 && limit[k] < distance && (distance < // limit[k+1] || k ==2)){ // bpath.setPaint(choose); // } // else{ bpath.setPaint(fill); bpath.setStroke(null); addChild(bpath); itempath[i + 2] = bpath; } } Font f = (new PText()).getFont(); Font nf = new Font(f.getFontName(), Font.BOLD, (int) (16 * SIZE / 80.0)); // FontMetrics fm = g2.getFontMetrics(nf); String s = "<<++ -->>"; char[] c = new char[s.length()]; s.getChars(0, s.length(), c, 0); PText pt = new PText(s); pt.setFont(nf); // topleftnumText.offset(mx - fm.charsWidth(c, 0, c.length)/2, // (int)(my+limit[1]+10)); pt.offset(mx - 45, (int) (my + limit[1] + 10)); s = getValue(); c = new char[s.length()]; s.getChars(0, s.length(), c, 0); PText pt2 = new PText(s); pt2.setFont(nf); pt2.offset(mx, my); // pt2.offset(mx-fm.charsWidth(c, 0, c.length)/2, my); addChild(pt); addChild(pt2); } public void setWidth(int rr) { if (rr < limit[1]) { width = 1; } else if (rr < limit[2]) { width = 10; } else { // width=50; width = 10; } } }