/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.ui.components;
import com.bric.swing.ColorPicker;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.SwingUtilities;
import org.openide.windows.WindowManager;
/**
*
* @author Mathieu Bastian
*/
public class JColorButton extends JButton {
public static String EVENT_COLOR = "color";
private Color color;
private boolean includeOpacity;
private final static int ICON_WIDTH = 16;
private final static int ICON_HEIGHT = 16;
private final static Color DISABLED_BORDER = new Color(200, 200, 200);
private final static Color DISABLED_FILL = new Color(220, 220, 220);
public JColorButton(Color originalColor) {
this(originalColor, false, false);
}
public JColorButton(Color originalColor, boolean rightClick, boolean includeOpacity) {
this.includeOpacity = includeOpacity;
this.color = originalColor;
setIcon(new Icon() {
public int getIconWidth() {
return ICON_WIDTH;
}
public int getIconHeight() {
return ICON_HEIGHT;
}
public void paintIcon(Component c, Graphics g, int x, int y) {
if (c.isEnabled()) {
g.setColor(Color.BLACK);
g.drawRect(x + 2, y + 2, ICON_WIDTH - 5, ICON_HEIGHT - 5);
if (color != null) {
g.setColor(color);
g.fillRect(x + 3, y + 3, ICON_WIDTH - 6, ICON_HEIGHT - 6);
}
} else {
g.setColor(DISABLED_BORDER);
g.drawRect(x + 2, y + 2, ICON_WIDTH - 5, ICON_HEIGHT - 5);
g.setColor(DISABLED_FILL);
g.fillRect(x + 3, y + 3, ICON_WIDTH - 6, ICON_HEIGHT - 6);
}
}
});
if (rightClick) {
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
Color newColor = ColorPicker.showDialog(WindowManager.getDefault().getMainWindow(), color, JColorButton.this.includeOpacity);
if (newColor != null) {
setColor(newColor);
}
}
}
});
} else {
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Color newColor = ColorPicker.showDialog(WindowManager.getDefault().getMainWindow(), color, JColorButton.this.includeOpacity);
if (newColor != null) {
setColor(newColor);
}
}
});
}
}
public void setColor(Color color) {
if (color != this.color || (color != null && !color.equals(this.color))) {
Color oldColor = this.color;
this.color = color;
firePropertyChange(EVENT_COLOR, oldColor, color);
repaint();
}
}
public Color getColor() {
return color;
}
public float[] getColorArray() {
return new float[]{color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, color.getAlpha() / 255f};
}
public void setIncludeOpacity(boolean includeOpacity) {
this.includeOpacity = includeOpacity;
}
}