/* * Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package com.bc.ceres.swing.figure.interactions; import com.bc.ceres.grender.Viewport; import com.bc.ceres.swing.figure.ViewportInteractor; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.Shape; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; public class ZoomInteractor extends ViewportInteractor { private int viewportX; private int viewportY; private Graphics graphics; private final Rectangle zoomRect = new Rectangle(); @Override public Cursor getCursor() { return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } @Override public void mousePressed(MouseEvent event) { viewportX = event.getX(); viewportY = event.getY(); setZoomRect(event); } @Override public void mouseDragged(MouseEvent event) { graphics = event.getComponent().getGraphics(); graphics.setXORMode(Color.white); if (!zoomRect.isEmpty()) { drawZoomRect(); } setZoomRect(event); drawZoomRect(); graphics.setPaintMode(); } @Override public void mouseReleased(MouseEvent event) { if (graphics == null) { return; } Viewport viewport = getViewport(event); if (!zoomRect.isEmpty()) { AffineTransform v2m = viewport.getViewToModelTransform(); Shape transformedShape = v2m.createTransformedShape(zoomRect); Rectangle2D bounds2D = transformedShape.getBounds2D(); viewport.zoom(bounds2D); } else { boolean zoomOut = event.isControlDown() || event.getButton() != 1; final double viewScaleOld = viewport.getZoomFactor(); final double viewScaleNew = zoomOut ? viewScaleOld / 1.6 : viewScaleOld * 1.6; viewport.setZoomFactor(viewScaleNew); } graphics.dispose(); graphics = null; zoomRect.setBounds(0, 0, 0, 0); } private void setZoomRect(MouseEvent e) { int x = viewportX; int y = viewportY; int w = e.getX() - x; int h = e.getY() - y; if (w < 0) { w = -w; x -= w; } if (h < 0) { h = -h; y -= h; } zoomRect.setBounds(x, y, w, h); } private void drawZoomRect() { graphics.drawRect(zoomRect.x, zoomRect.y, zoomRect.width, zoomRect.height); } }