package org.limewire.ui.swing.painter.factories; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Insets; import java.awt.Paint; import org.jdesktop.application.Resource; 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; import org.limewire.ui.swing.painter.ComponentBackgroundPainter; import org.limewire.ui.swing.painter.BorderPainter.AccentType; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.PainterUtils; import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton public class MessagePainterFactory { @Resource private int arcWidth; @Resource private int arcHeight; private final GreenMessagePainterResources greenResources = new GreenMessagePainterResources(); private final GrayMessagePainterResources grayResources = new GrayMessagePainterResources(); @Inject public MessagePainterFactory() { GuiUtils.assignResources(this); } public Painter createGrayMessagePainter() { return createPainter(grayResources.backgroundGradientTop, grayResources.backgroundGradientBottom, grayResources.border, grayResources.bevelTop1, grayResources.bevelTop2, grayResources.bevelLeft, grayResources.bevelRightGradientTop, grayResources.bevelRightGradientBottom, grayResources.bevelBottom); } public Painter createGreenMessagePainter() { return createPainter(greenResources.backgroundGradientTop, greenResources.backgroundGradientBottom, greenResources.border, greenResources.bevelTop1, greenResources.bevelTop2, greenResources.bevelLeft, greenResources.bevelRightGradientTop, greenResources.bevelRightGradientBottom, greenResources.bevelBottom); } /** * Creates a painter for a rectangular region that does not render rounded * corners. */ public Painter createGreenRectanglePainter() { return createRectanglePainter(grayResources.backgroundGradientTop, grayResources.backgroundGradientBottom, grayResources.border, grayResources.bevelTop1, grayResources.bevelTop2, grayResources.bevelLeft, grayResources.bevelRightGradientTop, grayResources.bevelRightGradientBottom, grayResources.bevelBottom); } private Painter createPainter(Color backgroundGradientTop, Color backgroundGradientBottom, Color border, Color bevelTop1, Color bevelTop2, Color bevelLeft, Color bevelRightGradientTop, Color bevelRightGradientBottom, Color bevelBottom) { Paint background = new GradientPaint(0, 0, backgroundGradientTop, 0, 1, backgroundGradientBottom); Paint bevelRight = new GradientPaint(0, 0, bevelRightGradientTop, 0, 1, bevelRightGradientBottom); return new ComponentBackgroundPainter(background, border, bevelLeft, bevelTop1, bevelTop2, bevelRight, bevelBottom, arcWidth, arcHeight, AccentType.NONE); } /** * Creates a painter for a rectangular region that does not render rounded * corners. */ private Painter createRectanglePainter(Color backgroundGradientTop, Color backgroundGradientBottom, Color border, Color bevelTop1, Color bevelTop2, Color bevelLeft, Color bevelRightGradientTop, Color bevelRightGradientBottom, Color bevelBottom) { Paint background = new GradientPaint(0, 0, backgroundGradientTop, 0, 1, backgroundGradientBottom); Paint bevelRight = new GradientPaint(0, 0, bevelRightGradientTop, 0, 1, bevelRightGradientBottom); // Create background painter without rounded corners. RectanglePainter backgroundPainter = new RectanglePainter(); backgroundPainter.setRounded(true); backgroundPainter.setFillPaint(background); backgroundPainter.setRoundWidth(0); backgroundPainter.setRoundHeight(0); backgroundPainter.setInsets(new Insets(2,2,2,2)); backgroundPainter.setBorderPaint(null); backgroundPainter.setPaintStretched(true); backgroundPainter.setFillVertical(true); backgroundPainter.setFillHorizontal(true); backgroundPainter.setAntialiasing(true); backgroundPainter.setCacheable(true); // Create border painter without rounded corners. We specify shadow // accent to ensure that the entire region is painted. We set the // left inset so shadow appears only along right and bottom borders. BorderPainter borderPainter = new BorderPainter(0, 0, border, bevelLeft, bevelTop1, bevelTop2, bevelRight, bevelBottom, AccentType.SHADOW); borderPainter.setInsets(new Insets(0, -1, 0, 0)); // Return compound painter for background and border. CompoundPainter painter = new CompoundPainter(); painter.setPainters(backgroundPainter, borderPainter); painter.setCacheable(true); return painter; } private static class GreenMessagePainterResources { @Resource protected Color backgroundGradientTop = PainterUtils.TRANSPARENT; @Resource protected Color backgroundGradientBottom = PainterUtils.TRANSPARENT; @Resource protected Color border = PainterUtils.TRANSPARENT; @Resource protected Color bevelTop1 = PainterUtils.TRANSPARENT; @Resource protected Color bevelTop2 = PainterUtils.TRANSPARENT; @Resource protected Color bevelLeft = PainterUtils.TRANSPARENT; @Resource protected Color bevelRightGradientTop = PainterUtils.TRANSPARENT; @Resource protected Color bevelRightGradientBottom = PainterUtils.TRANSPARENT; @Resource protected Color bevelBottom = PainterUtils.TRANSPARENT; public GreenMessagePainterResources() { GuiUtils.assignResources(this); } } private static class GrayMessagePainterResources { @Resource protected Color backgroundGradientTop = PainterUtils.TRANSPARENT; @Resource protected Color backgroundGradientBottom = PainterUtils.TRANSPARENT; @Resource protected Color border = PainterUtils.TRANSPARENT; @Resource protected Color bevelTop1 = PainterUtils.TRANSPARENT; @Resource protected Color bevelTop2 = PainterUtils.TRANSPARENT; @Resource protected Color bevelLeft = PainterUtils.TRANSPARENT; @Resource protected Color bevelRightGradientTop = PainterUtils.TRANSPARENT; @Resource protected Color bevelRightGradientBottom = PainterUtils.TRANSPARENT; @Resource protected Color bevelBottom = PainterUtils.TRANSPARENT; public GrayMessagePainterResources() { GuiUtils.assignResources(this); } } }