// **********************************************************************
//
// <copyright>
//
// BBN Technologies
// 10 Moulton Street
// Cambridge, MA 02138
// (617) 873-8000
//
// Copyright (C) BBNT Solutions LLC. All rights reserved.
//
// </copyright>
// **********************************************************************
//
// $Source:
// /cvs/distapps/openmap/src/openmap/com/bbn/openmap/gui/menu/DataBoundsViewMenuItem.java,v
// $
// $RCSfile: DataBoundsViewMenuItem.java,v $
// $Revision: 1.5 $
// $Date: 2005/12/09 21:09:15 $
// $Author: dietrick $
//
// **********************************************************************
package com.bbn.openmap.gui.menu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import com.bbn.openmap.InformationDelegator;
import com.bbn.openmap.MapBean;
import com.bbn.openmap.MapHandler;
import com.bbn.openmap.proj.Proj;
import com.bbn.openmap.proj.ProjMath;
import com.bbn.openmap.proj.coords.LatLonPoint;
import com.bbn.openmap.util.DataBounds;
import com.bbn.openmap.util.DataBoundsProvider;
import com.bbn.openmap.util.Debug;
public class DataBoundsViewMenuItem extends MapHandlerMenuItem implements
ActionListener {
protected MapBean map;
protected InformationDelegator infoDelegator;
protected DataBoundsProvider provider;
public DataBoundsViewMenuItem(DataBoundsProvider dbp) {
super(dbp.getName());
provider = dbp;
addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
if (map != null) {
Proj proj = (Proj) map.getProjection();
DataBounds bounds = provider.getDataBounds();
if (bounds != null) {
java.awt.geom.Point2D center = bounds.getCenter();
if (center != null) {
proj.setCenter(center.getY(), center.getX());
LatLonPoint llp1 = new LatLonPoint.Double(bounds.getMax().getY(), bounds.getMin()
.getX());
LatLonPoint llp2 = new LatLonPoint.Double(bounds.getMin().getY(), bounds.getMax()
.getX());
float scale = ProjMath.getScale(llp1, llp2, proj);
proj.setScale(scale);
java.awt.geom.Point2D ul = proj.getUpperLeft();
java.awt.geom.Point2D lr = proj.getLowerRight();
double factor1 = (bounds.getMax().getY() - bounds.getMin().getY())
/ (ul.getY() - lr.getY());
double factor2 = (bounds.getMax().getX() - bounds.getMin().getX())
/ (lr.getX() - ul.getX());
// 1.1 buffers the edges for viewing a little, a
// little zoomed out.
scale *= Math.max(factor1, factor2);
proj.setScale(scale * 1.1f);
map.setProjection(proj);
}
} else {
String complaint = "Can't move map over data: "
+ provider.getName() + " isn't ready. Add to map?";
if (infoDelegator != null) {
infoDelegator.displayMessage("Go Over Data", complaint);
} else {
Debug.error(complaint);
}
}
}
}
public void findAndInit(Object someObj) {
super.findAndInit(someObj);
if (someObj instanceof MapHandler) {
// Check to see if the MapBean is already available.
map = (MapBean) mapHandler.get("com.bbn.openmap.MapBean");
infoDelegator = (InformationDelegator) mapHandler.get("com.bbn.openmap.InformationDelegator");
}
if (someObj instanceof MapBean) {
map = (MapBean) someObj;
}
if (someObj instanceof InformationDelegator) {
infoDelegator = (InformationDelegator) someObj;
}
}
public void findAndUndo(Object someObj) {
super.findAndUndo(someObj);
if (someObj instanceof MapBean && map == someObj) {
map = null;
}
if (someObj instanceof InformationDelegator && infoDelegator == someObj) {
infoDelegator = null;
}
}
}