/*
Copyright 2008-2010 Gephi
Authors : Jeremy Subtil <jeremy.subtil@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.preview.propertyeditors;
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.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.GroupLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JRadioButton;
import javax.swing.LayoutStyle.ComponentPlacement;
import org.gephi.preview.api.Colorizer;
import org.gephi.preview.api.GenericColorizer;
/**
*
* @author jeremy
*/
class CustomColorModePanelDecorator extends ColorModePanelDecorator {
private JButton customColorButton;
public CustomColorModePanelDecorator(final AbstractColorizerPropertyEditor propertyEditor, final ColorModePanel decoratedPanel) {
super(propertyEditor, decoratedPanel);
}
@Override
protected void setPanelContent() {
// radio button
JRadioButton radioButton = new JRadioButton();
radioButton.setText(getRadioButtonLabel());
this.addRadioButton(radioButton);
// color chooser button
if (factory.isCustomColorMode((Colorizer) propertyEditor.getValue())) {
customColorButton = new JColorButton(((GenericColorizer) propertyEditor.getValue()).getAwtColor(), customColorButton);
} else {
customColorButton = new JColorButton(Color.BLACK, customColorButton);
}
// initialization
radioButton.setSelected(isSelectedRadioButton());
customColorButton.setEnabled(isSelectedRadioButton());
// radio button listener
radioButton.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
customColorButton.setEnabled(e.getStateChange() == ItemEvent.SELECTED);
propertyEditor.setValue(createColorizer());
}
});
// button listener
customColorButton.addPropertyChangeListener(JColorButton.EVENT_COLOR, new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
Color newColor = (Color) evt.getNewValue();
propertyEditor.setValue(factory.createCustomColorMode(newColor));
}
});
// panel layout
GroupLayout layout = new GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(layout.createSequentialGroup().
addGroup(layout.createParallelGroup().
addGroup(layout.createSequentialGroup().
addComponent(radioButton).
addPreferredGap(ComponentPlacement.RELATED).
addComponent(customColorButton)).
addComponent(decoratedPanel)));
layout.setVerticalGroup(layout.createSequentialGroup().
addGroup(layout.createParallelGroup().
addComponent(radioButton).
addComponent(customColorButton)).
addPreferredGap(ComponentPlacement.RELATED).
addComponent(decoratedPanel));
}
@Override
protected String getRadioButtonLabel() {
return "Custom";
}
@Override
protected boolean isSelectedRadioButton() {
return factory.isCustomColorMode((Colorizer) propertyEditor.getValue());
}
@Override
protected Colorizer createColorizer() {
return factory.createCustomColorMode(0, 0, 0);
}
private static class JColorButton extends JButton {
public static String EVENT_COLOR = "color";
private Color color;
private Component parent;
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, Component parent) {
this.parent = parent;
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);
}
}
});
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Color newColor = JColorChooser.showDialog(JColorButton.this.parent, "Choose Color", color);
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};
}
}
}