001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.perseus.model;
028:
029: /**
030: * @version $Id: StringRefValues.java,v 1.2 2006/04/21 06:38:51 st125089 Exp $
031: */
032: public class StringRefValues implements RefValues {
033: /**
034: * The RefValues StringSegments
035: */
036: StringSegment[] segments;
037:
038: /**
039: * Used to store the length of this RefValues
040: */
041: float[] length;
042:
043: /**
044: * @param i requested segment index.
045: * @return Segment at index i
046: */
047: public Segment getSegment(int i) {
048: return segments[i];
049: }
050:
051: /**
052: * @return the number of segments in refValues
053: */
054: public int getSegments() {
055: return segments.length;
056: }
057:
058: /**
059: * StringRefValues only have one component.
060: *
061: * @return the number of string components
062: */
063: public int getComponents() {
064: return segments[0].start.length;
065: }
066:
067: /**
068: * Computes the value for the input interpolated values.
069: * There should be as many entries in the return array as there
070: * are components in the RefValues.
071: *
072: * @param si the current segment index
073: * @param p the current penetration
074: * @param the interpolated value.
075: */
076: public Object[] compute(int si, float p) {
077: return segments[si].compute(p);
078: }
079:
080: /**
081: * Adds a new time segment so accomodate for discreet behavior.
082: * If there is only one segment for discreet animations, the
083: * last value is never shown. To accomodate for that, this
084: * method should add a segment to the RefValues so that the
085: * last animation value is shown during the last value interval
086: * of a discreet animation.
087: */
088: public void makeDiscrete() {
089: StringSegment[] tmpSegments = new StringSegment[segments.length + 1];
090: System.arraycopy(segments, 0, tmpSegments, 0, segments.length);
091: StringSegment lastSeg = segments[segments.length - 1];
092: StringSegment newSeg = new StringSegment();
093: newSeg.start = lastSeg.end;
094: newSeg.end = lastSeg.end;
095: tmpSegments[tmpSegments.length - 1] = newSeg;
096: segments = tmpSegments;
097: }
098:
099: /**
100: * Computes the length of the RefValues. This is meant for paced timing
101: * computation.
102: *
103: * @return the length between the various ref values. For strings, we
104: * consider that each segment is of length 1, so this simply
105: * returns the number of segments.
106: */
107: public float getLength() {
108: return segments.length;
109: }
110:
111: /**
112: * Computes the length of segment at index si.
113: *
114: * @param si the segment index.
115: */
116: public float getLength(final int si) {
117: // The length of a StringSegment is _always_ 1.
118: return 1;
119: }
120:
121: /**
122: * Debug helper.
123: */
124: public String toString() {
125: StringBuffer sb = new StringBuffer();
126: sb.append("StringRefValues[" + getSegments() + "]\n");
127: for (int si = 0; si < getSegments(); si++) {
128: Segment seg = getSegment(si);
129: sb.append("seg[" + si + "] : " + seg.toString() + "\n");
130: }
131: return sb.toString();
132: }
133:
134: /**
135: * Should be called after the RefValue's configuration is complete
136: * to give the implementation a chance to initialize
137: * internal data and cache values.
138: */
139: public void initialize() {
140: // Initialize segments.
141: final int ns = segments.length;
142:
143: // Initialize length cache
144: length = new float[segments[0].start.length];
145:
146: // The length of a StringSegment is 1, in all cases.
147: for (int ci = 0; ci < length.length; ci++) {
148: length[ci] = segments.length;
149: }
150: }
151:
152: }
|