package com.soundlooper.gui.customComponent.potentiometer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.css.CssMetaData;
import javafx.css.SimpleStyleableBooleanProperty;
import javafx.css.SimpleStyleableDoubleProperty;
import javafx.css.SimpleStyleableStringProperty;
import javafx.css.StyleConverter;
import javafx.css.Styleable;
import javafx.css.StyleableBooleanProperty;
import javafx.css.StyleableDoubleProperty;
import javafx.css.StyleableProperty;
import javafx.css.StyleableStringProperty;
import javafx.scene.control.ButtonBase;
import javafx.scene.control.Skin;
import javafx.scene.control.Slider;
public class Potentiometer extends Slider {
public static final String SIZE_SMALL = "small";
public static final String SIZE_MEDIUM = "medium";
private StyleableStringProperty size;
private DoubleProperty rotationBoundaryMinInDegree = new SimpleDoubleProperty(30);
private DoubleProperty rotationBoundaryMaxInDegree = new SimpleDoubleProperty(30);
private StyleableDoubleProperty sensibility;
private StyleableBooleanProperty displayValue;
private SimpleObjectProperty<ButtonBase> centralButton = new SimpleObjectProperty<>();
@Override
protected Skin<?> createDefaultSkin() {
return new PotentiometerSkin(this);
}
public StyleableStringProperty sizeProperty() {
if (size == null) {
size = new SimpleStyleableStringProperty(StyleableProperties.SIZE, this, "size", Potentiometer.SIZE_SMALL);
}
return size;
}
public StyleableBooleanProperty displayValueProperty() {
if (displayValue == null) {
displayValue = new SimpleStyleableBooleanProperty(StyleableProperties.DISPLAY_VALUE, this, "display-value",
false);
}
return displayValue;
}
public StyleableDoubleProperty sensibilityProperty() {
if (sensibility == null) {
sensibility = new SimpleStyleableDoubleProperty(StyleableProperties.SENSIBILITY, this, "sensibility", 1d);
}
return sensibility;
}
public boolean getDisplayValue() {
return displayValue == null ? false : displayValue.get();
}
public double getSensibility() {
return sensibility == null ? 1 : sensibility.get();
}
public void setSensibility(double sensibility) {
this.rotationBoundaryMaxInDegree.set(sensibility);
}
public DoubleProperty rotationBoundaryMinInDegreeProperty() {
return rotationBoundaryMinInDegree;
}
public DoubleProperty rotationBoundaryMaxInDegreeProperty() {
return rotationBoundaryMaxInDegree;
}
public String getSize() {
return size == null ? Potentiometer.SIZE_SMALL : size.get();
}
public void setSize(String size) {
this.size.set(size);
}
public double getRotationBoundaryMinInDegree() {
return rotationBoundaryMinInDegree.get();
}
public void setRotationBoundaryMinInDegree(double rotationBoundaryMinInDegree) {
this.rotationBoundaryMinInDegree.set(rotationBoundaryMinInDegree);
}
public double getRotationBoundaryMaxInDegree() {
return rotationBoundaryMaxInDegree.get();
}
public void setRotationBoundaryMaxInDegree(double rotationBoundaryMaxInDegree) {
this.rotationBoundaryMaxInDegree.set(rotationBoundaryMaxInDegree);
}
private static class StyleableProperties {
private static final CssMetaData<Potentiometer, Number> SENSIBILITY = new CssMetaData<Potentiometer, Number>(
"-fx-potentiometer-sensibility", new StyleConverter<String, Number>(), 1) {
@Override
public boolean isSettable(Potentiometer potentiometer) {
return potentiometer.sensibility == null || !potentiometer.sensibility.isBound();
}
@Override
public StyleableProperty<Number> getStyleableProperty(Potentiometer potentiometer) {
return potentiometer.sensibilityProperty();
}
};
private static final CssMetaData<Potentiometer, String> SIZE = new CssMetaData<Potentiometer, String>(
"-fx-potentiometer-size", new StyleConverter<String, String>(), Potentiometer.SIZE_SMALL) {
@Override
public boolean isSettable(Potentiometer potentiometer) {
return potentiometer.size == null || !potentiometer.size.isBound();
}
@Override
public StyleableProperty<String> getStyleableProperty(Potentiometer potentiometer) {
return potentiometer.sizeProperty();
}
};
private static final CssMetaData<Potentiometer, Boolean> DISPLAY_VALUE = new CssMetaData<Potentiometer, Boolean>(
"-fx-potentiometer-display-value", new StyleConverter<String, Boolean>(), false) {
@Override
public boolean isSettable(Potentiometer potentiometer) {
return potentiometer.displayValue == null || !potentiometer.displayValue.isBound();
}
@Override
public StyleableProperty<Boolean> getStyleableProperty(Potentiometer potentiometer) {
return potentiometer.displayValueProperty();
}
};
private static final List<CssMetaData<? extends Styleable, ?>> STYLEABLES;
static {
final List<CssMetaData<? extends Styleable, ?>> styleables = new ArrayList<>();
Collections.addAll(styleables, SENSIBILITY, SIZE, DISPLAY_VALUE);
STYLEABLES = Collections.unmodifiableList(styleables);
}
}
@Override
protected List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
return getClassCssMetaData();
}
public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
return StyleableProperties.STYLEABLES;
}
public void setCentralButton(ButtonBase centralNode) {
this.centralButton.set(centralNode);
}
public ButtonBase getCentralButton() {
return centralButton.get();
}
public SimpleObjectProperty<ButtonBase> centralButtonProperty() {
return centralButton;
}
public void forceLayout() {
setNeedsLayout(true);
layout();
}
}