/*
* Copyright (c) 2005-2016 Substance Kirill Grouchnikov. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* o Neither the name of Substance Kirill Grouchnikov nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package tools.jitterbug;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LayoutManager;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JRadioButton;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import org.pushingpixels.lafwidget.utils.RenderingUtils;
public class JColorComponent extends JComponent {
private JRadioButton radio;
private Color selectedColor;
private ColorVisualizer visualizer;
private class ColorVisualizer extends JComponent {
boolean isRollover;
public ColorVisualizer() {
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (!isEnabled())
return;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
radio.setSelected(true);
Color selected = JColorChooser.showDialog(
ColorVisualizer.this, "Color chooser",
selectedColor);
if (selected != null) {
Color old = selectedColor;
selectedColor = selected;
JColorComponent.this.firePropertyChange(
"selectedColor", old, selectedColor);
}
}
});
}
@Override
public void mouseEntered(MouseEvent e) {
if (!isEnabled())
return;
isRollover = true;
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
if (!isEnabled())
return;
isRollover = false;
repaint();
}
});
this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
this.setToolTipText("Open color chooser and change the color");
this.isRollover = false;
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
RenderingUtils.installDesktopHints(g2d, this);
g2d.setFont(UIManager.getFont("Label.font"));
if (selectedColor != null) {
g2d.setColor(selectedColor);
g2d.fillRect(2, 2, 100, getHeight() - 4);
g2d.setStroke(new BasicStroke(isRollover ? 2.5f : 1.0f));
g2d.setColor(selectedColor.darker());
g2d.drawRect(2, 2, 99, getHeight() - 5);
g2d.setColor(Color.black);
g2d.drawString(getEncodedColor(), 108, (getHeight() + g2d
.getFontMetrics().getHeight())
/ 2 - g2d.getFontMetrics().getDescent());
} else {
g2d.setColor(isEnabled() ? Color.gray : Color.lightGray);
g2d.drawString("click to choose", 5, (getHeight() + g2d
.getFontMetrics().getHeight())
/ 2 - g2d.getFontMetrics().getDescent());
}
g2d.dispose();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 25);
}
}
public JColorComponent(String name, Color color) {
this.radio = new JRadioButton(name);
this.radio.setFocusable(false);
this.selectedColor = color;
this.visualizer = new ColorVisualizer();
this.setLayout(new ColorComponentLayout());
this.add(this.radio);
this.add(this.visualizer);
}
private class ColorComponentLayout implements LayoutManager {
@Override
public void addLayoutComponent(String name, Component comp) {
}
@Override
public void layoutContainer(Container parent) {
JColorComponent cc = (JColorComponent) parent;
int width = cc.getWidth();
int height = cc.getHeight();
ColorVisualizer cv = cc.visualizer;
Dimension cvPref = cv.getPreferredSize();
cv.setBounds(width - cvPref.width, 0, cvPref.width, height);
cc.radio.setBounds(0, 0, width - cvPref.width, height);
}
@Override
public Dimension minimumLayoutSize(Container parent) {
return preferredLayoutSize(parent);
}
@Override
public Dimension preferredLayoutSize(Container parent) {
JColorComponent cc = (JColorComponent) parent;
ColorVisualizer cv = cc.visualizer;
Dimension cvPref = cv.getPreferredSize();
return new Dimension(100 + cvPref.width, cvPref.height);
}
@Override
public void removeLayoutComponent(Component comp) {
}
}
public String getEncodedColor() {
return "#" + encodeColorComponent(selectedColor.getRed())
+ encodeColorComponent(selectedColor.getGreen())
+ encodeColorComponent(selectedColor.getBlue());
}
private static String encodeColorComponent(int colorComp) {
String hex = "0123456789ABCDEF";
return "" + hex.charAt(colorComp / 16) + hex.charAt(colorComp % 16);
}
public JRadioButton getRadio() {
return radio;
}
public void setColor(Color color, boolean firePropertyChange) {
Color old = this.selectedColor;
this.selectedColor = color;
this.repaint();
if (firePropertyChange) {
this.firePropertyChange("selectedColor", old, selectedColor);
}
}
public Color getColor() {
return this.selectedColor;
}
public boolean isDefined() {
return (this.selectedColor != null);
}
}