package jp.ac.kyutech.mns.ist; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Stroke; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import jp.ac.kyutech.mns.ist.util.BUtil; import edu.umd.cs.piccolo.PCamera; import edu.umd.cs.piccolo.PCanvas; import edu.umd.cs.piccolo.PNode; import edu.umd.cs.piccolo.event.PDragSequenceEventHandler; import edu.umd.cs.piccolo.event.PInputEvent; import edu.umd.cs.piccolo.nodes.PPath; import edu.umd.cs.piccolo.util.PAffineTransform; import edu.umd.cs.piccolo.util.PBounds; /** * ATNWindowで右ドラッグしながら青色のズーム範囲矩形を表示し,ズームする機能を実現するクラス * @author miuramo * */ public class ZoomRegionHandler extends PDragSequenceEventHandler { PPath selection; private Stroke[] strokes = null; private float strokeNum = 0; final static int NUM_STROKES = 10; final static int DASH_WIDTH = 15; Point2D cmp; // ドラッグ開始座標 Point2D cp; //ドラッグ中の座標 Point2D max_ext_cp; // 左上方向(通常とは逆方向)一番遠くにドラッグしたときの座標 // double dist_max_ext_cp; //そのときの距離 PBounds initialBounds; //ドラッグ開始時の視野 PNode pressN; PInputEvent pressEv = null; int dragCount = 0; PCanvas canvas; // public boolean canceled_by_SimpleATN_EnterKey; public ZoomRegionHandler(PCanvas _canvas) { canvas = _canvas; float[] dash = { DASH_WIDTH, DASH_WIDTH }; strokes = new Stroke[NUM_STROKES]; for (int i = 0; i < NUM_STROKES; i++) { strokes[i] = new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1, dash, i); } } public void startDrag(PInputEvent e) { super.startDrag(e); pressN = e.getPickedNode(); pressEv = e; dragCount = 0; cmp = e.getPositionRelativeTo(canvas.getCamera()); max_ext_cp = cmp; // 初期化 selection = new PPath(); selection.setPathToRectangle((float) cmp.getX(), (float) cmp.getY(), 0, 0); selection.setStrokePaint(Color.blue);//青色 selection.setPaint(null); selection.setStroke(strokes[0]); canvas.getCamera().addChild(selection); initialBounds = canvas.getCamera().getViewBounds(); } public void drag(PInputEvent e) { super.drag(e); cp = e.getPositionRelativeTo(canvas.getCamera()); dragCount++; float cp_cmp_x = (float)(cp.getX() - cmp.getX()); float cp_cmp_y = (float)(cp.getY() - cmp.getY()); if (selection != null){ selection.setPathToRectangle((float) cmp.getX(), (float) cmp.getY(), cp_cmp_x, cp_cmp_y); // 右下にドラッグしているときの,青い点線矩形の点線パターンを変化させる float origStrokeNum = strokeNum; strokeNum = (strokeNum + 0.3f) % NUM_STROKES; if ((int) strokeNum != (int) origStrokeNum) { selection.setStroke(strokes[(int) strokeNum]); } if (cp_cmp_x>10 && cp_cmp_y >10){ selection.setStrokePaint(Color.blue); } else { selection.setStrokePaint(Color.magenta); } } // 左上方向(通常とは逆方向)一番遠くにドラッグしたときの処理 if (cp_cmp_x < 0 || cp_cmp_y < 0){ PCamera pc = canvas.getCamera(); float f; if (cp_cmp_x < 0) f = Math.abs((float)(canvas.getWidth()/(canvas.getWidth() - cp.distance(cmp)))); else f = Math.abs((float)((canvas.getWidth() - cp.distance(cmp))/canvas.getWidth())); PBounds pb = BUtil.zoomBounds(initialBounds, f); pc.animateViewToCenterBounds(pb, true, 0); } } public void endDrag(PInputEvent e) { super.endDrag(e); cp = e.getPositionRelativeTo(canvas.getCamera()); if (dragCount < 3){ // if (pressN instanceof PText){ // //ポップアップメニュー // new PopupMenu_forBase(pressEv, canvas, this); // } } if (!PopupMenu_forZoomRegion.isopening /*&& !canceled_by_SimpleATN_EnterKey*/){ if (selection != null) selection.removeFromParent(); if (cmp.getX() < cp.getX() && cmp.getY() < cp.getY()) { if ((cp.getX()-cmp.getX())>10 && (cp.getY()-cmp.getY())>10){ //あまり小さければキャンセル // カメラ座標から,グローバル(パネル)座標への変換 PAffineTransform at = canvas.getCamera().getViewTransform(); if (selection != null){ Rectangle2D globalb = selection.getGlobalBounds(); Rectangle2D layerb = new Rectangle2D.Double(); at.inverseTransform(globalb, layerb); canvas.getCamera().animateViewToCenterBounds(layerb, true, 1000); } } } selection = null; pressN = null; } // canceled_by_SimpleATN_EnterKey = false; } public void dismissRegionLater(){ if (selection != null){ // カメラ座標から,グローバル(パネル)座標への変換 // PAffineTransform at = canvas.getCamera().getViewTransform(); // Rectangle2D globalb = selection.getGlobalBounds(); // Rectangle2D layerb = new Rectangle2D.Double(); // at.inverseTransform(globalb, layerb); // PPath p = new PPath(layerb); // p.setStroke(strokes[(int) strokeNum]); // p.setStrokePaint(Color.orange); // p.setPaint(null); // canvas.getLayer().addChild(p); selection.removeFromParent(); selection = null; pressN = null; } } }