/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.client.controls.geopane.mousetools; import com.eas.client.controls.geopane.JGeoPane; import com.eas.client.controls.geopane.actions.ZoomInAction; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.SwingUtilities; /** * * @author mg */ public class RectZoomer extends GeoPaneTool { protected Point mouseDown; public RectZoomer(JGeoPane aPane) { super(aPane); } protected boolean isBeginDragValid() throws Exception { return true; } @Override public void mousePressed(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { try { mouseDown = e.getPoint(); if (!isBeginDragValid()) { mouseDown = null; } } catch (Exception ex) { Logger.getLogger(RectZoomer.class.getName()).log(Level.SEVERE, null, ex); } } } @Override public void mouseReleased(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { if (mouseDown != null) { try { double coef = 1; Point ptSource = mouseDown; Point ptDest = e.getPoint(); if (!ptSource.equals(ptDest)) { if (Math.abs(ptDest.x - ptSource.x) > 5 || Math.abs(ptDest.y - ptSource.y) > 5) { Point ptCenter = new Point((ptSource.x + ptDest.x) / 2, (ptSource.y + ptDest.y) / 2); if (ptSource.x < ptDest.x && ptSource.y < ptDest.y) { Dimension size = pane.getSize(); double sx = (double) size.width / ((double) ptDest.x - (double) ptSource.x); double sy = (double) size.height / ((double) ptDest.y - (double) ptSource.y); coef = Math.min(sx, sy); coef = pane.snapScale(coef); } else if (ptSource.x > ptDest.x && ptSource.y > ptDest.y) { coef = 1 / ZoomInAction.DEFAULT_ZOOM_FACTOR_STEP; } Point2D.Double screenCenterBefore = pane.awtScreen2Cartesian(ptCenter); pane.scaleView(coef, coef, false); Point2D.Double screenCenterAfter = pane.awtScreen2Cartesian(ptCenter); pane.translateView(screenCenterAfter.x - screenCenterBefore.x, screenCenterAfter.y - screenCenterBefore.y, true); } pane.repaint(); } mouseDown = null; } catch (Exception ex) { Logger.getLogger(RectZoomer.class.getName()).log(Level.SEVERE, null, ex); mouseDown = null; pane.clearCaches(); pane.repaint(); } } pane.setSelectionRectangle(null); } } @Override public void mouseDragged(MouseEvent e) { if (mouseDown != null) { if (SwingUtilities.isLeftMouseButton(e)) { Rectangle selRect = new Rectangle(); selRect.x = Math.min(e.getPoint().x, mouseDown.x); selRect.y = Math.min(e.getPoint().y, mouseDown.y); selRect.width = Math.abs(e.getPoint().x - mouseDown.x); selRect.height = Math.abs(e.getPoint().y - mouseDown.y); Dimension size = pane.getSize(); selRect.translate(-size.width / 2, -size.height / 2); pane.setSelectionRectangle(selRect); pane.repaint(); } } } @Override public boolean isCapable(MouseToolCapability aCapability) { return aCapability == MouseToolCapability.BUTTONS || aCapability == MouseToolCapability.MOTION; } }