package org.limewire.ui.swing.painter; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Paint; import javax.swing.ButtonModel; import org.jdesktop.swingx.JXButton; import org.jdesktop.swingx.painter.AbstractPainter; import org.jdesktop.swingx.painter.CompoundPainter; import org.jdesktop.swingx.painter.Painter; import org.jdesktop.swingx.painter.RectanglePainter; import org.limewire.ui.swing.painter.BorderPainter.AccentType; /** * Background painter for a gradient button. */ public abstract class ButtonBackgroundPainter extends AbstractPainter<JXButton> { protected DrawMode drawMode = DrawMode.FULLY_ROUNDED; protected Painter<JXButton> normalPainter; protected Painter<JXButton> clickedPainter; protected Painter<JXButton> hoveredPainter; protected Painter<JXButton> disabledPainter; protected Painter<JXButton> createPainter(Color gradientTop, Color gradientBottom, Paint border, Paint bevelLeft, Paint bevelTop1, Paint bevelTop2, Paint bevelRight, Paint bevelBottom, int arcWidth, int arcHeight, AccentType accentType) { CompoundPainter<JXButton> compoundPainter = new CompoundPainter<JXButton>(); RectanglePainter<JXButton> painter = new RectanglePainter<JXButton>(); int shiftX1 = 0; int shiftX2 = 0; switch (this.drawMode) { case LEFT_ROUNDED : shiftX1 = 0; shiftX2 = -arcWidth+2; break; case RIGHT_ROUNDED : shiftX1 = -arcWidth-2; shiftX2 = 0; break; case UNROUNDED : shiftX1 = -arcWidth-2; shiftX2 = -arcWidth-2; break; } painter.setRounded(true); painter.setFillPaint(new GradientPaint(0,0, gradientTop, 0, 1, gradientBottom, false)); painter.setRoundWidth(arcWidth); painter.setRoundHeight(arcHeight); painter.setInsets(new Insets(1,2+shiftX1,2,2+shiftX2)); painter.setPaintStretched(true); painter.setBorderPaint(null); painter.setFillVertical(true); painter.setFillHorizontal(true); painter.setAntialiasing(true); painter.setCacheable(true); BorderPainter borderPainter = new BorderPainter(arcWidth, arcHeight, border, bevelLeft, bevelTop1, bevelTop2, bevelRight, bevelBottom, accentType); borderPainter.setInsets(new Insets(0,shiftX1, 0, shiftX2)); compoundPainter.setPainters(painter, borderPainter); compoundPainter.setCacheable(true); return compoundPainter; } @Override public void doPaint(Graphics2D g, JXButton object, int width, int height) { ButtonModel model = object.getModel(); if (!object.isEnabled() && disabledPainter != null) { this.disabledPainter.paint(g, object, width, height); return; } if(model.isPressed() || model.isSelected()) { this.clickedPainter.paint(g, object, width, height); } else if (model.isRollover() || object.hasFocus()) { this.hoveredPainter.paint(g, object, width, height); } else { this.normalPainter.paint(g, object, width, height); } } /** * For creating buttons with different edge rounding properties. * <pre> * Examples : * * ( LEFT_ROUNDED | | UNROUNDED | | RIGHT_ROUNDED ) * * ( FULLY_ROUNDED ) * </pre> */ public enum DrawMode { FULLY_ROUNDED, RIGHT_ROUNDED, LEFT_ROUNDED, UNROUNDED } }