/* * org.openmicroscopy.shoola.util.ui.colourpicker.ColourSlider * *------------------------------------------------------------------------------ * Copyright (C) 2006 University of Dundee. All rights reserved. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.util.ui.colourpicker; //Java imports import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JSlider; import javax.swing.plaf.basic.BasicSliderUI; //Third-party libraries //Application-internal dependencies import org.openmicroscopy.shoola.util.ui.colour.HSV; /** * ColourSliderUI is a derived class of BasicSliderUI which replaces the track * with a colour spectrum, either from one RGB value to another or one HSV value * to another. In this case the HSV normally just adjusts the V, to show a * change in value. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author Donald MacDonald      * <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a> * @version 3.0 * <small> * (<b>Internal version:</b> $Revision: $ $Date: $) * </small> * @since OME2.2 */ class ColourSliderUI extends BasicSliderUI { /** Static variable holdng the colour of the track border. */ private final static Color TRACK_BORDER_COLOUR = new Color(128, 128, 128); /** * The Colourspace of the gradient used to fill track either * {@link ColourSlider#RGB_COLOURSPACE} or * {@link ColourSlider#HSV_COLOURSPACE}. */ private int colourSpace; /** RGB Colour use to start the gradient fill. */ private Color RGBStart; /** RGB Colour use to complete the gradient fill. */ private Color RGBEnd; /** HSV Colour used to start the gradient fill. */ private HSV HSVStart; /** * Determine which channel of the HSV component the gradient fill will * use. */ private int channel; /** HSV Colour used to complete the gradient fill. */ private HSV HSVEnd; /** Colour of the border of the track. This is a medium Gray. */ private Color trackBorderColour; /** * The size of the track is too large in a standard JSlider component, so * we create a smaller track and store it in smallTrack. */ private Rectangle smallTrack; /** * The size of the track is too large in a standard JSlider component, so * we create a smaller track and store it in smallTrack, the filled part of * the track is stored in smallTrackFilled. */ private Rectangle smallTrackFilled; /** * Creates the sliderUI delegate based on the JSlider component. The * Colour range is specified in the s, and e parameters. * * @param slider The parent slider. * @param s The start colour used to paint the gradient in the track. * @param e The end colour used to paint the gradient in the track. */ ColourSliderUI(JSlider slider, Color s, Color e) { super(slider); setColourSpace(ColourSlider.RGB_COLOURSPACE); RGBStart = s; RGBEnd = e; trackBorderColour = TRACK_BORDER_COLOUR; } /** * Creates the sliderUI delegate based on the JSlider component. The * Colour range is specified in the s, and e parameters. * * @param slider parent slider. * @param s start HSV colour used to paint the gradient in the track. * @param e end HSV colour used to paint the gradient in the track. */ ColourSliderUI(JSlider slider, HSV s, HSV e) { super(slider); setColourSpace(ColourSlider.HSV_COLOURSPACE); HSVStart = s; HSVEnd = e; channel = ColourSlider.HSV_CHANNEL_VALUE; trackBorderColour = TRACK_BORDER_COLOUR; } /** * Sets the current colour space of the Slider. * * @param colourSpace The selected color space, should either be * {@link ColourSlider#RGB_COLOURSPACE} or * {@link ColourSlider#HSV_COLOURSPACE}. */ void setColourSpace(int colourSpace) { this.colourSpace = colourSpace; } /** * Returns the current colour space of the Slider. * * @return See above. */ int getColourSpace() { return colourSpace; } /** * Sets the current start of the HSV Colour for gradient fill to c. * * @param c HSV colour to be used for start of gradient fill. */ void setHSVStart(HSV c) { HSVStart = new HSV(c); } /** * Sets the current end of the HSV Colour for gradient fill to c. * * @param c HSV Colour to be used for end of gradient fill. */ void setHSVEnd(HSV c) { HSVEnd = new HSV(c); } /** * Sets the current start of the HSV Colour for gradient fill to c. * * @param c colour to be used for start of gradient fill. */ void setHSVStart(Color c) { HSVStart = new HSV(c); } /** * Sets the current end of the HSV Colour for gradient fill to c. * * @param c colour to be used for end of gradient fill. */ void setHSVEnd(Color c) { HSVEnd = new HSV(c); } /** * Sets the channel the component will use for HSV gradient. The default * value is v. * * @param c The value to set. */ void setChannel(int c) { channel = c; } /** * Sets the current start of the RGB Colour for gradient fill to c. * * @param s Colour to be used for start of gradient fill. */ void setRGBStart(Color s) { RGBStart = new Color(s.getRed(), s.getGreen(), s.getBlue(), s.getAlpha()); } /** * Sets the current end of the RGB Colour for gradient fill to c. * * @param e Colour to be used for end of gradient fill. */ void setRGBEnd(Color e) { RGBEnd = new Color(e.getRed(), e.getGreen(), e.getBlue(), e.getAlpha()); } /*public void paintThumb(Graphics og) { Graphics2D g = (Graphics2D)og; if( slider.getOrientation() == JSlider.VERTICAL ) g.drawImage(thumbImageRight.getImage(),(int) smallTrack.getX(), (int) thumbRect.getY(), (int) smallTrack.getWidth(), (int) smallTrack.getWidth()*2, null); else { thumbRect.height = (int) (smallTrack.getHeight()*2); thumbRect.width = (int) smallTrack.getHeight(); g.drawImage(thumbImageDown.getImage(), (int) (thumbRect.getX()), (int) thumbRect.getY(), (int) thumbImageDown.getIconWidth(), (int) thumbImageDown.getIconHeight(), null); } }*/ /** * Overridden to paint the gradient on the slider track * @see BasicSliderUI#paintTrack(Graphics) */ public void paintTrack(Graphics og) { Graphics2D g = (Graphics2D)og; smallTrack = new Rectangle(trackRect); GradientPaint gp; if (this.slider.getOrientation() == JSlider.HORIZONTAL) { smallTrack.y += smallTrack.height/3; smallTrack.height = (int) (smallTrack.height*(3.0f/4.0f)); smallTrackFilled = new Rectangle(smallTrack); smallTrackFilled.x +=1; smallTrackFilled.y +=1; smallTrackFilled.height -=1; smallTrackFilled.width -=1; g.setColor(trackBorderColour); g.fillRect(smallTrack.x+1, smallTrack.y+smallTrack.height+1, 1, 8); g.fillRect(smallTrack.x+smallTrack.width/2, smallTrack.y+smallTrack.height+1, 1, 8); g.fillRect(smallTrack.x+smallTrack.width-2, smallTrack.y+smallTrack.height+1, 1, 8); g.setPaint(trackBorderColour); g.draw(smallTrack); if (colourSpace == ColourSlider.RGB_COLOURSPACE) { gp = new GradientPaint((int) smallTrackFilled.getX(), (int) smallTrackFilled.getY(), RGBStart, (int) smallTrackFilled.getWidth(), (int) smallTrackFilled.getHeight(),RGBEnd, false); g.setPaint(gp); g.fill(smallTrackFilled); } else { g.fill(smallTrackFilled); float start = slider.getMinimum(); float end = slider.getMaximum(); float range = (end-start); start = start/255; end = end/255; range = range/255; float steps = (float) (smallTrackFilled.getWidth()/255.0f); for (int x = 0 ; x < 255 ; x++) { if (channel == ColourSlider.HSV_CHANNEL_HUE) HSVStart.setHue(start+((float) x/255)*range); if (channel == ColourSlider.HSV_CHANNEL_SATURATION) HSVStart.setSaturation(start+((float) x/255)*range); if (channel == ColourSlider.HSV_CHANNEL_VALUE) HSVStart.setValue(start+((float) x/255)*range); g.setPaint(HSVStart.toColor()); g.fillRect((int) (smallTrackFilled.getX()+x*steps), (int) smallTrackFilled.getY(), (int) Math.ceil(steps), (int) smallTrackFilled.getHeight()); } } } else { smallTrack.width = (int) (smallTrack.width*(3.0f/4.0f)); smallTrackFilled = new Rectangle(smallTrack); smallTrackFilled.x +=1; smallTrackFilled.y +=1; smallTrackFilled.height -=1; smallTrackFilled.width -=1; if (colourSpace == ColourSlider.RGB_COLOURSPACE) { gp = new GradientPaint((int) smallTrackFilled.getX(), (int) smallTrackFilled.getY(), RGBEnd, (int) smallTrackFilled.getWidth(), (int) smallTrackFilled.getHeight(),RGBStart, false); g.setPaint(gp); g.fill(smallTrackFilled); } else { g.fill(smallTrackFilled); float start = slider.getMinimum(); float end = slider.getMaximum(); float range = (end-start); start = start/255; end = end/255; range = range/255; float steps = (float) (smallTrackFilled.getHeight()/255.0f); for (int x = 0 ; x < 255 ; x++) { if(channel == ColourSlider.HSV_CHANNEL_HUE) HSVStart.setHue(end-((float) x/255)*range); if(channel == ColourSlider.HSV_CHANNEL_SATURATION) HSVStart.setSaturation(end-((float) x/255)*range); if(channel == ColourSlider.HSV_CHANNEL_VALUE) HSVStart.setValue(end-((float) x/255)*range); g.setPaint(HSVStart.toColor()); g.fillRect((int) smallTrackFilled.getX(), (int) (smallTrackFilled.getY()+x*steps), (int) smallTrackFilled.getWidth(), (int) Math.ceil(steps)); } } g.setColor(trackBorderColour); g.fillRect(smallTrack.x+smallTrack.width+1, smallTrack.y+1, 8, 1); g.fillRect(smallTrack.x+smallTrack.width+1, smallTrack.y+ smallTrack.height/2, 8, 1); g.fillRect(smallTrack.x+smallTrack.width+1, smallTrack.y+ smallTrack.height-2, 8, 1); g.setPaint(trackBorderColour); g.draw(smallTrack); } } }