package org.limewire.ui.swing.painter;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Paint;
import org.jdesktop.application.Resource;
import org.jdesktop.swingx.JXButton;
import org.jdesktop.swingx.painter.AbstractPainter;
import org.jdesktop.swingx.util.PaintUtils;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.PainterUtils;
/**
* Initially unpainted button painter that when clicked or selected
* draws a centered gradient on the background
* and two divider divots on the left and right.
*/
public class HeaderButtonBackgroundPainter extends AbstractPainter<JXButton> {
@Resource private Color innerSideBorder = PainterUtils.TRANSPARENT;
@Resource private Color outterSideBorder = PainterUtils.TRANSPARENT;
@Resource private int innerSideBorderFadeStep;
@Resource private int outterSideBorderFadeStep;
@Resource private Color backgroundGradientTop = PainterUtils.TRANSPARENT;
@Resource private Color backgroundGradientMiddle = PainterUtils.TRANSPARENT;
@Resource private Color backgroundGradientBottom = PainterUtils.TRANSPARENT;
private Paint topBackground;
private Paint bottomBackground;
private int cachedHeight = -1;
public HeaderButtonBackgroundPainter() {
GuiUtils.assignResources(this);
topBackground = new GradientPaint(0,0,backgroundGradientTop,0,1,backgroundGradientMiddle,true);
bottomBackground = new GradientPaint(0,0,backgroundGradientBottom,0,1,backgroundGradientMiddle,true);
setAntialiasing(false);
setCacheable(false);
}
@Override
protected void doPaint(Graphics2D g, JXButton object, int width, int height) {
if (object.getModel().isPressed() || object.getModel().isSelected()) {
if (cachedHeight != height) {
cachedHeight = height;
topBackground = PaintUtils.resizeGradient(topBackground, 0, height/2);
bottomBackground = PaintUtils.resizeGradient(bottomBackground, 0, height/2);
}
g.setPaint(topBackground);
g.fillRect(0, 0, width, height/2);
g.setPaint(bottomBackground);
g.fillRect(0, height/2, width, height/2);
int outerFadePoint = 9;
int innerFadePoint = 11;
g.setPaint(outterSideBorder);
g.drawLine(0,outerFadePoint,0, height-outerFadePoint-1);
g.drawLine(width-1,outerFadePoint,width-1, height-outerFadePoint-1);
g.setPaint(innerSideBorder);
g.drawLine(1,innerFadePoint,1, height-innerFadePoint-1);
g.drawLine(width-2,innerFadePoint,width-2, height-innerFadePoint-1);
Color strokeThreshold = PainterUtils.lighten(backgroundGradientTop, -30);
Color outerStroke = outterSideBorder;
for ( int i=0 ; i<outerFadePoint ; i++ ) {
outerStroke = PainterUtils.lighten(outerStroke, strokeThreshold, outterSideBorderFadeStep);
g.setPaint(outerStroke);
g.drawLine(0, outerFadePoint-i, 0, outerFadePoint-i);
g.drawLine(width-1, outerFadePoint-i, width-1, outerFadePoint-i);
g.drawLine(0, height-outerFadePoint-1+i, 0, height-outerFadePoint-1+i);
g.drawLine(width-1, height-outerFadePoint-1+i, width-1, height-outerFadePoint-1+i);
}
Color innerStroke = innerSideBorder;
for ( int i=0 ; i<innerFadePoint ; i++ ) {
innerStroke = PainterUtils.lighten(innerStroke, strokeThreshold, innerSideBorderFadeStep);
g.setPaint(innerStroke);
g.drawLine(1, innerFadePoint-i, 1, innerFadePoint-i);
g.drawLine(width-2, innerFadePoint-i, width-2, innerFadePoint-i);
g.drawLine(1, height-innerFadePoint-1+i, 1, height-innerFadePoint-1+i);
g.drawLine(width-2, height-innerFadePoint-1+i, width-2, height-innerFadePoint-1+i);
}
}
}
}