RunningAnimation.java

package swingtree.animation;

import org.jspecify.annotations.Nullable;

import javax.swing.JComponent;
import java.awt.Component;
import java.lang.ref.WeakReference;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicLong;

/**
 *  Runs an {@link Animation} on a {@link Component} according to a {@link LifeSpan} and a {@link RunCondition}.
 */
final class RunningAnimation
{
    private final @Nullable WeakReference<Component> _compRef;
    private final LifeSpan      _lifeSpan;
    private final Stride        _stride;
    private final RunCondition  _condition;
    private final Animation     _animation;
    private final AtomicLong    _currentRepeat = new AtomicLong(0);


    RunningAnimation(
        @Nullable Component component, // may be null if the animation is not associated with a specific component
        LifeSpan            lifeSpan,
        Stride              stride,
        RunCondition        condition,
        Animation           animation
    ) {
        _compRef   = component == null ? null : new WeakReference<>(component);
        _lifeSpan  = Objects.requireNonNull(lifeSpan);
        _stride    = Objects.requireNonNull(stride);
        _condition = Objects.requireNonNull(condition);
        _animation = Objects.requireNonNull(animation);
    }

    public LifeSpan lifeSpan() {
        return _lifeSpan;
    }

    public Optional<JComponent> component() {
        if ( _compRef == null ) return Optional.empty();
        Component _component = this._compRef.get();
        return Optional.ofNullable( _component instanceof JComponent ? (JComponent) _component : null );
    }

    public @Nullable WeakReference<Component> compRef() {
        return _compRef;
    }

    public Stride stride() {
        return _stride;
    }

    public RunCondition condition() {
        return _condition;
    }

    public Animation animation() {
        return _animation;
    }

    public long currentRepeat() {
        return _currentRepeat.get();
    }

    public void setCurrentRepeat( long repeat ) {
        _currentRepeat.set(repeat);
    }

}