/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package javafx.css;
import com.sun.javafx.css.converters.
EnumConverter;
import javafx.beans.property.
Property;
import javafx.geometry.
Insets;
import javafx.scene.effect.
Effect;
import javafx.scene.paint.
Color;
import javafx.scene.paint.
Paint;
import javafx.scene.text.
Font;
import javafx.util.
Duration;
import javafx.util.
Pair;
import java.util.
ArrayList;
import java.util.
Collections;
import java.util.
HashMap;
import java.util.
List;
import java.util.
Map;
import java.util.
NoSuchElementException;
import java.util.function.
Function;
/**
* Methods for creating instances of StyleableProperty with corresponding CssMetaData created behind the scenes.
* These methods greatly reduce the amount of boiler-plate code needed to implement the StyleableProperty
* and CssMetaData.
* These methods take a Function<? extends Styleable, StyleableProperty<?>> which returns a
* reference to the property itself. See the example below. Note that for efficient use of memory and for better
* CSS performance, creating the <code>StyleablePropertyFactory</code> as a static member, as shown below, is recommended.
* <code><pre>
public final class MyButton extends Button {
private static final{@literal StyleablePropertyFactory<MyButton>} FACTORY = new{@literal StyleablePropertyFactory<>}(Button.getClassCssMetaData());
MyButton(String labelText) {
super(labelText);
getStyleClass().add("my-button");
}
// Typical JavaFX property implementation
public{@literal ObservableValue<Boolean>} selectedProperty() { return ({@literal ObservableValue<Boolean>})selected; }
public final boolean isSelected() { return selected.getValue(); }
public final void setSelected(boolean isSelected) { selected.setValue(isSelected); }
// StyleableProperty implementation reduced to one line
private final{@literal StyleableProperty<Boolean>} selected =
FACTORY.createStyleableBooleanProperty(this, "selected", "-my-selected", s{@literal ->} s.selected);
{@literal @}Override
public{@literal List<CssMetaData<? extends Styleable, ?>>} getControlCssMetaData() {
return FACTORY.getCssMetaData();
}
}
* </pre></code>
* <p>The example above is the simplest use of <code>StyleablePropertyFactory</code>. But, this use does not provide the
* static CssMetaData that is useful for {@code getClassCssMetaData()}, which is described in the javadoc for
* {@link CssMetaData)}. Static CssMetaData can, however, be created via <code>StyleablePropertyFactory</code> methods
* and will be returned by the methods which create StyleableProperty instances, as the example below illustrates.
* Note that the static method <code>getClassCssMetaData()</code> is a convention used throughout the JavaFX code base
* but the <code>getClassCssMetaData()</code> method itself is not used at runtime.</p>
* <code><pre>
public final class MyButton extends Button {
private static final{@literal StyleablePropertyFactory<MyButton>} FACTORY =
new{@literal StyleablePropertyFactory<>}(Button.getClassCssMetaData());
private static final{@literal CssMetaData<MyButton, Boolean>} SELECTED =
FACTORY.createBooleanCssMetaData("-my-selected", s{@literal ->} s.selected, false, false);
MyButton(String labelText) {
super(labelText);
getStyleClass().add("my-button");
}
// Typical JavaFX property implementation
public{@literal ObservableValue<Boolean>} selectedProperty() { return ({@literal ObservableValue<Boolean>})selected; }
public final boolean isSelected() { return selected.getValue(); }
public final void setSelected(boolean isSelected) { selected.setValue(isSelected); }
// StyleableProperty implementation reduced to one line
private final{@literal StyleableProperty<Boolean>} selected =
new SimpleStyleableBooleanProperty(SELECTED, this, "selected");
public static {@literal List<CssMetaData<? extends Styleable, ?>>} getClassCssMetaData() {
return FACTORY.getCssMetaData();
}
{@literal @}Override
public{@literal List<CssMetaData<? extends Styleable, ?>>} getControlCssMetaData() {
return FACTORY.getCssMetaData();
}
}
* </pre></code>
* <p>The same can be accomplished with an inner-class. The previous example called {@code new SimpleStyleableBooleanProperty}
* to create the <code>selected</code> property. This example uses the factory to access the <code>CssMetaData</code>
* that was created along with the anonymous inner-class. For all intents and purposes, the two examples are the same.</p>
* <code><pre>
public final class MyButton extends Button {
private static final{@literal StyleablePropertyFactory<MyButton>} FACTORY =
new{@literal StyleablePropertyFactory<>}(Button.getClassCssMetaData()) {
{
createBooleanCssMetaData("-my-selected", s{@literal ->} s.selected, false, false);
}
}
MyButton(String labelText) {
super(labelText);
getStyleClass().add("my-button");
}
// Typical JavaFX property implementation
public{@literal ObservableValue<Boolean>} selectedProperty() { return ({@literal ObservableValue<Boolean>})selected; }
public final boolean isSelected() { return selected.getValue(); }
public final void setSelected(boolean isSelected) { selected.setValue(isSelected); }
// StyleableProperty implementation reduced to one line
private final{@literal StyleableProperty<Boolean>} selected =
new SimpleStyleableBooleanProperty(this, "selected", "my-selected");
public static {@literal List<CssMetaData<? extends Styleable, ?>>} getClassCssMetaData() {
return FACTORY.getCssMetaData();
}
{@literal @}Override
public{@literal List<CssMetaData<? extends Styleable, ?>>} getControlCssMetaData() {
return FACTORY.getCssMetaData();
}
}
* </pre></code>
* <p><span class="simpleTagLabel">Caveats:</span></p>
* The only option for creating a StyleableProperty with a number value is to create a StyleableProperty<Number></Number>.
* The return value from the <code>getValue()</code> method of the StyleableProperty is a Number. Therefore,
* the <code>get</code> method of the JavaFX property needs to call the correct <code>value</code> method for the return type.
* For example,
* <code><pre>
public ObservableValue<Double> offsetProperty() { return (ObservableValue<Double>)offset; }
public Double getOffset() { return offset.getValue().doubleValue(); }
public void setOffset(Double value) { offset.setValue(value); }
private final StyleableProperty<Number> offset = FACTORY.createStyleableNumberProperty(this, "offset", "-my-offset", s -> ((MyButton)s).offset);
* <br>
* </pre></code>
* @param <S> The type of Styleable
* @since JavaFX 8u40
*/
public class
StyleablePropertyFactory<S extends
Styleable> {
/**
* The constructor is passed the CssMetaData of the parent class of <S>, typically by calling the
* static <code>getClassCssMetaData()</code> method of the parent.
* @param parentCssMetaData The CssMetaData of the parent class of <S>, or null.
*/
public
StyleablePropertyFactory(
List<
CssMetaData<? extends
Styleable, ?>>
parentCssMetaData) {
this.
metaDataList = new
ArrayList<>();
this.
unmodifiableMetaDataList =
Collections.
unmodifiableList(this.
metaDataList);
if (
parentCssMetaData != null) this.
metaDataList.
addAll(
parentCssMetaData);
this.
metaDataMap = new
HashMap<>();
}
/**
* Get the CssMetaData for the given Styleable. For a Node other than a Control, this method should be
* called from the {@link javafx.css.Styleable#getCssMetaData()} method. For a Control, this method should be called
* from the {@link javafx.scene.control.Control#getControlCssMetaData()} method.
*/
public final
List<
CssMetaData<? extends
Styleable, ?>>
getCssMetaData() {
return
unmodifiableMetaDataList;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// StyleableProperty<Boolean>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<Boolean> with initial value and inherit flag.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Boolean>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Boolean> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final
StyleableProperty<
Boolean>
createStyleableBooleanProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Boolean>>
function,
boolean
initialValue,
boolean
inherits) {
CssMetaData<S,
Boolean>
cssMetaData =
createBooleanCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableBooleanProperty(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<Boolean> with initial value. The inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Boolean>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Boolean> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final
StyleableProperty<
Boolean>
createStyleableBooleanProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Boolean>>
function,
boolean
initialValue) {
return
createStyleableBooleanProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, false);
}
/**
* Create a StyleableProperty<Boolean>. The initialValue and inherit flag default to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Boolean>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Boolean> that was created by this method call.
*/
public final
StyleableProperty<
Boolean>
createStyleableBooleanProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Boolean>>
function) {
return
createStyleableBooleanProperty(
styleable,
propertyName,
cssProperty,
function, false, false);
}
/**
* Create a StyleableProperty<Boolean> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Boolean>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
Boolean>
createStyleableBooleanProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
Boolean>
cssMetaData = (
CssMetaData<S,
Boolean>)
getCssMetaData(
Boolean.class,
cssProperty);
return new
SimpleStyleableBooleanProperty(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<Color>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<Color> with initial value and inherit flag.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Color>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Color> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final
StyleableProperty<
Color>
createStyleableColorProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Color>>
function,
Color initialValue,
boolean
inherits) {
CssMetaData<S,
Color>
cssMetaData =
createColorCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableObjectProperty<
Color>(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<Color> with initial value. The inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Color>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Color> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final
StyleableProperty<
Color>
createStyleableColorProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Color>>
function,
Color initialValue) {
return
createStyleableColorProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, false);
}
/**
* Create a StyleableProperty<Color>. The initial value defaults to Color.BLACK and the
* inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Color>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Color> that was created by this method call.
*/
public final
StyleableProperty<
Color>
createStyleableColorProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Color>>
function) {
return
createStyleableColorProperty(
styleable,
propertyName,
cssProperty,
function,
Color.
BLACK, false);
}
/**
* Create a StyleableProperty<Color> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Color>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
Color>
createStyleableColorProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
Color>
cssMetaData = (
CssMetaData<S,
Color>)
getCssMetaData(
Color.class,
cssProperty);
return new
SimpleStyleableObjectProperty<
Color>(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<Duration>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<Duration> with initial value and inherit flag.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Duration>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Duration> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final
StyleableProperty<
Duration>
createStyleableDurationProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Duration>>
function,
Duration initialValue,
boolean
inherits) {
CssMetaData<S,
Duration>
cssMetaData =
createDurationCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableObjectProperty<
Duration>(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<Duration> with initial value. The inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Duration>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Duration> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final
StyleableProperty<
Duration>
createStyleableDurationProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Duration>>
function,
Duration initialValue) {
return
createStyleableDurationProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, false);
}
/**
* Create a StyleableProperty<Duration>. The initial value defaults to Duration.BLACK and the
* inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Duration>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Duration> that was created by this method call.
*/
public final
StyleableProperty<
Duration>
createStyleableDurationProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Duration>>
function) {
return
createStyleableDurationProperty(
styleable,
propertyName,
cssProperty,
function,
Duration.
UNKNOWN, false);
}
/**
* Create a StyleableProperty<Duration> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Duration>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
Duration>
createStyleableDurationProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
Duration>
cssMetaData = (
CssMetaData<S,
Duration>)
getCssMetaData(
Duration.class,
cssProperty);
return new
SimpleStyleableObjectProperty<
Duration>(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<Effect>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<Effect> with initial value and inherit flag.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Effect>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Effect> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final <E extends
Effect>
StyleableProperty<E>
createStyleableEffectProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<E>>
function,
E
initialValue,
boolean
inherits) {
CssMetaData<S,E>
cssMetaData =
createEffectCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableObjectProperty<E>(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<Effect> with initial value. The inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Effect>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Effect> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final <E extends
Effect>
StyleableProperty<E>
createStyleableEffectProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<E>>
function,
E
initialValue) {
return
createStyleableEffectProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, false);
}
/**
* Create a StyleableProperty<Effect>. The initial value is null and the inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Effect>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Effect> that was created by this method call.
*/
public final <E extends
Effect>
StyleableProperty<E>
createStyleableEffectProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<E>>
function) {
return
createStyleableEffectProperty(
styleable,
propertyName,
cssProperty,
function, null, false);
}
/**
* Create a StyleableProperty<Effect> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Effect>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
Effect>
createStyleableEffectProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
Effect>
cssMetaData = (
CssMetaData<S,
Effect>)
getCssMetaData(
Effect.class,
cssProperty);
return new
SimpleStyleableObjectProperty<
Effect>(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<? extends Enum<?>>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<E extends Enum<E>> with initial value and inherit flag.
* The <code>enumClass</code> parameter is the Class of the Enum that is the value of the property. For example,
* <code><pre>
* private static final StyleablePropertyFactory<MyControl> FACTORY = new StyleablePropertyFactory<>();
* StyleableProperty<Orientation> orientation =
* FACTORY.createStyleableEnumProperty(
* this,
* "orientation",
* "-my-orientation",
* s -> ((MyControl)s).orientation,
* Orientation.class,
* Orientation.HORIZONTAL,
* false);
* </pre></code>
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<E extends Enum<E>>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<E extends Enum<E>> that was created by this method call.
* @param enumClass The Enum class that is the type of the StyleableProperty<E extends Enum<E>>.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final <E extends
Enum<E>>
StyleableProperty<E>
createStyleableEnumProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<E>>
function,
Class<E>
enumClass,
E
initialValue,
boolean
inherits) {
CssMetaData<S,E>
cssMetaData =
createEnumCssMetaData(
enumClass,
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableObjectProperty<E>(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<E extends Enum<E>> with initial value. The inherit flag defaults to false.
* The <code>enumClass</code> parameter is the Class of the Enum that is the value of the property. For example,
* <code><pre>
* private static final StyleablePropertyFactory<MyControl> FACTORY = new StyleablePropertyFactory<>();
* StyleableProperty<Orientation> orientation =
* FACTORY.createStyleableEnumProperty(
* this,
* "orientation",
* "-my-orientation",
* s -> ((MyControl)s).orientation,
* Orientation.class,
* Orientation.HORIZONTAL);
* </pre></code>
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<E extends Enum<E>>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<E extends Enum<E>> that was created by this method call.
* @param enumClass The Enum class that is the type of the StyleableProperty<E extends Enum<E>>.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final <E extends
Enum<E>>
StyleableProperty<E>
createStyleableEnumProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<E>>
function,
Class<E>
enumClass,
E
initialValue) {
return
createStyleableEnumProperty(
styleable,
propertyName,
cssProperty,
function,
enumClass,
initialValue, false);
}
/**
* Create a StyleableProperty<E extends Enum<E>>. The initial value is null and inherit flag defaults to false.
* The <code>enumClass</code> parameter is the Class of the Enum that is the value of the property. For example,
* <code><pre>
* private static final StyleablePropertyFactory<MyControl> FACTORY = new StyleablePropertyFactory<>();
* StyleableProperty<Orientation> orientation =
* FACTORY.createStyleableEnumProperty(
* this,
* "orientation",
* "-my-orientation",
* s -> ((MyControl)s).orientation,
* Orientation.class);
* </pre></code>
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<E extends Enum<E>>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<E extends Enum<E>> that was created by this method call.
* @param enumClass The Enum class that is the type of the StyleableProperty<E extends Enum<E>>.
*/
public final <E extends
Enum<E>>
StyleableProperty<E>
createStyleableEnumProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<E>>
function,
Class<E>
enumClass) {
return
createStyleableEnumProperty(
styleable,
propertyName,
cssProperty,
function,
enumClass, null, false);
}
/**
* Create a StyleableProperty<E extends Enum<E>> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<E extends Enum<E>>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final <E extends
Enum<E>>
StyleableProperty<E>
createStyleableEffectProperty(
S
styleable,
String propertyName,
String cssProperty,
Class<E>
enumClass) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,E>
cssMetaData = (
CssMetaData<S,E>)
getCssMetaData(
enumClass,
cssProperty);
return new
SimpleStyleableObjectProperty<E>(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<Font>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<Font> with initial value and inherit flag.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Font>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Font> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final
StyleableProperty<
Font>
createStyleableFontProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Font>>
function,
Font initialValue,
boolean
inherits) {
CssMetaData<S,
Font>
cssMetaData =
createFontCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableObjectProperty<
Font>(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<Font> with initial value. The inherit flag defaults to true.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Font>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Font> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final
StyleableProperty<
Font>
createStyleableFontProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Font>>
function,
Font initialValue) {
return
createStyleableFontProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, true);
}
/**
* Create a StyleableProperty<Font>. The initial value defaults to {@link javafx.scene.text.Font#getDefault()}
* and the inherit flag defaults to true.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Font>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Font> that was created by this method call.
*/
public final
StyleableProperty<
Font>
createStyleableFontProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Font>>
function) {
return
createStyleableFontProperty(
styleable,
propertyName,
cssProperty,
function,
Font.
getDefault(), true);
}
/**
* Create a StyleableProperty<Font> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Font>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
Font>
createStyleableFontProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
Font>
cssMetaData = (
CssMetaData<S,
Font>)
getCssMetaData(
Font.class,
cssProperty);
return new
SimpleStyleableObjectProperty<
Font>(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<Insets>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<Inset> with initial value and inherit flag.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Inset>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Inset> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final
StyleableProperty<
Insets>
createStyleableInsetsProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Insets>>
function,
Insets initialValue,
boolean
inherits) {
CssMetaData<S,
Insets>
cssMetaData =
createInsetsCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableObjectProperty<
Insets>(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<Inset> with initial value. The inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Inset>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Inset> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final
StyleableProperty<
Insets>
createStyleableInsetsProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Insets>>
function,
Insets initialValue) {
return
createStyleableInsetsProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, false);
}
/**
* Create a StyleableProperty<Inset>. The initial value is {@link Insets#EMPTY} and the inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Inset>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Inset> that was created by this method call.
*/
public final
StyleableProperty<
Insets>
createStyleableInsetsProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Insets>>
function) {
return
createStyleableInsetsProperty(
styleable,
propertyName,
cssProperty,
function,
Insets.
EMPTY, false);
}
/**
* Create a StyleableProperty<Insets> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Insets>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
Insets>
createStyleableInsetsProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
Insets>
cssMetaData = (
CssMetaData<S,
Insets>)
getCssMetaData(
Insets.class,
cssProperty);
return new
SimpleStyleableObjectProperty<
Insets>(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<Paint>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<Paint> with initial value and inherit flag.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Paint>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Paint> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final
StyleableProperty<
Paint>
createStyleablePaintProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Paint>>
function,
Paint initialValue,
boolean
inherits) {
CssMetaData<S,
Paint>
cssMetaData =
createPaintCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableObjectProperty<
Paint>(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<Paint> with initial value. The inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Paint>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Paint> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final
StyleableProperty<
Paint>
createStyleablePaintProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Paint>>
function,
Paint initialValue) {
return
createStyleablePaintProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, false);
}
/**
* Create a StyleableProperty<Paint>. The initial value defautls to Color.BLACK and the inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Paint>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Paint> that was created by this method call.
*/
public final
StyleableProperty<
Paint>
createStyleablePaintProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Paint>>
function) {
return
createStyleablePaintProperty(
styleable,
propertyName,
cssProperty,
function,
Color.
BLACK, false);
}
/**
* Create a StyleableProperty<Paint> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Paint>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
Paint>
createStyleablePaintProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
Paint>
cssMetaData = (
CssMetaData<S,
Paint>)
getCssMetaData(
Paint.class,
cssProperty);
return new
SimpleStyleableObjectProperty<
Paint>(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<Number>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<Number> with initial value and inherit flag.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Number>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Number> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final
StyleableProperty<
Number>
createStyleableNumberProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Number>>
function,
Number initialValue,
boolean
inherits) {
CssMetaData<S,
Number>
cssMetaData =
createSizeCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableObjectProperty<>(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<Number> with initial value. The inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Number>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Number> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final
StyleableProperty<
Number>
createStyleableNumberProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Number>>
function,
Number initialValue) {
return
createStyleableNumberProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, false);
}
/**
* Create a StyleableProperty<Number>. The initial value defaults to zero. The inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Number>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<Number> that was created by this method call.
*/
public final
StyleableProperty<
Number>
createStyleableNumberProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
Number>>
function) {
return
createStyleableNumberProperty(
styleable,
propertyName,
cssProperty,
function, 0d, false);
}
/**
* Create a StyleableProperty<Number> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<Number>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
Number>
createStyleableNumberProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
Number>
cssMetaData = (
CssMetaData<S,
Number>)
getCssMetaData(
Number.class,
cssProperty);
return new
SimpleStyleableObjectProperty<
Number>(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<String>
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<String> with initial value and inherit flag.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<String>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<String> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final
StyleableProperty<
String>
createStyleableStringProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
String>>
function,
String initialValue,
boolean
inherits) {
CssMetaData<S,
String>
cssMetaData =
createStringCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableStringProperty(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<String> with initial value. The inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<String>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<String> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final
StyleableProperty<
String>
createStyleableStringProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
String>>
function,
String initialValue) {
return
createStyleableStringProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, false);
}
/**
* Create a StyleableProperty<String>. The initial value defaults to null and the inherit flag defaults to false.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<String>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<String> that was created by this method call.
*/
public final
StyleableProperty<
String>
createStyleableStringProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
String>>
function) {
return
createStyleableStringProperty(
styleable,
propertyName,
cssProperty,
function, null, false);
}
/**
* Create a StyleableProperty<String> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<String>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
String>
createStyleableStringProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
String>
cssMetaData = (
CssMetaData<S,
String>)
getCssMetaData(
String.class,
cssProperty);
return new
SimpleStyleableStringProperty(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// create StyleableProperty<String> where String is a URL
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a StyleableProperty<String> with initial value and inherit flag. Here, the String value represents
* a URL converted from a <a href="http://www.w3.org/TR/CSS21/syndata.html#uri">CSS</a> url("<path>").
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<String>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<String> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
*/
public final
StyleableProperty<
String>
createStyleableUrlProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
String>>
function,
String initialValue,
boolean
inherits) {
CssMetaData<S,
String>
cssMetaData =
createUrlCssMetaData(
cssProperty,
function,
initialValue,
inherits);
return new
SimpleStyleableStringProperty(
cssMetaData,
styleable,
propertyName,
initialValue);
}
/**
* Create a StyleableProperty<String> with initial value. The inherit flag defaults to false.
* Here, the String value represents a URL converted from a
* <a href="http://www.w3.org/TR/CSS21/syndata.html#uri">CSS</a> url("<path>").
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<String>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<String> that was created by this method call.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
*/
public final
StyleableProperty<
String>
createStyleableUrlProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
String>>
function,
String initialValue) {
return
createStyleableUrlProperty(
styleable,
propertyName,
cssProperty,
function,
initialValue, false);
}
/**
* Create a StyleableProperty<String> with initial value. The inherit flag defaults to false.
* Here, the String value represents a URL converted from a
* <a href="http://www.w3.org/TR/CSS21/syndata.html#uri">CSS</a> url("<path>").
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<String>
* @param cssProperty The CSS property name
* @param function A function that returns the StyleableProperty<String> that was created by this method call.
*/
public final
StyleableProperty<
String>
createStyleableUrlProperty(
S
styleable,
String propertyName,
String cssProperty,
Function<S,
StyleableProperty<
String>>
function) {
return
createStyleableUrlProperty(
styleable,
propertyName,
cssProperty,
function, null, false);
}
/**
* Create a StyleableProperty<String> using previously created CssMetaData for the given <code>cssProperty</code>.
* @param styleable The <code>this</code> reference of the returned property. This is also the property bean.
* @param propertyName The field name of the StyleableProperty<String>
* @param cssProperty The CSS property name
* @throws java.lang.IllegalArgumentException if <code>cssProperty</code> is null or empty
* @throws java.util.NoSuchElementException if the CssMetaData for <code>cssProperty</code> was not created prior to this method invocation
*/
public final
StyleableProperty<
String>
createStyleableUrlProperty(
S
styleable,
String propertyName,
String cssProperty) {
if (
cssProperty == null ||
cssProperty.
isEmpty()) {
throw new
IllegalArgumentException("cssProperty cannot be null or empty string");
}
@
SuppressWarnings("unchecked")
CssMetaData<S,
String>
cssMetaData = (
CssMetaData<S,
String>)
getCssMetaData(
String.class,
cssProperty);
return new
SimpleStyleableStringProperty(
cssMetaData,
styleable,
propertyName,
cssMetaData.
getInitialValue(
styleable));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, Boolean> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, Boolean> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Boolean> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Boolean>
createBooleanCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Boolean>>
function, final boolean
initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S,
Boolean>
cssMetaData =
(
CssMetaData<S,
Boolean>)
getCssMetaData(
Boolean.class,
property,
key -> {
final
StyleConverter<
String,
Boolean>
converter =
StyleConverter.
getBooleanConverter();
return new
SimpleCssMetaData<S,
Boolean>(
key,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, Boolean> with initial value, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Boolean> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Boolean>
createBooleanCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Boolean>>
function, final boolean
initialValue)
{
return
createBooleanCssMetaData(
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, Boolean> with initial value and inherit flag both defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Boolean> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Boolean>
createBooleanCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Boolean>>
function)
{
return
createBooleanCssMetaData(
property,
function, false, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, Color> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, Color> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Color> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Color>
createColorCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Color>>
function, final
Color initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S,
Color>
cssMetaData =
(
CssMetaData<S,
Color>)
getCssMetaData(
Color.class,
property,
key -> {
final
StyleConverter<
String,
Color>
converter =
StyleConverter.
getColorConverter();
return new
SimpleCssMetaData<S,
Color>(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, Color> with initial value, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Color> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Color>
createColorCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Color>>
function, final
Color initialValue)
{
return
createColorCssMetaData(
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, Color> with initial value of Color.BLACK, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Color> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Color>
createColorCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Color>>
function)
{
return
createColorCssMetaData(
property,
function,
Color.
BLACK, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, Duration> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, Duration> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Duration> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Duration>
createDurationCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Duration>>
function, final
Duration initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S,
Duration>
cssMetaData =
(
CssMetaData<S,
Duration>)
getCssMetaData(
Duration.class,
property,
key -> {
final
StyleConverter<?,
Duration>
converter =
StyleConverter.
getDurationConverter();
return new
SimpleCssMetaData<S,
Duration>(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, Duration> with initial value, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Duration> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Duration>
createDurationCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Duration>>
function, final
Duration initialValue)
{
return
createDurationCssMetaData(
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, Duration> with initial value of Duration.BLACK, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Duration> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Duration>
createDurationCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Duration>>
function)
{
return
createDurationCssMetaData(
property,
function,
Duration.
UNKNOWN, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, Effect> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, Effect> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Effect> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final <E extends
Effect>
CssMetaData<S, E>
createEffectCssMetaData(final
String property, final
Function<S,
StyleableProperty<E>>
function, final E
initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S, E>
cssMetaData =
(
CssMetaData<S, E>)
getCssMetaData(
Effect.class,
property,
key -> {
final
StyleConverter<
ParsedValue[],
Effect>
converter =
StyleConverter.
getEffectConverter();
return new
SimpleCssMetaData(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, Effect> with initial value, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Effect> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final <E extends
Effect>
CssMetaData<S, E>
createEffectCssMetaData(final
String property, final
Function<S,
StyleableProperty<E>>
function, final E
initialValue) {
return
createEffectCssMetaData(
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, Effect> with initial value of null, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Effect> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final <E extends
Effect>
CssMetaData<S, E>
createEffectCssMetaData(final
String property, final
Function<S,
StyleableProperty<E>>
function) {
return
createEffectCssMetaData(
property,
function, null, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, Enum> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, Enum> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Enum> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final <E extends
Enum<E>>
CssMetaData<S, E>
createEnumCssMetaData(
Class<? extends
Enum>
enumClass, final
String property, final
Function<S,
StyleableProperty<E>>
function, final E
initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S, E>
cssMetaData =
(
CssMetaData<S, E>)
getCssMetaData(
enumClass,
property,
key -> {
final
EnumConverter<E>
converter = new
EnumConverter(
enumClass);
return new
SimpleCssMetaData<S, E>(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, Enum> with initial value, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Enum> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final <E extends
Enum<E>>
CssMetaData<S, E>
createEnumCssMetaData(
Class<? extends
Enum>
enumClass, final
String property, final
Function<S,
StyleableProperty<E>>
function, final E
initialValue) {
return
createEnumCssMetaData(
enumClass,
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, Enum> with initial value of null, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Enum> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final <E extends
Enum<E>>
CssMetaData<S, E>
createEnumCssMetaData(
Class<? extends
Enum>
enumClass, final
String property, final
Function<S,
StyleableProperty<E>>
function) {
return
createEnumCssMetaData(
enumClass,
property,
function, null, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, Font> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, Font> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Font> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Font>
createFontCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Font>>
function, final
Font initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S,
Font>
cssMetaData =
(
CssMetaData<S,
Font>)
getCssMetaData(
Font.class,
property,
key -> {
final
StyleConverter<
ParsedValue[],
Font>
converter =
StyleConverter.
getFontConverter();
return new
SimpleCssMetaData<S,
Font>(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, Font> with initial value, and inherit flag defaulting to true.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Font> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Font>
createFontCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Font>>
function, final
Font initialValue) {
return
createFontCssMetaData(
property,
function,
initialValue, true);
}
/**
* Create a CssMetaData<S, Font> with initial value of {@link javafx.scene.text.Font#getDefault()}, and inherit flag defaulting to true.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Font> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Font>
createFontCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Font>>
function) {
return
createFontCssMetaData(
property,
function,
Font.
getDefault(), true);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, Insets> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, Insets> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Insets> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Insets>
createInsetsCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Insets>>
function, final
Insets initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S,
Insets>
cssMetaData =
(
CssMetaData<S,
Insets>)
getCssMetaData(
Insets.class,
property,
key -> {
final
StyleConverter<
ParsedValue[],
Insets>
converter =
StyleConverter.
getInsetsConverter();
return new
SimpleCssMetaData<S,
Insets>(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, Insets> with initial value, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Insets> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Insets>
createInsetsCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Insets>>
function, final
Insets initialValue)
{
return
createInsetsCssMetaData(
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, Insets> with initial value of {@link javafx.geometry.Insets.EMPTY}, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Insets> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Insets>
createInsetsCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Insets>>
function)
{
return
createInsetsCssMetaData(
property,
function,
Insets.
EMPTY, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, Paint> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, Paint> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Paint> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Paint>
createPaintCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Paint>>
function, final
Paint initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S,
Paint>
cssMetaData =
(
CssMetaData<S,
Paint>)
getCssMetaData(
Paint.class,
property,
key -> {
final
StyleConverter<
ParsedValue<?,
Paint>,
Paint>
converter =
StyleConverter.
getPaintConverter();
return new
SimpleCssMetaData<S,
Paint>(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, Paint> with initial value, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Paint> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Paint>
createPaintCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Paint>>
function, final
Paint initialValue) {
return
createPaintCssMetaData(
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, Paint> with initial value of Color.BLACK, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Paint> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Paint>
createPaintCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Paint>>
function) {
return
createPaintCssMetaData(
property,
function,
Color.
BLACK, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, Number> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, Number> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Number> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Number>
createSizeCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Number>>
function, final
Number initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S,
Number>
cssMetaData =
(
CssMetaData<S,
Number>)
getCssMetaData(
Number.class,
property,
key -> {
final
StyleConverter<?,
Number>
converter =
StyleConverter.
getSizeConverter();
return new
SimpleCssMetaData<S,
Number>(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, Number> with initial value, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Number> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Number>
createSizeCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Number>>
function, final
Number initialValue) {
return
createSizeCssMetaData(
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, Number> with initial value of <code>0d</code>, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<Number> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
Number>
createSizeCssMetaData(final
String property, final
Function<S,
StyleableProperty<
Number>>
function) {
return
createSizeCssMetaData(
property,
function, 0d, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, String> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, String> with initial value, and inherit flag.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<String> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
String>
createStringCssMetaData(final
String property, final
Function<S,
StyleableProperty<
String>>
function, final
String initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S,
String>
cssMetaData =
(
CssMetaData<S,
String>)
getCssMetaData(
String.class,
property,
key -> {
final
StyleConverter<
String,
String>
converter =
StyleConverter.
getStringConverter();
return new
SimpleCssMetaData<S,
String>(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, String> with initial value, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<String> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
String>
createStringCssMetaData(final
String property, final
Function<S,
StyleableProperty<
String>>
function, final
String initialValue) {
return
createStringCssMetaData(
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, String> with initial value of null, and inherit flag defaulting to false.
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<String> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
String>
createStringCssMetaData(final
String property, final
Function<S,
StyleableProperty<
String>>
function) {
return
createStringCssMetaData(
property,
function, null, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// create CssMetaData<S, String> //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Create a CssMetaData<S, String> with initial value, and inherit flag.
* Here, the String value represents a URL converted from a
* <a href="http://www.w3.org/TR/CSS21/syndata.html#uri">CSS</a> url("<path>").
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<String> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @param inherits Whether or not the CSS style can be inherited by child nodes
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
String>
createUrlCssMetaData(final
String property, final
Function<S,
StyleableProperty<
String>>
function, final
String initialValue, final boolean
inherits)
{
if (
property == null ||
property.
isEmpty()) {
throw new
IllegalArgumentException("property cannot be null or empty string");
}
if (
function == null) {
throw new
IllegalArgumentException("function cannot be null");
}
@
SuppressWarnings("unchecked") // getCssMetaData checks and will throw a ClassCastException
CssMetaData<S,
String>
cssMetaData =
(
CssMetaData<S,
String>)
getCssMetaData(java.net.
URL.class,
property,
key -> {
final
StyleConverter<
ParsedValue[],
String>
converter =
StyleConverter.
getUrlConverter();
return new
SimpleCssMetaData<S,
String>(
property,
function,
converter,
initialValue,
inherits);
});
return
cssMetaData;
}
/**
* Create a CssMetaData<S, String> with initial value, and inherit flag defaulting to false.
* Here, the String value represents a URL converted from a
* <a href="http://www.w3.org/TR/CSS21/syndata.html#uri">CSS</a> url("<path>").
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<String> that corresponds to this CssMetaData.
* @param initialValue The initial value of the property. CSS may reset the property to this value.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
String>
createUrlCssMetaData(final
String property, final
Function<S,
StyleableProperty<
String>>
function, final
String initialValue) {
return
createUrlCssMetaData(
property,
function,
initialValue, false);
}
/**
* Create a CssMetaData<S, String> with initial value of null, and inherit flag defaulting to false.
* Here, the String value represents a URL converted from a
* <a href="http://www.w3.org/TR/CSS21/syndata.html#uri">CSS</a> url("<path>").
* @param property The CSS property name.
* @param function A function that returns the StyleableProperty<String> that corresponds to this CssMetaData.
* @throws java.lang.IllegalArgumentException if <code>property</code> is null or an empty string, or <code>function</code> is null.
*/
public final
CssMetaData<S,
String>
createUrlCssMetaData(final
String property, final
Function<S,
StyleableProperty<
String>>
function) {
return
createUrlCssMetaData(
property,
function, null, false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// SimpleCssMetaData is an implementation of CssMetaData that uses a Function<S, StyleableProperty<V>> //
// to get the StyleableProperty from the Styleable. This is the function that is passed in on the
// various create methods.
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private static class
SimpleCssMetaData<S extends
Styleable,V> extends
CssMetaData<S,V> {
SimpleCssMetaData(
final
String property,
final
Function<S,
StyleableProperty<V>>
function,
final
StyleConverter<?, V>
converter,
final V
initialValue,
final boolean
inherits)
{
super(
property,
converter,
initialValue,
inherits);
this.
function =
function;
}
private final
Function<S,
StyleableProperty<V>>
function;
public final boolean
isSettable(S
styleable) {
final
StyleableProperty<V>
prop =
getStyleableProperty(
styleable);
if (
prop instanceof
Property) {
return !((
Property)
prop).
isBound();
}
// can't set this property if getStyleableProperty returns null!
return
prop != null;
}
/** {@inheritDoc} */
@
Override
public final
StyleableProperty<V>
getStyleableProperty(S
styleable) {
if (
styleable != null) {
StyleableProperty<V>
property =
function.
apply(
styleable);
return
property;
}
return null;
}
}
// for testing only
void
clearDataForTesting() {
metaDataMap.
clear();
metaDataList.
clear();
}
private
CssMetaData<S, ?>
getCssMetaData(final
Class ofClass,
String property) {
return
getCssMetaData(
ofClass,
property, null);
}
private
CssMetaData<S, ?>
getCssMetaData(final
Class ofClass,
String property, final
Function<
String,
CssMetaData<S,?>>
createFunction) {
final
String key =
property.
toLowerCase();
Pair<
Class,
CssMetaData<S,?>>
entry =
metaDataMap.
get(
key);
if (
entry != null) {
if (
entry.
getKey() ==
ofClass) {
return
entry.
getValue();
} else {
throw new
ClassCastException("CssMetaData value is not " +
ofClass + ": " +
entry.
getValue());
}
} else if (
createFunction == null) {
throw new
NoSuchElementException("No CssMetaData for " +
key);
}
// Entry was null
CssMetaData<S,?>
cssMetaData =
createFunction.
apply(
key);
metaDataMap.
put(
key, new
Pair(
ofClass,
cssMetaData));
metaDataList.
add(
cssMetaData);
return
cssMetaData;
}
private final
Map<
String,
Pair<
Class,
CssMetaData<S,?>>>
metaDataMap;
private final
List<
CssMetaData<? extends
Styleable,?>>
unmodifiableMetaDataList;
private final
List<
CssMetaData<? extends
Styleable,?>>
metaDataList;
}