/*
* org.openmicroscopy.shoola.util.ui.colourpicker.ColourPickerUI
*
*------------------------------------------------------------------------------
* 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.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
//Third-party libraries
import info.clearthought.layout.TableLayout;
//Application-internal dependencies
import org.openmicroscopy.shoola.util.ui.colour.HSV;
/**
* This is the UI Panel which contains the HSV elements including Colour
* Wheel, Value slider and alpha slider. It is all incorporated as part of
* tabbedUI
*
* @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 HSVColourWheelUI
extends JPanel
implements ChangeListener
{
/** The preferred size of the wheel. */
private static final Dimension WHEEL_SIZE = new Dimension(175, 175);
/**
* Wheel is an HSVWheel which will display the HSV Colourwheel as an image.
*/
private HSVWheel wheel;
/**
* HSVStrip displays the HSV value as a colour strip showing the range of
* colours which can be chosen, going from min to max value.
*/
private ColourSlider HSVSlider;
/**
* alphaStrip displays the alpha value as a colour strip showing the range
* of colours which can be chosen, going from min to max value.
*/
private ColourSlider alphaSlider;
/** Displays the current value of the alphaStrip Slider. */
private JTextField alphaTextbox;
/** Change listener of the HSVSlider. */
private ChangeListener HSVListener;
/** Change listener of the alpha slider. */
private ChangeListener alphaListener;
/** Action listener of the alpha textbox. */
private ActionListener alphaTextboxListener;
/**
* Boolean variable, true if the current component is active, this is
* controlled from the parent component. It tells the UI whether or not
* to ignore refresh events.
*/
private boolean active;
/** Reference to the colour model. */
private RGBControl control;
/**
* Creates all the UI components of the panel. This includes, HSVSlider,
* alphaSlider and colourwheel. It also initialises all the Change, Action
* listeners.
*/
private void createUI()
{
createWheel();
createHSVSlider();
createAlphaSlider();
createAlphaTextbox();
int width = HSVSlider.getPreferredSize().width;
double[][] tl = {{TableLayout.PREFERRED, 5, width}, //columns
{TableLayout.FILL, TableLayout.PREFERRED} }; //rows
setLayout(new TableLayout(tl));
JPanel empty = new JPanel();
empty.setOpaque(true);
add(wheel, "0, 0");
add(empty, "1, 0");
add(HSVSlider, "2, 0");
add(alphaSlider, "0, 1");
empty = new JPanel();
empty.setOpaque(true);
add(empty, "1, 1");
JPanel p = new JPanel();
p.add(alphaTextbox);
add(p, "2, 1, LEFT, TOP");
}
/**
* Creates the HSV Colour wheel, and adds the listener which will notify
* this component when its been picked by the user.
*/
private void createWheel()
{
wheel = new HSVWheel(control);
wheel.addListener(this);
wheel.setPreferredSize(WHEEL_SIZE);
}
/**
* Creates the HSV Slider in the UI, this will construct the slider and
* instantiate the values of the slider, including the range of colours the
* slider will display in its track.
*/
private void createHSVSlider()
{
HSV startcol = new HSV(control.getColour());
HSV endcol = new HSV(control.getColour());
startcol.setValue(0);
endcol.setValue(1);
HSVSlider = new ColourSlider(0, 255, startcol, endcol);
HSVSlider.setColourSpace(ColourSlider.HSV_COLOURSPACE);
HSVSlider.setChannel(ColourSlider.HSV_CHANNEL_VALUE);
HSVSlider.setOrientation(ColourSlider.VERTICAL);
HSVSlider.setValue((int) (control.getValue()*255));
HSVListener = new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent)
{
ColourSlider src = (ColourSlider) changeEvent.getSource();
control.setHSVColour(wheel.getHue(), wheel.getSaturation(),
src.getValue()/255.0f,
alphaSlider.getValue()/255.0f);
}
};
HSVSlider.addChangeListener(HSVListener);
}
/**
* Creates the Alpha Slider in the UI, this will construct the slider and
* instantiate the values of the slider, including the range of colours the
* slider will display in its track.
*/
private void createAlphaSlider()
{
Color s1 = control.getColour();
Color s = new Color(s1.getRed(), s1.getGreen(), s1.getBlue(), 0);
Color e = new Color(s1.getRed(), s1.getGreen(), s1.getBlue(), 255);
alphaSlider = new ColourSlider(0, 255, s, e);
alphaSlider.setColourSpace(ColourSlider.RGB_COLOURSPACE);
alphaSlider.setOrientation(ColourSlider.HORIZONTAL);
alphaSlider.setValue((int) (control.getAlpha()*255));
alphaListener = new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent)
{
control.setHSVColour(wheel.getHue(), wheel.getSaturation(),
HSVSlider.getValue()/255.0f,
alphaSlider.getValue()/255.0f);
}
};
alphaSlider.addChangeListener(alphaListener);
}
/**
* Creates the AlphaTextbox in the UI, this will construct the textbox and
* instantiates the values of the textbox.
*/
private void createAlphaTextbox()
{
alphaTextbox = new JTextField((int) (control.getAlpha()*255)+"");
alphaTextbox.setColumns(TabbedPaneUI.TEXTBOX_COLUMN);
alphaTextboxListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
JTextField src = (JTextField) actionEvent.getSource();
try {
int value = Integer.parseInt(src.getText());
if (value >= 0 && value <= 255)
control.setHSVColour(wheel.getHue(),
wheel.getSaturation(),
HSVSlider.getValue()/255.0f,
value/255.0f);
else {
ColourPicker.invalidColorValue();
alphaTextbox.setText(""+(int) (control.getAlpha()*255));
}
} catch(NumberFormatException e) {
ColourPicker.invalidColorValue();
alphaTextbox.setText(""+(int) (control.getAlpha()*255));
}
}
};
}
/**
* HSVPicker constructor, control c is the control, which also contains
* the a RGBModel.
*
* @param c Reference to the control. Mustn't be <code>null</code>.
*/
HSVColourWheelUI(RGBControl c)
{
if (c == null)
throw new NullPointerException("No control.");
control = c;
createUI();
active = false;
}
/** Updates the UI components based on changes to the model. */
void refresh()
{
if (!(active)) return;
removeListeners();
alphaSlider.setValue((int) (control.getAlpha()*255));
Color col = control.getColour();
Color start = new Color(col.getRed(), col.getGreen(), col.getBlue(), 0);
Color end = new Color(col.getRed(), col.getGreen(), col.getBlue(), 255);
alphaSlider.setRGBStart(start);
alphaSlider.setRGBEnd(end);
alphaTextbox.setText((int) (control.getAlpha()*255)+"");
wheel.findPuck();
wheel.refresh();
alphaTextbox.repaint();
HSV startcol = new HSV(wheel.getHue(), wheel.getSaturation(), 1, 1);
HSV endcol = new HSV(wheel.getHue(), wheel.getSaturation(), 0, 1);
HSVSlider.setHSVStart(startcol);
HSVSlider.setHSVEnd(endcol);
HSVSlider.setValue((int) (control.getValue()*255));
wheel.repaint();
HSVSlider.repaint();
alphaSlider.repaint();
addListeners();
repaint();
}
/**
* Calls the wheel find puck method {@link HSVWheel#findPuck()} which
* will position the puck on the colourwheel based on the current colour
* select by user.
*/
void findPuck() { wheel.findPuck(); }
/**
* Adds change listeners to the components. Used in conjunction with
* {@link #removeListeners()} to get round spurious event
* triggers when updating components.
*/
void addListeners()
{
HSVSlider.addChangeListener(HSVListener);
alphaSlider.addChangeListener(alphaListener);
alphaTextbox.addActionListener(alphaTextboxListener);
}
/**
* Removes change listeners to the components. Used in conjunction with
* {@link #addListeners()} to get round spurious event
* triggers when updating components.
*/
void removeListeners()
{
HSVSlider.removeChangeListener(HSVListener);
alphaSlider.removeChangeListener(alphaListener);
alphaTextbox.removeActionListener(alphaTextboxListener);
}
/**
* Sets the current component is active or inactive, this is
* controlled from the parent component. It tells the UI whether or not
* to ignore refresh events.
*
* @param act Pass <code>true</code> to activate the component,
* <code>false</code> otherwise.
*/
void setActive(boolean act) { active = act; }
/**
* Sets the Colour of the model, using the HS values from
* the HSVWheel, Value from HSVSlider and alpha from alphaSlider.
* @see ChangeListener#stateChanged(ChangeEvent)
*/
public void stateChanged(ChangeEvent arg0)
{
control.setHSVColour(wheel.getHue(), wheel.getSaturation(),
HSVSlider.getValue()/255.0f,
alphaSlider.getValue()/255.0f);
refresh();
}
}