/**
* Booz|Allen|Hamilton
* 8283 Greensboro Dr.
* McLean, VA 22102-3888
*
* This software was developed by Booz | Allen | Hamilton.
*
* @author Richard B. Lane
*/
package com.bbn.openmap.event;
import java.awt.Color;
import java.awt.Transparency;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import com.bbn.openmap.MapBean;
import com.bbn.openmap.proj.Projection;
import com.bbn.openmap.proj.coords.LatLonPoint;
/**
* This mouse mode responds to a double click with an animation effect of
* zooming in the map.
*/
public class ZoomMouseMode
extends CoordMouseMode {
protected double squareWidth = 50;
public final static transient String modeID = "Zoom";
protected MapBean theMap = null;
public ZoomMouseMode() {
super(modeID, true);
}
/**
* Process a mouseClicked event.
*
* @param e mouse event.
*/
public void mouseClicked(MouseEvent e) {
if (e.getSource() instanceof MapBean) {
final int currX = e.getX();
final int currY = e.getY();
theMap = (MapBean) e.getSource();
if (e.getClickCount() == 2) {
if (e.getButton() == 1) {
int squareCenterX = currX;
int squareCenterY = currY;
double aspect = (double) theMap.getHeight() / (double) theMap.getWidth();
double squareWidth = this.squareWidth;
double squareHeight = this.squareWidth;
if (aspect > 1) {
squareHeight *= aspect;
} else {
squareWidth /= aspect;
}
int squareUpperLeftX = squareCenterX - ((int) squareWidth / 2);
int squareUpperLeftY = squareCenterY - ((int) squareHeight / 2);
if (squareUpperLeftX < 1) {
squareUpperLeftX = 1;
squareCenterX = (int) (squareUpperLeftX + squareWidth / 2);
} else if (squareUpperLeftX + squareWidth >= theMap.getWidth()) {
squareUpperLeftX = (int) (theMap.getWidth() - squareWidth - 1);
squareCenterX = (int) (squareUpperLeftX + squareWidth / 2);
}
if (squareUpperLeftY < 1) {
squareUpperLeftY = 1;
squareCenterY = (int) (squareUpperLeftY + squareHeight / 2);
} else if (squareUpperLeftY + squareHeight >= theMap.getHeight()) {
squareUpperLeftY = (int) (theMap.getHeight() - squareHeight - 1);
squareCenterY = (int) (squareUpperLeftY + squareHeight / 2);
}
Projection proj = theMap.getProjection();
Point2D upperLeft = proj.inverse(squareUpperLeftX, squareUpperLeftY, new LatLonPoint.Double());
Point2D lowerRight =
proj.inverse(squareUpperLeftX + (int) (squareWidth), squareUpperLeftY + (int) (squareHeight),
new LatLonPoint.Double());
Point2D center = proj.inverse(squareCenterX, squareCenterY);
double necessaryScale = proj.getScale(upperLeft, lowerRight, proj.forward(upperLeft), proj.forward(lowerRight));
final Projection newProj =
theMap.getProjectionFactory().makeProjection(proj.getClass(), center, (float) necessaryScale,
theMap.getWidth(), theMap.getHeight());
Thread delayThread = new Thread() {
public void run() {
theMap.setProjection(newProj);
}
};
java.awt.image.BufferedImage bi =
theMap.getGraphicsConfiguration().createCompatibleImage(theMap.getWidth(), theMap.getHeight(),
Transparency.OPAQUE);
theMap.paintAll(bi.getGraphics());
java.awt.image.BufferedImage bi2 =
bi.getSubimage(squareUpperLeftX, squareUpperLeftY, (int) squareWidth, (int) squareHeight);
java.awt.image.BufferedImage square =
new java.awt.image.BufferedImage((int) squareWidth, (int) squareHeight,
java.awt.image.BufferedImage.TYPE_INT_RGB);
square.getGraphics().drawImage(bi2, 0, 0, (int) squareWidth, (int) squareHeight, null);
square.getGraphics().setColor(new Color(0, 255, 0, 255));
square.getGraphics().drawRect(0, 0, square.getWidth() - 1, square.getHeight() - 1);
delayThread.start();
double iterations = 10;
double widthIncrease = theMap.getWidth() - squareWidth;
double heightIncrease = theMap.getHeight() - squareHeight;
double widthInc = widthIncrease / iterations;
double heightInc = heightIncrease / iterations;
double leftInc = squareUpperLeftX / iterations;
double upInc = squareUpperLeftY / iterations;
for (int i = 0; i < iterations + 1; i++) {
theMap.getGraphics(true).drawImage(square, squareUpperLeftX - (int) (leftInc * i),
squareUpperLeftY - (int) (upInc * i),
(int) squareWidth + (int) (widthInc * i),
(int) squareHeight + (int) (heightInc * i), null);
try {
Thread.sleep(50);
} catch (Exception ex) {
}
}
}
}
}
}
}