/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed 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 com.vaadin.v7.ui.components.colorpicker;
import java.lang.reflect.Method;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
import com.vaadin.v7.data.Property.ValueChangeEvent;
import com.vaadin.v7.data.Property.ValueChangeListener;
import com.vaadin.v7.shared.ui.colorpicker.Color;
import com.vaadin.v7.ui.TextField;
/**
* A component that represents color selection preview within a color picker.
*
* @since 7.0.0
*/
@Deprecated
public class ColorPickerPreview extends CssLayout
implements ColorSelector, ValueChangeListener {
private static final String STYLE_DARK_COLOR = "v-textfield-dark";
private static final String STYLE_LIGHT_COLOR = "v-textfield-light";
private static final Method COLOR_CHANGE_METHOD;
static {
try {
COLOR_CHANGE_METHOD = ColorChangeListener.class.getDeclaredMethod(
"colorChanged", new Class[] { ColorChangeEvent.class });
} catch (final java.lang.NoSuchMethodException e) {
// This should never happen
throw new java.lang.RuntimeException(
"Internal error finding methods in ColorPicker");
}
}
/** The color. */
private Color color;
/** The field. */
private final TextField field;
/** The old value. */
private String oldValue;
private ColorPickerPreview() {
setStyleName("v-colorpicker-preview");
field = new TextField();
field.setImmediate(true);
field.setSizeFull();
field.setStyleName("v-colorpicker-preview-textfield");
field.setData(this);
field.addValueChangeListener(this);
addComponent(field);
}
/**
* Instantiates a new color picker preview.
*/
public ColorPickerPreview(Color color) {
this();
setColor(color);
}
@Override
public void setColor(Color color) {
this.color = color;
// Unregister listener
field.removeValueChangeListener(this);
String colorCSS = color.getCSS();
field.setValue(colorCSS);
if (field.isValid()) {
oldValue = colorCSS;
} else {
field.setValue(oldValue);
}
// Re-register listener
field.addValueChangeListener(this);
// Set the text color
field.removeStyleName(STYLE_DARK_COLOR);
field.removeStyleName(STYLE_LIGHT_COLOR);
if (this.color.getRed() + this.color.getGreen()
+ this.color.getBlue() < 3 * 128) {
field.addStyleName(STYLE_DARK_COLOR);
} else {
field.addStyleName(STYLE_LIGHT_COLOR);
}
markAsDirty();
}
@Override
public Color getColor() {
return color;
}
@Override
public void addColorChangeListener(ColorChangeListener listener) {
addListener(ColorChangeEvent.class, listener, COLOR_CHANGE_METHOD);
}
@Override
public void removeColorChangeListener(ColorChangeListener listener) {
removeListener(ColorChangeEvent.class, listener);
}
@Override
public void valueChange(ValueChangeEvent event) {
String value = (String) event.getProperty().getValue();
try {
if (value != null) {
/*
* Description of supported formats see
* http://www.w3schools.com/cssref/css_colors_legal.asp
*/
if (value.length() == 7 && value.startsWith("#")) {
// CSS color format (e.g. #000000)
int red = Integer.parseInt(value.substring(1, 3), 16);
int green = Integer.parseInt(value.substring(3, 5), 16);
int blue = Integer.parseInt(value.substring(5, 7), 16);
color = new Color(red, green, blue);
} else if (value.startsWith("rgb")) {
// RGB color format rgb/rgba(255,255,255,0.1)
String[] colors = value.substring(value.indexOf("(") + 1,
value.length() - 1).split(",");
int red = Integer.parseInt(colors[0]);
int green = Integer.parseInt(colors[1]);
int blue = Integer.parseInt(colors[2]);
if (colors.length > 3) {
int alpha = (int) (Double.parseDouble(colors[3])
* 255d);
color = new Color(red, green, blue, alpha);
} else {
color = new Color(red, green, blue);
}
} else if (value.startsWith("hsl")) {
// HSL color format hsl/hsla(100,50%,50%,1.0)
String[] colors = value.substring(value.indexOf("(") + 1,
value.length() - 1).split(",");
int hue = Integer.parseInt(colors[0]);
int saturation = Integer
.parseInt(colors[1].replace("%", ""));
int lightness = Integer
.parseInt(colors[2].replace("%", ""));
int rgb = Color.HSLtoRGB(hue, saturation, lightness);
if (colors.length > 3) {
int alpha = (int) (Double.parseDouble(colors[3])
* 255d);
color = new Color(rgb);
color.setAlpha(alpha);
} else {
color = new Color(rgb);
}
}
oldValue = value;
fireEvent(new ColorChangeEvent((Component) field.getData(),
color));
}
} catch (NumberFormatException nfe) {
// Revert value
field.setValue(oldValue);
}
}
/**
* Called when the component is refreshing
*/
@Override
protected String getCss(Component c) {
return "background: " + color.getCSS();
}
}