package com.quiltplayer.view.swing.buttons; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.AbstractButton; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.SwingConstants; import org.jdesktop.animation.timing.Animator; import org.jdesktop.animation.timing.interpolation.PropertySetter; import com.quiltplayer.view.swing.FontFactory; /** * Default control panel button implementation. * * @author Vlado Palczynski. */ public class QControlPanelButton extends JButton { private static final long serialVersionUID = 1L; private String label; private float defaultAlpha = 0.40f; private float currentAlpha = defaultAlpha; private float highlightAlpha = 1.0f; private boolean active; private boolean fade; private transient Animator animator = new Animator(0); private int horizontalAlignment; public QControlPanelButton(String label, Icon icon, int verticalTextPosition, int horizontalAlignment) { super(" ", icon); this.horizontalAlignment = horizontalAlignment; this.label = label; setDefaults(verticalTextPosition); } private void setDefaults(int verticalTextPosition) { setOpaque(false); setHorizontalTextPosition(AbstractButton.CENTER); setHorizontalAlignment(AbstractButton.CENTER); setVerticalTextPosition(verticalTextPosition); setVerticalAlignment(AbstractButton.CENTER); setFocusable(false); setForeground(new Color(255, 255, 255)); setContentAreaFilled(false); setFont(FontFactory.getFont(11f)); addMouseListener(listener); } private transient MouseListener listener = new MouseAdapter() { /* * (non-Javadoc) * * @see java.awt.event.MouseAdapter#mouseEntered(java.awt.event.MouseEvent) */ @Override public void mouseEntered(MouseEvent e) { if (!active) { if (animator.isRunning()) animator.stop(); setText(label); animate(currentAlpha, highlightAlpha); } } /* * (non-Javadoc) * * @see java.awt.event.MouseAdapter#mouseExited(java.awt.event.MouseEvent) */ @Override public void mouseExited(MouseEvent e) { if (!active) { if (animator.isRunning()) animator.stop(); animate(currentAlpha, defaultAlpha); setText(" "); repaint(); } } }; private void animate(final float fromAlpha, final float toAlpha) { if (animator.isRunning()) animator.stop(); PropertySetter setter = new PropertySetter(this, "alpha", fromAlpha, toAlpha); animator = new Animator(300, setter); animator.start(); } // Paint the round background and label. protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); if (fade) { } else if (active) { // RescaleOp op = new RescaleOp(-1.0f, 255f, null); // BufferedImage negative = op.filter(icon, null); g2d.setBackground(Color.BLACK); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.05f)); if (horizontalAlignment == SwingConstants.LEFT) g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 5, 5); else if (horizontalAlignment == SwingConstants.RIGHT) g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 5, 5); g2d.setComposite(makeComposite()); } else { g2d.setComposite(makeComposite()); } super.paintComponent(g); } protected void paintBorder(Graphics g) { // No border should be painted. } public void inactivate() { setText(" "); active = false; animate(currentAlpha, defaultAlpha); } public void fade() { fade = !fade; } public void activate() { setText(label); active = true; animate(currentAlpha, highlightAlpha); } /* * Set alpha composite. For example, pass in 1.0f to have 100% opacity pass in 0.25f to have 25% * opacity. */ private AlphaComposite makeComposite() { int type = AlphaComposite.SRC_OVER; return (AlphaComposite.getInstance(type, currentAlpha)); } /** * @return the alpha */ public final float getAlpha() { return currentAlpha; } /** * @param alpha * the alpha to set */ public final void setAlpha(float alpha) { this.currentAlpha = alpha; repaint(); } }