/*
* TV-Browser
* Copyright (C) 04-2003 Martin Oberhauser (darras@users.sourceforge.net)
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* CVS information:
* $RCSfile$
* $Source$
* $Date: 2010-06-28 19:33:48 +0200 (Mon, 28 Jun 2010) $
* $Author: bananeweizen $
* $Revision: 6662 $
*/
package util.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
* A Color chooser with Alpha-Selection
*/
public class AlphaColorChooser extends JDialog implements ChangeListener {
/** The localizer for this class. */
private static final util.ui.Localizer mLocalizer
= util.ui.Localizer.getLocalizerFor(AlphaColorChooser.class);
/**
* The Sliders
*/
private JSlider mRedSl, mGreenSl, mBlueSl, mAlphaSl;
/**
* The Spinners
*/
private JSpinner mRedSp, mGreenSp, mBlueSp, mAlphaSp;
/**
* The Panel that shows the current color
*/
private PaintColor mColorPanel;
/**
* The current color
*/
private Color mCurrentColor;
/**
* The default color
*/
private Color mDefaultColor;
/**
* The standard color
*/
private Color mStandardColor;
/**
* Return-Value (JOptionPane.CANCEL_OPTION / OK_OPTION)
*/
private int mReturnValue = JOptionPane.CANCEL_OPTION;
/**
* Creates the Dialog
*
* @param parent
* Parent-Dialog
* @param title
* Title
* @param color
* Color to start with
* @param stdColor
* The standard color
* @since 3.0
*/
public AlphaColorChooser(Window parent, String title, Color color,
Color stdColor) {
super(parent, title);
setModal(true);
mStandardColor = stdColor;
createGui();
mDefaultColor = color;
setColor(color);
}
/**
* Creates the Dialog
*
* @param parent
* Parent-Dialog
* @param title
* Title
* @param color
* Color to start with
* @param stdColor
* The standard color
* @deprecated since 3.0
*/
@Deprecated
public AlphaColorChooser(JDialog parent, String title, Color color,
Color stdColor) {
this((Window) parent, title, color, stdColor);
}
/**
* Creates the Dialog
*
* @param parent
* Parent-Frame
* @param title
* Title
* @param color
* Color to start with
* @param stdColor
* The standard color
* @deprecated since 3.0
*/
@Deprecated
public AlphaColorChooser(JFrame parent, String title, Color color, Color stdColor) {
this((Window) parent, title, color, stdColor);
}
/**
* Create the GUI
*/
public void createGui() {
JPanel panel = (JPanel) getContentPane();
panel.setBorder(Borders.DLU4_BORDER);
panel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.weightx = 0.5;
c.weighty = 1.0;
c.fill = GridBagConstraints.BOTH;
JPanel values = new JPanel(new TabLayout(3));
values.setBorder(BorderFactory.createTitledBorder(mLocalizer.msg("Values","Values")+":"));
values.add(new JLabel(mLocalizer.msg("red","Red")+":"));
values.add(mRedSl = createSlider());
values.add(mRedSp = createSpinner());
values.add(new JLabel(mLocalizer.msg("green","Green")+":"));
values.add(mGreenSl = createSlider());
values.add(mGreenSp = createSpinner());
values.add(new JLabel(mLocalizer.msg("blue","Blue")+":"));
values.add(mBlueSl = createSlider());
values.add(mBlueSp = createSpinner());
values.add(new JLabel(mLocalizer.msg("alpha","Alpha")+":"));
values.add(mAlphaSl = createSlider());
values.add(mAlphaSp = createSpinner());
mRedSl.addChangeListener(this);
mRedSp.addChangeListener(this);
mGreenSl.addChangeListener(this);
mGreenSp.addChangeListener(this);
mBlueSl.addChangeListener(this);
mBlueSp.addChangeListener(this);
mAlphaSl.addChangeListener(this);
mAlphaSp.addChangeListener(this);
panel.add(values, c);
JPanel color = new JPanel(new BorderLayout());
color.setBorder(BorderFactory.createTitledBorder(mLocalizer.msg("Color","Color")+":"));
mColorPanel = new PaintColor();
color.add(mColorPanel, BorderLayout.CENTER);
color.setMinimumSize(new Dimension(100, 100));
color.setPreferredSize(new Dimension(100, 100));
c.gridwidth = GridBagConstraints.REMAINDER;
panel.add(color, c);
c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
c.weighty = 0;
c.insets = new Insets(5, 0, 0, 0);
c.gridwidth = GridBagConstraints.REMAINDER;
FormLayout layout = new FormLayout("pref, fill:pref:grow, pref, 3dlu, pref", "pref");
layout.setColumnGroups(new int[][]{{1,3,5}});
JPanel buttonPanel = new JPanel(layout);
JButton ok = new JButton(Localizer.getLocalization(Localizer.I18N_OK));
JButton cancel = new JButton(Localizer.getLocalization(Localizer.I18N_CANCEL));
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stopEditing();
updateColorPanel();
mReturnValue = JOptionPane.OK_OPTION;
setVisible(false);
}
});
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mCurrentColor = mDefaultColor;
updateColorPanel();
mReturnValue = JOptionPane.CANCEL_OPTION;
setVisible(false);
}
});
CellConstraints cc = new CellConstraints();
if(mStandardColor != null) {
JButton def = new JButton(Localizer
.getLocalization(Localizer.I18N_DEFAULT));
def.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setColor(mStandardColor);
mCurrentColor = mStandardColor;
}
});
buttonPanel.add(def, cc.xy(1,1));
}
buttonPanel.add(ok, cc.xy(3,1));
buttonPanel.add(cancel, cc.xy(5,1));
panel.add(buttonPanel, c);
updateColorPanel();
pack();
}
/**
* Creates one Spinner
*
* @return Spinner
*/
private JSpinner createSpinner() {
SpinnerModel model = new SpinnerNumberModel(100, 0, 255, 1);
JSpinner ret = new JSpinner(model);
ret.setMinimumSize(new Dimension(50, 10));
ret.setPreferredSize(new Dimension(50, 10));
return ret;
}
/**
* Creates a Slider
*
* @return Slider
*/
private JSlider createSlider() {
JSlider ret = new JSlider(0, 255, 100);
ret.setMinorTickSpacing(25);
ret.setPaintTicks(true);
return ret;
}
/**
* Shows the ColorChooser-Dialog and returns the selected Color. If Cancel
* is pressed, the default Color is returned
*
* @param parent Parent-Dialog or Frame
* @param title Title of the Dialog
* @param color Color to start with
* @param stdColor The standard color.
* @return Selected Color
*/
public static Color showDialog(Component parent, String title, Color color,
Color stdColor) {
AlphaColorChooser chooser;
if (parent instanceof Window) {
chooser = new AlphaColorChooser((Window) parent, title, color, stdColor);
} else {
chooser = new AlphaColorChooser((Window) null, title, color, stdColor);
}
UiUtilities.centerAndShow(chooser);
if (chooser.getReturnValue() == JOptionPane.OK_OPTION) {
return chooser.getColor();
}
return color;
}
/**
* Get the Return Value (JOptionPane.OK_OPTION or CANCEL_OPTION)
*
* @return return value (JOptionPane.OK_OPTION or CANCEL_OPTION)
*/
public int getReturnValue() {
return mReturnValue;
}
/**
* Update the ColorPanel
*/
private void updateColorPanel() {
int red = mRedSl.getValue();
int green = mGreenSl.getValue();
int blue = mBlueSl.getValue();
int alpha = mAlphaSl.getValue();
mCurrentColor = new Color(red, green, blue, alpha);
mColorPanel.setBackground(mCurrentColor);
}
public void stateChanged(ChangeEvent e) {
if (e.getSource() == mRedSp) {
mRedSl.setValue(((Integer) mRedSp.getValue()).intValue());
} else if (e.getSource() == mGreenSp) {
mGreenSl.setValue(((Integer) mGreenSp.getValue()).intValue());
} else if (e.getSource() == mBlueSp) {
mBlueSl.setValue(((Integer) mBlueSp.getValue()).intValue());
} else if (e.getSource() == mAlphaSp) {
mAlphaSl.setValue(((Integer) mAlphaSp.getValue()).intValue());
} else if (e.getSource() == mRedSl) {
mRedSp.setValue(mRedSl.getValue());
} else if (e.getSource() == mGreenSl) {
mGreenSp.setValue(mGreenSl.getValue());
} else if (e.getSource() == mBlueSl) {
mBlueSp.setValue(mBlueSl.getValue());
} else if (e.getSource() == mAlphaSl) {
mAlphaSp.setValue(mAlphaSl.getValue());
}
updateColorPanel();
}
/**
* Quick Work-Around. Give Focus to Slider, all Spinner loose Focus and
* try to store their values
*/
private void stopEditing() {
mRedSl.grabFocus();
}
/**
* Sets the Color in this Dialog
*
* @param color Color
*/
public void setColor(Color color) {
if (color != null) {
mRedSl.setValue(color.getRed());
mGreenSl.setValue(color.getGreen());
mBlueSl.setValue(color.getBlue());
mAlphaSl.setValue(color.getAlpha());
}
}
/**
* Returns the current selected Color
*
* @return current selected Color
*/
public Color getColor() {
stopEditing();
updateColorPanel();
return mCurrentColor;
}
/**
* Inner Class for the Color-Preview
*/
private static class PaintColor extends JPanel {
protected void paintComponent(Graphics g) {
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.GRAY);
for (int y = 0; y < getHeight(); y += 15) {
int start = 0;
if ((y & 1) == 1) {
start = 15;
}
for (int x = start; x < getWidth(); x += 30) {
g.fillRect(x, y, 15, 15);
}
}
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
}
}