/* * Copyright (c) 2016 Vivid Solutions. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * * http://www.eclipse.org/org/documents/edl-v10.php. */ package org.locationtech.jtstest.testbuilder.ui.tools; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.geom.Point2D; import javax.swing.SwingUtilities; import org.locationtech.jtstest.testbuilder.AppConstants; import org.locationtech.jtstest.testbuilder.GeometryEditPanel; import org.locationtech.jtstest.testbuilder.JTSTestBuilderFrame; /** * @version 1.7 */ public class ZoomTool extends BasicTool { private double zoomFactor = 2; private Point zoomBoxStart = null; private Point zoomBoxEnd = null; public ZoomTool(double zoomFactor, Cursor cursor) { super(cursor); this.zoomFactor = zoomFactor; } public void mouseClicked(MouseEvent mouseEvent) { // determine if zoom in (left) or zoom out (right) double realZoomFactor = SwingUtilities.isRightMouseButton(mouseEvent) ? (1d / zoomFactor) : zoomFactor; panel().zoom(toModel(mouseEvent.getPoint()), realZoomFactor); } public void mousePressed(MouseEvent e) { zoomBoxStart = e.getPoint(); zoomBoxEnd= e.getPoint(); } public void mouseReleased(MouseEvent e) { // don't process event if the mouse was clicked or dragged a very short // distance if (! isSignificantMouseMove(e.getPoint())) return; // do Pan if (e.isControlDown()) { Point2D destination = toModel(e.getPoint()); PanTool.pan(panel(), toModel(zoomBoxStart), destination); return; } // no key -> do Zoom panel().zoom(toModel(zoomBoxStart), toModel(zoomBoxEnd)); } public void mouseDragged(MouseEvent e) { // if panning don't draw zoom box if (e.isControlDown()) return; Point currPoint = e.getPoint(); Graphics g = panel().getGraphics(); g.setColor(AppConstants.BAND_CLR); g.setXORMode(Color.white); // erase old rectangle drawRect(g, zoomBoxStart, zoomBoxEnd); // draw new zoom box zoomBoxEnd = currPoint; drawRect(g, zoomBoxStart, zoomBoxEnd); } public void mouseWheelMoved(MouseWheelEvent e) { double notches = e.getPreciseWheelRotation(); double zoomFactor = Math.abs(notches) * 2; if (notches > 0 && zoomFactor > 0) zoomFactor = 1.0 / zoomFactor; panel().zoom(toModel(e.getPoint()), zoomFactor); } private static final int MIN_MOVEMENT = 3; private boolean isSignificantMouseMove(Point p) { if (Math.abs(zoomBoxStart.x - p.x) < MIN_MOVEMENT) return false; if (Math.abs(zoomBoxStart.y - p.y) < MIN_MOVEMENT) return false; return true; } public void drawRect(Graphics g, Point p0, Point p1) { Point base = new Point(Math.min(p0.x, p1.x), Math.min(p0.y, p1.y)); int width = Math.abs(p1.x - p0.x); int height = Math.abs(p1.y - p0.y); g.drawRect(base.x, base.y, width, height); } }