/* * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package javafx.animation; import javafx.beans.NamedArg; import javafx.beans.value.WritableBooleanValue; import javafx.beans.value.WritableDoubleValue; import javafx.beans.value.WritableFloatValue; import javafx.beans.value.WritableIntegerValue; import javafx.beans.value.WritableLongValue; import javafx.beans.value.WritableNumberValue; import javafx.beans.value.WritableValue; /** * Defines a key value to be interpolated for a particular interval along the * animation. A {@link KeyFrame}, which defines a specific point on a timeline, * can hold multiple {@code KeyValues}. {@code KeyValue} is an immutable class. *

* A {@code KeyValue} is defined by a target, which is an implementation of * {@link javafx.beans.value.WritableValue}, an end value and an * {@link Interpolator}. *

* Most interpolators define the interpolation between two {@code KeyFrames}. * (The only exception are tangent-interpolators.) * The {@code KeyValue} of the second {@code KeyFrame} (in forward * direction) specifies the interpolator to be used in the interval. *

* Tangent-interpolators define the interpolation to the left and to the right of * a {@code KeyFrame} (see {@link Interpolator#TANGENT(javafx.util.Duration, double, javafx.util.Duration, double) * Interpolator.TANGENT}). *

* By default, {@link Interpolator#LINEAR} is used in the interval. * * @see Timeline * @see KeyFrame * @see Interpolator * * @since JavaFX 2.0 */ public final class KeyValue { private static final Interpolator DEFAULT_INTERPOLATOR = Interpolator.LINEAR; /** * @treatAsPrivate implementation detail * @deprecated This is an internal API that is not intended for use and will be removed in the next version * @since JavaFX 2.0 */ @Deprecated public static enum Type { BOOLEAN, DOUBLE, FLOAT, INTEGER, LONG, OBJECT } /** * @treatAsPrivate implementation detail * @deprecated This is an internal API that is not intended for use and will be removed in the next version */ @Deprecated public Type getType() { return type; } private final Type type; /** * Returns the target of this {@code KeyValue} * * @return the target */ public WritableValue getTarget() { return target; } private final WritableValue target; /** * Returns the end value of this {@code KeyValue} * * @return the end value */ public Object getEndValue() { return endValue; } private final Object endValue; /** * {@link Interpolator} to be used for calculating the key value along the * particular interval. By default, {@link Interpolator#LINEAR} is used. */ public Interpolator getInterpolator() { return interpolator; } private final Interpolator interpolator; /** * Creates a {@code KeyValue}. * * @param target * the target * @param endValue * the end value * @param interpolator * the {@link Interpolator} * @throws NullPointerException * if {@code target} or {@code interpolator} are {@code null} */ public KeyValue(@NamedArg("target") WritableValue target, @NamedArg("endValue") T endValue, @NamedArg("interpolator") Interpolator interpolator) { if (target == null) { throw new NullPointerException("Target needs to be specified"); } if (interpolator == null) { throw new NullPointerException("Interpolator needs to be specified"); } this.target = target; this.endValue = endValue; this.interpolator = interpolator; this.type = (target instanceof WritableNumberValue) ? (target instanceof WritableDoubleValue) ? Type.DOUBLE : (target instanceof WritableIntegerValue) ? Type.INTEGER : (target instanceof WritableFloatValue) ? Type.FLOAT : (target instanceof WritableLongValue) ? Type.LONG : Type.OBJECT : (target instanceof WritableBooleanValue) ? Type.BOOLEAN : Type.OBJECT; } /** * Creates a {@code KeyValue} that uses {@link Interpolator#LINEAR}. * * @param target * the target * @param endValue * the end value * @throws NullPointerException * if {@code target} or {@code interpolator} are {@code null} */ public KeyValue(@NamedArg("target") WritableValue target, @NamedArg("endValue") T endValue) { this(target, endValue, DEFAULT_INTERPOLATOR); } /** * Returns a string representation of this {@code KeyValue} object. * @return a string representation of this {@code KeyValue} object. */ @Override public String toString() { return "KeyValue [target=" + target + ", endValue=" + endValue + ", interpolator=" + interpolator + "]"; } /** * Returns a hash code for this {@code KeyValue} object. * @return a hash code for this {@code KeyValue} object. */ @Override public int hashCode() { assert (target != null) && (interpolator != null); final int prime = 31; int result = 1; result = prime * result + target.hashCode(); result = prime * result + ((endValue == null) ? 0 : endValue.hashCode()); result = prime * result + interpolator.hashCode(); return result; } /** * Indicates whether some other object is "equal to" this one. * Two {@code KeyValues} are considered equal, if their {@link #getTarget() * target}, {@link #getEndValue() endValue}, and {@link #getInterpolator() * interpolator} are equal. */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof KeyValue) { final KeyValue keyValue = (KeyValue) obj; assert (target != null) && (interpolator != null) && (keyValue.target != null) && (keyValue.interpolator != null); return target.equals(keyValue.target) && ((endValue == null) ? (keyValue.endValue == null) : endValue.equals(keyValue.endValue)) && interpolator.equals(keyValue.interpolator); } return false; } }