001: /*
002: * @(#)Animator.java
003: *
004: * Copyright 2002 - 2003 JIDE Software Inc. All rights reserved.
005: */
006: package com.jidesoft.swing;
007:
008: import javax.swing.*;
009: import java.awt.*;
010: import java.awt.event.ActionEvent;
011: import java.awt.event.ActionListener;
012:
013: /**
014: * An <code>ActionListener</code> with a timer. It is used to
015: * simplify the animation of all kind of sliding windows.
016: */
017:
018: public class Animator implements ActionListener {
019:
020: private final Component _source;
021:
022: private Timer _timer;
023:
024: private final int _totalSteps;
025: private int _currentStep;
026:
027: private AnimatorListener _listener;
028:
029: /**
030: * Creates an animator for source with initDelay 50 ms, each step delays 10 ms and total 10 steps.
031: *
032: * @param source the source for this animator.
033: */
034: public Animator(Component source) {
035: this (source, 50, 10, 10);
036: }
037:
038: /**
039: * Creates an animator for source.
040: *
041: * @param source the source for this animator.
042: * @param initDelay the initial delay before timer starts.
043: * @param delay the delay of the timer
044: * @param totalSteps the number of steps. If -1, it means this animator will never stop until {@link #stop()} is called.
045: */
046: public Animator(Component source, int initDelay, int delay,
047: int totalSteps) {
048: _source = source;
049: _totalSteps = totalSteps;
050:
051: _timer = createTimer(delay, this );
052: _timer.setInitialDelay(initDelay);
053: }
054:
055: /**
056: * Creates the timer.
057: *
058: * @param delay the delay between each step, in ms.
059: * @param listener the action listener associated with the timer.
060: * @return the timer
061: */
062: protected Timer createTimer(int delay, ActionListener listener) {
063: return new Timer(delay, listener);
064: }
065:
066: /**
067: * Gets the AnimatorListener so that you can custom the behavior of the animator.
068: *
069: * @return the listener
070: */
071: public AnimatorListener getAnimatorListener() {
072: return _listener;
073: }
074:
075: /**
076: * Sets the AnimatorListener so that you can custom the behavior of the animator.
077: *
078: * @param listener the <code>AnimatorListener</code>.
079: */
080: public void setAnimatorListener(AnimatorListener listener) {
081: _listener = listener;
082: }
083:
084: public void actionPerformed(ActionEvent e) {
085: if (_source != null) {
086: if (_listener != null) {
087: _listener.animationFrame(_source, _totalSteps,
088: _currentStep);
089: }
090: _currentStep++;
091: if (_totalSteps != -1 && _currentStep > _totalSteps) {
092: stop();
093: if (_listener != null) {
094: _listener.animationEnds(_source);
095: }
096: }
097: }
098: }
099:
100: /**
101: * Starts the animator.
102: */
103: public void start() {
104: if (_listener != null) {
105: _listener.animationStarts(_source);
106: }
107: if (_timer != null)
108: _timer.start();
109: _currentStep = 0;
110: }
111:
112: /**
113: * Stop the animator and reset the counter.
114: */
115: public void stop() {
116: if (_timer != null) {
117: _timer.stop();
118: }
119: _currentStep = 0;
120: }
121:
122: /**
123: * Interrupts the animator. The counter is not reset in this case.
124: */
125: public void interrupt() {
126: if (_timer != null) {
127: _timer.stop();
128: }
129: }
130:
131: /**
132: * If the animator is running, returns true. Otherwise, returns false.
133: *
134: * @return true if animator is running. Otherwise, returns false.
135: */
136: public boolean isRunning() {
137: return _timer != null && _timer.isRunning();
138: }
139:
140: public void setDelay(int delay) {
141: _timer.setDelay(delay);
142: }
143:
144: public void dispose() {
145: stop();
146: _timer.removeActionListener(this);
147: _timer = null;
148: }
149: }
|