package org.lemsml.jlems.viz.plot; final class ClickZoomHandler extends BaseMouseHandler { private int xc; private int yc; double xfac; double yfac; final static int NORMAL = 1; final static int IN = 2; final static int OUT = 3; final static int INOUT = 4; int actionMode; boolean dragging = false; public ClickZoomHandler() { super(); xfac = 1.0; yfac = 1.0; } public void activate() { actionMode = NORMAL; super.activate(); } public void activateInOut() { activate(); actionMode = INOUT; } public void activateOut() { activate(); actionMode = OUT; } public void activateIn() { activate(); actionMode = IN; } public void init(Mouse m) { dragging = false; xc = m.getX(); yc = m.getY(); double zfac = 1.0; xfac = 1.0; yfac = 1.0; if (actionMode == IN) { zfac = 0.7; setClaimIn(); } else if (actionMode == OUT) { zfac = 1. / 0.7; setClaimIn(); } else if (actionMode == INOUT) { // we're the only handler, so claim it and zoom on moving up/down or clicking zfac = 1.; if (m.leftButton()) { zfac = 0.7; } else if (m.rightButton()) { zfac = 1. / 0.7; } setClaimIn(); } else { if (m.leftButton()) { zfac = 0.7; } else if (m.rightButton()) { zfac = 1. / 0.7; } else { setClaimOut(); } } if (xc > 30) { xfac = zfac; } if (yc < m.getCanvasHeight() - 30) { yfac = zfac; } } public void advance(Mouse m) { if (actionMode == NORMAL) { int dx = m.getX() - xc; int dy = m.getY() - yc; if (dx * dx + dy * dy > 100) { // not a ckick - a drag - we're out of running; setClaimOut(); } } } public void release(Mouse m) { setClaimIn(); } public void applyOnDown(Mouse m) { m.initializeZoom(xc, yc); } public void applyOnDrag(Mouse m) { int x = m.getX(); int y = m.getY(); double rz = 100.; double zx = Math.exp(-(x - xc) / rz); double zy = Math.exp((y - yc) / rz); if (Math.abs(x - xc) * Math.abs(y - yc) > 5) { dragging = true; } m.dragZoom(zx, zy, xc, yc); setFullRepaint(); } public void applyOnRelease(Mouse m) { if (!dragging) { m.zoom(xfac, yfac, xc, yc); } m.restoreAA(); } }