/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_animations_XAnimationNode_idl__
#define __com_sun_star_animations_XAnimationNode_idl__

#ifndef __com_sun_star_container_XChild_idl__
#include <com/sun/star/container/XChild.idl>
#endif

#ifndef __com_sun_star_beans_NamedValue_idl__
#include <com/sun/star/beans/NamedValue.idl>
#endif

//=============================================================================

 module com {  module sun {  module star {  module animations {

//=============================================================================

/**
*/
published interface XAnimationNode : ::com::sun::star::container::XChild
{
    /**  a value from <const>AnimationNodeType</const>.

        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-timeContainer
    */
    [readonly, attribute] short Type;

    /** a sequnece of values that define the begining of this element
        <br>
        <member>Begin</member> is
            <ul>
            <li><atom>double</atom> describes the element begin as an offset in seconds from an implicit syncbase.
                The definition of the implicit syncbase depends upon the element's parent time container.
                The offset is measured in parent simple time.</li>
            <li><type>Event</type> describes an event and an optional offset that determine the
                element begin. The element begin is defined relative to the time that the event
                is raised.</li>
            <li><const>Timing::INDEFINITE</const> the begin of the element will be determined by an
                external event to the element.</li>
            <li><type>sequence&lt;any&gt;</type> a sequence of values described above if more than
                one begin value is defined for this element.</li>
            <li><void/> if no begin behaviour is defined for this element.</li>
            </ul>

        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-begin
    */
    [attribute] any Begin;

    /** defines the length of the simple duration.
        <br>
        <member>Duration</member> is
            <ul>
            <li><atom>double</atom> specifies the length of the simple duration in seconds.</li>
            <li><const>Timing::INDEFINITE</const> specifies the simple duration as indefinite.</li>
            <li><const>Timing::MEDIA</const> specifies the simple duration as the intrinsic media duration. This is only valid for elements that define media.</li>
            <li><void/> the simple duration for the element is defined to be the implicit duration of the element.</li>
            </ul>

        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-dur
    */
    [attribute] any Duration;

    /** a sequnece of values that define the ending of this element
        <br>
        <member>End</member> is
            <ul>
            <li><atom>double</atom> describes the element end as an offset in seconds from an implicit syncbase.
                The definition of the implicit syncbase depends upon the element's parent time container.
                The offset is measured in parent simple time.</li>
            <li><type>Event</type> describes an event and an optional offset that determine the
                element end. The element end is defined relative to the time that the event
                is raised.</li>
            <li><const>Timing::INDEFINITE</const> the end of the element will be determined by an
                external event to the element.</li>
            <li><type>sequence&lt;any&gt;</type> a sequence of values described above if more than
                one begin value is defined for this element.</li>
            <li><void/> if no end behaviour is defined for this element.</li>
            </ul>

        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-end
    */
    [attribute] any End;

    /** controls the implicit duration of time containers,
        as a function of the children.
        <br>
        The endsync attribute is only valid for
        par and excl time container elements, and media elements with timed
        children (e.g. animate or area elements).

        <member>EndSync</member> is
            eiter a <atom>short</atom> constant from <const>EndSync</const>,
            an interface reference to a child <type>XTimeContainer</type>
            or <void/>.

        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-endsync
    */
    [attribute] any EndSync;

    /** the number of iterations of the simple duration.
        <br>
        <member>RepeatCount</member> is
            <ul>
            <li><atom>double</atom>
                this is a numeric value that specifies the number of iterations.
                It can include partial iterations expressed as fraction values.
                A fractional value describes a portion of the simple duration.
                Values must be greater than 0.</li>
            <li><const>Timing::INDEFINITE</const> the element is defined to repeat indefinitely
                (subject to the constraints of the parent time container).</li>
            <li><void/>
                no repeat count is defined for this element.</li>
            </ul>

        @see <const>EndSync</const>
        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-repeatCount
    */
    [attribute] any RepeatCount;

    /** the total duration for repeat.
        <br>
        <member>RepeatDuration</member> is
            <ul>
            <li><atom>double</atom>
                specifies the duration in element active time
                to repeat the simple duration in seconds.</li>
            <li><const>Timing::INDEFINITE</const> the element is defined to repeat indefinitely
                (subject to the constraints of the parent time container).</li>
            <li><void/>
                No repeat duration is defined for this element. </li>
            </ul>

        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-repeatDur
    */
    [attribute] any RepeatDuration;

    /** the attribute that specify the behaviour how an element
        should be extended beyond the active duration by freezing the final
        state of the element.
        <br>
        <member>Fill</member> is
            a value from <const>AnimationFill</const>.

        @see <const>Fill</const>
        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-fill
    */
    [attribute] short Fill;

    /** the default value for the fill behavior for this element and all
        descendents.
        <br>
        <member>FillDefault</member> is
            <ul>
            <li>The values <const>AnimationFill::REMOVE</const>, <const>AnimationFill::FREEZE</const>,
            <const>AnimationFill::HOLD</const>, <const>AnimationFill::TRANSITION</const> and <const>AnimationFill::AUTO</const>
            specify that the element fill behavior is the respective value.</li>
            <li>The value <const>AnimationFill::INHERIT</const> specifies that the value of this attribute
            (and of the fill behavior) are inherited from the <member>FillDefault</member> value of the parent
            element. If there is no parent element, the value is <const>AnimationFill::AUTO</const>.</li>
            </ul>

        @see <const>Fill</const>
        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-fillDefault
    */
    [attribute] short FillDefault;

    /**	defines the restart behaviour of this element.
        <br>
        <member>Restart</member> is
            a <atom>short</atom> value from <const>AnimationRestart</const>.

        @see <const>AnimationRestart</const>
        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-restart
    */
    [attribute] short Restart;

    /**	defines the default restart behaviour for this element and all descendents.

        @returns
            a value from <const>Restart</const>.

        @see <const>AnimationRestart</const>
        @see http://www.w3.org/TR/smil20/smil-timing.html#adef-restartDefault
    */
    [attribute] short RestartDefault;

    /** defines the acceleration for this element.
        <br>
        Element time will accelerate from a rate of 0 at the beginning up
        to a run rate, over the course of the specified proportion of the
        simple duration.

        <member>Acceleration</member> is
            a value between 0 (no acceleration) and 1 (acceleration until end
            of the elements duration).

        @see http://www.w3.org/TR/smil20/smil-timemanip.html#adef-accelerate
    */
    [attribute] double Acceleration;

    /** defines the deceleration for this element.
        Element time will deceleration from a run rate to a rate of 0 at the
        ending, over the course of the specified proportion of the
        simple duration.

        <member>Decelerate</member> is
            a value between 0 (no deceleration) and 1 (deceleration from beginning
            of the elements duration).

        @see http://www.w3.org/TR/smil20/smil-timemanip.html#adef-decelerate
    */
    [attribute] double Decelerate;

    /** defines the auto reverse settings for this element.

        <member>AutoRevers</member> is
            <ul>
            <li><false/> if the animation is played normal.</li>
            <li><true/> if the animation is played forwards and then backwards. This doubles the duration</li>
            </ul>

        @see http://www.w3.org/TR/smil20/smil-timemanip.html#adef-autoReverse
    */
    [attribute] boolean AutoReverse;

    /**
    */
    [attribute] sequence< ::com::sun::star::beans::NamedValue > UserData;
};

//=============================================================================

}; }; }; };

#endif
