package org.limewire.ui.swing.animate; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Timer; import org.limewire.listener.EventListener; import org.limewire.listener.EventListenerList; /** * Abstract Animator class that will handle starting and stepping through an * animation, then finally stopping. The animation tries to trigger at least 66 * frames a second, to Keep the animation smooth. In other words the animation * will take a step every 15ms. */ abstract class AbstractAnimator<T> implements Animator<T> { private final Timer timer; private int stepNumber = 0; private final int totalNumberOfSteps; private final EventListenerList<AnimatorEvent<T>> eventListenerList; private final T component; private static final int STEP_TIME = 15;// A step time of 15ms is about // 66fps public AbstractAnimator(final T component, int totalTime) { this.component = component; totalNumberOfSteps = (int) Math.ceil(totalTime / (double) STEP_TIME); this.eventListenerList = new EventListenerList<AnimatorEvent<T>>(); this.timer = new Timer(0, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ++stepNumber; eventListenerList.broadcast(new AnimatorEvent<T>(AbstractAnimator.this, AnimatorEvent.Type.STEP)); if (stepNumber == totalNumberOfSteps) { stop(); } } }); timer.setDelay(STEP_TIME); } @Override public void setInitialDelay(int initialDelay) { timer.setInitialDelay(initialDelay); } @Override public void start() { timer.start(); eventListenerList.broadcast(new AnimatorEvent<T>(this, AnimatorEvent.Type.STARTED)); } @Override public void stop() { eventListenerList.broadcast(new AnimatorEvent<T>(this, AnimatorEvent.Type.STOPPED)); timer.stop(); } /** * Total number of steps this animator will run. */ public int getTotalNumberOfSteps() { return totalNumberOfSteps; } @Override public void addListener(EventListener<AnimatorEvent<T>> listener) { eventListenerList.addListener(listener); } @Override public boolean removeListener(EventListener<AnimatorEvent<T>> listener) { return eventListenerList.removeListener(listener); } @Override public int getCurrentStepNumber() { return stepNumber; } @Override public T getComponent() { return component; } }