package cit.PureATN;
import java.awt.AWTException;
import java.awt.Point;
import java.awt.Robot;
import java.awt.geom.Point2D;
import org.piccolo2d.PCamera;
import org.piccolo2d.PCanvas;
import org.piccolo2d.PLayer;
import org.piccolo2d.event.PBasicInputEventHandler;
import org.piccolo2d.event.PInputEvent;
import org.piccolo2d.util.PBounds;
public class WheelEvent_on_Note extends PBasicInputEventHandler {
public int direction = -1;
PCamera camera;
PLayer layer;
PCanvas canvas;
Point2D cursorpoint;
Robot robot;
public WheelEvent_on_Note(PCanvas canv) {
canvas = canv;
camera = canvas.getCamera();
layer = canvas.getLayer();
try {
robot = new Robot();
} catch (AWTException e) {
}
}
public void mouseMoved(PInputEvent e){
cursorpoint = e.getCanvasPosition();
try {
e.getPath().getPathTransformTo(layer).inverseTransform(cursorpoint, cursorpoint);
} catch (RuntimeException ex) {
cursorpoint = e.getPosition(); // Camera付きのメニューボタンや,背景部分(PCamera)のとき
}
}
public void setDirection(int d) {
direction = d;
}
public void mouseWheelRotated(PInputEvent e) {
if (!e.isControlDown() && !e.isShiftDown() && !e.isAltDown()) {
// System.out.println("wheel rotation: " + pc.getAttribute("hoge"));
PBounds pb = camera.getViewBounds();
// System.out.println(pb.toString());
float f = 1.0f + (0.1f * direction * e.getWheelRotation());
if (e.getWheelRotation() // 下に回すと正になるので
* direction < 0) {
pb = zoomBounds_focusbyCursor(pb, f);
} else {
pb = zoomBounds(pb, f);
}
if (pb.x == 0 && pb.y == 0) {
System.out.println("ズームイン位置がまだ準備前");
return;
}
camera.animateViewToCenterBounds(pb, true, 0);
// if (MyPCanvas.this.wheelListener != null)
// MyPCanvas.this.wheelListener.mouseWheelRotated(f);
}
}
/**
* 引数pbで与えた領域を,引数rateだけ拡大した新しい領域を返す
*
* @param pagemanager 領域
* @param rate ズーム率
* @return 新しい領域
*/
public static PBounds zoomBounds(PBounds pb, double rate) {
double x = pb.getX();
double y = pb.getY();
double w = pb.getWidth();
double h = pb.getHeight();
double nw = w * rate;
double nh = h * rate;
double nx = x - (nw - w) / 2;
double ny = y - (nh - h) / 2;
return new PBounds(nx, ny, nw, nh);
}
public PBounds zoomBounds_focusbyCursor(PBounds pb, double rate) {
double x = pb.getX();
double y = pb.getY();
double w = pb.getWidth();
double h = pb.getHeight();
double nw = w * rate;
double nh = h * rate;
Point2D camcp = camera.getViewBounds().getCenter2D();
double camcx = camcp.getX();
double camcy = camcp.getY();
// System.out.println("camcp "+camcx+" "+camcy);
double curx = cursorpoint.getX();
double cury = cursorpoint.getY();
// System.out.println("cursor "+curx+" "+cury);
double nx = x - (nw - w) / 2 + curx - camcx;
double ny = y - (nh - h) / 2 + cury - camcy;
PBounds ret = new PBounds(nx, ny, nw, nh);
cursorpoint = ret.getCenter2D();
moveCursorPointCenter();
return ret;
}
public void moveCursorPointCenter() {
Point canvasglobalp = canvas.getLocationOnScreen();
int canvasw = canvas.getWidth();
int canvash = canvas.getHeight();
if (robot != null)
robot.mouseMove((int) (canvasglobalp.getX() + canvasw / 2),
(int) (canvasglobalp.getY() + canvash / 2));
}
}