package magic.ui.screen.widget;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import magic.ui.MagicSound;
import magic.ui.helpers.ImageHelper;
@SuppressWarnings("serial")
public class BigDialButton extends ActionBarButton {
private final int INTERVAL; // in degrees
private final int positions;
private int position;
public BigDialButton(int count, int start, String caption, String tooltip, AbstractAction action) {
super(caption, tooltip, action);
this.positions = count;
this.position = start;
this.INTERVAL = 360 / positions;
rotateIconImage();
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
position = position >= positions - 1 ? 0 : position + 1;
rotateIconImage();
MagicSound.CLICK.play();
}
}
});
}
public BigDialButton(int count, int start, AbstractAction action) {
this(count, start, null, null, action);
}
private static final GradientPaint tintColor =
new GradientPaint(
0, 0, new Color(255, 255, 255, 160),
24, 24, new Color(255, 255, 255, 255)
);
private void rotateIconImage() {
final int W = 24;
final int H = 24;
final BufferedImage image = ImageHelper.getCompatibleBufferedImage(
W, H, BufferedImage.TRANSLUCENT
);
Graphics2D g2d = image.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
// This makes a big difference to quality of rotated image if rotation is not a factor of 90 degrees.
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC) ;
g2d.setTransform(AffineTransform.getRotateInstance(
Math.toRadians(INTERVAL * position),
W * 0.5d, H * 0.5d)
);
g2d.setPaint(tintColor);
g2d.fillOval(2, 2, W-4, H-4);
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OUT);
g2d.setComposite(ac);
g2d.fillOval((W - 8) / 2, 3, 8, 8);
g2d.dispose();
super.setIcon(new ImageIcon(image));
}
public int getPosition() {
return position;
}
}