/**
* @(#)PaletteSliderUI.java
*
* Copyright (c) 2008 The authors and contributors of JHotDraw.
* You may not use, copy or modify this file, except in compliance with the
* accompanying license terms.
*/
package org.jhotdraw.gui.plaf.palette;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
/**
* PaletteSliderUI.
*
* @author Werner Randelshofer
* @version $Id$
*/
public class PaletteSliderUI extends BasicSliderUI {
private static final float[] enabledStops = new float[]{0f, 0.35f, 0.351f, 1f};
private static final Color[] enabledStopColors = new Color[]{new Color(0xf3f3f3), new Color(0xcccccc), new Color(0xbababa), new Color(0xf3f3f3)};
private static final float[] disabledStops = new float[]{0f, 0.35f, 0.351f, 1f};
private static final Color[] disabledStopColors = new Color[]{new Color(0xf3f3f3), new Color(0xeeeeee), new Color(0xcacaca), new Color(0xf3f3f3)};
private static final float[] selectedStops = new float[]{0f, 0.2f, 1f};
private static final Color[] selectedStopColors = new Color[]{new Color(0x999999), new Color(0xaaaaaa), new Color(0x666666)};
public static ComponentUI createUI(JComponent b) {
return new PaletteSliderUI((JSlider)b);
}
public PaletteSliderUI(JSlider slider) {
super(slider);
}
@Override
protected void installDefaults( JSlider slider ) {
super.installDefaults(slider);
PaletteLookAndFeel.installBorder(slider, "Slider.border");
PaletteLookAndFeel.installColors(slider, "Slider.background", "Slider.foreground");
}
@Override
public Dimension getPreferredHorizontalSize() {
Dimension horizDim = (Dimension)PaletteLookAndFeel.getInstance().get("Slider.horizontalSize");
if (horizDim == null) {
horizDim = new Dimension(100, 21);
}
return horizDim;
}
@Override
public Dimension getPreferredVerticalSize() {
Dimension vertDim = (Dimension)PaletteLookAndFeel.getInstance().get("Slider.verticalSize");
if (vertDim == null) {
vertDim = new Dimension(21, 100);
}
return vertDim;
}
@Override
public void paint( Graphics gr, JComponent c ) {
Graphics2D g = (Graphics2D) gr;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
super.paint(g, c);
}
@Override
public void paintFocus(Graphics g) {
// empty
}
@Override
public void paintTrack(Graphics g) {
int cx, cy, cw, ch;
int pad;
Rectangle trackBounds = trackRect;
if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
pad = trackBuffer;
//cx = pad;
cy = (trackBounds.height / 2) - 2;
cw = trackBounds.width;
g.translate(trackBounds.x, trackBounds.y + cy);
g.setColor(getShadowColor());
g.drawLine(0, 0, cw - 1, 0);
g.drawLine(0, 1, 0, 2);
g.setColor(getHighlightColor());
g.drawLine(0, 3, cw, 3);
g.drawLine(cw, 0, cw, 3);
g.setColor(Color.black);
g.drawLine(1, 1, cw-2, 1);
g.translate(-trackBounds.x, -(trackBounds.y + cy));
}
else {
pad = trackBuffer;
cx = (trackBounds.width / 2) - 2;
//cy = pad;
ch = trackBounds.height;
g.setColor(new Color(slider.isEnabled() ? 0x888888 : 0xaaaaaa));
g.drawRoundRect( trackBounds.x + cx, trackBounds.y, 5, ch, 5, 5);
}
}
@Override
public void paintThumb(Graphics gr) {
Graphics2D g = (Graphics2D) gr;
Rectangle knobBounds = thumbRect;
int w = knobBounds.width;
int h = knobBounds.height;
g.translate(knobBounds.x, knobBounds.y);
float[] stops;
Color[] stopColors;
if ( slider.isEnabled() ) {
g.setColor(slider.getBackground());
if (slider.getModel().getValueIsAdjusting()) {
stops = selectedStops;
stopColors = selectedStopColors;
} else {
stops = enabledStops;
stopColors = enabledStopColors;
}
}
else {
g.setColor(slider.getBackground().darker());
stops = enabledStops;
stopColors = enabledStopColors;
}
Boolean paintThumbArrowShape =
(Boolean)slider.getClientProperty("Slider.paintThumbArrowShape");
if ((!slider.getPaintTicks() && paintThumbArrowShape == null) ||
paintThumbArrowShape == Boolean.FALSE) {
// "plain" version
LinearGradientPaint lgp = new LinearGradientPaint(
new Point2D.Float(2, 2), new Point2D.Float(2, 2+h-4),
stops, stopColors,
MultipleGradientPaint.CycleMethod.REPEAT);
g.setPaint(lgp);
g.fillOval(2,2,w - 4,h - 4);
g.setColor(new Color(0x444444));
g.drawOval(1,1,w - 3,h - 3);
}
else if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
int cw = w / 2;
g.fillRect(1, 1, w-3, h-1-cw);
Polygon p = new Polygon();
p.addPoint(1, h-cw);
p.addPoint(cw-1, h-1);
p.addPoint(w-2, h-1-cw);
g.fillPolygon(p);
g.setColor(getHighlightColor());
g.drawLine(0, 0, w-2, 0);
g.drawLine(0, 1, 0, h-1-cw);
g.drawLine(0, h-cw, cw-1, h-1);
g.setColor(Color.black);
g.drawLine(w-1, 0, w-1, h-2-cw);
g.drawLine(w-1, h-1-cw, w-1-cw, h-1);
g.setColor(getShadowColor());
g.drawLine(w-2, 1, w-2, h-2-cw);
g.drawLine(w-2, h-1-cw, w-1-cw, h-2);
}
else { // vertical
int cw = h / 2;
if(slider.getComponentOrientation().isLeftToRight()) {
g.fillRect(1, 1, w-1-cw, h-3);
Polygon p = new Polygon();
p.addPoint(w-cw-1, 0);
p.addPoint(w-1, cw);
p.addPoint(w-1-cw, h-2);
g.fillPolygon(p);
g.setColor(getHighlightColor());
g.drawLine(0, 0, 0, h - 2); // left
g.drawLine(1, 0, w-1-cw, 0); // top
g.drawLine(w-cw-1, 0, w-1, cw); // top slant
g.setColor(Color.black);
g.drawLine(0, h-1, w-2-cw, h-1); // bottom
g.drawLine(w-1-cw, h-1, w-1, h-1-cw); // bottom slant
g.setColor(getShadowColor());
g.drawLine(1, h-2, w-2-cw, h-2 ); // bottom
g.drawLine(w-1-cw, h-2, w-2, h-cw-1 ); // bottom slant
}
else {
g.fillRect(5, 1, w-1-cw, h-3);
Polygon p = new Polygon();
p.addPoint(cw, 0);
p.addPoint(0, cw);
p.addPoint(cw, h-2);
g.fillPolygon(p);
g.setColor(getHighlightColor());
g.drawLine(cw-1, 0, w-2, 0); // top
g.drawLine(0, cw, cw, 0); // top slant
g.setColor(Color.black);
g.drawLine(0, h-1-cw, cw, h-1 ); // bottom slant
g.drawLine(cw, h-1, w-1, h-1); // bottom
g.setColor(getShadowColor());
g.drawLine(cw, h-2, w-2, h-2 ); // bottom
g.drawLine(w-1, 1, w-1, h-2 ); // right
}
}
g.translate(-knobBounds.x, -knobBounds.y);
}
@Override
protected Dimension getThumbSize() {
Dimension size = new Dimension();
if ( slider.getOrientation() == JSlider.VERTICAL ) {
size.width = 15;
size.height = 15;
}
else {
size.width = 15;
size.height = 15;
}
return size;
}
}