/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* 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.
*/
package org.jivesoftware.spark.util;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jivesoftware.resource.Res;
/**
* A simple Colorpicker with sliders
* @author wolf.posdorfer
*
*/
public class ColorPick extends JPanel implements ChangeListener {
private static final long serialVersionUID = 2709297435120012839L;
private JSlider[] _sliderarray;
private JLabel _preview;
/**
* Creates a Colorpicker with initial values 0,0,0,0
*
* @param opacity
* , true if Opacity Slider should be visible
*/
public ColorPick(boolean opacity)
{
this.setLayout(new GridBagLayout());
JLabel red = new JLabel(Res.getString("lookandfeel.color.red"));
JLabel green = new JLabel(Res.getString("lookandfeel.color.green"));
JLabel blue = new JLabel(Res.getString("lookandfeel.color.blue"));
JLabel opaq = new JLabel(Res.getString("lookandfeel.color.opacity"));
JSlider redslider = new JSlider(0,255);
JSlider greenslider = new JSlider(0,255);
JSlider blueslider = new JSlider(0,255);
JSlider opaqslider = new JSlider(0,255);
_sliderarray = new JSlider[4];
_sliderarray[0] = redslider;
_sliderarray[1] = greenslider;
_sliderarray[2] = blueslider;
_sliderarray[3] = opaqslider;
for(JSlider s : _sliderarray)
{
s.addChangeListener(this);
s.setMajorTickSpacing(256/3);
s.setMinorTickSpacing(0);
s.setPaintTicks(true);
s.setPaintLabels(true);
}
_preview = new JLabel(" ");
_preview.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
_preview.setOpaque(true);
this.add(red,new GridBagConstraints(0, 0, 1, 1, 0.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,5,5),0,0));
this.add(redslider,new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,5,5),0,0));
this.add(green,new GridBagConstraints(0, 1, 1, 1, 0.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,5,5),0,0));
this.add(greenslider,new GridBagConstraints(1, 1, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,5,5),0,0));
this.add(blue,new GridBagConstraints(0, 2, 1, 1, 0.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,5,5),0,0));
this.add(blueslider,new GridBagConstraints(1, 2, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,5,5),0,0));
if(opacity)
{
this.add(opaq,new GridBagConstraints(0, 3, 1, 1, 0.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,5,5),0,0));
this.add(opaqslider,new GridBagConstraints(1, 3, 1, 1, 1.0, 1.0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,5,5),0,0));
}
this.add(_preview,new GridBagConstraints(2, 0, 1, 4, 0.1, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,5,5),0,0));
}
/**
* Creates a Colorpicker with initialvalues provided by c
* @param opacity, true if Opacity Slider should be visible
* @param c, the initial Color
*/
public ColorPick(boolean opacity, Color c)
{
this(opacity);
for(int i=0; i < 3; i++)
{
float w = c.getColorComponents(new float[3])[i];
int x = Math.round(w*255f/1f);
_sliderarray[i].setValue(x);
}
_sliderarray[3].setValue(c.getAlpha());
this.revalidate();
}
/**
* Returns the Color of the Current View
* @return
*/
public Color getColor() {
return new Color(_sliderarray[0].getValue(), _sliderarray[1].getValue(), _sliderarray[2].getValue(),
_sliderarray[3].getValue());
}
/**
* Sets the Color of this Colorpicker
* @param c
*/
public void setColor(Color c) {
for (int i = 0; i < 3; i++) {
float w = c.getColorComponents(new float[3])[i];
int x = Math.round(w * 255f / 1f);
_sliderarray[i].setValue(x);
}
_sliderarray[3].setValue(c.getAlpha());
this.revalidate();
}
public void addChangeListener(ChangeListener cl)
{
for(JSlider sl : _sliderarray)
{
sl.addChangeListener(cl);
}
}
@Override
public void stateChanged(ChangeEvent e) {
_preview.setBackground(new Color(_sliderarray[0].getValue(), _sliderarray[1].getValue(), _sliderarray[2]
.getValue(), _sliderarray[3].getValue()));
_preview.setForeground(new Color(_sliderarray[0].getValue(), _sliderarray[1].getValue(), _sliderarray[2]
.getValue(), _sliderarray[3].getValue()));
_preview.invalidate();
_preview.repaint();
_preview.revalidate();
Container c = _preview.getParent();
if (c instanceof JPanel) {
((JPanel) c).repaint();
((JPanel) c).revalidate();
}
}
}