/*
* 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.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.ChangeListener;
import org.pushingpixels.substance.api.SubstanceColorScheme;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
import tools.jitterbug.StateChangeEvent.StateChangeType;
public class JColorSchemeComponent extends JPanel {
private JCheckBox isLight;
private JLabel name;
private JColorComponent ultraLight;
private JColorComponent extraLight;
private JColorComponent light;
private JColorComponent mid;
private JColorComponent dark;
private JColorComponent ultraDark;
private JColorComponent foreground;
private ButtonGroup bg;
public JColorSchemeComponent() {
FormLayout layout = new FormLayout("fill:pref", "");
DefaultFormBuilder formBuilder = new DefaultFormBuilder(layout, this);
this.bg = new ButtonGroup();
this.ultraLight = createColorComponent("ultra light");
this.extraLight = createColorComponent("extra light");
this.light = createColorComponent("light");
this.mid = createColorComponent("mid");
this.dark = createColorComponent("dark");
this.ultraDark = createColorComponent("ultra dark");
this.foreground = createColorComponent("foreground");
JPanel header = new JPanel();
FormLayout hLayout = new FormLayout(
"fill:pref,2dlu,fill:min(150px;pref):grow,4dlu,right:pref", "");
DefaultFormBuilder headerBuilder = new DefaultFormBuilder(hLayout,
header);
name = new JLabel("");
name.setFont(name.getFont().deriveFont(Font.BOLD));
isLight = new JCheckBox("light");
isLight.setSelected(true);
isLight.setFocusable(false);
headerBuilder.append(new JLabel("Display name:"));
headerBuilder.append(name);
headerBuilder.append(isLight);
isLight.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireStateChanged(StateChangeType.MODIFIED);
}
});
formBuilder.append(header);
formBuilder.append(ultraLight);
formBuilder.append(extraLight);
formBuilder.append(light);
formBuilder.append(mid);
formBuilder.append(dark);
formBuilder.append(ultraDark);
formBuilder.append(foreground);
}
private JColorComponent createColorComponent(String label) {
JColorComponent result = new JColorComponent(label, null);
result.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("selectedColor".equals(evt.getPropertyName())) {
fireStateChanged(StateChangeType.MODIFIED);
}
}
});
this.bg.add(result.getRadio());
return result;
}
public void setContent(SubstanceColorScheme scheme) {
this.setEnabled(true);
ultraLight.setColor(scheme.getUltraLightColor(), false);
extraLight.setColor(scheme.getExtraLightColor(), false);
light.setColor(scheme.getLightColor(), false);
mid.setColor(scheme.getMidColor(), false);
dark.setColor(scheme.getDarkColor(), false);
ultraDark.setColor(scheme.getUltraDarkColor(), false);
foreground.setColor(scheme.getForegroundColor(), false);
isLight.setSelected(!scheme.isDark());
name.setText(scheme.getDisplayName());
fireStateChanged(StateChangeType.INITIALIZED);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
this.setEnabledChildren(this, enabled);
}
private void setEnabledChildren(Component c, boolean enabled) {
if (c instanceof Container) {
Container cont = (Container) c;
for (int i = 0; i < cont.getComponentCount(); i++) {
Component child = cont.getComponent(i);
child.setEnabled(enabled);
setEnabledChildren(child, enabled);
}
}
}
public void clearContent() {
this.setEnabled(false);
ultraLight.setColor(null, false);
extraLight.setColor(null, false);
light.setColor(null, false);
mid.setColor(null, false);
dark.setColor(null, false);
ultraDark.setColor(null, false);
foreground.setColor(null, false);
isLight.setSelected(true);
name.setText("");
fireStateChanged(StateChangeType.RESET);
}
public boolean isLight() {
return this.isLight.isSelected();
}
public String getDisplayName() {
return this.name.getText();
}
public Color getUltraLightColor() {
return ultraLight.getColor();
}
public Color getExtraLightColor() {
return extraLight.getColor();
}
public Color getLightColor() {
return light.getColor();
}
public Color getMidColor() {
return mid.getColor();
}
public Color getDarkColor() {
return dark.getColor();
}
public Color getUltraDarkColor() {
return ultraDark.getColor();
}
public Color getForegroundColor() {
return foreground.getColor();
}
public String getEncoded() {
StringBuffer sb = new StringBuffer();
sb.append(this.getDisplayName() + " {\n");
sb.append("\tkind=" + (this.isLight() ? "Light" : "Dark") + "\n");
sb.append("\tcolorUltraLight=" + this.ultraLight.getEncodedColor()
+ "\n");
sb.append("\tcolorExtraLight=" + this.extraLight.getEncodedColor()
+ "\n");
sb.append("\tcolorLight=" + this.light.getEncodedColor() + "\n");
sb.append("\tcolorMid=" + this.mid.getEncodedColor() + "\n");
sb.append("\tcolorDark=" + this.dark.getEncodedColor() + "\n");
sb
.append("\tcolorUltraDark=" + this.ultraDark.getEncodedColor()
+ "\n");
sb.append("\tcolorForeground=" + this.foreground.getEncodedColor()
+ "\n");
sb.append("}\n");
return sb.toString();
}
/**
* Adds the specified change listener to track changes to this ribbon.
*
* @param l
* Change listener to add.
* @see #removeChangeListener(ChangeListener)
*/
public void addStateChangeListener(StateChangeListener l) {
this.listenerList.add(StateChangeListener.class, l);
}
/**
* Removes the specified change listener from tracking changes to this
* ribbon.
*
* @param l
* Change listener to remove.
* @see #addChangeListener(ChangeListener)
*/
public void removeStateChangeListener(StateChangeListener l) {
this.listenerList.remove(StateChangeListener.class, l);
}
/**
* Notifies all registered listener that the state of this component has
* changed.
*/
protected void fireStateChanged(
StateChangeEvent.StateChangeType stateChangeType) {
// Guaranteed to return a non-null array
Object[] listeners = this.listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
StateChangeEvent event = new StateChangeEvent(this, stateChangeType);
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == StateChangeListener.class) {
((StateChangeListener) listeners[i + 1]).stateChanged(event);
}
}
}
public boolean isDefined() {
if ((this.name.getText() == null)
|| (this.name.getText().trim().length() == 0))
return false;
if (!this.ultraLight.isDefined())
return false;
if (!this.extraLight.isDefined())
return false;
if (!this.light.isDefined())
return false;
if (!this.mid.isDefined())
return false;
if (!this.dark.isDefined())
return false;
if (!this.ultraDark.isDefined())
return false;
if (!this.foreground.isDefined())
return false;
return true;
}
public JColorComponent getSelectedColorComponent() {
if (this.ultraLight.getRadio().isSelected())
return this.ultraLight;
if (this.extraLight.getRadio().isSelected())
return this.extraLight;
if (this.light.getRadio().isSelected())
return this.light;
if (this.mid.getRadio().isSelected())
return this.mid;
if (this.dark.getRadio().isSelected())
return this.dark;
if (this.ultraDark.getRadio().isSelected())
return this.ultraDark;
if (this.foreground.getRadio().isSelected())
return this.foreground;
return null;
}
}