filebot/source/net/sourceforge/tuned/ui/ProgressIndicator.java

134 lines
3.1 KiB
Java
Raw Normal View History

2008-05-03 20:43:15 +00:00
package net.sourceforge.tuned.ui;
2008-05-03 20:43:15 +00:00
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
2008-05-03 20:43:15 +00:00
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
2008-05-03 20:43:15 +00:00
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.Calendar;
import javax.swing.JComponent;
import javax.swing.Timer;
2008-05-03 20:43:15 +00:00
public class ProgressIndicator extends JComponent {
2008-05-03 20:43:15 +00:00
private float radius = 4.0f;
private int shapeCount = 3;
2008-05-03 20:43:15 +00:00
private float strokeWidth = 2f;
private Stroke stroke = new BasicStroke(strokeWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND);
2008-05-03 20:43:15 +00:00
private Color progressShapeColor = Color.orange;
private Color backgroundShapeColor = new Color(0f, 0f, 0f, 0.25f);
2008-05-03 20:43:15 +00:00
private final Rectangle2D frame = new Rectangle2D.Double();
private final Ellipse2D circle = new Ellipse2D.Double();
private final Dimension baseSize = new Dimension(32, 32);
private Timer updateTimer = new Timer(20, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
});;
2008-05-03 20:43:15 +00:00
public ProgressIndicator() {
setPreferredSize(baseSize);
2008-05-03 20:43:15 +00:00
addComponentListener(new ComponentAdapter() {
@Override
public void componentHidden(ComponentEvent e) {
stopAnimation();
}
2008-05-03 20:43:15 +00:00
@Override
public void componentShown(ComponentEvent e) {
startAnimation();
}
});
2008-05-03 20:43:15 +00:00
}
@Override
public void paintComponent(Graphics g) {
2008-05-03 20:43:15 +00:00
Graphics2D g2d = (Graphics2D) g;
double a = Math.min(getWidth(), getHeight());
g2d.scale(a / baseSize.width, a / baseSize.height);
2008-05-03 20:43:15 +00:00
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
frame.setFrame(radius, radius, baseSize.width - radius * 2 - 1, baseSize.height - radius * 2 - 1);
2008-05-03 20:43:15 +00:00
paintShapes(g2d);
2008-05-03 20:43:15 +00:00
}
protected void paintShapes(Graphics2D g2d) {
2008-05-03 20:43:15 +00:00
circle.setFrame(frame);
g2d.setStroke(stroke);
g2d.setPaint(backgroundShapeColor);
2008-05-03 20:43:15 +00:00
g2d.draw(circle);
Point2D center = new Point2D.Double(frame.getCenterX(), frame.getMinY());
circle.setFrameFromCenter(center, new Point2D.Double(center.getX() + radius, center.getY() + radius));
2008-05-03 20:43:15 +00:00
g2d.setStroke(stroke);
g2d.setPaint(progressShapeColor);
2008-05-03 20:43:15 +00:00
Calendar now = Calendar.getInstance();
double theta = getTheta(now.get(Calendar.MILLISECOND), now.getMaximum(Calendar.MILLISECOND));
g2d.rotate(theta, frame.getCenterX(), frame.getCenterY());
theta = getTheta(1, shapeCount);
2008-05-03 20:43:15 +00:00
for (int i = 0; i < shapeCount; i++) {
2008-05-03 20:43:15 +00:00
g2d.rotate(theta, frame.getCenterX(), frame.getCenterY());
g2d.fill(circle);
}
}
private double getTheta(int value, int max) {
return ((double) value / max) * 2 * Math.PI;
}
public void startAnimation() {
updateTimer.restart();
2008-05-03 20:43:15 +00:00
}
public void stopAnimation() {
updateTimer.stop();
2008-05-03 20:43:15 +00:00
}
public void setShapeCount(int indeterminateShapeCount) {
this.shapeCount = indeterminateShapeCount;
2008-05-03 20:43:15 +00:00
}
}