001: /*
002:
003: Licensed to the Apache Software Foundation (ASF) under one or more
004: contributor license agreements. See the NOTICE file distributed with
005: this work for additional information regarding copyright ownership.
006: The ASF licenses this file to You under the Apache License, Version 2.0
007: (the "License"); you may not use this file except in compliance with
008: the License. You may obtain a copy of the License at
009:
010: http://www.apache.org/licenses/LICENSE-2.0
011:
012: Unless required by applicable law or agreed to in writing, software
013: distributed under the License is distributed on an "AS IS" BASIS,
014: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: See the License for the specific language governing permissions and
016: limitations under the License.
017:
018: */
019: package org.apache.batik.anim.values;
020:
021: import java.text.DecimalFormat;
022: import java.text.DecimalFormatSymbols;
023: import java.util.Locale;
024:
025: import org.apache.batik.dom.anim.AnimationTarget;
026:
027: /**
028: * An abstract class for values in the animation engine.
029: *
030: * @author <a href="mailto:cam%40mcc%2eid%2eau">Cameron McCormack</a>
031: * @version $Id: AnimatableValue.java 475477 2006-11-15 22:44:28Z cam $
032: */
033: public abstract class AnimatableValue {
034:
035: /**
036: * A formatting object to get CSS compatible float strings.
037: */
038: protected static DecimalFormat decimalFormat = new DecimalFormat(
039: "0.0###########################################################",
040: new DecimalFormatSymbols(Locale.ENGLISH));
041:
042: /**
043: * The target of the animation.
044: */
045: protected AnimationTarget target;
046:
047: /**
048: * Whether this value has changed since the last call to
049: * {@link #hasChanged()}. This must be updated within {@link #interpolate}
050: * in descendant classes.
051: */
052: protected boolean hasChanged = true;
053:
054: /**
055: * Creates a new AnimatableValue.
056: */
057: protected AnimatableValue(AnimationTarget target) {
058: this .target = target;
059: }
060:
061: /**
062: * Returns a CSS compatible string version of the specified float.
063: */
064: public static String formatNumber(float f) {
065: return decimalFormat.format(f);
066: }
067:
068: /**
069: * Performs interpolation to the given value.
070: * @param result the object in which to store the result of the
071: * interpolation, or null if a new object should be created
072: * @param to the value this value should be interpolated towards, or null
073: * if no actual interpolation should be performed
074: * @param interpolation the interpolation distance, 0 <= interpolation
075: * <= 1
076: * @param accumulation an accumulation to add to the interpolated value
077: * @param multiplier an amount the accumulation values should be multiplied
078: * by before being added to the interpolated value
079: */
080: public abstract AnimatableValue interpolate(AnimatableValue result,
081: AnimatableValue to, float interpolation,
082: AnimatableValue accumulation, int multiplier);
083:
084: /**
085: * Returns whether two values of this type can have their distance
086: * computed, as needed by paced animation.
087: */
088: public abstract boolean canPace();
089:
090: /**
091: * Returns the absolute distance between this value and the specified other
092: * value.
093: */
094: public abstract float distanceTo(AnimatableValue other);
095:
096: /**
097: * Returns a zero value of this AnimatableValue's type.
098: */
099: public abstract AnimatableValue getZeroValue();
100:
101: /**
102: * Returns the CSS text representation of the value.
103: */
104: public String getCssText() {
105: return null;
106: }
107:
108: /**
109: * Returns whether the value in this AnimatableValue has been modified.
110: */
111: public boolean hasChanged() {
112: boolean ret = hasChanged;
113: hasChanged = false;
114: return ret;
115: }
116:
117: /**
118: * Returns a string representation of this object. This should be
119: * overridden in classes that do not have a CSS representation.
120: */
121: public String toStringRep() {
122: return getCssText();
123: }
124:
125: /**
126: * Returns a string representation of this object prefixed with its
127: * class name.
128: */
129: public String toString() {
130: return getClass().getName() + "[" + toStringRep() + "]";
131: }
132: }
|