/*
* 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$
*/
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 javax.swing.JSlider;
import com.seaglasslookandfeel.effect.SeaGlassInternalShadowEffect;
import com.seaglasslookandfeel.painter.AbstractRegionPainter.PaintContext.CacheMode;
import com.seaglasslookandfeel.painter.util.ShapeGenerator.CornerSize;
/**
* Nimbus's SliderTrackPainter.
*/
public final class SliderTrackPainter extends AbstractCommonColorsPainter {
/**
* DOCUMENT ME!
*
* @author $author$
* @version $Revision$, $Date$
*/
public static enum Which {
BACKGROUND_DISABLED, BACKGROUND_ENABLED
}
private Color sliderTrackInteriorBase = decodeColor("sliderTrackInteriorBase");
private TwoColors sliderTrackInteriorEnabled = new TwoColors(deriveColor(sliderTrackInteriorBase, 0f, 0f, 0.078431f, 0),
deriveColor(sliderTrackInteriorBase, 0f, 0f, 0.474510f, 0));
private TwoColors sliderTrackInteriorDisabled = disable(sliderTrackInteriorEnabled);
private FourColors interiorValueEnabled = getCommonInteriorColors(CommonControlState.SELECTED);
private FourColors interiorValueDisabled = disable(interiorValueEnabled);
SeaGlassInternalShadowEffect effect = new SeaGlassInternalShadowEffect();
private Which state;
private PaintContext ctx;
/**
* Creates a new SliderTrackPainter object.
*
* @param state DOCUMENT ME!
*/
public SliderTrackPainter(Which state) {
super();
this.state = state;
this.ctx = new PaintContext(CacheMode.NO_CACHING);
}
/**
* {@inheritDoc}
*/
protected void doPaint(Graphics2D g, JComponent c, int width, int height, Object[] extendedCacheKeys) {
Shape s = shapeGenerator.createRoundRectangle(0, 0, width, height, CornerSize.ROUND_HEIGHT);
g.setPaint(getSliderTrackBorderPaint(s));
g.fill(s);
s = shapeGenerator.createRoundRectangle(1, 1, width - 2, height - 2, CornerSize.ROUND_HEIGHT);
g.setPaint(getSliderTrackInteriorPaint(s));
g.fill(s);
effect.fill(g, s, false, false);
paintValueTrack(g, c, width, height);
}
/**
* @param g
* @param c
* @param width
* @param height
*/
private void paintValueTrack(Graphics2D g, JComponent c, int width, int height) {
JSlider slider = (JSlider) c;
int orientation = slider.getOrientation();
double trackLength = slider.getMaximum()-slider.getMinimum();
double percentFilled = (slider.getValue()-slider.getMinimum()) / trackLength;
if ( "LogarithmicJSlider".equals( c.getClass().getSimpleName() ) ) {
percentFilled = (Math.log((slider.getValue()))-Math.log(slider.getMinimum())) /
((double) Math.log(slider.getMaximum()) - (double) Math.log(slider.getMinimum()));
}
if (percentFilled > 0) {
Shape s = getValueShape(c, width, height, orientation, percentFilled);
g.setPaint(getValuePaint(s));
g.fill(s);
}
}
/**
* @param width
* @param height
* @param orientation
* @param percentFilled
* @return
*/
private Shape getValueShape(JComponent c,int width, int height, int orientation, double percentFilled) {
Shape s;
JSlider slider = (JSlider)c;
if ((orientation == JSlider.HORIZONTAL && slider.getComponentOrientation().isLeftToRight()) || slider.getInverted()) {
s = shapeGenerator.createRoundRectangle(1, 1, (int) (width*percentFilled), height - 2, CornerSize.ROUND_HEIGHT);
} else {
s = shapeGenerator.createRoundRectangle(width-(int)(width*percentFilled), 1, width, height - 2, CornerSize.ROUND_HEIGHT);
}
return s;
}
/**
* @param s
* @param type
* @return
*/
public Paint getValuePaint(Shape s) {
FourColors colors = getValueColors();
return createVerticalGradient(s, colors);
}
/**
* @param type
* @return
*/
private FourColors getValueColors() {
switch (state) {
case BACKGROUND_ENABLED:
return interiorValueEnabled;
case BACKGROUND_DISABLED:
return interiorValueDisabled;
}
return null;
}
/**
* {@inheritDoc}
*/
protected PaintContext getPaintContext() {
return ctx;
}
/**
* DOCUMENT ME!
*
* @param s DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Paint getSliderTrackBorderPaint(Shape s) {
return getSliderTrackBorderColors();
}
/**
* DOCUMENT ME!
*
* @param s DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Paint getSliderTrackInteriorPaint(Shape s) {
return createVerticalGradient(s, getSliderTrackInteriorColors());
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Paint getSliderTrackBorderColors() {
switch (state) {
case BACKGROUND_DISABLED:
return getTextBorderPaint(CommonControlState.DISABLED,false);
case BACKGROUND_ENABLED:
return getTextBorderPaint(CommonControlState.ENABLED,false);
}
return null;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private TwoColors getSliderTrackInteriorColors() {
switch (state) {
case BACKGROUND_DISABLED:
return sliderTrackInteriorDisabled; //getCommonInteriorColors(CommonControlState.DISABLED_SELECTED);
case BACKGROUND_ENABLED:
return sliderTrackInteriorEnabled; //getCommonInteriorColors(CommonControlState.ENABLED_SELECTED);
}
return null;
}
}