package com.shaneisrael.st.utilities; import java.awt.Image; import java.util.ArrayList; import java.util.List; import javax.swing.ImageIcon; import com.shaneisrael.st.Config; import com.shaneisrael.st.SnippingToolPlusPlus; import com.shaneisrael.st.data.Logger; public class AnimatedTrayIcon implements Runnable { private final int delayMs; private List<Image> frames; private boolean animate; private String originalIconPath; public AnimatedTrayIcon(String basePath, int numFrames, int delayMs) { this.delayMs = delayMs; frames = new ArrayList<>(); for (int i = 1; i < numFrames; i++) { frames.add(new ImageIcon(this.getClass().getResource(basePath + i + ".png")).getImage()); } } @Override public void run() { animate = true; while (animate) { for (Image frame : frames) { SnippingToolPlusPlus.trayIcon.setImage(frame); try { Thread.sleep(delayMs); } catch (InterruptedException e) { Logger.Log(e); e.printStackTrace(); } } } SnippingToolPlusPlus.trayIcon.setImage(new ImageIcon(this.getClass().getResource(originalIconPath)).getImage()); } public void stopAnimating() { animate = false; } public void setOriginalIconPath(String iconPath) { this.originalIconPath = iconPath; } public static AnimatedTrayIcon getDefaultIcon() { AnimatedTrayIcon defaultIcon = new AnimatedTrayIcon( Config.TRAY_ICON_BASE_DIR, Config.TRAY_ICON_NUM_FRAMES, Config.TRAY_ICON_FRAME_DELAY_MS); defaultIcon.setOriginalIconPath(Config.TRAY_ICON_STATIC); return defaultIcon; } }