package org.hudson.trayapp.gui.tray;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.Timer;
public class AnimatedTrayIcon {
private ImageAndDelay[] imageAndDelays;
private int frame;
private TrayIconImplementation trayIcon;
private Timer timer;
public AnimatedTrayIcon(ImageAndDelay[] imageAndDelays, TrayIconImplementation trayIcon) {
this.imageAndDelays = imageAndDelays;
frame = imageAndDelays.length != 0 ? 0 : -1;
this.trayIcon = trayIcon;
timer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
ImageAndDelay iad = AnimatedTrayIcon.this.imageAndDelays[frame];
int length = AnimatedTrayIcon.this.imageAndDelays.length;
AnimatedTrayIcon.this.trayIcon.setIcon(iad.image.imageIcon);
frame++;
if (frame == length) {
frame = 0;
}
if (length != 1) {
timer.setDelay(iad.delay);
timer.restart();
} else {
timer.stop();
}
}
});
}
public void start() {
timer.start();
}
public void stop() {
timer.stop();
}
public static class ImageAndDelay {
private LayeredImage image;
private int delay;
public ImageAndDelay(LayeredImage image, int delay) {
this.image = image;
this.delay = delay;
}
}
public static class LayeredImage {
private ImageIcon imageIcon = null;
public LayeredImage(BufferedImage[] images, float[] alpha) {
if (images != null && images.length > 0 && alpha != null && alpha.length > 0 && alpha.length == images.length) {
BufferedImage image = new BufferedImage(images[0].getWidth(), images[0].getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g = (Graphics2D) image.getGraphics();
for (int i = 0; i < images.length; i++) {
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha[i]));
g.drawRenderedImage(images[i], new AffineTransform());
}
imageIcon = new ImageIcon(image);
}
}
public ImageIcon getImageIcon() {
return imageIcon;
}
}
}