package jp.crwdev.app.gui;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class ProgressIcon extends JComponent implements Icon {
private Timer mTimer;
private final List<Shape> mList;
private final Stroke mStroke = new BasicStroke(2.0f);
private final int ICON_SIZE=32;
private boolean mIsRunning = false;
public ProgressIcon() {
super();
mList = new ArrayList<Shape>();
Shape line= new Line2D.Double(0.0,8.0,0.0,14.0);
AffineTransform rot = AffineTransform.getRotateInstance(Math.toRadians(30.0));
AffineTransform trans = AffineTransform.getTranslateInstance(ICON_SIZE/2.0, ICON_SIZE/2.0);
for(int i=0;i<12;i++){
line = rot.createTransformedShape(line);
mList.add(trans.createTransformedShape(line));
}
setPreferredSize(new Dimension(ICON_SIZE, ICON_SIZE));
//setVisible(false);
}
public void start() {
if(mTimer == null){
mTimer = new Timer();
setVisible(true);
mTimer.schedule(new TimerTask(){
@Override
public void run() {
mList.add(mList.remove(0));
repaint();
}
}, 100, 100);
mIsRunning = true;
}
}
public void stop() {
if(mTimer != null){
mTimer.cancel();
mTimer = null;
mIsRunning = false;
setVisible(false);
}
}
public boolean isRunning(){
return mIsRunning;
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2=(Graphics2D)g;
g2.setColor(getBackground());
g2.fillRect(0,0,getWidth(),getHeight());
g2.setStroke(mStroke);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Iterator<Shape> it = mList.iterator();
if(mIsRunning) {
float alpha=0.083f;
while(it.hasNext()) {
g2.setColor(new Color(0.6f,0.6f,0.6f,alpha));
g2.draw((Shape)it.next());
alpha +=0.083f;
}
}else{
while(it.hasNext()) {
g2.setColor(new Color(0.6f,0.6f,0.6f));
g2.draw((Shape)it.next());
}
}
}
@Override
public int getIconHeight() {
return ICON_SIZE;
}
@Override
public int getIconWidth() {
return ICON_SIZE;
}
@Override
public void paintIcon(Component arg0, Graphics arg1, int arg2, int arg3) {
SwingUtilities.paintComponent(arg1,this,
(Container)arg0,new Rectangle(arg2,arg3,ICON_SIZE,ICON_SIZE));
}
}