package org.limewire.ui.swing.components.decorators; import java.awt.Color; import java.awt.Cursor; import java.awt.Font; import java.awt.Paint; import javax.swing.BorderFactory; import org.jdesktop.application.Resource; import org.jdesktop.swingx.JXButton; import org.jdesktop.swingx.painter.Painter; import org.limewire.ui.swing.painter.ButtonForegroundPainter; import org.limewire.ui.swing.painter.StatusBarPopupButtonPainter; import org.limewire.ui.swing.painter.BorderPainter.AccentType; import org.limewire.ui.swing.painter.ButtonBackgroundPainter.DrawMode; import org.limewire.ui.swing.painter.StatusBarPopupButtonPainter.PopupVisibilityChecker; import org.limewire.ui.swing.painter.factories.ButtonPainterFactory; import org.limewire.ui.swing.util.FontUtils; import org.limewire.ui.swing.util.GuiUtils; import com.google.inject.Inject; import com.google.inject.Singleton; /** * Class that prepares and skins JXButtons with the default * LimeWire style. * <p> * Mini buttons do not have a background drawn unless mouse * over or clicked, full buttons do. * */ @Singleton public class ButtonDecorator { private final ButtonPainterFactory painterFactory; @Resource private Font miniTextFont; @Resource private Color miniTextForeground; @Resource private Font linkTextFont; @Resource private Color linkTextForeground; @Resource private Font lightFullTextFont; @Resource private Color lightFullTextForeground; @Resource private Font darkFullTextFont; @Resource private Color darkFullTextForeground; @Resource private Font flatTextFont; @Resource private Color flatTextForeground; @Inject ButtonDecorator(ButtonPainterFactory painterFactory) { GuiUtils.assignResources(this); this.painterFactory = painterFactory; // TODO: Underline can not be set using resources? linkTextFont = FontUtils.deriveUnderline(linkTextFont, true); flatTextFont = FontUtils.deriveUnderline(flatTextFont, true); } public void decorateMiniButton(JXButton button) { button.setForegroundPainter(painterFactory.createMiniButtonForegroundPainter()); button.setBackgroundPainter(painterFactory.createMiniButtonBackgroundPainter()); decorateGeneral(button); button.setBorder(BorderFactory.createEmptyBorder(2,6,3,6)); button.setForeground(miniTextForeground); button.setFont(miniTextFont); } /** * The link button is similar to the mini button in that it has no background drawn until mouse * over. When inactive, text is underlined like a link, the active styles are similar to that * of the mini buttons. */ public void decorateLinkButton(JXButton button) { button.setForegroundPainter(painterFactory.createLinkButtonForegroundPainter()); button.setBackgroundPainter(painterFactory.createLinkButtonBackgroundPainter()); decorateGeneral(button); button.setBorder(BorderFactory.createEmptyBorder(2,6,3,6)); button.setForeground(linkTextForeground); button.setFont(linkTextFont); } public void decorateDarkFullButton(JXButton button, AccentType accent) { decorateDarkFullButton(button, DrawMode.FULLY_ROUNDED, accent); button.setBorder(BorderFactory.createEmptyBorder(2,10,3,10)); } public void decorateDarkFullButton(JXButton button) { decorateDarkFullButton(button, DrawMode.FULLY_ROUNDED, AccentType.SHADOW); button.setBorder(BorderFactory.createEmptyBorder(2,10,3,10)); } /** * This button is preped for the case where an image will be displayed * but no text. The buttons icon will be centered and the remained of the * button drawn around. This button will be painted with the dark style and * needs an accent to be selected. */ public void decorateDarkFullImageButton(JXButton button, AccentType accent) { decorateDarkFullButton(button, button.getForegroundPainter(), painterFactory.createDarkFullButtonBackgroundPainter(DrawMode.FULLY_ROUNDED, accent)); button.setContentAreaFilled(false); button.setPaintBorderInsets(true); } /** * This button is preped for the case where an image will be displayed * but no text. The buttons icon will be centered and the remained of the * button drawn around. This button will be painted with the dark style and * accepts a parameter for overriding the edge rounding settings on the button face. */ public void decorateDarkFullImageButton(JXButton button, DrawMode mode) { decorateDarkFullButton(button, button.getForegroundPainter(), painterFactory.createDarkFullButtonBackgroundPainter(mode, AccentType.SHADOW)); button.setContentAreaFilled(false); button.setPaintBorderInsets(true); } public void decorateDarkFullButton(JXButton button, DrawMode mode, AccentType accent) { decorateDarkFullButton(button, painterFactory.createDarkFullButtonForegroundPainter(), painterFactory.createDarkFullButtonBackgroundPainter(mode, accent)); button.setBorder(BorderFactory.createEmptyBorder(2,10,3,10)); } private void decorateDarkFullButton(JXButton button, Painter<JXButton> foregroundPainter, Painter<JXButton> backgroundPainter) { button.setForegroundPainter(foregroundPainter); button.setBackgroundPainter(backgroundPainter); decorateGeneral(button); button.setForeground(darkFullTextForeground); button.setFont(darkFullTextFont); } public void decorateLightFullButton(JXButton button) { button.setForegroundPainter(painterFactory.createLightFullButtonForegroundPainter()); button.setBackgroundPainter(painterFactory.createLightFullButtonBackgroundPainter()); decorateGeneral(button); button.setBorder(BorderFactory.createEmptyBorder(2,10,3,10)); button.setForeground(lightFullTextForeground); button.setFont(lightFullTextFont); } public void decorateGreenFullButton(JXButton button) { button.setForegroundPainter(painterFactory.createLightFullButtonForegroundPainter()); button.setBackgroundPainter(painterFactory.createGreenFullButtonBackgroundPainter()); decorateGeneral(button); button.setForeground(lightFullTextForeground); button.setFont(lightFullTextFont); } /** * Decorates a button using the flat button style with no rollover and click effects and a minimal * visual style. */ public void decorateFlatButton(JXButton button) { button.setBackgroundPainter(painterFactory.createFlatButtonBackgroundPainter()); decorateGeneral(button); button.setForeground(flatTextForeground); button.setFont(flatTextFont); button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } public void decorateStatusPopupButton(JXButton button, PopupVisibilityChecker visibilityChecker, Paint background, Paint border, org.limewire.ui.swing.painter.StatusBarPopupButtonPainter.DrawMode mode) { button.setBackgroundPainter(new StatusBarPopupButtonPainter(visibilityChecker, background, border, mode)); button.setForegroundPainter(new ButtonForegroundPainter()); decorateGeneral(button); button.setBorder(BorderFactory.createEmptyBorder(0,8,0,8)); } public void decorateChatButton(JXButton button, PopupVisibilityChecker visibilityChecker, Paint background, Paint border) { //TODO: Michael T needs to fix this painting. button.setBackgroundPainter(new StatusBarPopupButtonPainter(visibilityChecker, background, border, org.limewire.ui.swing.painter.StatusBarPopupButtonPainter.DrawMode.RIGHT_CONNECTING)); // button.setForegroundPainter(new ButtonForegroundPainter()); decorateGeneral(button); button.setBorder(BorderFactory.createEmptyBorder(0,8,0,8)); } private static void decorateGeneral(JXButton button) { button.setOpaque(false); button.setFocusPainted(false); button.setBorderPainted(false); } }