package com.explodingpixels.macwidgets.plaf; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Image; import javax.swing.AbstractButton; import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; import com.explodingpixels.macwidgets.MacFontUtils; import com.explodingpixels.painter.ImagePainter; import com.explodingpixels.painter.MacWidgetsPainter; import com.explodingpixels.widgets.ImageBasedJComponent; import com.explodingpixels.widgets.plaf.ButtonsSeparateScrollBarSkin; import com.explodingpixels.widgets.plaf.ButtonsTogetherScrollBarSkin; import com.explodingpixels.widgets.plaf.ScrollBarOrientation; import com.explodingpixels.widgets.plaf.ScrollBarSkin; import com.explodingpixels.widgets.plaf.ScrollThumbImagePainter; import com.explodingpixels.widgets.plaf.SkinnableScrollBarUI; /** * Creates an iApp style scroll bar, either horizontal or vertical based on * {@link javax.swing.JScrollBar#getOrientation()}. * <br> * <img src="../../../../../graphics/iAppHorizontalScrollBar.png"> * <img src="../../../../../graphics/iAppVerticalScrollBar.png"> */ public class IAppScrollBarUI extends SkinnableScrollBarUI { private static boolean fButtonsSeparate = initializeSeparateStatus(); public IAppScrollBarUI() { super(createScrollBarSkinProvider()); } public static ComponentUI createUI(JComponent c) { return new IAppScrollBarUI(); } public static boolean areButtonsSeparate() { return fButtonsSeparate; } public static void setButtonsSeparate(boolean buttonsSeparate) { IAppScrollBarUI.fButtonsSeparate = buttonsSeparate; } private static ScrollBarSkinProvider createScrollBarSkinProvider() { return new ScrollBarSkinProvider() { public ScrollBarSkin provideSkin(ScrollBarOrientation orientation) { ScrollBarSkin skin; if (fButtonsSeparate) { if (orientation == ScrollBarOrientation.HORIZONTAL) { skin = createHorizontalSeparateSkin(); } else { skin = createVerticalSeparateSkin(); } } else { if (orientation == ScrollBarOrientation.HORIZONTAL) { skin = createHorizontalTogetherSkin(); } else { skin = createVerticalTogetherSkin(); } } return skin; } }; } private static ScrollBarSkin createHorizontalSeparateSkin() { Dimension minimumThumbSize = IAppScrollBarArtworkUtils.getHorizontalScrollBarMinimumSize(); AbstractButton decrementButton = IAppScrollBarArtworkUtils.createHorizontalSeparateDecrementButton(); AbstractButton incrementButton = IAppScrollBarArtworkUtils.createHorizontalSeparateIncrementButton(); MacWidgetsPainter<Component> trackPainter = new ImagePainter(IAppScrollBarArtworkUtils.getHorizontalTrack().getImage()); ScrollThumbImagePainter scrollerThumb = IAppScrollBarArtworkUtils.createHorizontalScrollerThumb(); int decrementButtonRecess = IAppScrollBarArtworkUtils.getScrollBarTopCapRecess(); int incrementButtonRecess = IAppScrollBarArtworkUtils.getDecrementButtonRecess(); // FIXME - Hack because some LAFs failed to set default fonts for everything AND Java 7 font behavior changed. decrementButton.setFont(MacFontUtils.DEFAULT_BUTTON_FONT); Dimension preferredSize = new Dimension(100, decrementButton.getPreferredSize().height); return new ButtonsSeparateScrollBarSkin(decrementButton, incrementButton, trackPainter, scrollerThumb, decrementButtonRecess, incrementButtonRecess, minimumThumbSize, preferredSize); } private static ScrollBarSkin createVerticalSeparateSkin() { Dimension minimumThumbSize = IAppScrollBarArtworkUtils.getVerticalScrollBarMinimumSize(); AbstractButton decrementButton = IAppScrollBarArtworkUtils.createVerticalSeparateDecrementButton(); AbstractButton incrementButton = IAppScrollBarArtworkUtils.createVerticalSeparateIncrementButton(); MacWidgetsPainter<Component> trackPainter = new ImagePainter(IAppScrollBarArtworkUtils.getVerticalTrack().getImage()); ScrollThumbImagePainter scrollerThumb = IAppScrollBarArtworkUtils.createVerticalScrollerThumb(); int decrementButtonRecess = IAppScrollBarArtworkUtils.getScrollBarTopCapRecess(); int incrementButtonRecess = IAppScrollBarArtworkUtils.getDecrementButtonRecess(); // FIXME - Hack because some LAFs failed to set default fonts for everything AND Java 7 font behavior changed. decrementButton.setFont(MacFontUtils.DEFAULT_BUTTON_FONT); Dimension preferredSize = new Dimension(decrementButton.getPreferredSize().width, 100); return new ButtonsSeparateScrollBarSkin(decrementButton, incrementButton, trackPainter, scrollerThumb, decrementButtonRecess, incrementButtonRecess, minimumThumbSize, preferredSize); } private static ScrollBarSkin createHorizontalTogetherSkin() { JComponent topCap = new ImageBasedJComponent(IAppScrollBarArtworkUtils.getScrollBarLeftCap().getImage()); Dimension minimumThumbSize = IAppScrollBarArtworkUtils.getHorizontalScrollBarMinimumSize(); AbstractButton decrementButton = IAppScrollBarArtworkUtils.createHorizontalTogetherDecrementButton(); AbstractButton incrementButton = IAppScrollBarArtworkUtils.createHorizontalTogetherIncrementButton(); MacWidgetsPainter<Component> trackPainter = new ImagePainter(IAppScrollBarArtworkUtils.getHorizontalTrack().getImage()); ScrollThumbImagePainter scrollerThumb = IAppScrollBarArtworkUtils.createHorizontalScrollerThumb(); int topCapRecess = IAppScrollBarArtworkUtils.getScrollBarTopCapRecess(); int decrementButtonRecess = IAppScrollBarArtworkUtils.getDecrementButtonRecess(); // FIXME - Hack because some LAFs failed to set default fonts for everything AND Java 7 font behavior changed. decrementButton.setFont(MacFontUtils.DEFAULT_BUTTON_FONT); Dimension preferredSize = new Dimension(100, decrementButton.getPreferredSize().height); return new ButtonsTogetherScrollBarSkin( topCap, decrementButton, incrementButton, trackPainter, scrollerThumb, topCapRecess, decrementButtonRecess, minimumThumbSize, preferredSize); } private static ScrollBarSkin createVerticalTogetherSkin() { Image topCapImage = IAppScrollBarArtworkUtils.getScrollBarTopCap().getImage(); JComponent topCap = new ImageBasedJComponent(topCapImage); Dimension minimumThumbSize = IAppScrollBarArtworkUtils.getVerticalScrollBarMinimumSize(); AbstractButton decrementButton = IAppScrollBarArtworkUtils.createVerticalTogetherDecrementButton(); AbstractButton incrementButton = IAppScrollBarArtworkUtils.createVerticalTogetherIncrementButton(); MacWidgetsPainter<Component> trackPainter = new ImagePainter(IAppScrollBarArtworkUtils.getVerticalTrack().getImage()); ScrollThumbImagePainter scrollerThumb = IAppScrollBarArtworkUtils.createVerticalScrollerThumb(); int topCapRecess = IAppScrollBarArtworkUtils.getScrollBarTopCapRecess(); int decrementButtonRecess = IAppScrollBarArtworkUtils.getDecrementButtonRecess(); // FIXME - Hack because some LAFs failed to set default fonts for everything AND Java 7 font behavior changed. decrementButton.setFont(MacFontUtils.DEFAULT_BUTTON_FONT); Dimension preferredSize = new Dimension(decrementButton.getPreferredSize().width, 100); return new ButtonsTogetherScrollBarSkin( topCap, decrementButton, incrementButton, trackPainter, scrollerThumb, topCapRecess, decrementButtonRecess, minimumThumbSize, preferredSize); } /** * In practice we should initialize this from the AppleScrollBarVariant * property in $HOME/Library/Preferences/.GlobalPreferences.plist, which * will be either Single (for separate) or DoubleMax (for together). * * @return <code>true</code> if buttons should be separate, * <code>false</code> if buttons should be placed together at right * or bottom. */ private static boolean initializeSeparateStatus() { return false; } }