package src.com.fxexperience.javafx.scene.control.colorpicker;
import javafx.beans.binding.ObjectBinding;
import javafx.beans.binding.StringBinding;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.RectangleBuilder;
/**
* @author Jasper Potts
*/
public class ColorPicker extends Button {
private ObjectProperty<Color> color = new SimpleObjectProperty<Color>(
Color.RED);
public ObjectProperty<Color> colorProperty() {
return color;
}
public Color getColor() {
return color.get();
}
public void setColor(Color newColor) {
color.set(newColor);
}
private ColorPickerPopover popover;
public ColorPicker() {
this(Color.BLACK);
}
public ColorPicker(Color startColor) {
setMinWidth(USE_PREF_SIZE);
setMaxWidth(Double.MAX_VALUE);
setAlignment(Pos.BASELINE_LEFT);
getStyleClass().add("color-picker");
color.set(startColor);
textProperty().bind(new StringBinding() {
{
bind(color);
}
@Override
protected String computeValue() {
return getWebColor(getColor());
}
});
setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
if (popover == null) {
popover = new ColorPickerPopover();
popover.colorProperty().addListener(
new ChangeListener<Color>() {
@Override
public void changed(
ObservableValue<? extends Color> arg0,
Color arg1, Color newValue) {
setColor(newValue);
}
});
}
if (popover.isShowing()) {
popover.hide();
} else {
popover.setColor(getColor());
popover.show(ColorPicker.this);
}
}
});
Rectangle colorRect = RectangleBuilder.create().width(16).height(16)
.build();
colorRect.fillProperty().bind(new ObjectBinding<Paint>() {
{
bind(color);
}
@Override
protected Paint computeValue() {
return getColor();
}
});
colorRect.setEffect(new DropShadow(3, 0, 1, Color.rgb(0, 0, 0, 0.8)));
setGraphic(colorRect);
}
private static String getWebColor(Color color) {
final int red = (int) (color.getRed() * 255);
final int green = (int) (color.getGreen() * 255);
final int blue = (int) (color.getBlue() * 255);
return "#" + String.format("%02X", red) + String.format("%02X", green)
+ String.format("%02X", blue);
}
public String getWebColor() {
return getWebColor(getColor());
}
}