com.jgoodies.looks.plastic.PlasticScrollBarUI Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jgoodies-looks Show documentation
Show all versions of jgoodies-looks Show documentation
The JGoodies Looks make your Swing applications and
applets look better. They have been optimized for readability,
precise micro-design and usability. And they simplify
the multi-platform support by using similar widget dimensions.
In addition, many people have reviewed them as elegant.
/*
* Copyright (c) 2001-2012 JGoodies Karsten Lentzsch. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* o Neither the name of JGoodies Karsten Lentzsch nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jgoodies.looks.plastic;
import java.awt.Adjustable;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.MetalScrollBarUI;
/**
* The JGoodies Plastic L&F implementation of {@code ScrollBarUI}.
* Can add a pseudo 3D effect and honors the Plastic Option
* ScrollBar.maxBumpsWidth to limit the with of the scroll bar bumps.
*
* @author Karsten Lentzsch
* @version $Revision: 1.10 $
*/
public final class PlasticScrollBarUI extends MetalScrollBarUI {
private static final String PROPERTY_PREFIX = "ScrollBar.";
public static final String MAX_BUMPS_WIDTH_KEY = PROPERTY_PREFIX + "maxBumpsWidth";
private Color shadowColor;
private Color highlightColor;
private Color darkShadowColor;
private Color thumbColor;
private Color thumbShadow;
private Color thumbHighlightColor;
private PlasticBumps bumps;
public static ComponentUI createUI(JComponent b) {
return new PlasticScrollBarUI();
}
@Override
protected void installDefaults() {
super.installDefaults();
bumps = new PlasticBumps(10, 10, thumbHighlightColor, thumbShadow, thumbColor);
}
@Override
protected JButton createDecreaseButton(int orientation) {
decreaseButton = new PlasticArrowButton(orientation, scrollBarWidth, isFreeStanding);
return decreaseButton;
}
@Override
protected JButton createIncreaseButton(int orientation) {
increaseButton = new PlasticArrowButton(orientation, scrollBarWidth, isFreeStanding);
return increaseButton;
}
@Override
protected void configureScrollBarColors() {
super.configureScrollBarColors();
shadowColor = UIManager.getColor(PROPERTY_PREFIX + "shadow");
highlightColor = UIManager.getColor(PROPERTY_PREFIX + "highlight");
darkShadowColor = UIManager.getColor(PROPERTY_PREFIX + "darkShadow");
thumbColor = UIManager.getColor(PROPERTY_PREFIX + "thumb");
thumbShadow = UIManager.getColor(PROPERTY_PREFIX + "thumbShadow");
thumbHighlightColor = UIManager.getColor(PROPERTY_PREFIX + "thumbHighlight");
}
@Override
protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
g.translate(trackBounds.x, trackBounds.y);
boolean leftToRight = PlasticUtils.isLeftToRight(c);
if (scrollbar.getOrientation() == Adjustable.VERTICAL) {
if (!isFreeStanding) {
if (!leftToRight) {
trackBounds.width += 1;
g.translate(-1, 0);
} else {
trackBounds.width += 2;
}
}
if (c.isEnabled()) {
g.setColor(darkShadowColor);
g.drawLine(0, 0, 0, trackBounds.height - 1);
g.drawLine(trackBounds.width - 2, 0, trackBounds.width - 2, trackBounds.height - 1);
g.drawLine(1, trackBounds.height - 1, trackBounds.width - 1, trackBounds.height - 1);
g.drawLine(1, 0, trackBounds.width - 2, 0);
g.setColor(shadowColor);
// g.setColor( Color.red);
g.drawLine(1, 1, 1, trackBounds.height - 2);
g.drawLine(1, 1, trackBounds.width - 3, 1);
if (scrollbar.getValue() != scrollbar.getMaximum()) { // thumb shadow
int y = thumbRect.y + thumbRect.height - trackBounds.y;
g.drawLine(1, y, trackBounds.width - 1, y);
}
g.setColor(highlightColor);
g.drawLine(trackBounds.width - 1, 0, trackBounds.width - 1, trackBounds.height - 1);
} else {
PlasticUtils.drawDisabledBorder(g, 0, 0, trackBounds.width, trackBounds.height);
}
if (!isFreeStanding) {
if (!leftToRight) {
trackBounds.width -= 1;
g.translate(1, 0);
} else {
trackBounds.width -= 2;
}
}
} else { // HORIZONTAL
if (!isFreeStanding) {
trackBounds.height += 2;
}
if (c.isEnabled()) {
g.setColor(darkShadowColor);
g.drawLine(0, 0, trackBounds.width - 1, 0); // top
g.drawLine(0, 1, 0, trackBounds.height - 2); // left
g.drawLine(0, trackBounds.height - 2, trackBounds.width - 1, trackBounds.height - 2);
// bottom
g.drawLine(trackBounds.width - 1, 1, trackBounds.width - 1, trackBounds.height - 1);
// right
g.setColor(shadowColor);
// g.setColor( Color.red);
g.drawLine(1, 1, trackBounds.width - 2, 1); // top
g.drawLine(1, 1, 1, trackBounds.height - 3); // left
g.drawLine(0, trackBounds.height - 1, trackBounds.width - 1, trackBounds.height - 1);
// bottom
if (scrollbar.getValue() != scrollbar.getMaximum()) { // thumb shadow
int x = thumbRect.x + thumbRect.width - trackBounds.x;
g.drawLine(x, 1, x, trackBounds.height - 1);
}
} else {
PlasticUtils.drawDisabledBorder(g, 0, 0, trackBounds.width, trackBounds.height);
}
if (!isFreeStanding) {
trackBounds.height -= 2;
}
}
g.translate(-trackBounds.x, -trackBounds.y);
}
@Override
protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
if (!c.isEnabled()) {
return;
}
boolean leftToRight = PlasticUtils.isLeftToRight(c);
g.translate(thumbBounds.x, thumbBounds.y);
if (scrollbar.getOrientation() == Adjustable.VERTICAL) {
if (!isFreeStanding) {
if (!leftToRight) {
thumbBounds.width += 1;
g.translate(-1, 0);
} else {
thumbBounds.width += 2;
}
}
g.setColor(thumbColor);
g.fillRect(0, 0, thumbBounds.width - 2, thumbBounds.height - 1);
g.setColor(thumbShadow);
g.drawRect(0, 0, thumbBounds.width - 2, thumbBounds.height - 1);
g.setColor(thumbHighlightColor);
g.drawLine(1, 1, thumbBounds.width - 3, 1);
g.drawLine(1, 1, 1, thumbBounds.height - 2);
paintBumps(g, c, 3, 4, thumbBounds.width - 6, thumbBounds.height - 7);
if (!isFreeStanding) {
if (!leftToRight) {
thumbBounds.width -= 1;
g.translate(1, 0);
} else {
thumbBounds.width -= 2;
}
}
} else { // HORIZONTAL
if (!isFreeStanding) {
thumbBounds.height += 2;
}
g.setColor(thumbColor);
g.fillRect(0, 0, thumbBounds.width - 1, thumbBounds.height - 2);
g.setColor(thumbShadow);
g.drawRect(0, 0, thumbBounds.width - 1, thumbBounds.height - 2);
g.setColor(thumbHighlightColor);
g.drawLine(1, 1, thumbBounds.width - 2, 1);
g.drawLine(1, 1, 1, thumbBounds.height - 3);
paintBumps(g, c, 4, 3, thumbBounds.width - 7, thumbBounds.height - 6);
if (!isFreeStanding) {
thumbBounds.height -= 2;
}
}
g.translate(-thumbBounds.x, -thumbBounds.y);
if (PlasticUtils.is3D(PROPERTY_PREFIX)) {
paintThumb3D(g, thumbBounds);
}
}
private void paintBumps(Graphics g, JComponent c, int x, int y, int width, int height) {
if (!useNarrowBumps()) {
bumps.setBumpArea(width, height);
bumps.paintIcon(c, g, x, y);
} else {
int maxWidth = UIManager.getInt(MAX_BUMPS_WIDTH_KEY);
int myWidth = Math.min(maxWidth, width);
int myHeight = Math.min(maxWidth, height);
int myX = x + (width - myWidth) / 2;
int myY = y + (height - myHeight) / 2;
bumps.setBumpArea(myWidth, myHeight);
bumps.paintIcon(c, g, myX, myY);
}
}
private void paintThumb3D(Graphics g, Rectangle thumbBounds) {
boolean isHorizontal = scrollbar.getOrientation() == Adjustable.HORIZONTAL;
int width = thumbBounds.width - (isHorizontal ? 3 : 1);
int height = thumbBounds.height - (isHorizontal ? 1 : 3);
Rectangle r = new Rectangle(thumbBounds.x + 2, thumbBounds.y + 2, width, height);
PlasticUtils.addLight3DEffekt(g, r, isHorizontal);
}
// Accessing Special Client Properties ************************************
private static boolean useNarrowBumps() {
Object value = UIManager.get(MAX_BUMPS_WIDTH_KEY);
return value != null && value instanceof Integer;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy