001/*
002 * SVG Salamander
003 * Copyright (c) 2004, Mark McKay
004 * All rights reserved.
005 *
006 * Redistribution and use in source and binary forms, with or 
007 * without modification, are permitted provided that the following
008 * conditions are met:
009 *
010 *   - Redistributions of source code must retain the above 
011 *     copyright notice, this list of conditions and the following
012 *     disclaimer.
013 *   - Redistributions in binary form must reproduce the above
014 *     copyright notice, this list of conditions and the following
015 *     disclaimer in the documentation and/or other materials 
016 *     provided with the distribution.
017 *
018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
019 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
020 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
021 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
022 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
023 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
025 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
026 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
027 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
029 * OF THE POSSIBILITY OF SUCH DAMAGE. 
030 * 
031 * Mark McKay can be contacted at mark@kitfox.com.  Salamander and other
032 * projects can be found at http://www.kitfox.com
033 *
034 * Created on August 15, 2004, 11:34 PM
035 */
036
037package com.kitfox.svg.animation;
038
039import java.util.*;
040
041import com.kitfox.svg.xml.*;
042import com.kitfox.svg.*;
043
044/**
045 * A track holds the animation events for a single parameter of a single SVG 
046 * element.  It also contains the default value for the element, should the
047 * user want to see the 'unanimated' value.
048 *
049 * @author Mark McKay
050 * @author <a href="mailto:mark@kitfox.com">Mark McKay</a>
051 */
052abstract public class TrackBase
053{
054    protected final String attribName;
055    protected final int attribType;  //AnimationElement.AT_*
056 
057    /** Element we're animating */
058    protected final SVGElement parent;
059    
060    //It doesn't make sense to sort this, since some events will depend on
061    // other events - in many cases, there will be no meaningful sorted order.
062    final ArrayList<AnimationElement> animEvents = new ArrayList<AnimationElement>();
063    
064    /** Creates a new instance of TrackManager */
065//    public TrackBase(SVGElement parent)
066//    {
067//        this(parent, "", AnimationElement.AT_AUTO);
068//    }
069    
070    /**
071     * Creates a track that would be valid for the name and type of element
072     * passed in.  Does not actually add this elemnt to the track.
073     */
074    public TrackBase(SVGElement parent, AnimationElement ele) throws SVGElementException
075    {
076        this(parent, ele.getAttribName(), ele.getAttribType());
077    }
078    
079    public TrackBase(SVGElement parent, String attribName, int attribType) throws SVGElementException
080    {
081        this.parent = parent;
082        this.attribName = attribName;
083        this.attribType = attribType;
084        
085        //Make sure parent has an attribute we will write to
086        if (attribType == AnimationElement.AT_AUTO 
087            && !parent.hasAttribute(attribName, AnimationElement.AT_CSS)
088            && !parent.hasAttribute(attribName, AnimationElement.AT_XML))
089        {
090            parent.addAttribute(attribName, AnimationElement.AT_CSS, "");
091        }
092        else if (!parent.hasAttribute(attribName, attribType))
093        {
094            parent.addAttribute(attribName, attribType, "");
095        }
096    }
097    
098    public String getAttribName() { return attribName; }
099    public int getAttribType() { return attribType; }
100    
101    public void addElement(AnimationElement ele)
102    {
103        animEvents.add(ele);
104    }
105    
106    /**
107     * Returns a StyleAttribute representing the value of this track at the
108     * passed time.  If this track does not apply, returns null.
109     * @return - True if successful, false if a value could not be obtained
110     */
111    abstract public boolean getValue(StyleAttribute attrib, double curTime) throws SVGException;
112    
113}