/* * Copyright 2015 JBoss, by Red Hat, Inc * * Licensed 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. */ package org.uberfire.ext.widgets.common.client.animations; import java.util.ArrayList; import java.util.List; import com.google.gwt.animation.client.Animation; /** * Run a list of animations in order. */ public class Sequencer { private int currentAnimationIndex = 0; //The list of animations private List<AnimationConfiguration> animations = new ArrayList<AnimationConfiguration>(); /** * Add an animation to the list of animations to be sequenced. * @param animation * @param duration */ public void add(final SequencedAnimation animation, final int duration) { animations.add(new AnimationConfiguration(new WrappedAnimation(animation), duration)); } /** * Run all animations. */ public void run() { runNextAnimation(); } /** * Reset the sequence to the begining. */ public void reset() { currentAnimationIndex = 0; } private void runNextAnimation() { if (currentAnimationIndex < animations.size()) { final AnimationConfiguration config = animations.get(currentAnimationIndex++); final WrappedAnimation animation = config.animation; final int duration = config.duration; animation.run(duration); } else { reset(); } } //Simple holder for sequenced animation details private class AnimationConfiguration { final WrappedAnimation animation; final int duration; AnimationConfiguration(final WrappedAnimation animation, final int duration) { this.animation = animation; this.duration = duration; } } //A wrapper for sequenced animations allowing us to hook into the onComplete method to launch the next animation private class WrappedAnimation extends Animation { private final SequencedAnimation animation; WrappedAnimation(final SequencedAnimation animation) { this.animation = animation; } @Override public void onComplete() { //Pass through to the wrapped animation animation.onComplete(); runNextAnimation(); } @Override protected void onUpdate(double progress) { //Pass through to the wrapped animation animation.onUpdate(progress); } @Override public void cancel() { //Pass through to the wrapped animation animation.cancel(); } @Override protected double interpolate(double progress) { //Pass through to the wrapped animation return animation.interpolate(progress); } @Override protected void onCancel() { //Pass through to the wrapped animation animation.onCancel(); } @Override protected void onStart() { //Pass through to the wrapped animation animation.onStart(); } } }