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: package com.sun.perseus.model;
027:
028: /**
029: * This specialized <code>TimeInstance</code> is created by
030: * <code>SyncBaseCondition</code> time conditions.
031: *
032: * <p><code>IntervalTimeInstance</code> instances can be notified
033: * of updates by the <code>TimeCondition</code> which created it.
034: * This update can result on a <code>Time</code> update on the
035: * instance depending on context.
036: *
037: * @see <a href="http://www.w3.org/TR/smil20/smil-timing.html#Timing-PropagatingTimes">
038: * SMIL 2 Timing: Propagating changes to time</a>
039: *
040: * @version $Id: IntervalTimeInstance.java,v 1.3 2006/06/29 10:47:32 ln156897 Exp $
041: */
042: final class IntervalTimeInstance extends TimeInstance {
043: /**
044: * Offset from the interval sync base.
045: */
046: long offset;
047:
048: /**
049: * Associated interval.
050: */
051: TimeInterval timeInterval;
052:
053: /**
054: * Controls whether the instance synchronizes on begin or end
055: */
056: boolean isBeginSync;
057:
058: /**
059: * Associated syncBase
060: */
061: TimedElementSupport syncBase;
062:
063: /**
064: * Builds an instance time for the input <code>TimedElementSupport</code>
065: * and time. The constructor will insert the instance
066: * automatically into the <code>TimeInterval</code>'s corresponding
067: * dependent list
068: *
069: * @param timedElement the associated <code>TimedElementSupport</code>.
070: * Should not be null.
071: * @param syncBase the <code>TimedElementSupport</code> this time instance
072: * synchronizes with.
073: * @param offset this instance offset from the synch base.
074: * @param clearOnReset defines whether or not this instance should
075: * be cleared from instance times lists on reset.
076: * @param isBegin true if this object is part of the
077: * timedElement's begin instance list.
078: * @param isBeginSync true if this instance is synchronized on the
079: * interval's begin time. False if this instance is synchronized
080: * on the interval's end time.
081: */
082: IntervalTimeInstance(final TimedElementSupport timedElement,
083: final TimedElementSupport syncBase, final long offset,
084: final boolean clearOnReset, final boolean isBegin,
085: final boolean isBeginSync) {
086: super (timedElement, getTime(syncBase.currentInterval,
087: isBeginSync, offset, timedElement, syncBase),
088: clearOnReset, isBegin);
089:
090: this .offset = offset;
091: this .syncBase = syncBase;
092: this .timeInterval = syncBase.currentInterval;
093: this .isBeginSync = isBeginSync;
094:
095: timeInterval.addDependent(this );
096: }
097:
098: /**
099: * Invoke when this instance is no longer in a begin or end instance list,
100: * i.e., when it is removed from one of these lists.
101: *
102: */
103: void dispose() {
104: timeInterval.removeDependent(this );
105: }
106:
107: /**
108: * Implementation helpers.
109: *
110: * @param interval the interval to get
111: * @param isBeginSync the time to get
112: * @param offset offset from the sync base value.
113: * @param timedElement the TimedElementSupport to which the interval
114: * belongs
115: * @param syncBase the TimedElementSupport with which the timedElement
116: * is synchronized.
117: *
118: * @return the input interval's begin or end time. This method accounts for
119: * the offset from the syncBase and for the time convertion between the
120: * syncBase and the instance's timedElement.
121: */
122: private static Time getTime(final TimeInterval interval,
123: final boolean isBeginSync, final long offset,
124: final TimedElementSupport timedElement,
125: final TimedElementSupport syncBase) {
126: if (isBeginSync && !interval.begin.isResolved()) {
127: // 'unresolved' and 'indefinite' times are not
128: // legal begin time for intervals. This is an illegal
129: // state, so we throw an exception.
130: throw new IllegalStateException();
131: }
132:
133: Time t = interval.begin;
134: if (!isBeginSync) {
135: t = interval.end;
136: }
137:
138: if (!t.isResolved()) {
139: return t;
140: } else {
141: // Convert the time value from the syncBase's time space
142: // to the timedElement time space.
143: Time time = new Time(t.value + offset);
144: return timedElement.toContainerSimpleTime(syncBase
145: .toRootContainerSimpleTime(time));
146: }
147: }
148:
149: /**
150: * Used to synchronize this instance's time with its syncBase time. This is
151: * used when resetting timed elements.
152: */
153: void syncTime() {
154: setTime(getTime(timeInterval, isBeginSync, offset,
155: timedElement, syncBase));
156: }
157:
158: /**
159: * Must be called by the <code>TimeInterval</code>'s begin
160: * or end time this instance depends on changes.
161: *
162: * <p>This method update this time instance with a new
163: * time, accounting for the offset from the sync base.</p>
164: *
165: */
166: void onIntervalUpdate() {
167: setTime(getTime(timeInterval, isBeginSync, offset,
168: timedElement, syncBase));
169: }
170:
171: }
|