/*
Copyright (C) 2001, 2006 United States Government as represented by
the Administrator of the National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.view;
import gov.nasa.worldwind.avlist.AVKey;
import gov.nasa.worldwind.util.Logging;
import gov.nasa.worldwind.View;
import gov.nasa.worldwind.ViewStateIterator;
/**
* @author dcollins
* @version $Id: BasicOrbitViewStateIterator.java 3459 2007-11-08 18:48:01Z dcollins $
*/
public class BasicOrbitViewStateIterator implements ViewStateIterator
{
private final boolean doCoalesce;
private final OrbitViewInterpolator interpolator;
private final OrbitViewAnimator animator;
private boolean hasNext = true;
public BasicOrbitViewStateIterator(boolean doCoalesce, OrbitViewInterpolator interpolator, OrbitViewAnimator animator)
{
if (interpolator == null)
{
String message = Logging.getMessage("nullValue.OrbitViewStateIterator.InterpolatorIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (animator == null)
{
String message = Logging.getMessage("nullValue.OrbitViewStateIterator.AnimatorIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
this.doCoalesce = doCoalesce;
this.interpolator = interpolator;
this.animator = animator;
}
public final boolean isCoalesce()
{
return this.doCoalesce;
}
public final void nextState(View view)
{
if (view == null)
{
String message = Logging.getMessage("nullValue.ViewIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (!(view instanceof OrbitView))
{
String message = Logging.getMessage("view.OrbitView.ViewNotAnOrbitView");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
// Get next interpolant, clamped it to range [0, 1]
// to ensure we don't set values outside the desired range.
double unclampedInterpolant = this.interpolator.nextInterpolant((OrbitView) view);
double interpolant = clampDouble(unclampedInterpolant, 0, 1);
// Flag iterator to stop when interpolant>=1,
// or when last change did not succeed.
if (interpolant >= 1)
this.stop();
this.doNextState(interpolant, (OrbitView) view);
view.firePropertyChange(AVKey.VIEW, null, view);
}
private static double clampDouble(double value, double min, double max)
{
return value < min ? min : (value > max ? max : value);
}
protected void doNextState(double interpolant, OrbitView orbitView)
{
if (orbitView == null)
{
String message = Logging.getMessage("nullValue.OrbitViewIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
this.animator.doNextState(interpolant, orbitView, this);
}
public final boolean hasNextState(View view)
{
if (view == null)
{
String message = Logging.getMessage("nullValue.ViewIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (!(view instanceof OrbitView))
{
String message = Logging.getMessage("view.OrbitView.ViewNotAnOrbitView");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
return this.hasNext;
}
public final void stop()
{
this.hasNext = false;
}
public final ViewStateIterator coalesceWith(View view, ViewStateIterator stateIterator)
{
if (view == null)
{
String message = Logging.getMessage("nullValue.ViewIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (!(view instanceof OrbitView))
{
String message = Logging.getMessage("view.OrbitView.ViewNotAnOrbitView");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (stateIterator == null || !(stateIterator instanceof BasicOrbitViewStateIterator))
return this;
if (!this.doCoalesce)
return this;
boolean doCoalesce = this.doCoalesce;
OrbitViewInterpolator interpolator = this.interpolator.coalesceWith(
(OrbitView) view, ((BasicOrbitViewStateIterator) stateIterator).interpolator);
OrbitViewAnimator animator = this.animator.coalesceWith(
(OrbitView) view, ((BasicOrbitViewStateIterator) stateIterator).animator);
return this.doCoalesce((OrbitView) view, doCoalesce, interpolator, animator);
}
protected ViewStateIterator doCoalesce(OrbitView orbitView, boolean doCoalesce, OrbitViewInterpolator interpolator,
OrbitViewAnimator animator)
{
if (orbitView == null)
{
String message = Logging.getMessage("nullValue.ViewIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (interpolator == null)
{
String message = Logging.getMessage("nullValue.OrbitViewStateIterator.InterpolatorIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (animator == null)
{
String message = Logging.getMessage("nullValue.OrbitViewStateIterator.AnimatorIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
// TODO: should use reflection
return new BasicOrbitViewStateIterator(doCoalesce, interpolator, animator);
}
}