/*
Copyright (C) 2001, 2008 United States Government
as represented by the Administrator of the
National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.examples;
import gov.nasa.worldwind.event.*;
import gov.nasa.worldwind.geom.*;
import gov.nasa.worldwind.view.*;
import gov.nasa.worldwind.globes.Globe;
import gov.nasa.worldwind.WorldWindow;
import gov.nasa.worldwind.util.Logging;
/**
* Handles view 'fly to' on left clicked picked objects with a position.
*
* @author Patrick Murris
* @version $Id: ClickAndGoSelectListener.java 5032 2008-04-11 20:47:09Z patrickmurris $
*/
public class ClickAndGoSelectListener implements SelectListener
{
private final WorldWindow wwd;
private final Class pickedObjClass; // Which picked object class do we handle
private final double elevationOffset; // Meters above the target position
public ClickAndGoSelectListener(WorldWindow wwd, Class pickedObjClass)
{
if (wwd == null)
{
String msg = Logging.getMessage("nullValue.WorldWindow");
Logging.logger().severe(msg);
throw new IllegalArgumentException(msg);
}
this.wwd = wwd;
this.pickedObjClass = pickedObjClass;
this.elevationOffset = 0d;
}
public ClickAndGoSelectListener(WorldWindow wwd, Class pickedObjClass, double elevationOffset)
{
if (wwd == null)
{
String msg = Logging.getMessage("nullValue.WorldWindow");
Logging.logger().severe(msg);
throw new IllegalArgumentException(msg);
}
if (pickedObjClass == null)
{
String msg = Logging.getMessage("nullValue.ClassIsNull");
Logging.logger().severe(msg);
throw new IllegalArgumentException(msg);
}
this.wwd = wwd;
this.pickedObjClass = pickedObjClass;
this.elevationOffset = elevationOffset;
}
/**
* Select Listener implementation.
*
* @param event the SelectEvent
*/
public void selected(SelectEvent event)
{
if (event.getEventAction().equals(SelectEvent.LEFT_CLICK))
{
// This is a left click
if (event.hasObjects() && event.getTopPickedObject().hasPosition())
{
// There is a picked object with a position
if (event.getTopObject().getClass().equals(pickedObjClass)
&& this.wwd.getView() instanceof OrbitView)
{
// This object class we handle and we have an orbit view
Position targetPos = event.getTopPickedObject().getPosition();
OrbitView view = (OrbitView)this.wwd.getView();
Globe globe = this.wwd.getModel().getGlobe();
if(globe != null && view != null)
{
// Use a PanToIterator to iterate view to target position
view.applyStateIterator(FlyToOrbitViewStateIterator.createPanToIterator(
// The elevation component of 'targetPos' here is not the surface elevation,
// so we ignore it when specifying the view center position.
view, globe, new Position(targetPos.getLatLon(), 0),
Angle.ZERO, Angle.ZERO, targetPos.getElevation() + this.elevationOffset));
}
}
}
}
}
}