
com.seaglasslookandfeel.painter.ScrollBarButtonPainter Maven / Gradle / Ivy
/*
* Copyright (c) 2009 Kathryn Huxtable and Kenneth Orr.
*
* This file is part of the SeaGlass Pluggable Look and Feel.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* $Id: ScrollBarButtonPainter.java 1120 2010-02-09 23:26:32Z [email protected] $
*/
package com.seaglasslookandfeel.painter;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Shape;
import javax.swing.JComponent;
import com.seaglasslookandfeel.effect.DropShadowEffect;
import com.seaglasslookandfeel.effect.Effect;
import com.seaglasslookandfeel.painter.AbstractRegionPainter.PaintContext.CacheMode;
/**
* ScrollBarButtonPainter implementation.
*/
public final class ScrollBarButtonPainter extends AbstractRegionPainter {
/**
* DOCUMENT ME!
*
* @author $author$
* @version $Revision$, $Date$
*/
public static enum Which {
FOREGROUND_ENABLED, FOREGROUND_DISABLED, FOREGROUND_PRESSED, FOREGROUND_INCREASE_ENABLED, FOREGROUND_INCREASE_DISABLED,
FOREGROUND_INCREASE_PRESSED,
FOREGROUND_ENABLED_TOGETHER, FOREGROUND_DISABLED_TOGETHER, FOREGROUND_PRESSED_TOGETHER, FOREGROUND_INCREASE_ENABLED_TOGETHER,
FOREGROUND_INCREASE_DISABLED_TOGETHER, FOREGROUND_INCREASE_PRESSED_TOGETHER,
FOREGROUND_CAP,
}
private Color scrollBarButtonBase = decodeColor("scrollBarButtonBase");
private Color scrollBarButtonBasePressed = decodeColor("scrollBarButtonBasePressed");
private TwoColors scrollBarCapColors = new TwoColors(scrollBarButtonBase, deriveColor(scrollBarButtonBase, 0f, 0f, -0.266667f, 0));
private Color scrollBarButtonTopPressed = deriveColor(scrollBarButtonBasePressed, 0.000737f, -0.105657f, 0.101961f, 0);
private Color scrollBarButtonMiddlePressed = deriveColor(scrollBarButtonBasePressed, 0.001240f, -0.041156f, 0.035294f, 0);
private Color scrollBarButtonBottomPressed = deriveColor(scrollBarButtonBasePressed, 0.000348f, 0.050949f, -0.039216f, 0);
private Color scrollBarButtonLinePressedColor = deriveColor(scrollBarButtonBasePressed, -0.001400f, 0.110160f, -0.043137f,
0);
private TwoColors scrollBarButtonIncreaseApart = new TwoColors(deriveColor(scrollBarButtonBase, 0f, 0f, -0.180392f, 0),
scrollBarButtonBase);
private TwoColors scrollBarButtonIncreaseTogether = new TwoColors(deriveColor(scrollBarButtonBase, 0f, 0f, -0.180392f, 0),
deriveColor(scrollBarButtonBase, 0f, 0f, -0.101961f, 0));
private TwoColors scrollBarButtonIncreasePressed = new TwoColors(scrollBarButtonMiddlePressed, scrollBarButtonBottomPressed);
private TwoColors scrollBarButtonDecreaseApart = new TwoColors(scrollBarButtonBase,
deriveColor(scrollBarButtonBase, 0f, 0f, -0.2f, 0));
private TwoColors scrollBarButtonDecreaseTogether = new TwoColors(scrollBarButtonBase,
deriveColor(scrollBarButtonBase, 0f, 0f, -0.086275f, 0));
private TwoColors scrollBarButtonDecreasePressed = new TwoColors(scrollBarButtonTopPressed, scrollBarButtonMiddlePressed);
private Color scrollBarButtonLine = deriveColor(scrollBarButtonBase, 0f, 0f, -0.258824f, 0);
private Color scrollBarButtonLinePressed = scrollBarButtonLinePressedColor;
private Color scrollBarButtonArrow = deriveColor(scrollBarButtonBase, 0f, 0f, -0.666667f, 0);
private Color scrollBarButtonArrowDisabled = disable(scrollBarButtonArrow);
private Color scrollBarButtonDarkDivider = deriveColor(scrollBarButtonBase, 0f, 0f, -1f,
-(int) (scrollBarButtonBase.getAlpha() * 0.87843137f));
private Color scrollBarButtonLightDivider = deriveColor(scrollBarButtonBase, 0f, 0f, 0f,
-(int) (scrollBarButtonBase.getAlpha() * 0.75294117647f));
private Effect dropShadow = new ScrollButtonDropShadowEffect();
private Which state;
private PaintContext ctx;
private boolean isPressed;
private boolean isDisabled;
private boolean isIncrease;
private boolean buttonsTogether;
/**
* Creates a new ScrollBarButtonPainter object.
*
* @param state DOCUMENT ME!
*/
public ScrollBarButtonPainter(Which state) {
super();
this.state = state;
this.ctx = new PaintContext(CacheMode.FIXED_SIZES);
isPressed = false;
isDisabled = false;
switch (state) {
case FOREGROUND_DISABLED:
isDisabled = true;
isIncrease = false;
buttonsTogether = false;
break;
case FOREGROUND_DISABLED_TOGETHER:
isDisabled = true;
isIncrease = false;
buttonsTogether = true;
break;
case FOREGROUND_ENABLED:
isIncrease = false;
buttonsTogether = false;
break;
case FOREGROUND_ENABLED_TOGETHER:
isIncrease = false;
buttonsTogether = true;
break;
case FOREGROUND_PRESSED:
isPressed = true;
isIncrease = false;
buttonsTogether = false;
break;
case FOREGROUND_PRESSED_TOGETHER:
isPressed = true;
isIncrease = false;
buttonsTogether = true;
break;
case FOREGROUND_INCREASE_DISABLED:
isDisabled = true;
isIncrease = true;
buttonsTogether = false;
break;
case FOREGROUND_INCREASE_DISABLED_TOGETHER:
isDisabled = true;
isIncrease = true;
buttonsTogether = true;
break;
case FOREGROUND_INCREASE_ENABLED:
isIncrease = true;
buttonsTogether = false;
break;
case FOREGROUND_INCREASE_ENABLED_TOGETHER:
isIncrease = true;
buttonsTogether = true;
break;
case FOREGROUND_INCREASE_PRESSED:
isPressed = true;
isIncrease = true;
buttonsTogether = false;
break;
case FOREGROUND_INCREASE_PRESSED_TOGETHER:
isPressed = true;
isIncrease = true;
buttonsTogether = true;
break;
case FOREGROUND_CAP:
isIncrease = false;
buttonsTogether = true;
break;
}
}
/**
* {@inheritDoc}
*/
@Override
protected void doPaint(Graphics2D g, JComponent c, int width, int height, Object[] extendedCacheKeys) {
switch (state) {
case FOREGROUND_DISABLED:
case FOREGROUND_ENABLED:
case FOREGROUND_PRESSED:
paintBackgroundApart(g, width, height);
paintDecreaseButtonApart(g, width, height);
break;
case FOREGROUND_DISABLED_TOGETHER:
case FOREGROUND_ENABLED_TOGETHER:
case FOREGROUND_PRESSED_TOGETHER:
paintBackgroundTogetherDecrease(g, width, height);
paintDecreaseButtonTogether(g, width, height);
break;
case FOREGROUND_INCREASE_DISABLED:
case FOREGROUND_INCREASE_ENABLED:
case FOREGROUND_INCREASE_PRESSED:
paintBackgroundApart(g, width, height);
paintIncreaseButtonApart(g, width, height);
break;
case FOREGROUND_INCREASE_DISABLED_TOGETHER:
case FOREGROUND_INCREASE_ENABLED_TOGETHER:
case FOREGROUND_INCREASE_PRESSED_TOGETHER:
paintBackgroundTogetherIncrease(g, width, height);
paintIncreaseButtonTogether(g, width, height);
break;
case FOREGROUND_CAP:
paintBackgroundCap(g, width, height);
break;
}
}
/**
* {@inheritDoc}
*/
@Override
protected PaintContext getPaintContext() {
return ctx;
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param width DOCUMENT ME!
* @param height DOCUMENT ME!
*/
private void paintBackgroundCap(Graphics2D g, int width, int height) {
Shape s = shapeGenerator.createScrollCap(0, 0, width, height);
dropShadow.fill(g, s);
fillScrollBarButtonInteriorColors(g, s, isIncrease, buttonsTogether);
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param width DOCUMENT ME!
* @param height DOCUMENT ME!
*/
private void paintBackgroundApart(Graphics2D g, int width, int height) {
Shape s = shapeGenerator.createScrollButtonApart(0, 0, width, height);
dropShadow.fill(g, s);
fillScrollBarButtonInteriorColors(g, s, isIncrease, buttonsTogether);
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param width DOCUMENT ME!
* @param height DOCUMENT ME!
*/
private void paintBackgroundTogetherDecrease(Graphics2D g, int width, int height) {
Shape s = shapeGenerator.createScrollButtonTogetherDecrease(0, 0, width, height);
dropShadow.fill(g, s);
fillScrollBarButtonInteriorColors(g, s, isIncrease, buttonsTogether);
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param width DOCUMENT ME!
* @param height DOCUMENT ME!
*/
private void paintBackgroundTogetherIncrease(Graphics2D g, int width, int height) {
Shape s = shapeGenerator.createScrollButtonTogetherIncrease(0, 0, width, height);
dropShadow.fill(g, s);
fillScrollBarButtonInteriorColors(g, s, isIncrease, buttonsTogether);
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param s DOCUMENT ME!
* @param isIncrease DOCUMENT ME!
* @param buttonsTogether DOCUMENT ME!
*/
private void fillScrollBarButtonInteriorColors(Graphics2D g, Shape s, boolean isIncrease, boolean buttonsTogether) {
g.setPaint(getScrollBarButtonBackgroundPaint(s, isIncrease, buttonsTogether));
g.fill(s);
int width = s.getBounds().width;
g.setPaint(getScrollBarButtonLinePaint());
g.drawLine(0, 0, width - 1, 0);
if (state != Which.FOREGROUND_CAP && buttonsTogether) {
int height = s.getBounds().height;
g.setPaint(getScrollBarButtonDividerPaint(isIncrease));
g.drawLine(width - 1, 1, width - 1, height - 1);
}
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param width DOCUMENT ME!
* @param height DOCUMENT ME!
*/
private void paintIncreaseButtonApart(Graphics2D g, int width, int height) {
paintArrowButton(g, width / 2.0 - 5, height / 2.0 - 2);
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param width DOCUMENT ME!
* @param height DOCUMENT ME!
*/
private void paintDecreaseButtonApart(Graphics2D g, int width, int height) {
paintArrowButton(g, width / 2.0 - 4, height / 2.0 - 3);
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param width DOCUMENT ME!
* @param height DOCUMENT ME!
*/
private void paintIncreaseButtonTogether(Graphics2D g, int width, int height) {
paintArrowButton(g, width / 2.0 - 3, height / 2.0 - 3);
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param width DOCUMENT ME!
* @param height DOCUMENT ME!
*/
private void paintDecreaseButtonTogether(Graphics2D g, int width, int height) {
paintArrowButton(g, width / 2.0, height / 2.0 - 3);
}
/**
* DOCUMENT ME!
*
* @param g DOCUMENT ME!
* @param x DOCUMENT ME!
* @param y DOCUMENT ME!
*/
private void paintArrowButton(Graphics2D g, double x, double y) {
Shape s = shapeGenerator.createArrowLeft(x, y, 4, 6);
g.setPaint(getScrollBarButtonArrowPaint());
g.fill(s);
}
/**
* DOCUMENT ME!
*
* @param s DOCUMENT ME!
* @param isIncrease DOCUMENT ME!
* @param buttonsTogether DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Paint getScrollBarButtonBackgroundPaint(Shape s, boolean isIncrease, boolean buttonsTogether) {
TwoColors colors = getScrollBarButtonBackgroundColors(buttonsTogether, isIncrease);
return createHorizontalGradient(s, colors);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Paint getScrollBarButtonLinePaint() {
return getScrollBarButtonLineColor();
}
/**
* DOCUMENT ME!
*
* @param isIncrease DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Paint getScrollBarButtonDividerPaint(boolean isIncrease) {
return isIncrease ? scrollBarButtonLightDivider : scrollBarButtonDarkDivider;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Paint getScrollBarButtonArrowPaint() {
return getScrollBarButtonArrowColor();
}
/**
* DOCUMENT ME!
*
* @param buttonsTogether DOCUMENT ME!
* @param isIncrease DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private TwoColors getScrollBarButtonBackgroundColors(boolean buttonsTogether, boolean isIncrease) {
if (state == Which.FOREGROUND_CAP) {
return scrollBarCapColors;
} else if (isPressed) {
return isIncrease ? scrollBarButtonIncreasePressed : scrollBarButtonDecreasePressed;
} else {
if (buttonsTogether) {
return isIncrease ? scrollBarButtonIncreaseTogether : scrollBarButtonDecreaseTogether;
} else {
return isIncrease ? scrollBarButtonIncreaseApart : scrollBarButtonDecreaseApart;
}
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Color getScrollBarButtonLineColor() {
if (isPressed) {
return scrollBarButtonLinePressed;
} else {
return scrollBarButtonLine;
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Color getScrollBarButtonArrowColor() {
if (isDisabled) {
return scrollBarButtonArrowDisabled;
} else {
return scrollBarButtonArrow;
}
}
/**
* Customized Nimbus's drop shadow effect for text fields.
*/
private static class ScrollButtonDropShadowEffect extends DropShadowEffect {
/**
* Creates a new ScrollButtonDropShadowEffect object.
*/
public ScrollButtonDropShadowEffect() {
color = new Color(150, 150, 150);
angle = 0;
distance = 0;
size = 3;
opacity = 0.25f;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy