blob: 010f08c0959c2f3821038feefebf5ec648d229a2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pivot.wtk;
import java.awt.Color;
import org.apache.pivot.json.JSON;
import org.apache.pivot.util.ListenerList;
import org.apache.pivot.util.Utils;
import org.apache.pivot.wtk.content.ListButtonColorItemRenderer;
/**
* A component that allows a user to select a color. The color chooser is hidden
* until the user pushes the button.
*/
public class ColorChooserButton extends Button {
/**
* ColorChooser button selection listener list.
*/
private static class ColorChooserButtonSelectionListenerList extends
WTKListenerList<ColorChooserButtonSelectionListener> implements
ColorChooserButtonSelectionListener {
@Override
public void selectedColorChanged(ColorChooserButton colorChooserButton,
Color previousSelectedColor) {
for (ColorChooserButtonSelectionListener listener : this) {
listener.selectedColorChanged(colorChooserButton, previousSelectedColor);
}
}
}
/**
* Color chooser button binding listener list.
*/
private static class ColorChooserButtonBindingListenerList extends
WTKListenerList<ColorChooserButtonBindingListener> implements
ColorChooserButtonBindingListener {
@Override
public void selectedColorKeyChanged(ColorChooserButton colorChooserButton,
String previousSelectedColorKey) {
for (ColorChooserButtonBindingListener listener : this) {
listener.selectedColorKeyChanged(colorChooserButton, previousSelectedColorKey);
}
}
@Override
public void selectedColorBindTypeChanged(ColorChooserButton colorChooserButton,
BindType previousSelectedColorBindType) {
for (ColorChooserButtonBindingListener listener : this) {
listener.selectedColorBindTypeChanged(colorChooserButton,
previousSelectedColorBindType);
}
}
@Override
public void selectedColorBindMappingChanged(ColorChooserButton colorChooserButton,
ColorChooser.SelectedColorBindMapping previousSelectedColorBindMapping) {
for (ColorChooserButtonBindingListener listener : this) {
listener.selectedColorBindMappingChanged(colorChooserButton,
previousSelectedColorBindMapping);
}
}
}
/**
* ColorChooserButton skin interface. ColorChooserButton skins must
* implement this interface to facilitate additional communication between
* the component and the skin.
*/
public interface Skin {
public Window getColorChooserPopup();
}
private Color selectedColor = null;
private String selectedColorKey = null;
private BindType selectedColorBindType = BindType.BOTH;
private ColorChooser.SelectedColorBindMapping selectedColorBindMapping = null;
private ColorChooserButtonSelectionListenerList colorChooserButtonSelectionListeners = new ColorChooserButtonSelectionListenerList();
private ColorChooserButtonBindingListenerList colorChooserButtonBindingListeners = new ColorChooserButtonBindingListenerList();
private static final Button.DataRenderer DEFAULT_DATA_RENDERER = new ListButtonColorItemRenderer();
public ColorChooserButton() {
this(null);
}
public ColorChooserButton(Object buttonData) {
super(buttonData);
setDataRenderer(DEFAULT_DATA_RENDERER);
installSkin(ColorChooserButton.class);
}
@Override
protected void setSkin(org.apache.pivot.wtk.Skin skin) {
if (!(skin instanceof ColorChooserButton.Skin)) {
throw new IllegalArgumentException("Skin class must implement "
+ ColorChooserButton.Skin.class.getName());
}
super.setSkin(skin);
}
/**
* @return The popup window associated with this component's skin.
*/
public Window getListPopup() {
return ((ColorChooserButton.Skin) getSkin()).getColorChooserPopup();
}
/**
* @throws UnsupportedOperationException This method is not supported by
* ColorChooserButton.
*/
@Override
public void setToggleButton(boolean toggleButton) {
throw new UnsupportedOperationException("Color chooser buttons cannot be toggle buttons.");
}
/**
* @return The currently selected color, or <tt>null</tt> if nothing is
* selected.
*/
public Color getSelectedColor() {
return selectedColor;
}
/**
* Sets the selected color.
*
* @param selectedColor The color to select, or <tt>null</tt> to clear the
* selection.
*/
public void setSelectedColor(Color selectedColor) {
Color previousSelectedColor = this.selectedColor;
if (previousSelectedColor != selectedColor
&& (previousSelectedColor == null || !previousSelectedColor.equals(selectedColor))) {
this.selectedColor = selectedColor;
colorChooserButtonSelectionListeners.selectedColorChanged(this, previousSelectedColor);
}
}
/**
* Sets the selected color.
*
* @param selectedColor A string representing a color.
* @throws IllegalArgumentException if the string is {@code null}.
*/
public final void setSelectedColor(String selectedColor) {
Utils.checkNull(selectedColor, "selectedColor");
setSelectedColor(Color.decode(selectedColor));
}
/**
* @return The data binding key that is set on this color chooser button.
*/
public String getSelectedColorKey() {
return selectedColorKey;
}
/**
* Sets this color chooser button's data binding key.
*
* @param selectedColorKey The binding key for the selected color.
*/
public void setSelectedColorKey(String selectedColorKey) {
String previousSelectedColorKey = this.selectedColorKey;
if (previousSelectedColorKey != selectedColorKey) {
this.selectedColorKey = selectedColorKey;
colorChooserButtonBindingListeners.selectedColorKeyChanged(this,
previousSelectedColorKey);
}
}
public BindType getSelectedColorBindType() {
return selectedColorBindType;
}
public void setSelectedColorBindType(BindType selectedColorBindType) {
Utils.checkNull(selectedColorBindType, "selectedColorBindType");
BindType previousSelectedColorBindType = this.selectedColorBindType;
if (previousSelectedColorBindType != selectedColorBindType) {
this.selectedColorBindType = selectedColorBindType;
colorChooserButtonBindingListeners.selectedColorBindTypeChanged(this,
previousSelectedColorBindType);
}
}
public ColorChooser.SelectedColorBindMapping getSelectedColorBindMapping() {
return selectedColorBindMapping;
}
public void setSelectedColorBindMapping(ColorChooser.SelectedColorBindMapping bindMapping) {
ColorChooser.SelectedColorBindMapping previousSelectedColorBindMapping = this.selectedColorBindMapping;
if (previousSelectedColorBindMapping != bindMapping) {
this.selectedColorBindMapping = bindMapping;
colorChooserButtonBindingListeners.selectedColorBindMappingChanged(this,
previousSelectedColorBindMapping);
}
}
/**
* Loads the selected color from the specified bind context using this color
* picker button's bind key, if one is set.
*/
@Override
public void load(Object context) {
if (selectedColorKey != null && JSON.containsKey(context, selectedColorKey)
&& selectedColorBindType != BindType.STORE) {
Object value = JSON.get(context, selectedColorKey);
Color selectedColorLocal = null;
if (value instanceof Color) {
selectedColorLocal = (Color) value;
} else if (selectedColorBindMapping == null) {
if (value != null) {
selectedColorLocal = Color.decode(value.toString());
}
} else {
selectedColorLocal = selectedColorBindMapping.toColor(value);
}
setSelectedColor(selectedColorLocal);
}
}
/**
* Stores the selected color into the specified bind context using this
* color picker button's bind key, if one is set.
*/
@Override
public void store(Object context) {
if (selectedColorKey != null && selectedColorBindType != BindType.LOAD) {
JSON.put(context, selectedColorKey, (selectedColorBindMapping == null) ? selectedColor
: selectedColorBindMapping.valueOf(selectedColor));
}
}
/**
* If a bind key is set, clears the selected color.
*/
@Override
public void clear() {
if (selectedColorKey != null) {
setSelectedColor((Color) null);
}
}
/**
* @return The color chooser button selection listener list.
*/
public ListenerList<ColorChooserButtonSelectionListener> getColorChooserButtonSelectionListeners() {
return colorChooserButtonSelectionListeners;
}
/**
* @return The color chooser button binding listener list.
*/
public ListenerList<ColorChooserButtonBindingListener> getColorChooserButtonBindingListeners() {
return colorChooserButtonBindingListeners;
}
}