javafx: Simplify resources for inspection of redundant FXML attributes and tags,...
authorPavel Dolgov <pavel.dolgov@jetbrains.com>
Thu, 3 Mar 2016 13:15:59 +0000 (16:15 +0300)
committerPavel Dolgov <pavel.dolgov@jetbrains.com>
Thu, 3 Mar 2016 13:15:59 +0000 (16:15 +0300)
plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxGenerateDefaultPropertyValuesScript.java
plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java
plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/inspections/JavaFxRedundantPropertyValueInspection.java
plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/inspections/JavaFxRedundantPropertyValueInspection8.txt
plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyAttributeDescriptor.java

index 7a68e1756e5c83d8eb915f8f8c62d71557fb7fc0..6ad78d30c6eff376ca14849de237e746061687ef 100644 (file)
@@ -2,9 +2,14 @@ package org.jetbrains.plugins.javaFX.fxml;
 
 import javafx.application.Application;
 import javafx.application.Platform;
+import javafx.geometry.NodeOrientation;
+import javafx.geometry.Pos;
+import javafx.scene.AccessibleRole;
 import javafx.scene.Scene;
+import javafx.scene.chart.LineChart;
 import javafx.scene.control.Button;
 import javafx.scene.layout.StackPane;
+import javafx.stage.PopupWindow;
 import javafx.stage.Stage;
 import org.jetbrains.annotations.NotNull;
 
@@ -20,7 +25,7 @@ import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
 /**
- * This is not a test, this is a config generator for JavaFxRedundantPropertyValueInspection
+ * This is not a test, this is a resource generator for JavaFxRedundantPropertyValueInspection
  * <p>
  * When launched without arguments it produces default values for JavaFX classes having default constructor and their superclasses, including some (but not all) abstract classes
  * <p>
@@ -59,70 +64,57 @@ public class JavaFxGenerateDefaultPropertyValuesScript extends Application {
     });
   }
 
-  private static final Map<Class, Class> ourToBoxed = new HashMap<>();
+  private static final Map<String, Object> ourFromSource = new TreeMap<>();
 
   static {
-    ourToBoxed.put(Boolean.TYPE, Boolean.class);
-    ourToBoxed.put(Character.TYPE, Character.class);
-    ourToBoxed.put(Byte.TYPE, Byte.class);
-    ourToBoxed.put(Short.TYPE, Short.class);
-    ourToBoxed.put(Integer.TYPE, Integer.class);
-    ourToBoxed.put(Long.TYPE, Long.class);
-    ourToBoxed.put(Float.TYPE, Float.class);
-    ourToBoxed.put(Double.TYPE, Double.class);
-  }
-
-  private static final Map<String, String> ourFromSource = new TreeMap<>();
-
-  static {
-    ourFromSource.put("javafx.concurrent.ScheduledService#maximumFailureCount", "Integer=2147483647");
-    ourFromSource.put("javafx.concurrent.ScheduledService#restartOnFailure", "Boolean=true");
-    ourFromSource.put("javafx.scene.Node#accessibleRole", "Enum=NODE");
-    ourFromSource.put("javafx.scene.Node#focusTraversable", "Boolean=false");
-    ourFromSource.put("javafx.scene.Node#nodeOrientation", "Enum=INHERIT");
-    ourFromSource.put("javafx.scene.Node#pickOnBounds", "Boolean=false");
-    ourFromSource.put("javafx.scene.SubScene#height", "Double=0.0");
-    ourFromSource.put("javafx.scene.SubScene#width", "Double=0.0");
-    ourFromSource.put("javafx.scene.chart.AreaChart#createSymbols", "Boolean=true");
-    ourFromSource.put("javafx.scene.chart.Axis#label", "String=");
-    ourFromSource.put("javafx.scene.chart.BarChart#barGap", "Double=4.0");
-    ourFromSource.put("javafx.scene.chart.BarChart#categoryGap", "Double=10.0");
-    ourFromSource.put("javafx.scene.chart.Chart#title", "String=");
-    ourFromSource.put("javafx.scene.chart.LineChart#axisSortingPolicy", "Enum=X_AXIS");
-    ourFromSource.put("javafx.scene.chart.LineChart#createSymbols", "Boolean=true");
-    ourFromSource.put("javafx.scene.chart.StackedAreaChart#createSymbols", "Boolean=true");
-    ourFromSource.put("javafx.scene.chart.StackedBarChart#categoryGap", "Double=10.0");
-    ourFromSource.put("javafx.scene.chart.XYChart#alternativeColumnFillVisible", "Boolean=false");
-    ourFromSource.put("javafx.scene.chart.XYChart#alternativeRowFillVisible", "Boolean=true");
-    ourFromSource.put("javafx.scene.chart.XYChart#horizontalGridLinesVisible", "Boolean=true");
-    ourFromSource.put("javafx.scene.chart.XYChart#horizontalZeroLineVisible", "Boolean=true");
-    ourFromSource.put("javafx.scene.chart.XYChart#verticalGridLinesVisible", "Boolean=true");
-    ourFromSource.put("javafx.scene.chart.XYChart#verticalZeroLineVisible", "Boolean=true");
-    ourFromSource.put("javafx.scene.control.ComboBoxBase#editable", "Boolean=false");
-    ourFromSource.put("javafx.scene.control.CustomMenuItem#hideOnClick", "Boolean=true");
-    ourFromSource.put("javafx.scene.control.Labeled#alignment", "Enum=CENTER_LEFT");
-    ourFromSource.put("javafx.scene.control.Labeled#mnemonicParsing", "Boolean=false");
-    ourFromSource.put("javafx.scene.control.SpinnerValueFactory#wrapAround", "Boolean=false");
-    ourFromSource.put("javafx.scene.control.TableSelectionModel#cellSelectionEnabled", "Boolean=false");
-    ourFromSource.put("javafx.scene.media.AudioClip#balance", "Double=0.0");
-    ourFromSource.put("javafx.scene.media.AudioClip#cycleCount", "Integer=1");
-    ourFromSource.put("javafx.scene.media.AudioClip#pan", "Double=0.0");
-    ourFromSource.put("javafx.scene.media.AudioClip#priority", "Integer=0");
-    ourFromSource.put("javafx.scene.media.AudioClip#rate", "Double=1.0");
-    ourFromSource.put("javafx.scene.media.AudioClip#volume", "Double=1.0");
-    ourFromSource.put("javafx.scene.media.AudioEqualizer#enabled", "Boolean=false");
-    ourFromSource.put("javafx.scene.media.MediaPlayer#audioSpectrumInterval", "Double=0.1");
-    ourFromSource.put("javafx.scene.media.MediaPlayer#audioSpectrumNumBands", "Integer=128");
-    ourFromSource.put("javafx.scene.media.MediaPlayer#audioSpectrumThreshold", "Integer=-60");
-    ourFromSource.put("javafx.scene.media.MediaPlayer#autoPlay", "Boolean=false");
-    ourFromSource.put("javafx.scene.media.MediaPlayer#balance", "Double=0.0");
-    ourFromSource.put("javafx.scene.media.MediaPlayer#cycleCount", "Integer=1");
-    ourFromSource.put("javafx.scene.media.MediaPlayer#mute", "Boolean=false");
-    ourFromSource.put("javafx.scene.media.MediaPlayer#rate", "Double=1.0");
-    ourFromSource.put("javafx.scene.media.MediaPlayer#volume", "Double=1.0");
-    ourFromSource.put("javafx.stage.PopupWindow#anchorLocation", "Enum=WINDOW_TOP_LEFT");
-    ourFromSource.put("javafx.stage.PopupWindow#autoHide", "Boolean=false");
-    ourFromSource.put("javafx.stage.PopupWindow#consumeAutoHidingEvents", "Boolean=true");
+    ourFromSource.put("javafx.concurrent.ScheduledService#maximumFailureCount", Integer.MAX_VALUE);
+    ourFromSource.put("javafx.concurrent.ScheduledService#restartOnFailure", true);
+    ourFromSource.put("javafx.scene.Node#accessibleRole", AccessibleRole.NODE);
+    ourFromSource.put("javafx.scene.Node#focusTraversable", false);
+    ourFromSource.put("javafx.scene.Node#nodeOrientation", NodeOrientation.INHERIT);
+    ourFromSource.put("javafx.scene.Node#pickOnBounds", false);
+    ourFromSource.put("javafx.scene.SubScene#height", 0.0);
+    ourFromSource.put("javafx.scene.SubScene#width", 0.0);
+    ourFromSource.put("javafx.scene.chart.AreaChart#createSymbols", true);
+    ourFromSource.put("javafx.scene.chart.Axis#label", "");
+    ourFromSource.put("javafx.scene.chart.BarChart#barGap", 4.0);
+    ourFromSource.put("javafx.scene.chart.BarChart#categoryGap", 10.0);
+    ourFromSource.put("javafx.scene.chart.Chart#title", "");
+    ourFromSource.put("javafx.scene.chart.LineChart#axisSortingPolicy", LineChart.SortingPolicy.X_AXIS);
+    ourFromSource.put("javafx.scene.chart.LineChart#createSymbols", true);
+    ourFromSource.put("javafx.scene.chart.StackedAreaChart#createSymbols", true);
+    ourFromSource.put("javafx.scene.chart.StackedBarChart#categoryGap", 10.0);
+    ourFromSource.put("javafx.scene.chart.XYChart#alternativeColumnFillVisible", false);
+    ourFromSource.put("javafx.scene.chart.XYChart#alternativeRowFillVisible", true);
+    ourFromSource.put("javafx.scene.chart.XYChart#horizontalGridLinesVisible", true);
+    ourFromSource.put("javafx.scene.chart.XYChart#horizontalZeroLineVisible", true);
+    ourFromSource.put("javafx.scene.chart.XYChart#verticalGridLinesVisible", true);
+    ourFromSource.put("javafx.scene.chart.XYChart#verticalZeroLineVisible", true);
+    ourFromSource.put("javafx.scene.control.ComboBoxBase#editable", false);
+    ourFromSource.put("javafx.scene.control.CustomMenuItem#hideOnClick", true);
+    ourFromSource.put("javafx.scene.control.Labeled#alignment", Pos.CENTER_LEFT);
+    ourFromSource.put("javafx.scene.control.Labeled#mnemonicParsing", false);
+    ourFromSource.put("javafx.scene.control.SpinnerValueFactory#wrapAround", false);
+    ourFromSource.put("javafx.scene.control.TableSelectionModel#cellSelectionEnabled", false);
+    ourFromSource.put("javafx.scene.media.AudioClip#balance", 0.0);
+    ourFromSource.put("javafx.scene.media.AudioClip#cycleCount", 1);
+    ourFromSource.put("javafx.scene.media.AudioClip#pan", 0.0);
+    ourFromSource.put("javafx.scene.media.AudioClip#priority", 0);
+    ourFromSource.put("javafx.scene.media.AudioClip#rate", 1.0);
+    ourFromSource.put("javafx.scene.media.AudioClip#volume", 1.0);
+    ourFromSource.put("javafx.scene.media.AudioEqualizer#enabled", false);
+    ourFromSource.put("javafx.scene.media.MediaPlayer#audioSpectrumInterval", 0.1);
+    ourFromSource.put("javafx.scene.media.MediaPlayer#audioSpectrumNumBands", 128);
+    ourFromSource.put("javafx.scene.media.MediaPlayer#audioSpectrumThreshold", -60);
+    ourFromSource.put("javafx.scene.media.MediaPlayer#autoPlay", false);
+    ourFromSource.put("javafx.scene.media.MediaPlayer#balance", 0.0);
+    ourFromSource.put("javafx.scene.media.MediaPlayer#cycleCount", 1);
+    ourFromSource.put("javafx.scene.media.MediaPlayer#mute", false);
+    ourFromSource.put("javafx.scene.media.MediaPlayer#rate", 1.0);
+    ourFromSource.put("javafx.scene.media.MediaPlayer#volume", 1.0);
+    ourFromSource.put("javafx.stage.PopupWindow#anchorLocation", PopupWindow.AnchorLocation.WINDOW_TOP_LEFT);
+    ourFromSource.put("javafx.stage.PopupWindow#autoHide", false);
+    ourFromSource.put("javafx.stage.PopupWindow#consumeAutoHidingEvents", true);
   }
 
   private static final Set<String> ourSkippedProperties = new HashSet<>(
@@ -130,56 +122,6 @@ public class JavaFxGenerateDefaultPropertyValuesScript extends Application {
                   "javafx.scene.web.WebEngine#userAgent",
                   "javafx.scene.control.ButtonBar#buttonOrder"));
 
-  static class TypedValue {
-
-    private final String kind;
-    private final String value;
-
-    TypedValue(@NotNull String kind, @NotNull String value) {
-      this.kind = kind;
-      this.value = value;
-    }
-
-    public String getKind() {
-      return kind;
-    }
-
-    public String getValue() {
-      return value;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (this == o) return true;
-      if (!(o instanceof TypedValue)) return false;
-
-      TypedValue that = (TypedValue)o;
-      return kind.equals(that.kind) && value.equals(that.value);
-    }
-
-    @Override
-    public int hashCode() {
-      return kind.hashCode() ^ value.hashCode();
-    }
-
-    @Override
-    public String toString() {
-      return kind + ':' + value;
-    }
-  }
-
-  static class ContainedValue extends TypedValue {
-    private final String declaringClass;
-
-    public ContainedValue(@NotNull String kind, @NotNull String value, @NotNull String declaringClass) {
-      super(kind, value);
-      this.declaringClass = declaringClass;
-    }
-
-    public String getDeclaringClass() {
-      return declaringClass;
-    }
-  }
 
   /**
    * Attempt to instantiate JavaFX classes on the FX thread, obtain default property values from instantiated objects.
@@ -187,8 +129,8 @@ public class JavaFxGenerateDefaultPropertyValuesScript extends Application {
   private static void generate() {
     System.out.println("--- JavaFX default property values ---");
 
-    final Map<String, Map<String, ContainedValue>> containedProperties = new TreeMap<>();
-    final Map<String, Map<String, TypedValue>> declaredProperties = new TreeMap<>();
+    final Map<String, Map<String, DefaultValue>> defaultPropertyValues = new TreeMap<>();
+    final Map<String, Map<String, String>> declaredProperties = new TreeMap<>();
     final Map<String, Map<String, Set<String>>> overriddenProperties = new TreeMap<>();
     final Map<String, String> superClasses = new TreeMap<>();
     try (final ZipInputStream zip = new ZipInputStream(new FileInputStream(new File(BINARIES_PATH)))) {
@@ -213,7 +155,7 @@ public class JavaFxGenerateDefaultPropertyValuesScript extends Application {
             }
           }
 
-          Object obj = null;
+          Object instance = null;
           for (PropertyDescriptor desc : info.getPropertyDescriptors()) {
             final String propName = desc.getName();
             final String propQualifiedName = currentClass.getName() + "#" + propName;
@@ -223,48 +165,41 @@ public class JavaFxGenerateDefaultPropertyValuesScript extends Application {
             if (setter == null || !hasBinding) continue;
             final Type type = setter.getGenericParameterTypes()[0];
 
-            if (type instanceof Class) {
-              final Class<?> paramCls = (Class)type;
-              final String kind = kind(paramCls);
-              if (kind != null) {
-                if (obj == null) {
-                  obj = instantiate(currentClass);
-                  if (obj == null) break;
-                }
-                final Object value;
-                final Method getter = desc.getReadMethod();
-                try {
-                  value = getter.invoke(obj);
-                }
-                catch (IllegalAccessException | InvocationTargetException e) {
-                  throw new RuntimeException("Can't invoke " + getter + " on " + currentClass, e);
+            if (type instanceof Class && isSupportedPropertyType((Class)type)) {
+              if (instance == null) {
+                instance = instantiate(currentClass);
+                if (instance == null) break;
+              }
+              final Object value;
+              final Method getter = desc.getReadMethod();
+              try {
+                value = getter.invoke(instance);
+              }
+              catch (IllegalAccessException | InvocationTargetException e) {
+                throw new RuntimeException("Can't invoke " + getter + " on " + currentClass, e);
+              }
+              if (value != null) {
+                final Class<?> declaringClass = getter.getDeclaringClass();
+                final DefaultValue newValue = new DefaultValue(value, declaringClass.getName());
+                if (declaringClass.getName().startsWith("javafx")) {
+                  defaultPropertyValues
+                    .computeIfAbsent(currentClass.getName(), unused -> new TreeMap<>())
+                    .put(propName, newValue);
                 }
-                if (value != null) {
-                  if (!value.equals(validate(paramCls, value))) {
-                    throw new RuntimeException("Invalid " + currentClass + "#" + propName + ":" + paramCls + "=" + value);
-                  }
-                  final Class<?> declaringClass = getter.getDeclaringClass();
-                  final ContainedValue newValue = new ContainedValue(kind, String.valueOf(value), declaringClass.getName());
-                  if (declaringClass.getName().startsWith("javafx")) {
-                    containedProperties
-                      .computeIfAbsent(currentClass.getName(), unused -> new TreeMap<>())
-                      .put(propName, newValue);
-                  }
 
-                  final Map<String, TypedValue> shareableProperties =
-                    declaredProperties.computeIfAbsent(declaringClass.getName(), unused -> new TreeMap<>());
-                  final TypedValue sharedValue = shareableProperties.get(propName);
+                final Map<String, String> shareableProperties =
+                  declaredProperties.computeIfAbsent(declaringClass.getName(), unused -> new TreeMap<>());
+                final String sharedValue = shareableProperties.get(propName);
 
-                  if (sharedValue == null) {
-                    shareableProperties.put(propName, newValue);
-                  }
-                  else if (!sharedValue.equals(newValue)) {
-                    final Set<String> multipleValues = overriddenProperties
-                      .computeIfAbsent(declaringClass.getName(), unused -> new TreeMap<>())
-                      .computeIfAbsent(propName, unused -> new TreeSet<>());
-                    multipleValues.add(sharedValue.getValue());
-                    multipleValues.add(newValue.getValue());
-                  }
+                if (sharedValue == null) {
+                  shareableProperties.put(propName, newValue.getValueText());
+                }
+                else if (!sharedValue.equals(newValue.getValueText())) {
+                  final Set<String> multipleValues = overriddenProperties
+                    .computeIfAbsent(declaringClass.getName(), unused -> new TreeMap<>())
+                    .computeIfAbsent(propName, unused -> new TreeSet<>());
+                  multipleValues.add(sharedValue);
+                  multipleValues.add(newValue.getValueText());
                 }
               }
             }
@@ -277,60 +212,51 @@ public class JavaFxGenerateDefaultPropertyValuesScript extends Application {
     }
 
     System.out.println("-------- Collected from sources ---------");
-    ourFromSource.forEach((k, v) -> System.out.println(k + ":" + v));
+    ourFromSource.forEach((qualifiedPropName, value) -> System.out.println(qualifiedPropName + "=" + value));
 
     System.out.println("-------- Shared (not overridden) ---------");
     declaredProperties.forEach(
       (className, propertyMap) -> {
         final Map<String, Set<String>> multipleValues = overriddenProperties.getOrDefault(className, Collections.emptyMap());
-        propertyMap.forEach((propName, typedValue) -> {
+        propertyMap.forEach((propName, valueText) -> {
           if (!multipleValues.containsKey(propName)) {
-            System.out.println(className + "#" + propName + ":" + typedValue.getKind() + "=" + typedValue.getValue());
+            System.out.println(className + "#" + propName + "=" + valueText);
           }
         });
       });
     System.out.println("-------- Overridden in subclass ---------");
-    final Map<String, Map<String, ContainedValue>> fromSource = new TreeMap<>();
-    ourFromSource.forEach((classAndPropName, kindAndValue) -> {
-      final int p1 = classAndPropName.indexOf('#');
-      if (p1 > 0 && p1 < classAndPropName.length()) {
-        final String className = classAndPropName.substring(0, p1);
-        final String propName = classAndPropName.substring(p1 + 1);
-        final int p3 = kindAndValue.indexOf('=');
-        if (p3 > 0 && p3 < kindAndValue.length()) {
-          final String kind = kindAndValue.substring(0, p3);
-          final String value = kindAndValue.substring(p3 + 1);
-          final Map<String, ContainedValue> propMap = fromSource.computeIfAbsent(className, unused -> new TreeMap<>());
-          if (!propMap.containsKey(propName)) {
-            final ContainedValue valueFromSource = new ContainedValue(kind, value, className);
-            propMap.put(propName, valueFromSource);
-          }
-        }
+    final Map<String, Map<String, DefaultValue>> fromSource = new TreeMap<>();
+    ourFromSource.forEach((qualifiedPropName, value) -> {
+      final int p = qualifiedPropName.indexOf('#');
+      if (p > 0 && p < qualifiedPropName.length()) {
+        final String className = qualifiedPropName.substring(0, p);
+        final String propName = qualifiedPropName.substring(p + 1);
+        fromSource.computeIfAbsent(className, unused -> new TreeMap<>())
+          .computeIfAbsent(propName, unused -> new DefaultValue(value, className));
       }
     });
-    containedProperties.forEach(
+    defaultPropertyValues.forEach(
       (className, propertyMap) -> propertyMap.forEach(
         (propName, propValue) -> {
-          final ContainedValue sourceValue = fromSource.getOrDefault(className, Collections.emptyMap()).get(propName);
-          if (sourceValue != null &&
-              sourceValue.equals(propValue)) {
+          final DefaultValue sourceValue = fromSource.getOrDefault(className, Collections.emptyMap()).get(propName);
+          if (sourceValue != null && areValuesEqual(propValue, sourceValue)) {
             return;
           }
           final Map<String, Set<String>> multipleValues = overriddenProperties.get(propValue.getDeclaringClass());
           if (multipleValues != null && multipleValues.get(propName) != null) {
             boolean sameValueInSuperClass = false;
             for (String scName = superClasses.get(className); scName != null; scName = superClasses.get(scName)) {
-              final Map<String, ContainedValue> superPropMap = containedProperties.getOrDefault(scName, fromSource.get(scName));
+              final Map<String, DefaultValue> superPropMap = defaultPropertyValues.getOrDefault(scName, fromSource.get(scName));
               if (superPropMap != null) {
-                ContainedValue superValue = superPropMap.get(propName);
+                DefaultValue superValue = superPropMap.get(propName);
                 if (superValue != null) {
-                  sameValueInSuperClass = superValue.equals(propValue);
+                  sameValueInSuperClass = areValuesEqual(propValue, superValue);
                   break;
                 }
               }
             }
             if (!sameValueInSuperClass) {
-              System.out.println(className + "#" + propName + ":" + propValue.getKind() + "=" + propValue.getValue());
+              System.out.println(className + "#" + propName + "=" + propValue.getValueText());
             }
           }
         }));
@@ -343,46 +269,17 @@ public class JavaFxGenerateDefaultPropertyValuesScript extends Application {
     ourSkippedProperties.forEach(propName -> System.out.println("-- " + propName));
   }
 
-  private static String kind(Class aCls) {
-    String kind = null;
-    if (aCls.isPrimitive()) {
-      kind = ourToBoxed.get(aCls).getSimpleName();
-    }
-    else if (aCls.isEnum()) {
-      kind = "Enum";
-    }
-    else if (Number.class.isAssignableFrom(aCls) || Boolean.class.isAssignableFrom(aCls) || Character.class.isAssignableFrom(aCls)) {
-      kind = aCls.getSimpleName();
-    }
-    else if (CharSequence.class.isAssignableFrom(aCls)) {
-      kind = "String";
-    }
-    return kind;
+  private static boolean areValuesEqual(DefaultValue first, DefaultValue second) {
+    return second.getValueText().equals(first.getValueText());
   }
 
-  private static Object validate(Class<?> aCls, Object val) {
-    try {
-      if (aCls.isPrimitive()) {
-        aCls = ourToBoxed.get(aCls);
-        Method valueOf = aCls.getDeclaredMethod("valueOf", String.class);
-        return valueOf.invoke(null, String.valueOf(val));
-      }
-      if (Number.class.isAssignableFrom(aCls) || Boolean.class.isAssignableFrom(aCls) || Character.class.isAssignableFrom(aCls)) {
-        Method valueOf = aCls.getDeclaredMethod("valueOf", String.class);
-        return valueOf.invoke(null, String.valueOf(val));
-      }
-      if (CharSequence.class.isAssignableFrom(aCls)) {
-        return val;
-      }
-      if (aCls.isEnum()) {
-        Method valueOf = aCls.getDeclaredMethod("valueOf", String.class);
-        return valueOf.invoke(null, String.valueOf(val));
-      }
-      throw new IllegalStateException("Cannot cast " + val + " to unsupported class " + aCls);
-    }
-    catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
-      throw new IllegalStateException("Cannot cast " + val + " to " + aCls, e);
-    }
+  private static boolean isSupportedPropertyType(Class<?> propertyClass) {
+    return propertyClass.isPrimitive() ||
+           propertyClass.isEnum() ||
+           Number.class.isAssignableFrom(propertyClass) ||
+           Boolean.class.isAssignableFrom(propertyClass) ||
+           Character.class.isAssignableFrom(propertyClass) ||
+           CharSequence.class.isAssignableFrom(propertyClass);
   }
 
   private static Object instantiate(Class<?> aClass) {
@@ -530,4 +427,27 @@ public class JavaFxGenerateDefaultPropertyValuesScript extends Application {
     System.out.println("--- Default values collected from JavaDoc and declarations. To be reviewed and manually edited ---");
     props.forEach((n, v) -> System.out.println(n + "=" + v));
   }
+
+  private static class DefaultValue {
+    private final String myValueText;
+    private final String myDeclaringClass;
+
+    public DefaultValue(@NotNull Object value, @NotNull String declaringClass) {
+      myValueText = String.valueOf(value);
+      myDeclaringClass = declaringClass;
+    }
+
+    public String getDeclaringClass() {
+      return myDeclaringClass;
+    }
+
+    public String getValueText() {
+      return myValueText;
+    }
+
+    @Override
+    public String toString() {
+      return myValueText;
+    }
+  }
 }
index d60539dca5fa0994d31a2132c0873855dde74792..4aa147da46513bc6b94c92de31ac49571913d4c9 100644 (file)
@@ -446,7 +446,7 @@ public class JavaFxPsiUtil {
 
   public static boolean hasBuilder(@NotNull final PsiClass psiClass) {
     final Project project = psiClass.getProject();
-    return CachedValuesManager.getManager(project).getCachedValue(psiClass, new CachedValueProvider<Boolean>() {
+    return CachedValuesManager.getCachedValue(psiClass, new CachedValueProvider<Boolean>() {
       @Nullable
       @Override
       public Result<Boolean> compute() {
@@ -604,8 +604,6 @@ public class JavaFxPsiUtil {
     return null;
   }
 
-  private static final Key<CachedValue<Map<String, XmlAttributeValue>>> FILE_IDS_KEY = Key.create("FILE_IDS_KEY");
-
   @NotNull
   public static Map<String, XmlAttributeValue> collectFileIds(@Nullable final XmlTag currentTag) {
     if (currentTag == null) return Collections.emptyMap();
@@ -614,10 +612,8 @@ public class JavaFxPsiUtil {
     final XmlTag rootTag = ((XmlFile)containingFile).getRootTag();
     if (rootTag == null) return Collections.emptyMap();
 
-    final Map<String, XmlAttributeValue> cachedIds = CachedValuesManager.getManager(containingFile.getProject())
-      .getCachedValue(rootTag, FILE_IDS_KEY,
-                      () -> new CachedValueProvider.Result<>(prepareFileIds(rootTag), PsiModificationTracker.MODIFICATION_COUNT), false);
-
+    final Map<String, XmlAttributeValue> cachedIds = CachedValuesManager
+      .getCachedValue(rootTag, () -> new CachedValueProvider.Result<>(prepareFileIds(rootTag), PsiModificationTracker.MODIFICATION_COUNT));
     final XmlAttribute currentIdAttribute = currentTag.getAttribute(FxmlConstants.FX_ID);
     if (currentIdAttribute != null) {
       final String currentId = currentIdAttribute.getValue();
@@ -684,6 +680,21 @@ public class JavaFxPsiUtil {
            || findValueOfMethod(targetClass) != null;
   }
 
+  @Nullable
+  public static String getBoxedPropertyType(PsiElement declaration) {
+    PsiType psiType = getWritablePropertyType(declaration);
+    if (psiType instanceof PsiPrimitiveType) {
+      return ((PsiPrimitiveType)psiType).getBoxedTypeName();
+    }
+    if (PsiPrimitiveType.getUnboxedType(psiType) != null) {
+      final PsiClass psiClass = PsiUtil.resolveClassInType(psiType);
+      if (psiClass != null) {
+        return psiClass.getQualifiedName();
+      }
+    }
+    return null;
+  }
+
   private static class JavaFxControllerCachedValueProvider implements CachedValueProvider<PsiClass> {
     private final Project myProject;
     private final PsiFile myContainingFile;
index fbd642fa8d74bf13accdb3c11362ea19747c4ede..a98b32f3069646edc00f6636dbddabd856a314b9 100644 (file)
@@ -1,12 +1,14 @@
 package org.jetbrains.plugins.javaFX.fxml.codeInsight.inspections;
 
 import com.intellij.codeInsight.daemon.impl.analysis.RemoveAttributeIntentionFix;
-import com.intellij.codeInspection.*;
+import com.intellij.codeInspection.ProblemHighlightType;
+import com.intellij.codeInspection.ProblemsHolder;
+import com.intellij.codeInspection.XmlSuppressableInspectionTool;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vfs.CharsetToolkit;
 import com.intellij.psi.*;
-import com.intellij.psi.util.InheritanceUtil;
+import com.intellij.psi.meta.PsiMetaData;
 import com.intellij.psi.xml.XmlAttribute;
 import com.intellij.psi.xml.XmlFile;
 import com.intellij.psi.xml.XmlTag;
@@ -17,8 +19,9 @@ import gnu.trove.THashMap;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.plugins.javaFX.fxml.FxmlConstants;
+import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonNames;
 import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory;
-import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxClassBackedElementDescriptor;
+import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil;
 import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxPropertyAttributeDescriptor;
 import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxPropertyElementDescriptor;
 
@@ -26,8 +29,10 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.lang.ref.Reference;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.net.URL;
-import java.util.LinkedHashSet;
+import java.util.Collections;
 import java.util.Map;
 
 /**
@@ -36,7 +41,7 @@ import java.util.Map;
 public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspectionTool {
   private static final Logger LOG = Logger.getInstance("#" + JavaFxRedundantPropertyValueInspection.class.getName());
 
-  private static Reference<Map<String, Map<String, Object>>> ourDefaultPropertyValues;
+  private static Reference<Map<String, Map<String, String>>> ourDefaultPropertyValues;
 
   @NotNull
   @Override
@@ -64,7 +69,7 @@ public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspe
           return;
         }
 
-        final Object defaultValue = getDefaultValue(attributeName, attribute.getParent());
+        final Object defaultValue = getDefaultValue(descriptor, attributeName, attribute.getParent());
         if (defaultValue == null) return;
 
         if (isEqualValue(attributeValue, defaultValue)) {
@@ -78,8 +83,7 @@ public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspe
       public void visitXmlTag(XmlTag tag) {
         super.visitXmlTag(tag);
         final XmlElementDescriptor descriptor = tag.getDescriptor();
-        if (!(descriptor instanceof JavaFxPropertyElementDescriptor) &&
-            !(descriptor instanceof JavaFxClassBackedElementDescriptor)) {
+        if (!(descriptor instanceof JavaFxPropertyElementDescriptor)) {
           return;
         }
         if (tag.getSubTags().length != 0) return;
@@ -90,7 +94,7 @@ public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspe
           return;
         }
 
-        final Object defaultValue = getDefaultValue(tag.getName(), tag.getParentTag());
+        final Object defaultValue = getDefaultValue(descriptor, tag.getName(), tag.getParentTag());
         if (defaultValue == null) return;
 
         if (isEqualValue(tagText, defaultValue)) {
@@ -103,21 +107,19 @@ public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspe
   }
 
   @Nullable
-  private static Object getDefaultValue(@NotNull String propertyName, @Nullable XmlTag enclosingTag) {
+  private static Object getDefaultValue(PsiMetaData propertyDescriptor, @NotNull String propertyName, @Nullable XmlTag enclosingTag) {
     if (enclosingTag != null) {
       final XmlElementDescriptor descriptor = enclosingTag.getDescriptor();
       if (descriptor != null) {
         final PsiElement declaration = descriptor.getDeclaration();
         if (declaration instanceof PsiClass) {
-          PsiClass containingClass = ((PsiClass)declaration);
-          {
-            final Object defaultValue = getDefaultPropertyValue(containingClass.getQualifiedName(), propertyName);
-            if (defaultValue != null) return defaultValue;
-          }
-          final LinkedHashSet<PsiClass> superClasses = InheritanceUtil.getSuperClasses(containingClass);
-          for (PsiClass superClass : superClasses) {
-            final Object defaultValue = getDefaultPropertyValue(superClass.getQualifiedName(), propertyName);
-            if (defaultValue != null) return defaultValue;
+          for (PsiClass psiClass = ((PsiClass)declaration); psiClass != null; psiClass = psiClass.getSuperClass()) {
+            final String qualifiedName = psiClass.getQualifiedName();
+            if (CommonClassNames.JAVA_LANG_OBJECT.equals(qualifiedName)) break;
+            final String defaultValue = getDefaultPropertyValue(qualifiedName, propertyName);
+            if (defaultValue != null) {
+              return getBoxedValue(propertyDescriptor.getDeclaration(), defaultValue);
+            }
           }
         }
       }
@@ -125,12 +127,25 @@ public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspe
     return null;
   }
 
+  private static Object getBoxedValue(PsiElement declaration, String value) {
+    String boxedQName = JavaFxPsiUtil.getBoxedPropertyType(declaration);
+    if (boxedQName == null) return value;
+    try {
+      final Class<?> boxedClass = Class.forName(boxedQName);
+      final Method method = boxedClass.getMethod(JavaFxCommonNames.VALUE_OF, String.class);
+      return method.invoke(boxedClass, value);
+    }
+    catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | ClassNotFoundException ignored) {
+      return value;
+    }
+  }
+
   private static boolean isEqualValue(@NotNull String attributeValue, @NotNull Object defaultValue) {
     if (defaultValue instanceof String && defaultValue.equals(attributeValue)) return true;
     if (defaultValue instanceof Boolean) return defaultValue == Boolean.valueOf(attributeValue);
     if (defaultValue instanceof Double) {
       try {
-        return Double.compare((Double)defaultValue, Double.valueOf(attributeValue)) == 0;
+        return Double.compare((Double)defaultValue, Double.parseDouble(attributeValue)) == 0;
       }
       catch (NumberFormatException ignored) {
         return false;
@@ -138,7 +153,7 @@ public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspe
     }
     if (defaultValue instanceof Integer) {
       try {
-        return Integer.compare((Integer)defaultValue, Integer.valueOf(attributeValue)) == 0;
+        return Integer.compare((Integer)defaultValue, Integer.parseInt(attributeValue)) == 0;
       }
       catch (NumberFormatException ignored) {
         return false;
@@ -147,33 +162,37 @@ public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspe
     return false;
   }
 
-  private static Object getDefaultPropertyValue(String classQualifiedName, String propertyName) {
-    final Map<String, Object> values = getDefaultPropertyValues(classQualifiedName);
+  @Nullable
+  private static String getDefaultPropertyValue(String classQualifiedName, String propertyName) {
+    final Map<String, String> values = getDefaultPropertyValues(classQualifiedName);
     return values != null ? values.get(propertyName) : null;
   }
 
   /**
-   * Load property values config. The config is produced with the script JavaFxGenerateDefaultPropertyValuesScript (can be found in tests)
+   * Load property values resource. The resource is produced with the script JavaFxGenerateDefaultPropertyValuesScript (can be found in tests)
    */
-  private static Map<String, Object> getDefaultPropertyValues(String classQualifiedName) {
-    if (ourDefaultPropertyValues == null) {
-      ourDefaultPropertyValues = loadDefaultPropertyValues(JavaFxRedundantPropertyValueInspection.class.getSimpleName() + "8.txt");
+  @Nullable
+  private static Map<String, String> getDefaultPropertyValues(String classQualifiedName) {
+    Map<String, Map<String, String>> values = SoftReference.dereference(ourDefaultPropertyValues);
+    if (values == null) {
+      values = loadDefaultPropertyValues(JavaFxRedundantPropertyValueInspection.class.getSimpleName() + "8.txt");
+      ourDefaultPropertyValues = new SoftReference<>(values);
     }
-    Map<String, Map<String, Object>> values = SoftReference.dereference(ourDefaultPropertyValues);
-    return values != null ? values.get(classQualifiedName) : null;
+    return values.get(classQualifiedName);
   }
 
   /**
    * The file format is <code>ClassName#propertyName:type=value</code> per line, line with leading double dash (--) is commented out
    */
-  private static Reference<Map<String, Map<String, Object>>> loadDefaultPropertyValues(String resourceName) {
+  @NotNull
+  private static Map<String, Map<String, String>> loadDefaultPropertyValues(@NotNull String resourceName) {
     final URL resource = JavaFxRedundantPropertyValueInspection.class.getResource(resourceName);
     if (resource == null) {
       LOG.warn("Resource not found: " + resourceName);
-      return null;
+      return Collections.emptyMap();
     }
 
-    final Map<String, Map<String, Object>> result = new THashMap<>(200);
+    final Map<String, Map<String, String>> result = new THashMap<>(200);
     try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource.openStream(), CharsetToolkit.UTF8_CHARSET))) {
       for (String line : FileUtil.loadLines(reader)) {
         if (line.isEmpty() || line.startsWith("--")) continue;
@@ -181,21 +200,14 @@ public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspe
         final int p1 = line.indexOf('#');
         if (p1 > 0 && p1 < line.length()) {
           final String className = line.substring(0, p1);
-          final int p2 = line.indexOf(':', p1);
+          final int p2 = line.indexOf('=', p1);
           if (p2 > p1 && p2 < line.length()) {
             final String propertyName = line.substring(p1 + 1, p2);
-            final int p3 = line.indexOf('=', p2 + 1);
-            if (p3 > 0 && p3 < line.length()) {
-              final String type = line.substring(p2 + 1, p3);
-              final String text = line.substring(p3 + 1);
-              final Object value = parseValue(type, text);
-              if (value != null) {
-                lineParsed = true;
-                final Map<String, Object> properties = result.computeIfAbsent(className, ignored -> new THashMap<String, Object>());
-                if (properties.put(propertyName, value) != null) {
-                  LOG.warn("Duplicate default property value " + line);
-                }
-              }
+            final String valueText = line.substring(p2 + 1);
+            lineParsed = true;
+            final Map<String, String> properties = result.computeIfAbsent(className, ignored -> new THashMap<>());
+            if (properties.put(propertyName, valueText) != null) {
+              LOG.warn("Duplicate default property value " + line);
             }
           }
         }
@@ -205,35 +217,10 @@ public class JavaFxRedundantPropertyValueInspection extends XmlSuppressableInspe
       }
     }
     catch (IOException e) {
-      LOG.warn("Cannot read resource: " + resourceName, e);
-      return null;
-    }
-
-    return new SoftReference<Map<String, Map<String, Object>>>(result);
-  }
-
-  @Nullable
-  private static Object parseValue(String type, String text) {
-    try {
-      switch (type) {
-        case "Boolean":
-          return Boolean.valueOf(text);
-        case "Integer":
-          return Integer.valueOf(text);
-        case "Double":
-          return Double.valueOf(text);
-        case "String":
-        case "Enum":
-          return text;
-        default:
-          LOG.warn("Unsupported value type " + type + " for '" + text + "'");
-          return null;
-      }
-    }
-    catch (NumberFormatException ignored) {
-      LOG.warn("Invalid format of " + type + ": '" + text + "'");
-      return null;
+      LOG.warn("Can't read resource: " + resourceName, e);
+      return Collections.emptyMap();
     }
+    return result;
   }
 }
 
index 5fae741200b7fd092a62988382db70ae81467e01..62dc185e1988606ce236ef9bd2a694a70f657ff3 100644 (file)
 --- JavaFX default property values ---
 -------- Collected from sources ---------
-javafx.concurrent.ScheduledService#maximumFailureCount:Integer=2147483647
-javafx.concurrent.ScheduledService#restartOnFailure:Boolean=true
-javafx.scene.Node#accessibleRole:Enum=NODE
-javafx.scene.Node#focusTraversable:Boolean=false
-javafx.scene.Node#nodeOrientation:Enum=INHERIT
-javafx.scene.Node#pickOnBounds:Boolean=false
-javafx.scene.SubScene#height:Double=0.0
-javafx.scene.SubScene#width:Double=0.0
-javafx.scene.chart.AreaChart#createSymbols:Boolean=true
-javafx.scene.chart.Axis#label:String=
-javafx.scene.chart.BarChart#barGap:Double=4.0
-javafx.scene.chart.BarChart#categoryGap:Double=10.0
-javafx.scene.chart.Chart#title:String=
-javafx.scene.chart.LineChart#axisSortingPolicy:Enum=X_AXIS
-javafx.scene.chart.LineChart#createSymbols:Boolean=true
-javafx.scene.chart.StackedAreaChart#createSymbols:Boolean=true
-javafx.scene.chart.StackedBarChart#categoryGap:Double=10.0
-javafx.scene.chart.XYChart#alternativeColumnFillVisible:Boolean=false
-javafx.scene.chart.XYChart#alternativeRowFillVisible:Boolean=true
-javafx.scene.chart.XYChart#horizontalGridLinesVisible:Boolean=true
-javafx.scene.chart.XYChart#horizontalZeroLineVisible:Boolean=true
-javafx.scene.chart.XYChart#verticalGridLinesVisible:Boolean=true
-javafx.scene.chart.XYChart#verticalZeroLineVisible:Boolean=true
-javafx.scene.control.ComboBoxBase#editable:Boolean=false
-javafx.scene.control.CustomMenuItem#hideOnClick:Boolean=true
-javafx.scene.control.Labeled#alignment:Enum=CENTER_LEFT
-javafx.scene.control.Labeled#mnemonicParsing:Boolean=false
-javafx.scene.control.SpinnerValueFactory#wrapAround:Boolean=false
-javafx.scene.control.TableSelectionModel#cellSelectionEnabled:Boolean=false
-javafx.scene.media.AudioClip#balance:Double=0.0
-javafx.scene.media.AudioClip#cycleCount:Integer=1
-javafx.scene.media.AudioClip#pan:Double=0.0
-javafx.scene.media.AudioClip#priority:Integer=0
-javafx.scene.media.AudioClip#rate:Double=1.0
-javafx.scene.media.AudioClip#volume:Double=1.0
-javafx.scene.media.AudioEqualizer#enabled:Boolean=false
-javafx.scene.media.MediaPlayer#audioSpectrumInterval:Double=0.1
-javafx.scene.media.MediaPlayer#audioSpectrumNumBands:Integer=128
-javafx.scene.media.MediaPlayer#audioSpectrumThreshold:Integer=-60
-javafx.scene.media.MediaPlayer#autoPlay:Boolean=false
-javafx.scene.media.MediaPlayer#balance:Double=0.0
-javafx.scene.media.MediaPlayer#cycleCount:Integer=1
-javafx.scene.media.MediaPlayer#mute:Boolean=false
-javafx.scene.media.MediaPlayer#rate:Double=1.0
-javafx.scene.media.MediaPlayer#volume:Double=1.0
-javafx.stage.PopupWindow#anchorLocation:Enum=WINDOW_TOP_LEFT
-javafx.stage.PopupWindow#autoHide:Boolean=false
-javafx.stage.PopupWindow#consumeAutoHidingEvents:Boolean=true
+javafx.concurrent.ScheduledService#maximumFailureCount=2147483647
+javafx.concurrent.ScheduledService#restartOnFailure=true
+javafx.scene.Node#accessibleRole=NODE
+javafx.scene.Node#focusTraversable=false
+javafx.scene.Node#nodeOrientation=INHERIT
+javafx.scene.Node#pickOnBounds=false
+javafx.scene.SubScene#height=0.0
+javafx.scene.SubScene#width=0.0
+javafx.scene.chart.AreaChart#createSymbols=true
+javafx.scene.chart.Axis#label=
+javafx.scene.chart.BarChart#barGap=4.0
+javafx.scene.chart.BarChart#categoryGap=10.0
+javafx.scene.chart.Chart#title=
+javafx.scene.chart.LineChart#axisSortingPolicy=X_AXIS
+javafx.scene.chart.LineChart#createSymbols=true
+javafx.scene.chart.StackedAreaChart#createSymbols=true
+javafx.scene.chart.StackedBarChart#categoryGap=10.0
+javafx.scene.chart.XYChart#alternativeColumnFillVisible=false
+javafx.scene.chart.XYChart#alternativeRowFillVisible=true
+javafx.scene.chart.XYChart#horizontalGridLinesVisible=true
+javafx.scene.chart.XYChart#horizontalZeroLineVisible=true
+javafx.scene.chart.XYChart#verticalGridLinesVisible=true
+javafx.scene.chart.XYChart#verticalZeroLineVisible=true
+javafx.scene.control.ComboBoxBase#editable=false
+javafx.scene.control.CustomMenuItem#hideOnClick=true
+javafx.scene.control.Labeled#alignment=CENTER_LEFT
+javafx.scene.control.Labeled#mnemonicParsing=false
+javafx.scene.control.SpinnerValueFactory#wrapAround=false
+javafx.scene.control.TableSelectionModel#cellSelectionEnabled=false
+javafx.scene.media.AudioClip#balance=0.0
+javafx.scene.media.AudioClip#cycleCount=1
+javafx.scene.media.AudioClip#pan=0.0
+javafx.scene.media.AudioClip#priority=0
+javafx.scene.media.AudioClip#rate=1.0
+javafx.scene.media.AudioClip#volume=1.0
+javafx.scene.media.AudioEqualizer#enabled=false
+javafx.scene.media.MediaPlayer#audioSpectrumInterval=0.1
+javafx.scene.media.MediaPlayer#audioSpectrumNumBands=128
+javafx.scene.media.MediaPlayer#audioSpectrumThreshold=-60
+javafx.scene.media.MediaPlayer#autoPlay=false
+javafx.scene.media.MediaPlayer#balance=0.0
+javafx.scene.media.MediaPlayer#cycleCount=1
+javafx.scene.media.MediaPlayer#mute=false
+javafx.scene.media.MediaPlayer#rate=1.0
+javafx.scene.media.MediaPlayer#volume=1.0
+javafx.stage.PopupWindow#anchorLocation=WINDOW_TOP_LEFT
+javafx.stage.PopupWindow#autoHide=false
+javafx.stage.PopupWindow#consumeAutoHidingEvents=true
 -------- Shared (not overridden) ---------
-javafx.animation.Animation#autoReverse:Boolean=false
-javafx.animation.Animation#cycleCount:Integer=1
-javafx.animation.Animation#rate:Double=1.0
-javafx.animation.FadeTransition#byValue:Double=0.0
-javafx.animation.FadeTransition#fromValue:Double=NaN
-javafx.animation.FadeTransition#toValue:Double=NaN
-javafx.animation.PathTransition#orientation:Enum=NONE
-javafx.animation.RotateTransition#byAngle:Double=0.0
-javafx.animation.RotateTransition#fromAngle:Double=NaN
-javafx.animation.RotateTransition#toAngle:Double=NaN
-javafx.animation.ScaleTransition#byX:Double=0.0
-javafx.animation.ScaleTransition#byY:Double=0.0
-javafx.animation.ScaleTransition#byZ:Double=0.0
-javafx.animation.ScaleTransition#fromX:Double=NaN
-javafx.animation.ScaleTransition#fromY:Double=NaN
-javafx.animation.ScaleTransition#fromZ:Double=NaN
-javafx.animation.ScaleTransition#toX:Double=NaN
-javafx.animation.ScaleTransition#toY:Double=NaN
-javafx.animation.ScaleTransition#toZ:Double=NaN
-javafx.animation.TranslateTransition#byX:Double=0.0
-javafx.animation.TranslateTransition#byY:Double=0.0
-javafx.animation.TranslateTransition#byZ:Double=0.0
-javafx.animation.TranslateTransition#fromX:Double=NaN
-javafx.animation.TranslateTransition#fromY:Double=NaN
-javafx.animation.TranslateTransition#fromZ:Double=NaN
-javafx.animation.TranslateTransition#toX:Double=NaN
-javafx.animation.TranslateTransition#toY:Double=NaN
-javafx.animation.TranslateTransition#toZ:Double=NaN
-javafx.scene.Camera#farClip:Double=100.0
-javafx.scene.Camera#nearClip:Double=0.1
-javafx.scene.Group#autoSizeChildren:Boolean=true
-javafx.scene.LightBase#lightOn:Boolean=true
-javafx.scene.Node#cache:Boolean=false
-javafx.scene.Node#cacheHint:Enum=DEFAULT
-javafx.scene.Node#depthTest:Enum=INHERIT
-javafx.scene.Node#disable:Boolean=false
-javafx.scene.Node#layoutX:Double=0.0
-javafx.scene.Node#layoutY:Double=0.0
-javafx.scene.Node#managed:Boolean=true
-javafx.scene.Node#mouseTransparent:Boolean=false
-javafx.scene.Node#opacity:Double=1.0
-javafx.scene.Node#rotate:Double=0.0
-javafx.scene.Node#scaleX:Double=1.0
-javafx.scene.Node#scaleY:Double=1.0
-javafx.scene.Node#scaleZ:Double=1.0
-javafx.scene.Node#style:String=
-javafx.scene.Node#translateX:Double=0.0
-javafx.scene.Node#translateY:Double=0.0
-javafx.scene.Node#translateZ:Double=0.0
-javafx.scene.Node#visible:Boolean=true
-javafx.scene.PerspectiveCamera#fieldOfView:Double=30.0
-javafx.scene.PerspectiveCamera#verticalFieldOfView:Boolean=true
-javafx.scene.canvas.Canvas#height:Double=0.0
-javafx.scene.canvas.Canvas#width:Double=0.0
-javafx.scene.chart.Axis#animated:Boolean=true
-javafx.scene.chart.Axis#autoRanging:Boolean=true
-javafx.scene.chart.Axis#tickLabelGap:Double=3.0
-javafx.scene.chart.Axis#tickLabelRotation:Double=0.0
-javafx.scene.chart.Axis#tickLabelsVisible:Boolean=true
-javafx.scene.chart.Axis#tickLength:Double=8.0
-javafx.scene.chart.Axis#tickMarkVisible:Boolean=true
-javafx.scene.chart.Axis$TickMark#position:Double=0.0
-javafx.scene.chart.CategoryAxis#endMargin:Double=5.0
-javafx.scene.chart.CategoryAxis#gapStartAndEnd:Boolean=true
-javafx.scene.chart.CategoryAxis#startMargin:Double=5.0
-javafx.scene.chart.Chart#animated:Boolean=true
-javafx.scene.chart.Chart#legendSide:Enum=BOTTOM
-javafx.scene.chart.Chart#legendVisible:Boolean=true
-javafx.scene.chart.Chart#titleSide:Enum=TOP
-javafx.scene.chart.NumberAxis#forceZeroInRange:Boolean=true
-javafx.scene.chart.NumberAxis#tickUnit:Double=5.0
-javafx.scene.chart.PieChart#clockwise:Boolean=true
-javafx.scene.chart.PieChart#labelLineLength:Double=20.0
-javafx.scene.chart.PieChart#labelsVisible:Boolean=true
-javafx.scene.chart.PieChart#startAngle:Double=0.0
-javafx.scene.chart.ValueAxis#lowerBound:Double=0.0
-javafx.scene.chart.ValueAxis#minorTickCount:Integer=5
-javafx.scene.chart.ValueAxis#minorTickLength:Double=5.0
-javafx.scene.chart.ValueAxis#minorTickVisible:Boolean=true
-javafx.scene.chart.ValueAxis#upperBound:Double=100.0
-javafx.scene.control.Button#cancelButton:Boolean=false
-javafx.scene.control.Button#defaultButton:Boolean=false
-javafx.scene.control.ButtonBar#buttonMinWidth:Double=85.0
-javafx.scene.control.Cell#editable:Boolean=true
-javafx.scene.control.CheckBox#allowIndeterminate:Boolean=false
-javafx.scene.control.CheckBox#indeterminate:Boolean=false
-javafx.scene.control.CheckBox#selected:Boolean=false
-javafx.scene.control.CheckBoxTreeItem#independent:Boolean=false
-javafx.scene.control.CheckBoxTreeItem#indeterminate:Boolean=false
-javafx.scene.control.CheckBoxTreeItem#selected:Boolean=false
-javafx.scene.control.CheckMenuItem#selected:Boolean=false
-javafx.scene.control.ComboBox#visibleRowCount:Integer=10
-javafx.scene.control.ComboBoxBase#promptText:String=
-javafx.scene.control.ContextMenu#impl_showRelativeToWindow:Boolean=false
-javafx.scene.control.DatePicker#showWeekNumbers:Boolean=false
-javafx.scene.control.Dialog#headerText:String=Confirmation
-javafx.scene.control.Dialog#resizable:Boolean=false
-javafx.scene.control.Dialog#title:String=Confirmation
-javafx.scene.control.DialogPane#expanded:Boolean=false
-javafx.scene.control.Hyperlink#visited:Boolean=false
-javafx.scene.control.Labeled#contentDisplay:Enum=LEFT
-javafx.scene.control.Labeled#ellipsisString:String=...
-javafx.scene.control.Labeled#graphicTextGap:Double=4.0
-javafx.scene.control.Labeled#lineSpacing:Double=0.0
-javafx.scene.control.Labeled#text:String=
-javafx.scene.control.Labeled#textAlignment:Enum=LEFT
-javafx.scene.control.Labeled#textOverrun:Enum=ELLIPSIS
-javafx.scene.control.Labeled#underline:Boolean=false
-javafx.scene.control.Labeled#wrapText:Boolean=false
-javafx.scene.control.ListView#editable:Boolean=false
-javafx.scene.control.ListView#fixedCellSize:Double=-1.0
-javafx.scene.control.ListView#orientation:Enum=VERTICAL
-javafx.scene.control.MenuBar#useSystemMenuBar:Boolean=false
-javafx.scene.control.MenuButton#popupSide:Enum=BOTTOM
-javafx.scene.control.MenuItem#disable:Boolean=false
-javafx.scene.control.MenuItem#mnemonicParsing:Boolean=true
-javafx.scene.control.MenuItem#text:String=
-javafx.scene.control.MenuItem#visible:Boolean=true
-javafx.scene.control.Pagination#currentPageIndex:Integer=0
-javafx.scene.control.Pagination#maxPageIndicatorCount:Integer=10
-javafx.scene.control.Pagination#pageCount:Integer=2147483647
-javafx.scene.control.PopupControl#maxHeight:Double=-1.0
-javafx.scene.control.PopupControl#maxWidth:Double=-1.0
-javafx.scene.control.PopupControl#minHeight:Double=-1.0
-javafx.scene.control.PopupControl#minWidth:Double=-1.0
-javafx.scene.control.PopupControl#prefHeight:Double=-1.0
-javafx.scene.control.PopupControl#prefWidth:Double=-1.0
-javafx.scene.control.PopupControl#style:String=
-javafx.scene.control.ProgressIndicator#progress:Double=-1.0
-javafx.scene.control.RadioMenuItem#selected:Boolean=false
-javafx.scene.control.ScrollBar#blockIncrement:Double=10.0
-javafx.scene.control.ScrollBar#max:Double=100.0
-javafx.scene.control.ScrollBar#min:Double=0.0
-javafx.scene.control.ScrollBar#orientation:Enum=HORIZONTAL
-javafx.scene.control.ScrollBar#unitIncrement:Double=1.0
-javafx.scene.control.ScrollBar#value:Double=0.0
-javafx.scene.control.ScrollBar#visibleAmount:Double=15.0
-javafx.scene.control.ScrollPane#fitToHeight:Boolean=false
-javafx.scene.control.ScrollPane#fitToWidth:Boolean=false
-javafx.scene.control.ScrollPane#hbarPolicy:Enum=AS_NEEDED
-javafx.scene.control.ScrollPane#hmax:Double=1.0
-javafx.scene.control.ScrollPane#hmin:Double=0.0
-javafx.scene.control.ScrollPane#hvalue:Double=0.0
-javafx.scene.control.ScrollPane#minViewportHeight:Double=0.0
-javafx.scene.control.ScrollPane#minViewportWidth:Double=0.0
-javafx.scene.control.ScrollPane#pannable:Boolean=false
-javafx.scene.control.ScrollPane#prefViewportHeight:Double=0.0
-javafx.scene.control.ScrollPane#prefViewportWidth:Double=0.0
-javafx.scene.control.ScrollPane#vbarPolicy:Enum=AS_NEEDED
-javafx.scene.control.ScrollPane#vmax:Double=1.0
-javafx.scene.control.ScrollPane#vmin:Double=0.0
-javafx.scene.control.ScrollPane#vvalue:Double=0.0
-javafx.scene.control.Separator#halignment:Enum=CENTER
-javafx.scene.control.Separator#orientation:Enum=HORIZONTAL
-javafx.scene.control.Separator#valignment:Enum=CENTER
-javafx.scene.control.Slider#blockIncrement:Double=10.0
-javafx.scene.control.Slider#majorTickUnit:Double=25.0
-javafx.scene.control.Slider#max:Double=100.0
-javafx.scene.control.Slider#min:Double=0.0
-javafx.scene.control.Slider#minorTickCount:Integer=3
-javafx.scene.control.Slider#orientation:Enum=HORIZONTAL
-javafx.scene.control.Slider#showTickLabels:Boolean=false
-javafx.scene.control.Slider#showTickMarks:Boolean=false
-javafx.scene.control.Slider#snapToTicks:Boolean=false
-javafx.scene.control.Slider#value:Double=0.0
-javafx.scene.control.Slider#valueChanging:Boolean=false
-javafx.scene.control.Spinner#editable:Boolean=false
-javafx.scene.control.SplitPane#orientation:Enum=HORIZONTAL
-javafx.scene.control.SplitPane$Divider#position:Double=0.5
-javafx.scene.control.Tab#closable:Boolean=true
-javafx.scene.control.Tab#disable:Boolean=false
-javafx.scene.control.TabPane#rotateGraphic:Boolean=false
-javafx.scene.control.TabPane#side:Enum=TOP
-javafx.scene.control.TabPane#tabClosingPolicy:Enum=SELECTED_TAB
-javafx.scene.control.TabPane#tabMaxHeight:Double=1.7976931348623157E308
-javafx.scene.control.TabPane#tabMaxWidth:Double=1.7976931348623157E308
-javafx.scene.control.TabPane#tabMinHeight:Double=0.0
-javafx.scene.control.TabPane#tabMinWidth:Double=0.0
-javafx.scene.control.TableColumn#sortType:Enum=ASCENDING
-javafx.scene.control.TableColumnBase#editable:Boolean=true
-javafx.scene.control.TableColumnBase#maxWidth:Double=5000.0
-javafx.scene.control.TableColumnBase#minWidth:Double=10.0
-javafx.scene.control.TableColumnBase#prefWidth:Double=80.0
-javafx.scene.control.TableColumnBase#resizable:Boolean=true
-javafx.scene.control.TableColumnBase#sortable:Boolean=true
-javafx.scene.control.TableColumnBase#style:String=
-javafx.scene.control.TableColumnBase#text:String=
-javafx.scene.control.TableColumnBase#visible:Boolean=true
-javafx.scene.control.TableView#editable:Boolean=false
-javafx.scene.control.TableView#fixedCellSize:Double=-1.0
-javafx.scene.control.TableView#tableMenuButtonVisible:Boolean=false
-javafx.scene.control.TextArea#prefColumnCount:Integer=40
-javafx.scene.control.TextArea#prefRowCount:Integer=10
-javafx.scene.control.TextArea#scrollLeft:Double=0.0
-javafx.scene.control.TextArea#scrollTop:Double=0.0
-javafx.scene.control.TextArea#wrapText:Boolean=false
-javafx.scene.control.TextField#alignment:Enum=CENTER_LEFT
-javafx.scene.control.TextField#prefColumnCount:Integer=12
-javafx.scene.control.TextInputControl#editable:Boolean=true
-javafx.scene.control.TextInputControl#promptText:String=
-javafx.scene.control.TextInputControl#text:String=
-javafx.scene.control.TitledPane#animated:Boolean=true
-javafx.scene.control.TitledPane#collapsible:Boolean=true
-javafx.scene.control.TitledPane#expanded:Boolean=true
-javafx.scene.control.ToggleButton#selected:Boolean=false
-javafx.scene.control.ToolBar#orientation:Enum=HORIZONTAL
-javafx.scene.control.Tooltip#contentDisplay:Enum=LEFT
-javafx.scene.control.Tooltip#graphicTextGap:Double=4.0
-javafx.scene.control.Tooltip#text:String=
-javafx.scene.control.Tooltip#textAlignment:Enum=LEFT
-javafx.scene.control.Tooltip#textOverrun:Enum=ELLIPSIS
-javafx.scene.control.Tooltip#wrapText:Boolean=false
-javafx.scene.control.TreeItem#expanded:Boolean=false
-javafx.scene.control.TreeTableColumn#sortType:Enum=ASCENDING
-javafx.scene.control.TreeTableView#editable:Boolean=false
-javafx.scene.control.TreeTableView#fixedCellSize:Double=-1.0
-javafx.scene.control.TreeTableView#showRoot:Boolean=true
-javafx.scene.control.TreeTableView#sortMode:Enum=ALL_DESCENDANTS
-javafx.scene.control.TreeTableView#tableMenuButtonVisible:Boolean=false
-javafx.scene.control.TreeView#editable:Boolean=false
-javafx.scene.control.TreeView#fixedCellSize:Double=-1.0
-javafx.scene.control.TreeView#showRoot:Boolean=true
-javafx.scene.control.cell.ComboBoxListCell#comboBoxEditable:Boolean=false
-javafx.scene.control.cell.ComboBoxTableCell#comboBoxEditable:Boolean=false
-javafx.scene.control.cell.ComboBoxTreeCell#comboBoxEditable:Boolean=false
-javafx.scene.control.cell.ComboBoxTreeTableCell#comboBoxEditable:Boolean=false
-javafx.scene.effect.Blend#mode:Enum=SRC_OVER
-javafx.scene.effect.Blend#opacity:Double=1.0
-javafx.scene.effect.Bloom#threshold:Double=0.3
-javafx.scene.effect.BoxBlur#height:Double=5.0
-javafx.scene.effect.BoxBlur#iterations:Integer=1
-javafx.scene.effect.BoxBlur#width:Double=5.0
-javafx.scene.effect.ColorAdjust#brightness:Double=0.0
-javafx.scene.effect.ColorAdjust#contrast:Double=0.0
-javafx.scene.effect.ColorAdjust#hue:Double=0.0
-javafx.scene.effect.ColorAdjust#saturation:Double=0.0
-javafx.scene.effect.ColorInput#height:Double=0.0
-javafx.scene.effect.ColorInput#width:Double=0.0
-javafx.scene.effect.ColorInput#x:Double=0.0
-javafx.scene.effect.ColorInput#y:Double=0.0
-javafx.scene.effect.DisplacementMap#offsetX:Double=0.0
-javafx.scene.effect.DisplacementMap#offsetY:Double=0.0
-javafx.scene.effect.DisplacementMap#scaleX:Double=1.0
-javafx.scene.effect.DisplacementMap#scaleY:Double=1.0
-javafx.scene.effect.DisplacementMap#wrap:Boolean=false
-javafx.scene.effect.DropShadow#blurType:Enum=THREE_PASS_BOX
-javafx.scene.effect.DropShadow#height:Double=21.0
-javafx.scene.effect.DropShadow#offsetX:Double=0.0
-javafx.scene.effect.DropShadow#offsetY:Double=0.0
-javafx.scene.effect.DropShadow#radius:Double=10.0
-javafx.scene.effect.DropShadow#spread:Double=0.0
-javafx.scene.effect.DropShadow#width:Double=21.0
-javafx.scene.effect.FloatMap#height:Integer=1
-javafx.scene.effect.FloatMap#width:Integer=1
-javafx.scene.effect.GaussianBlur#radius:Double=10.0
-javafx.scene.effect.Glow#level:Double=0.3
-javafx.scene.effect.ImageInput#x:Double=0.0
-javafx.scene.effect.ImageInput#y:Double=0.0
-javafx.scene.effect.InnerShadow#blurType:Enum=THREE_PASS_BOX
-javafx.scene.effect.InnerShadow#choke:Double=0.0
-javafx.scene.effect.InnerShadow#height:Double=21.0
-javafx.scene.effect.InnerShadow#offsetX:Double=0.0
-javafx.scene.effect.InnerShadow#offsetY:Double=0.0
-javafx.scene.effect.InnerShadow#radius:Double=10.0
-javafx.scene.effect.InnerShadow#width:Double=21.0
-javafx.scene.effect.Light$Distant#azimuth:Double=45.0
-javafx.scene.effect.Light$Distant#elevation:Double=45.0
-javafx.scene.effect.Light$Point#x:Double=0.0
-javafx.scene.effect.Light$Point#y:Double=0.0
-javafx.scene.effect.Light$Point#z:Double=0.0
-javafx.scene.effect.Light$Spot#pointsAtX:Double=0.0
-javafx.scene.effect.Light$Spot#pointsAtY:Double=0.0
-javafx.scene.effect.Light$Spot#pointsAtZ:Double=0.0
-javafx.scene.effect.Light$Spot#specularExponent:Double=1.0
-javafx.scene.effect.Lighting#diffuseConstant:Double=1.0
-javafx.scene.effect.Lighting#specularConstant:Double=0.3
-javafx.scene.effect.Lighting#specularExponent:Double=20.0
-javafx.scene.effect.Lighting#surfaceScale:Double=1.5
-javafx.scene.effect.MotionBlur#angle:Double=0.0
-javafx.scene.effect.MotionBlur#radius:Double=10.0
-javafx.scene.effect.PerspectiveTransform#llx:Double=0.0
-javafx.scene.effect.PerspectiveTransform#lly:Double=0.0
-javafx.scene.effect.PerspectiveTransform#lrx:Double=0.0
-javafx.scene.effect.PerspectiveTransform#lry:Double=0.0
-javafx.scene.effect.PerspectiveTransform#ulx:Double=0.0
-javafx.scene.effect.PerspectiveTransform#uly:Double=0.0
-javafx.scene.effect.PerspectiveTransform#urx:Double=0.0
-javafx.scene.effect.PerspectiveTransform#ury:Double=0.0
-javafx.scene.effect.Reflection#bottomOpacity:Double=0.0
-javafx.scene.effect.Reflection#fraction:Double=0.75
-javafx.scene.effect.Reflection#topOffset:Double=0.0
-javafx.scene.effect.Reflection#topOpacity:Double=0.5
-javafx.scene.effect.SepiaTone#level:Double=1.0
-javafx.scene.effect.Shadow#blurType:Enum=THREE_PASS_BOX
-javafx.scene.effect.Shadow#height:Double=21.0
-javafx.scene.effect.Shadow#radius:Double=10.0
-javafx.scene.effect.Shadow#width:Double=21.0
-javafx.scene.image.ImageView#fitHeight:Double=0.0
-javafx.scene.image.ImageView#fitWidth:Double=0.0
-javafx.scene.image.ImageView#preserveRatio:Boolean=false
-javafx.scene.image.ImageView#smooth:Boolean=true
-javafx.scene.image.ImageView#x:Double=0.0
-javafx.scene.image.ImageView#y:Double=0.0
-javafx.scene.layout.ColumnConstraints#fillWidth:Boolean=true
-javafx.scene.layout.ColumnConstraints#maxWidth:Double=-1.0
-javafx.scene.layout.ColumnConstraints#minWidth:Double=-1.0
-javafx.scene.layout.ColumnConstraints#percentWidth:Double=-1.0
-javafx.scene.layout.ColumnConstraints#prefWidth:Double=-1.0
-javafx.scene.layout.FlowPane#alignment:Enum=TOP_LEFT
-javafx.scene.layout.FlowPane#columnHalignment:Enum=LEFT
-javafx.scene.layout.FlowPane#hgap:Double=0.0
-javafx.scene.layout.FlowPane#orientation:Enum=HORIZONTAL
-javafx.scene.layout.FlowPane#prefWrapLength:Double=400.0
-javafx.scene.layout.FlowPane#rowValignment:Enum=CENTER
-javafx.scene.layout.FlowPane#vgap:Double=0.0
-javafx.scene.layout.GridPane#alignment:Enum=TOP_LEFT
-javafx.scene.layout.GridPane#gridLinesVisible:Boolean=false
-javafx.scene.layout.GridPane#hgap:Double=0.0
-javafx.scene.layout.GridPane#vgap:Double=0.0
-javafx.scene.layout.HBox#alignment:Enum=TOP_LEFT
-javafx.scene.layout.HBox#fillHeight:Boolean=true
-javafx.scene.layout.HBox#spacing:Double=0.0
-javafx.scene.layout.Region#cacheShape:Boolean=true
-javafx.scene.layout.Region#centerShape:Boolean=true
-javafx.scene.layout.Region#maxHeight:Double=-1.0
-javafx.scene.layout.Region#maxWidth:Double=-1.0
-javafx.scene.layout.Region#minHeight:Double=-1.0
-javafx.scene.layout.Region#minWidth:Double=-1.0
-javafx.scene.layout.Region#prefHeight:Double=-1.0
-javafx.scene.layout.Region#prefWidth:Double=-1.0
-javafx.scene.layout.Region#scaleShape:Boolean=true
-javafx.scene.layout.Region#snapToPixel:Boolean=true
-javafx.scene.layout.RowConstraints#fillHeight:Boolean=true
-javafx.scene.layout.RowConstraints#maxHeight:Double=-1.0
-javafx.scene.layout.RowConstraints#minHeight:Double=-1.0
-javafx.scene.layout.RowConstraints#percentHeight:Double=-1.0
-javafx.scene.layout.RowConstraints#prefHeight:Double=-1.0
-javafx.scene.layout.StackPane#alignment:Enum=CENTER
-javafx.scene.layout.TilePane#alignment:Enum=TOP_LEFT
-javafx.scene.layout.TilePane#hgap:Double=0.0
-javafx.scene.layout.TilePane#orientation:Enum=HORIZONTAL
-javafx.scene.layout.TilePane#prefColumns:Integer=5
-javafx.scene.layout.TilePane#prefRows:Integer=5
-javafx.scene.layout.TilePane#prefTileHeight:Double=-1.0
-javafx.scene.layout.TilePane#prefTileWidth:Double=-1.0
-javafx.scene.layout.TilePane#tileAlignment:Enum=CENTER
-javafx.scene.layout.TilePane#vgap:Double=0.0
-javafx.scene.layout.VBox#alignment:Enum=TOP_LEFT
-javafx.scene.layout.VBox#fillWidth:Boolean=true
-javafx.scene.layout.VBox#spacing:Double=0.0
-javafx.scene.media.EqualizerBand#bandwidth:Double=0.0
-javafx.scene.media.EqualizerBand#centerFrequency:Double=0.0
-javafx.scene.media.EqualizerBand#gain:Double=0.0
-javafx.scene.media.MediaView#fitHeight:Double=0.0
-javafx.scene.media.MediaView#fitWidth:Double=0.0
-javafx.scene.media.MediaView#preserveRatio:Boolean=true
-javafx.scene.media.MediaView#smooth:Boolean=true
-javafx.scene.media.MediaView#x:Double=0.0
-javafx.scene.media.MediaView#y:Double=0.0
-javafx.scene.paint.PhongMaterial#specularPower:Double=32.0
-javafx.scene.shape.Arc#centerX:Double=0.0
-javafx.scene.shape.Arc#centerY:Double=0.0
-javafx.scene.shape.Arc#length:Double=0.0
-javafx.scene.shape.Arc#radiusX:Double=0.0
-javafx.scene.shape.Arc#radiusY:Double=0.0
-javafx.scene.shape.Arc#startAngle:Double=0.0
-javafx.scene.shape.Arc#type:Enum=OPEN
-javafx.scene.shape.ArcTo#XAxisRotation:Double=0.0
-javafx.scene.shape.ArcTo#largeArcFlag:Boolean=false
-javafx.scene.shape.ArcTo#radiusX:Double=0.0
-javafx.scene.shape.ArcTo#radiusY:Double=0.0
-javafx.scene.shape.ArcTo#sweepFlag:Boolean=false
-javafx.scene.shape.ArcTo#x:Double=0.0
-javafx.scene.shape.ArcTo#y:Double=0.0
-javafx.scene.shape.Box#depth:Double=2.0
-javafx.scene.shape.Box#height:Double=2.0
-javafx.scene.shape.Box#width:Double=2.0
-javafx.scene.shape.Circle#centerX:Double=0.0
-javafx.scene.shape.Circle#centerY:Double=0.0
-javafx.scene.shape.Circle#radius:Double=0.0
-javafx.scene.shape.CubicCurve#controlX1:Double=0.0
-javafx.scene.shape.CubicCurve#controlX2:Double=0.0
-javafx.scene.shape.CubicCurve#controlY1:Double=0.0
-javafx.scene.shape.CubicCurve#controlY2:Double=0.0
-javafx.scene.shape.CubicCurve#endX:Double=0.0
-javafx.scene.shape.CubicCurve#endY:Double=0.0
-javafx.scene.shape.CubicCurve#startX:Double=0.0
-javafx.scene.shape.CubicCurve#startY:Double=0.0
-javafx.scene.shape.CubicCurveTo#controlX1:Double=0.0
-javafx.scene.shape.CubicCurveTo#controlX2:Double=0.0
-javafx.scene.shape.CubicCurveTo#controlY1:Double=0.0
-javafx.scene.shape.CubicCurveTo#controlY2:Double=0.0
-javafx.scene.shape.CubicCurveTo#x:Double=0.0
-javafx.scene.shape.CubicCurveTo#y:Double=0.0
-javafx.scene.shape.Cylinder#height:Double=2.0
-javafx.scene.shape.Cylinder#radius:Double=1.0
-javafx.scene.shape.Ellipse#centerX:Double=0.0
-javafx.scene.shape.Ellipse#centerY:Double=0.0
-javafx.scene.shape.Ellipse#radiusX:Double=0.0
-javafx.scene.shape.Ellipse#radiusY:Double=0.0
-javafx.scene.shape.HLineTo#x:Double=0.0
-javafx.scene.shape.Line#endX:Double=0.0
-javafx.scene.shape.Line#endY:Double=0.0
-javafx.scene.shape.Line#startX:Double=0.0
-javafx.scene.shape.Line#startY:Double=0.0
-javafx.scene.shape.LineTo#x:Double=0.0
-javafx.scene.shape.LineTo#y:Double=0.0
-javafx.scene.shape.MoveTo#x:Double=0.0
-javafx.scene.shape.MoveTo#y:Double=0.0
-javafx.scene.shape.Path#fillRule:Enum=NON_ZERO
-javafx.scene.shape.PathElement#absolute:Boolean=true
-javafx.scene.shape.QuadCurve#controlX:Double=0.0
-javafx.scene.shape.QuadCurve#controlY:Double=0.0
-javafx.scene.shape.QuadCurve#endX:Double=0.0
-javafx.scene.shape.QuadCurve#endY:Double=0.0
-javafx.scene.shape.QuadCurve#startX:Double=0.0
-javafx.scene.shape.QuadCurve#startY:Double=0.0
-javafx.scene.shape.QuadCurveTo#controlX:Double=0.0
-javafx.scene.shape.QuadCurveTo#controlY:Double=0.0
-javafx.scene.shape.QuadCurveTo#x:Double=0.0
-javafx.scene.shape.QuadCurveTo#y:Double=0.0
-javafx.scene.shape.Rectangle#arcHeight:Double=0.0
-javafx.scene.shape.Rectangle#arcWidth:Double=0.0
-javafx.scene.shape.Rectangle#height:Double=0.0
-javafx.scene.shape.Rectangle#width:Double=0.0
-javafx.scene.shape.Rectangle#x:Double=0.0
-javafx.scene.shape.Rectangle#y:Double=0.0
-javafx.scene.shape.SVGPath#content:String=
-javafx.scene.shape.SVGPath#fillRule:Enum=NON_ZERO
-javafx.scene.shape.Shape#smooth:Boolean=true
-javafx.scene.shape.Shape#strokeDashOffset:Double=0.0
-javafx.scene.shape.Shape#strokeLineCap:Enum=SQUARE
-javafx.scene.shape.Shape#strokeLineJoin:Enum=MITER
-javafx.scene.shape.Shape#strokeMiterLimit:Double=10.0
-javafx.scene.shape.Shape#strokeType:Enum=CENTERED
-javafx.scene.shape.Shape#strokeWidth:Double=1.0
-javafx.scene.shape.Shape3D#cullFace:Enum=BACK
-javafx.scene.shape.Shape3D#drawMode:Enum=FILL
-javafx.scene.shape.Sphere#radius:Double=1.0
-javafx.scene.shape.VLineTo#y:Double=0.0
-javafx.scene.text.Text#boundsType:Enum=LOGICAL
-javafx.scene.text.Text#fontSmoothingType:Enum=GRAY
-javafx.scene.text.Text#impl_caretBias:Boolean=true
-javafx.scene.text.Text#impl_caretPosition:Integer=-1
-javafx.scene.text.Text#impl_selectionEnd:Integer=-1
-javafx.scene.text.Text#impl_selectionStart:Integer=-1
-javafx.scene.text.Text#lineSpacing:Double=0.0
-javafx.scene.text.Text#strikethrough:Boolean=false
-javafx.scene.text.Text#text:String=
-javafx.scene.text.Text#textAlignment:Enum=LEFT
-javafx.scene.text.Text#textOrigin:Enum=BASELINE
-javafx.scene.text.Text#underline:Boolean=false
-javafx.scene.text.Text#wrappingWidth:Double=0.0
-javafx.scene.text.Text#x:Double=0.0
-javafx.scene.text.Text#y:Double=0.0
-javafx.scene.text.TextFlow#lineSpacing:Double=0.0
-javafx.scene.text.TextFlow#textAlignment:Enum=LEFT
-javafx.scene.transform.Affine#mxx:Double=1.0
-javafx.scene.transform.Affine#mxy:Double=0.0
-javafx.scene.transform.Affine#mxz:Double=0.0
-javafx.scene.transform.Affine#myx:Double=0.0
-javafx.scene.transform.Affine#myy:Double=1.0
-javafx.scene.transform.Affine#myz:Double=0.0
-javafx.scene.transform.Affine#mzx:Double=0.0
-javafx.scene.transform.Affine#mzy:Double=0.0
-javafx.scene.transform.Affine#mzz:Double=1.0
-javafx.scene.transform.Affine#tx:Double=0.0
-javafx.scene.transform.Affine#ty:Double=0.0
-javafx.scene.transform.Affine#tz:Double=0.0
-javafx.scene.transform.Rotate#angle:Double=0.0
-javafx.scene.transform.Rotate#pivotX:Double=0.0
-javafx.scene.transform.Rotate#pivotY:Double=0.0
-javafx.scene.transform.Rotate#pivotZ:Double=0.0
-javafx.scene.transform.Scale#pivotX:Double=0.0
-javafx.scene.transform.Scale#pivotY:Double=0.0
-javafx.scene.transform.Scale#pivotZ:Double=0.0
-javafx.scene.transform.Scale#x:Double=1.0
-javafx.scene.transform.Scale#y:Double=1.0
-javafx.scene.transform.Scale#z:Double=1.0
-javafx.scene.transform.Shear#pivotX:Double=0.0
-javafx.scene.transform.Shear#pivotY:Double=0.0
-javafx.scene.transform.Shear#x:Double=0.0
-javafx.scene.transform.Shear#y:Double=0.0
-javafx.scene.transform.Translate#x:Double=0.0
-javafx.scene.transform.Translate#y:Double=0.0
-javafx.scene.transform.Translate#z:Double=0.0
-javafx.scene.web.WebEngine#javaScriptEnabled:Boolean=true
-javafx.scene.web.WebView#contextMenuEnabled:Boolean=true
-javafx.scene.web.WebView#fontScale:Double=1.0
-javafx.scene.web.WebView#fontSmoothingType:Enum=LCD
-javafx.scene.web.WebView#maxHeight:Double=1.7976931348623157E308
-javafx.scene.web.WebView#maxWidth:Double=1.7976931348623157E308
-javafx.scene.web.WebView#minHeight:Double=0.0
-javafx.scene.web.WebView#minWidth:Double=0.0
-javafx.scene.web.WebView#prefHeight:Double=600.0
-javafx.scene.web.WebView#prefWidth:Double=800.0
-javafx.scene.web.WebView#zoom:Double=1.0
-javafx.stage.PopupWindow#autoFix:Boolean=true
-javafx.stage.PopupWindow#hideOnEscape:Boolean=true
-javafx.stage.Stage#maxHeight:Double=1.7976931348623157E308
-javafx.stage.Stage#maxWidth:Double=1.7976931348623157E308
-javafx.stage.Stage#minHeight:Double=0.0
-javafx.stage.Stage#minWidth:Double=0.0
-javafx.stage.Stage#resizable:Boolean=true
-javafx.stage.Window#opacity:Double=1.0
+javafx.animation.Animation#autoReverse=false
+javafx.animation.Animation#cycleCount=1
+javafx.animation.Animation#rate=1.0
+javafx.animation.FadeTransition#byValue=0.0
+javafx.animation.FadeTransition#fromValue=NaN
+javafx.animation.FadeTransition#toValue=NaN
+javafx.animation.PathTransition#orientation=NONE
+javafx.animation.RotateTransition#byAngle=0.0
+javafx.animation.RotateTransition#fromAngle=NaN
+javafx.animation.RotateTransition#toAngle=NaN
+javafx.animation.ScaleTransition#byX=0.0
+javafx.animation.ScaleTransition#byY=0.0
+javafx.animation.ScaleTransition#byZ=0.0
+javafx.animation.ScaleTransition#fromX=NaN
+javafx.animation.ScaleTransition#fromY=NaN
+javafx.animation.ScaleTransition#fromZ=NaN
+javafx.animation.ScaleTransition#toX=NaN
+javafx.animation.ScaleTransition#toY=NaN
+javafx.animation.ScaleTransition#toZ=NaN
+javafx.animation.TranslateTransition#byX=0.0
+javafx.animation.TranslateTransition#byY=0.0
+javafx.animation.TranslateTransition#byZ=0.0
+javafx.animation.TranslateTransition#fromX=NaN
+javafx.animation.TranslateTransition#fromY=NaN
+javafx.animation.TranslateTransition#fromZ=NaN
+javafx.animation.TranslateTransition#toX=NaN
+javafx.animation.TranslateTransition#toY=NaN
+javafx.animation.TranslateTransition#toZ=NaN
+javafx.scene.Camera#farClip=100.0
+javafx.scene.Camera#nearClip=0.1
+javafx.scene.Group#autoSizeChildren=true
+javafx.scene.LightBase#lightOn=true
+javafx.scene.Node#cache=false
+javafx.scene.Node#cacheHint=DEFAULT
+javafx.scene.Node#depthTest=INHERIT
+javafx.scene.Node#disable=false
+javafx.scene.Node#layoutX=0.0
+javafx.scene.Node#layoutY=0.0
+javafx.scene.Node#managed=true
+javafx.scene.Node#mouseTransparent=false
+javafx.scene.Node#opacity=1.0
+javafx.scene.Node#rotate=0.0
+javafx.scene.Node#scaleX=1.0
+javafx.scene.Node#scaleY=1.0
+javafx.scene.Node#scaleZ=1.0
+javafx.scene.Node#style=
+javafx.scene.Node#translateX=0.0
+javafx.scene.Node#translateY=0.0
+javafx.scene.Node#translateZ=0.0
+javafx.scene.Node#visible=true
+javafx.scene.PerspectiveCamera#fieldOfView=30.0
+javafx.scene.PerspectiveCamera#verticalFieldOfView=true
+javafx.scene.canvas.Canvas#height=0.0
+javafx.scene.canvas.Canvas#width=0.0
+javafx.scene.chart.Axis#animated=true
+javafx.scene.chart.Axis#autoRanging=true
+javafx.scene.chart.Axis#tickLabelGap=3.0
+javafx.scene.chart.Axis#tickLabelRotation=0.0
+javafx.scene.chart.Axis#tickLabelsVisible=true
+javafx.scene.chart.Axis#tickLength=8.0
+javafx.scene.chart.Axis#tickMarkVisible=true
+javafx.scene.chart.Axis$TickMark#position=0.0
+javafx.scene.chart.CategoryAxis#endMargin=5.0
+javafx.scene.chart.CategoryAxis#gapStartAndEnd=true
+javafx.scene.chart.CategoryAxis#startMargin=5.0
+javafx.scene.chart.Chart#animated=true
+javafx.scene.chart.Chart#legendSide=BOTTOM
+javafx.scene.chart.Chart#legendVisible=true
+javafx.scene.chart.Chart#titleSide=TOP
+javafx.scene.chart.NumberAxis#forceZeroInRange=true
+javafx.scene.chart.NumberAxis#tickUnit=5.0
+javafx.scene.chart.PieChart#clockwise=true
+javafx.scene.chart.PieChart#labelLineLength=20.0
+javafx.scene.chart.PieChart#labelsVisible=true
+javafx.scene.chart.PieChart#startAngle=0.0
+javafx.scene.chart.ValueAxis#lowerBound=0.0
+javafx.scene.chart.ValueAxis#minorTickCount=5
+javafx.scene.chart.ValueAxis#minorTickLength=5.0
+javafx.scene.chart.ValueAxis#minorTickVisible=true
+javafx.scene.chart.ValueAxis#upperBound=100.0
+javafx.scene.control.Button#cancelButton=false
+javafx.scene.control.Button#defaultButton=false
+javafx.scene.control.ButtonBar#buttonMinWidth=85.0
+javafx.scene.control.Cell#editable=true
+javafx.scene.control.CheckBox#allowIndeterminate=false
+javafx.scene.control.CheckBox#indeterminate=false
+javafx.scene.control.CheckBox#selected=false
+javafx.scene.control.CheckBoxTreeItem#independent=false
+javafx.scene.control.CheckBoxTreeItem#indeterminate=false
+javafx.scene.control.CheckBoxTreeItem#selected=false
+javafx.scene.control.CheckMenuItem#selected=false
+javafx.scene.control.ComboBox#visibleRowCount=10
+javafx.scene.control.ComboBoxBase#promptText=
+javafx.scene.control.ContextMenu#impl_showRelativeToWindow=false
+javafx.scene.control.DatePicker#showWeekNumbers=false
+javafx.scene.control.Dialog#headerText=Confirmation
+javafx.scene.control.Dialog#resizable=false
+javafx.scene.control.Dialog#title=Confirmation
+javafx.scene.control.DialogPane#expanded=false
+javafx.scene.control.Hyperlink#visited=false
+javafx.scene.control.Labeled#contentDisplay=LEFT
+javafx.scene.control.Labeled#ellipsisString=...
+javafx.scene.control.Labeled#graphicTextGap=4.0
+javafx.scene.control.Labeled#lineSpacing=0.0
+javafx.scene.control.Labeled#text=
+javafx.scene.control.Labeled#textAlignment=LEFT
+javafx.scene.control.Labeled#textOverrun=ELLIPSIS
+javafx.scene.control.Labeled#underline=false
+javafx.scene.control.Labeled#wrapText=false
+javafx.scene.control.ListView#editable=false
+javafx.scene.control.ListView#fixedCellSize=-1.0
+javafx.scene.control.ListView#orientation=VERTICAL
+javafx.scene.control.MenuBar#useSystemMenuBar=false
+javafx.scene.control.MenuButton#popupSide=BOTTOM
+javafx.scene.control.MenuItem#disable=false
+javafx.scene.control.MenuItem#mnemonicParsing=true
+javafx.scene.control.MenuItem#text=
+javafx.scene.control.MenuItem#visible=true
+javafx.scene.control.Pagination#currentPageIndex=0
+javafx.scene.control.Pagination#maxPageIndicatorCount=10
+javafx.scene.control.Pagination#pageCount=2147483647
+javafx.scene.control.PopupControl#maxHeight=-1.0
+javafx.scene.control.PopupControl#maxWidth=-1.0
+javafx.scene.control.PopupControl#minHeight=-1.0
+javafx.scene.control.PopupControl#minWidth=-1.0
+javafx.scene.control.PopupControl#prefHeight=-1.0
+javafx.scene.control.PopupControl#prefWidth=-1.0
+javafx.scene.control.PopupControl#style=
+javafx.scene.control.ProgressIndicator#progress=-1.0
+javafx.scene.control.RadioMenuItem#selected=false
+javafx.scene.control.ScrollBar#blockIncrement=10.0
+javafx.scene.control.ScrollBar#max=100.0
+javafx.scene.control.ScrollBar#min=0.0
+javafx.scene.control.ScrollBar#orientation=HORIZONTAL
+javafx.scene.control.ScrollBar#unitIncrement=1.0
+javafx.scene.control.ScrollBar#value=0.0
+javafx.scene.control.ScrollBar#visibleAmount=15.0
+javafx.scene.control.ScrollPane#fitToHeight=false
+javafx.scene.control.ScrollPane#fitToWidth=false
+javafx.scene.control.ScrollPane#hbarPolicy=AS_NEEDED
+javafx.scene.control.ScrollPane#hmax=1.0
+javafx.scene.control.ScrollPane#hmin=0.0
+javafx.scene.control.ScrollPane#hvalue=0.0
+javafx.scene.control.ScrollPane#minViewportHeight=0.0
+javafx.scene.control.ScrollPane#minViewportWidth=0.0
+javafx.scene.control.ScrollPane#pannable=false
+javafx.scene.control.ScrollPane#prefViewportHeight=0.0
+javafx.scene.control.ScrollPane#prefViewportWidth=0.0
+javafx.scene.control.ScrollPane#vbarPolicy=AS_NEEDED
+javafx.scene.control.ScrollPane#vmax=1.0
+javafx.scene.control.ScrollPane#vmin=0.0
+javafx.scene.control.ScrollPane#vvalue=0.0
+javafx.scene.control.Separator#halignment=CENTER
+javafx.scene.control.Separator#orientation=HORIZONTAL
+javafx.scene.control.Separator#valignment=CENTER
+javafx.scene.control.Slider#blockIncrement=10.0
+javafx.scene.control.Slider#majorTickUnit=25.0
+javafx.scene.control.Slider#max=100.0
+javafx.scene.control.Slider#min=0.0
+javafx.scene.control.Slider#minorTickCount=3
+javafx.scene.control.Slider#orientation=HORIZONTAL
+javafx.scene.control.Slider#showTickLabels=false
+javafx.scene.control.Slider#showTickMarks=false
+javafx.scene.control.Slider#snapToTicks=false
+javafx.scene.control.Slider#value=0.0
+javafx.scene.control.Slider#valueChanging=false
+javafx.scene.control.Spinner#editable=false
+javafx.scene.control.SplitPane#orientation=HORIZONTAL
+javafx.scene.control.SplitPane$Divider#position=0.5
+javafx.scene.control.Tab#closable=true
+javafx.scene.control.Tab#disable=false
+javafx.scene.control.TabPane#rotateGraphic=false
+javafx.scene.control.TabPane#side=TOP
+javafx.scene.control.TabPane#tabClosingPolicy=SELECTED_TAB
+javafx.scene.control.TabPane#tabMaxHeight=1.7976931348623157E308
+javafx.scene.control.TabPane#tabMaxWidth=1.7976931348623157E308
+javafx.scene.control.TabPane#tabMinHeight=0.0
+javafx.scene.control.TabPane#tabMinWidth=0.0
+javafx.scene.control.TableColumn#sortType=ASCENDING
+javafx.scene.control.TableColumnBase#editable=true
+javafx.scene.control.TableColumnBase#maxWidth=5000.0
+javafx.scene.control.TableColumnBase#minWidth=10.0
+javafx.scene.control.TableColumnBase#prefWidth=80.0
+javafx.scene.control.TableColumnBase#resizable=true
+javafx.scene.control.TableColumnBase#sortable=true
+javafx.scene.control.TableColumnBase#style=
+javafx.scene.control.TableColumnBase#text=
+javafx.scene.control.TableColumnBase#visible=true
+javafx.scene.control.TableView#editable=false
+javafx.scene.control.TableView#fixedCellSize=-1.0
+javafx.scene.control.TableView#tableMenuButtonVisible=false
+javafx.scene.control.TextArea#prefColumnCount=40
+javafx.scene.control.TextArea#prefRowCount=10
+javafx.scene.control.TextArea#scrollLeft=0.0
+javafx.scene.control.TextArea#scrollTop=0.0
+javafx.scene.control.TextArea#wrapText=false
+javafx.scene.control.TextField#alignment=CENTER_LEFT
+javafx.scene.control.TextField#prefColumnCount=12
+javafx.scene.control.TextInputControl#editable=true
+javafx.scene.control.TextInputControl#promptText=
+javafx.scene.control.TextInputControl#text=
+javafx.scene.control.TitledPane#animated=true
+javafx.scene.control.TitledPane#collapsible=true
+javafx.scene.control.TitledPane#expanded=true
+javafx.scene.control.ToggleButton#selected=false
+javafx.scene.control.ToolBar#orientation=HORIZONTAL
+javafx.scene.control.Tooltip#contentDisplay=LEFT
+javafx.scene.control.Tooltip#graphicTextGap=4.0
+javafx.scene.control.Tooltip#text=
+javafx.scene.control.Tooltip#textAlignment=LEFT
+javafx.scene.control.Tooltip#textOverrun=ELLIPSIS
+javafx.scene.control.Tooltip#wrapText=false
+javafx.scene.control.TreeItem#expanded=false
+javafx.scene.control.TreeTableColumn#sortType=ASCENDING
+javafx.scene.control.TreeTableView#editable=false
+javafx.scene.control.TreeTableView#fixedCellSize=-1.0
+javafx.scene.control.TreeTableView#showRoot=true
+javafx.scene.control.TreeTableView#sortMode=ALL_DESCENDANTS
+javafx.scene.control.TreeTableView#tableMenuButtonVisible=false
+javafx.scene.control.TreeView#editable=false
+javafx.scene.control.TreeView#fixedCellSize=-1.0
+javafx.scene.control.TreeView#showRoot=true
+javafx.scene.control.cell.ComboBoxListCell#comboBoxEditable=false
+javafx.scene.control.cell.ComboBoxTableCell#comboBoxEditable=false
+javafx.scene.control.cell.ComboBoxTreeCell#comboBoxEditable=false
+javafx.scene.control.cell.ComboBoxTreeTableCell#comboBoxEditable=false
+javafx.scene.effect.Blend#mode=SRC_OVER
+javafx.scene.effect.Blend#opacity=1.0
+javafx.scene.effect.Bloom#threshold=0.3
+javafx.scene.effect.BoxBlur#height=5.0
+javafx.scene.effect.BoxBlur#iterations=1
+javafx.scene.effect.BoxBlur#width=5.0
+javafx.scene.effect.ColorAdjust#brightness=0.0
+javafx.scene.effect.ColorAdjust#contrast=0.0
+javafx.scene.effect.ColorAdjust#hue=0.0
+javafx.scene.effect.ColorAdjust#saturation=0.0
+javafx.scene.effect.ColorInput#height=0.0
+javafx.scene.effect.ColorInput#width=0.0
+javafx.scene.effect.ColorInput#x=0.0
+javafx.scene.effect.ColorInput#y=0.0
+javafx.scene.effect.DisplacementMap#offsetX=0.0
+javafx.scene.effect.DisplacementMap#offsetY=0.0
+javafx.scene.effect.DisplacementMap#scaleX=1.0
+javafx.scene.effect.DisplacementMap#scaleY=1.0
+javafx.scene.effect.DisplacementMap#wrap=false
+javafx.scene.effect.DropShadow#blurType=THREE_PASS_BOX
+javafx.scene.effect.DropShadow#height=21.0
+javafx.scene.effect.DropShadow#offsetX=0.0
+javafx.scene.effect.DropShadow#offsetY=0.0
+javafx.scene.effect.DropShadow#radius=10.0
+javafx.scene.effect.DropShadow#spread=0.0
+javafx.scene.effect.DropShadow#width=21.0
+javafx.scene.effect.FloatMap#height=1
+javafx.scene.effect.FloatMap#width=1
+javafx.scene.effect.GaussianBlur#radius=10.0
+javafx.scene.effect.Glow#level=0.3
+javafx.scene.effect.ImageInput#x=0.0
+javafx.scene.effect.ImageInput#y=0.0
+javafx.scene.effect.InnerShadow#blurType=THREE_PASS_BOX
+javafx.scene.effect.InnerShadow#choke=0.0
+javafx.scene.effect.InnerShadow#height=21.0
+javafx.scene.effect.InnerShadow#offsetX=0.0
+javafx.scene.effect.InnerShadow#offsetY=0.0
+javafx.scene.effect.InnerShadow#radius=10.0
+javafx.scene.effect.InnerShadow#width=21.0
+javafx.scene.effect.Light$Distant#azimuth=45.0
+javafx.scene.effect.Light$Distant#elevation=45.0
+javafx.scene.effect.Light$Point#x=0.0
+javafx.scene.effect.Light$Point#y=0.0
+javafx.scene.effect.Light$Point#z=0.0
+javafx.scene.effect.Light$Spot#pointsAtX=0.0
+javafx.scene.effect.Light$Spot#pointsAtY=0.0
+javafx.scene.effect.Light$Spot#pointsAtZ=0.0
+javafx.scene.effect.Light$Spot#specularExponent=1.0
+javafx.scene.effect.Lighting#diffuseConstant=1.0
+javafx.scene.effect.Lighting#specularConstant=0.3
+javafx.scene.effect.Lighting#specularExponent=20.0
+javafx.scene.effect.Lighting#surfaceScale=1.5
+javafx.scene.effect.MotionBlur#angle=0.0
+javafx.scene.effect.MotionBlur#radius=10.0
+javafx.scene.effect.PerspectiveTransform#llx=0.0
+javafx.scene.effect.PerspectiveTransform#lly=0.0
+javafx.scene.effect.PerspectiveTransform#lrx=0.0
+javafx.scene.effect.PerspectiveTransform#lry=0.0
+javafx.scene.effect.PerspectiveTransform#ulx=0.0
+javafx.scene.effect.PerspectiveTransform#uly=0.0
+javafx.scene.effect.PerspectiveTransform#urx=0.0
+javafx.scene.effect.PerspectiveTransform#ury=0.0
+javafx.scene.effect.Reflection#bottomOpacity=0.0
+javafx.scene.effect.Reflection#fraction=0.75
+javafx.scene.effect.Reflection#topOffset=0.0
+javafx.scene.effect.Reflection#topOpacity=0.5
+javafx.scene.effect.SepiaTone#level=1.0
+javafx.scene.effect.Shadow#blurType=THREE_PASS_BOX
+javafx.scene.effect.Shadow#height=21.0
+javafx.scene.effect.Shadow#radius=10.0
+javafx.scene.effect.Shadow#width=21.0
+javafx.scene.image.ImageView#fitHeight=0.0
+javafx.scene.image.ImageView#fitWidth=0.0
+javafx.scene.image.ImageView#preserveRatio=false
+javafx.scene.image.ImageView#smooth=true
+javafx.scene.image.ImageView#x=0.0
+javafx.scene.image.ImageView#y=0.0
+javafx.scene.layout.ColumnConstraints#fillWidth=true
+javafx.scene.layout.ColumnConstraints#maxWidth=-1.0
+javafx.scene.layout.ColumnConstraints#minWidth=-1.0
+javafx.scene.layout.ColumnConstraints#percentWidth=-1.0
+javafx.scene.layout.ColumnConstraints#prefWidth=-1.0
+javafx.scene.layout.FlowPane#alignment=TOP_LEFT
+javafx.scene.layout.FlowPane#columnHalignment=LEFT
+javafx.scene.layout.FlowPane#hgap=0.0
+javafx.scene.layout.FlowPane#orientation=HORIZONTAL
+javafx.scene.layout.FlowPane#prefWrapLength=400.0
+javafx.scene.layout.FlowPane#rowValignment=CENTER
+javafx.scene.layout.FlowPane#vgap=0.0
+javafx.scene.layout.GridPane#alignment=TOP_LEFT
+javafx.scene.layout.GridPane#gridLinesVisible=false
+javafx.scene.layout.GridPane#hgap=0.0
+javafx.scene.layout.GridPane#vgap=0.0
+javafx.scene.layout.HBox#alignment=TOP_LEFT
+javafx.scene.layout.HBox#fillHeight=true
+javafx.scene.layout.HBox#spacing=0.0
+javafx.scene.layout.Region#cacheShape=true
+javafx.scene.layout.Region#centerShape=true
+javafx.scene.layout.Region#maxHeight=-1.0
+javafx.scene.layout.Region#maxWidth=-1.0
+javafx.scene.layout.Region#minHeight=-1.0
+javafx.scene.layout.Region#minWidth=-1.0
+javafx.scene.layout.Region#prefHeight=-1.0
+javafx.scene.layout.Region#prefWidth=-1.0
+javafx.scene.layout.Region#scaleShape=true
+javafx.scene.layout.Region#snapToPixel=true
+javafx.scene.layout.RowConstraints#fillHeight=true
+javafx.scene.layout.RowConstraints#maxHeight=-1.0
+javafx.scene.layout.RowConstraints#minHeight=-1.0
+javafx.scene.layout.RowConstraints#percentHeight=-1.0
+javafx.scene.layout.RowConstraints#prefHeight=-1.0
+javafx.scene.layout.StackPane#alignment=CENTER
+javafx.scene.layout.TilePane#alignment=TOP_LEFT
+javafx.scene.layout.TilePane#hgap=0.0
+javafx.scene.layout.TilePane#orientation=HORIZONTAL
+javafx.scene.layout.TilePane#prefColumns=5
+javafx.scene.layout.TilePane#prefRows=5
+javafx.scene.layout.TilePane#prefTileHeight=-1.0
+javafx.scene.layout.TilePane#prefTileWidth=-1.0
+javafx.scene.layout.TilePane#tileAlignment=CENTER
+javafx.scene.layout.TilePane#vgap=0.0
+javafx.scene.layout.VBox#alignment=TOP_LEFT
+javafx.scene.layout.VBox#fillWidth=true
+javafx.scene.layout.VBox#spacing=0.0
+javafx.scene.media.EqualizerBand#bandwidth=0.0
+javafx.scene.media.EqualizerBand#centerFrequency=0.0
+javafx.scene.media.EqualizerBand#gain=0.0
+javafx.scene.media.MediaView#fitHeight=0.0
+javafx.scene.media.MediaView#fitWidth=0.0
+javafx.scene.media.MediaView#preserveRatio=true
+javafx.scene.media.MediaView#smooth=true
+javafx.scene.media.MediaView#x=0.0
+javafx.scene.media.MediaView#y=0.0
+javafx.scene.paint.PhongMaterial#specularPower=32.0
+javafx.scene.shape.Arc#centerX=0.0
+javafx.scene.shape.Arc#centerY=0.0
+javafx.scene.shape.Arc#length=0.0
+javafx.scene.shape.Arc#radiusX=0.0
+javafx.scene.shape.Arc#radiusY=0.0
+javafx.scene.shape.Arc#startAngle=0.0
+javafx.scene.shape.Arc#type=OPEN
+javafx.scene.shape.ArcTo#XAxisRotation=0.0
+javafx.scene.shape.ArcTo#largeArcFlag=false
+javafx.scene.shape.ArcTo#radiusX=0.0
+javafx.scene.shape.ArcTo#radiusY=0.0
+javafx.scene.shape.ArcTo#sweepFlag=false
+javafx.scene.shape.ArcTo#x=0.0
+javafx.scene.shape.ArcTo#y=0.0
+javafx.scene.shape.Box#depth=2.0
+javafx.scene.shape.Box#height=2.0
+javafx.scene.shape.Box#width=2.0
+javafx.scene.shape.Circle#centerX=0.0
+javafx.scene.shape.Circle#centerY=0.0
+javafx.scene.shape.Circle#radius=0.0
+javafx.scene.shape.CubicCurve#controlX1=0.0
+javafx.scene.shape.CubicCurve#controlX2=0.0
+javafx.scene.shape.CubicCurve#controlY1=0.0
+javafx.scene.shape.CubicCurve#controlY2=0.0
+javafx.scene.shape.CubicCurve#endX=0.0
+javafx.scene.shape.CubicCurve#endY=0.0
+javafx.scene.shape.CubicCurve#startX=0.0
+javafx.scene.shape.CubicCurve#startY=0.0
+javafx.scene.shape.CubicCurveTo#controlX1=0.0
+javafx.scene.shape.CubicCurveTo#controlX2=0.0
+javafx.scene.shape.CubicCurveTo#controlY1=0.0
+javafx.scene.shape.CubicCurveTo#controlY2=0.0
+javafx.scene.shape.CubicCurveTo#x=0.0
+javafx.scene.shape.CubicCurveTo#y=0.0
+javafx.scene.shape.Cylinder#height=2.0
+javafx.scene.shape.Cylinder#radius=1.0
+javafx.scene.shape.Ellipse#centerX=0.0
+javafx.scene.shape.Ellipse#centerY=0.0
+javafx.scene.shape.Ellipse#radiusX=0.0
+javafx.scene.shape.Ellipse#radiusY=0.0
+javafx.scene.shape.HLineTo#x=0.0
+javafx.scene.shape.Line#endX=0.0
+javafx.scene.shape.Line#endY=0.0
+javafx.scene.shape.Line#startX=0.0
+javafx.scene.shape.Line#startY=0.0
+javafx.scene.shape.LineTo#x=0.0
+javafx.scene.shape.LineTo#y=0.0
+javafx.scene.shape.MoveTo#x=0.0
+javafx.scene.shape.MoveTo#y=0.0
+javafx.scene.shape.Path#fillRule=NON_ZERO
+javafx.scene.shape.PathElement#absolute=true
+javafx.scene.shape.QuadCurve#controlX=0.0
+javafx.scene.shape.QuadCurve#controlY=0.0
+javafx.scene.shape.QuadCurve#endX=0.0
+javafx.scene.shape.QuadCurve#endY=0.0
+javafx.scene.shape.QuadCurve#startX=0.0
+javafx.scene.shape.QuadCurve#startY=0.0
+javafx.scene.shape.QuadCurveTo#controlX=0.0
+javafx.scene.shape.QuadCurveTo#controlY=0.0
+javafx.scene.shape.QuadCurveTo#x=0.0
+javafx.scene.shape.QuadCurveTo#y=0.0
+javafx.scene.shape.Rectangle#arcHeight=0.0
+javafx.scene.shape.Rectangle#arcWidth=0.0
+javafx.scene.shape.Rectangle#height=0.0
+javafx.scene.shape.Rectangle#width=0.0
+javafx.scene.shape.Rectangle#x=0.0
+javafx.scene.shape.Rectangle#y=0.0
+javafx.scene.shape.SVGPath#content=
+javafx.scene.shape.SVGPath#fillRule=NON_ZERO
+javafx.scene.shape.Shape#smooth=true
+javafx.scene.shape.Shape#strokeDashOffset=0.0
+javafx.scene.shape.Shape#strokeLineCap=SQUARE
+javafx.scene.shape.Shape#strokeLineJoin=MITER
+javafx.scene.shape.Shape#strokeMiterLimit=10.0
+javafx.scene.shape.Shape#strokeType=CENTERED
+javafx.scene.shape.Shape#strokeWidth=1.0
+javafx.scene.shape.Shape3D#cullFace=BACK
+javafx.scene.shape.Shape3D#drawMode=FILL
+javafx.scene.shape.Sphere#radius=1.0
+javafx.scene.shape.VLineTo#y=0.0
+javafx.scene.text.Text#boundsType=LOGICAL
+javafx.scene.text.Text#fontSmoothingType=GRAY
+javafx.scene.text.Text#impl_caretBias=true
+javafx.scene.text.Text#impl_caretPosition=-1
+javafx.scene.text.Text#impl_selectionEnd=-1
+javafx.scene.text.Text#impl_selectionStart=-1
+javafx.scene.text.Text#lineSpacing=0.0
+javafx.scene.text.Text#strikethrough=false
+javafx.scene.text.Text#text=
+javafx.scene.text.Text#textAlignment=LEFT
+javafx.scene.text.Text#textOrigin=BASELINE
+javafx.scene.text.Text#underline=false
+javafx.scene.text.Text#wrappingWidth=0.0
+javafx.scene.text.Text#x=0.0
+javafx.scene.text.Text#y=0.0
+javafx.scene.text.TextFlow#lineSpacing=0.0
+javafx.scene.text.TextFlow#textAlignment=LEFT
+javafx.scene.transform.Affine#mxx=1.0
+javafx.scene.transform.Affine#mxy=0.0
+javafx.scene.transform.Affine#mxz=0.0
+javafx.scene.transform.Affine#myx=0.0
+javafx.scene.transform.Affine#myy=1.0
+javafx.scene.transform.Affine#myz=0.0
+javafx.scene.transform.Affine#mzx=0.0
+javafx.scene.transform.Affine#mzy=0.0
+javafx.scene.transform.Affine#mzz=1.0
+javafx.scene.transform.Affine#tx=0.0
+javafx.scene.transform.Affine#ty=0.0
+javafx.scene.transform.Affine#tz=0.0
+javafx.scene.transform.Rotate#angle=0.0
+javafx.scene.transform.Rotate#pivotX=0.0
+javafx.scene.transform.Rotate#pivotY=0.0
+javafx.scene.transform.Rotate#pivotZ=0.0
+javafx.scene.transform.Scale#pivotX=0.0
+javafx.scene.transform.Scale#pivotY=0.0
+javafx.scene.transform.Scale#pivotZ=0.0
+javafx.scene.transform.Scale#x=1.0
+javafx.scene.transform.Scale#y=1.0
+javafx.scene.transform.Scale#z=1.0
+javafx.scene.transform.Shear#pivotX=0.0
+javafx.scene.transform.Shear#pivotY=0.0
+javafx.scene.transform.Shear#x=0.0
+javafx.scene.transform.Shear#y=0.0
+javafx.scene.transform.Translate#x=0.0
+javafx.scene.transform.Translate#y=0.0
+javafx.scene.transform.Translate#z=0.0
+javafx.scene.web.WebEngine#javaScriptEnabled=true
+javafx.scene.web.WebView#contextMenuEnabled=true
+javafx.scene.web.WebView#fontScale=1.0
+javafx.scene.web.WebView#fontSmoothingType=LCD
+javafx.scene.web.WebView#maxHeight=1.7976931348623157E308
+javafx.scene.web.WebView#maxWidth=1.7976931348623157E308
+javafx.scene.web.WebView#minHeight=0.0
+javafx.scene.web.WebView#minWidth=0.0
+javafx.scene.web.WebView#prefHeight=600.0
+javafx.scene.web.WebView#prefWidth=800.0
+javafx.scene.web.WebView#zoom=1.0
+javafx.stage.PopupWindow#autoFix=true
+javafx.stage.PopupWindow#hideOnEscape=true
+javafx.stage.Stage#maxHeight=1.7976931348623157E308
+javafx.stage.Stage#maxWidth=1.7976931348623157E308
+javafx.stage.Stage#minHeight=0.0
+javafx.stage.Stage#minWidth=0.0
+javafx.stage.Stage#resizable=true
+javafx.stage.Window#opacity=1.0
 -------- Overridden in subclass ---------
-javafx.embed.swing.SwingNode#focusTraversable:Boolean=true
-javafx.scene.Group#accessibleRole:Enum=PARENT
-javafx.scene.canvas.Canvas#nodeOrientation:Enum=LEFT_TO_RIGHT
-javafx.scene.control.Button#accessibleRole:Enum=BUTTON
-javafx.scene.control.Button#focusTraversable:Boolean=true
-javafx.scene.control.Button#mnemonicParsing:Boolean=true
-javafx.scene.control.CheckBox#accessibleRole:Enum=CHECK_BOX
-javafx.scene.control.CheckBox#focusTraversable:Boolean=true
-javafx.scene.control.CheckBox#mnemonicParsing:Boolean=true
-javafx.scene.control.ChoiceBox#accessibleRole:Enum=COMBO_BOX
-javafx.scene.control.ChoiceBox#focusTraversable:Boolean=true
-javafx.scene.control.ColorPicker#focusTraversable:Boolean=true
-javafx.scene.control.ComboBox#accessibleRole:Enum=COMBO_BOX
-javafx.scene.control.ComboBox#focusTraversable:Boolean=true
-javafx.scene.control.ContextMenu#autoHide:Boolean=true
-javafx.scene.control.ContextMenu#consumeAutoHidingEvents:Boolean=false
-javafx.scene.control.DatePicker#accessibleRole:Enum=DATE_PICKER
-javafx.scene.control.DatePicker#editable:Boolean=true
-javafx.scene.control.DatePicker#focusTraversable:Boolean=true
-javafx.scene.control.Hyperlink#accessibleRole:Enum=HYPERLINK
-javafx.scene.control.Hyperlink#focusTraversable:Boolean=true
-javafx.scene.control.Label#accessibleRole:Enum=TEXT
-javafx.scene.control.ListCell#accessibleRole:Enum=LIST_ITEM
-javafx.scene.control.ListView#accessibleRole:Enum=LIST_VIEW
-javafx.scene.control.ListView#focusTraversable:Boolean=true
-javafx.scene.control.MenuBar#accessibleRole:Enum=MENU_BAR
-javafx.scene.control.MenuButton#accessibleRole:Enum=MENU_BUTTON
-javafx.scene.control.MenuButton#focusTraversable:Boolean=true
-javafx.scene.control.MenuButton#mnemonicParsing:Boolean=true
-javafx.scene.control.Pagination#accessibleRole:Enum=PAGINATION
-javafx.scene.control.Pagination#focusTraversable:Boolean=true
-javafx.scene.control.PasswordField#accessibleRole:Enum=PASSWORD_FIELD
-javafx.scene.control.PopupControl#anchorLocation:Enum=CONTENT_TOP_LEFT
-javafx.scene.control.ProgressIndicator#accessibleRole:Enum=PROGRESS_INDICATOR
-javafx.scene.control.RadioButton#accessibleRole:Enum=RADIO_BUTTON
-javafx.scene.control.RadioButton#alignment:Enum=CENTER_LEFT
-javafx.scene.control.ScrollBar#accessibleRole:Enum=SCROLL_BAR
-javafx.scene.control.ScrollPane#accessibleRole:Enum=SCROLL_PANE
-javafx.scene.control.SeparatorMenuItem#hideOnClick:Boolean=false
-javafx.scene.control.Slider#accessibleRole:Enum=SLIDER
-javafx.scene.control.Slider#focusTraversable:Boolean=true
-javafx.scene.control.Spinner#accessibleRole:Enum=SPINNER
-javafx.scene.control.Spinner#focusTraversable:Boolean=true
-javafx.scene.control.SplitMenuButton#accessibleRole:Enum=SPLIT_MENU_BUTTON
-javafx.scene.control.TabPane#accessibleRole:Enum=TAB_PANE
-javafx.scene.control.TabPane#focusTraversable:Boolean=true
-javafx.scene.control.TableCell#accessibleRole:Enum=TABLE_CELL
-javafx.scene.control.TableRow#accessibleRole:Enum=TABLE_ROW
-javafx.scene.control.TableView#accessibleRole:Enum=TABLE_VIEW
-javafx.scene.control.TableView#focusTraversable:Boolean=true
-javafx.scene.control.TextArea#accessibleRole:Enum=TEXT_AREA
-javafx.scene.control.TextArea#focusTraversable:Boolean=true
-javafx.scene.control.TextField#accessibleRole:Enum=TEXT_FIELD
-javafx.scene.control.TextField#focusTraversable:Boolean=true
-javafx.scene.control.TitledPane#accessibleRole:Enum=TITLED_PANE
-javafx.scene.control.TitledPane#focusTraversable:Boolean=true
-javafx.scene.control.ToggleButton#accessibleRole:Enum=TOGGLE_BUTTON
-javafx.scene.control.ToggleButton#alignment:Enum=CENTER
-javafx.scene.control.ToggleButton#focusTraversable:Boolean=true
-javafx.scene.control.ToggleButton#mnemonicParsing:Boolean=true
-javafx.scene.control.ToolBar#accessibleRole:Enum=TOOL_BAR
-javafx.scene.control.TreeCell#accessibleRole:Enum=TREE_ITEM
-javafx.scene.control.TreeTableCell#accessibleRole:Enum=TREE_TABLE_CELL
-javafx.scene.control.TreeTableRow#accessibleRole:Enum=TREE_TABLE_ROW
-javafx.scene.control.TreeTableView#accessibleRole:Enum=TREE_TABLE_VIEW
-javafx.scene.control.TreeTableView#focusTraversable:Boolean=true
-javafx.scene.control.TreeView#accessibleRole:Enum=TREE_VIEW
-javafx.scene.control.TreeView#focusTraversable:Boolean=true
-javafx.scene.control.cell.CheckBoxTreeCell#accessibleRole:Enum=TREE_ITEM
-javafx.scene.control.cell.CheckBoxTreeCell#alignment:Enum=CENTER_LEFT
-javafx.scene.control.cell.CheckBoxTreeCell#focusTraversable:Boolean=false
-javafx.scene.control.cell.CheckBoxTreeCell#mnemonicParsing:Boolean=false
-javafx.scene.control.cell.CheckBoxTreeCell#nodeOrientation:Enum=INHERIT
-javafx.scene.control.cell.CheckBoxTreeCell#pickOnBounds:Boolean=true
-javafx.scene.control.cell.ChoiceBoxTreeCell#accessibleRole:Enum=TREE_ITEM
-javafx.scene.control.cell.ChoiceBoxTreeCell#alignment:Enum=CENTER_LEFT
-javafx.scene.control.cell.ChoiceBoxTreeCell#focusTraversable:Boolean=false
-javafx.scene.control.cell.ChoiceBoxTreeCell#mnemonicParsing:Boolean=false
-javafx.scene.control.cell.ChoiceBoxTreeCell#nodeOrientation:Enum=INHERIT
-javafx.scene.control.cell.ChoiceBoxTreeCell#pickOnBounds:Boolean=true
-javafx.scene.control.cell.ComboBoxTreeCell#accessibleRole:Enum=TREE_ITEM
-javafx.scene.control.cell.ComboBoxTreeCell#alignment:Enum=CENTER_LEFT
-javafx.scene.control.cell.ComboBoxTreeCell#focusTraversable:Boolean=false
-javafx.scene.control.cell.ComboBoxTreeCell#mnemonicParsing:Boolean=false
-javafx.scene.control.cell.ComboBoxTreeCell#nodeOrientation:Enum=INHERIT
-javafx.scene.control.cell.ComboBoxTreeCell#pickOnBounds:Boolean=true
-javafx.scene.control.cell.TextFieldTreeCell#accessibleRole:Enum=TREE_ITEM
-javafx.scene.control.cell.TextFieldTreeCell#alignment:Enum=CENTER_LEFT
-javafx.scene.control.cell.TextFieldTreeCell#focusTraversable:Boolean=false
-javafx.scene.control.cell.TextFieldTreeCell#mnemonicParsing:Boolean=false
-javafx.scene.control.cell.TextFieldTreeCell#nodeOrientation:Enum=INHERIT
-javafx.scene.control.cell.TextFieldTreeCell#pickOnBounds:Boolean=true
-javafx.scene.image.ImageView#accessibleRole:Enum=IMAGE_VIEW
-javafx.scene.image.ImageView#nodeOrientation:Enum=LEFT_TO_RIGHT
-javafx.scene.layout.Region#accessibleRole:Enum=PARENT
-javafx.scene.layout.Region#pickOnBounds:Boolean=true
-javafx.scene.media.MediaView#nodeOrientation:Enum=LEFT_TO_RIGHT
-javafx.scene.text.Text#accessibleRole:Enum=TEXT
-javafx.scene.text.Text#pickOnBounds:Boolean=true
-javafx.scene.text.TextFlow#accessibleRole:Enum=TEXT
-javafx.scene.web.HTMLEditor#focusTraversable:Boolean=true
-javafx.scene.web.WebView#accessibleRole:Enum=PARENT
-javafx.scene.web.WebView#focusTraversable:Boolean=true
-javafx.scene.web.WebView#nodeOrientation:Enum=LEFT_TO_RIGHT
+javafx.embed.swing.SwingNode#focusTraversable=true
+javafx.scene.Group#accessibleRole=PARENT
+javafx.scene.canvas.Canvas#nodeOrientation=LEFT_TO_RIGHT
+javafx.scene.control.Button#accessibleRole=BUTTON
+javafx.scene.control.Button#focusTraversable=true
+javafx.scene.control.Button#mnemonicParsing=true
+javafx.scene.control.CheckBox#accessibleRole=CHECK_BOX
+javafx.scene.control.CheckBox#focusTraversable=true
+javafx.scene.control.CheckBox#mnemonicParsing=true
+javafx.scene.control.ChoiceBox#accessibleRole=COMBO_BOX
+javafx.scene.control.ChoiceBox#focusTraversable=true
+javafx.scene.control.ColorPicker#focusTraversable=true
+javafx.scene.control.ComboBox#accessibleRole=COMBO_BOX
+javafx.scene.control.ComboBox#focusTraversable=true
+javafx.scene.control.ContextMenu#autoHide=true
+javafx.scene.control.ContextMenu#consumeAutoHidingEvents=false
+javafx.scene.control.DatePicker#accessibleRole=DATE_PICKER
+javafx.scene.control.DatePicker#editable=true
+javafx.scene.control.DatePicker#focusTraversable=true
+javafx.scene.control.Hyperlink#accessibleRole=HYPERLINK
+javafx.scene.control.Hyperlink#focusTraversable=true
+javafx.scene.control.Label#accessibleRole=TEXT
+javafx.scene.control.ListCell#accessibleRole=LIST_ITEM
+javafx.scene.control.ListView#accessibleRole=LIST_VIEW
+javafx.scene.control.ListView#focusTraversable=true
+javafx.scene.control.MenuBar#accessibleRole=MENU_BAR
+javafx.scene.control.MenuButton#accessibleRole=MENU_BUTTON
+javafx.scene.control.MenuButton#focusTraversable=true
+javafx.scene.control.MenuButton#mnemonicParsing=true
+javafx.scene.control.Pagination#accessibleRole=PAGINATION
+javafx.scene.control.Pagination#focusTraversable=true
+javafx.scene.control.PasswordField#accessibleRole=PASSWORD_FIELD
+javafx.scene.control.PopupControl#anchorLocation=CONTENT_TOP_LEFT
+javafx.scene.control.ProgressIndicator#accessibleRole=PROGRESS_INDICATOR
+javafx.scene.control.RadioButton#accessibleRole=RADIO_BUTTON
+javafx.scene.control.RadioButton#alignment=CENTER_LEFT
+javafx.scene.control.ScrollBar#accessibleRole=SCROLL_BAR
+javafx.scene.control.ScrollPane#accessibleRole=SCROLL_PANE
+javafx.scene.control.SeparatorMenuItem#hideOnClick=false
+javafx.scene.control.Slider#accessibleRole=SLIDER
+javafx.scene.control.Slider#focusTraversable=true
+javafx.scene.control.Spinner#accessibleRole=SPINNER
+javafx.scene.control.Spinner#focusTraversable=true
+javafx.scene.control.SplitMenuButton#accessibleRole=SPLIT_MENU_BUTTON
+javafx.scene.control.TabPane#accessibleRole=TAB_PANE
+javafx.scene.control.TabPane#focusTraversable=true
+javafx.scene.control.TableCell#accessibleRole=TABLE_CELL
+javafx.scene.control.TableRow#accessibleRole=TABLE_ROW
+javafx.scene.control.TableView#accessibleRole=TABLE_VIEW
+javafx.scene.control.TableView#focusTraversable=true
+javafx.scene.control.TextArea#accessibleRole=TEXT_AREA
+javafx.scene.control.TextArea#focusTraversable=true
+javafx.scene.control.TextField#accessibleRole=TEXT_FIELD
+javafx.scene.control.TextField#focusTraversable=true
+javafx.scene.control.TitledPane#accessibleRole=TITLED_PANE
+javafx.scene.control.TitledPane#focusTraversable=true
+javafx.scene.control.ToggleButton#accessibleRole=TOGGLE_BUTTON
+javafx.scene.control.ToggleButton#alignment=CENTER
+javafx.scene.control.ToggleButton#focusTraversable=true
+javafx.scene.control.ToggleButton#mnemonicParsing=true
+javafx.scene.control.ToolBar#accessibleRole=TOOL_BAR
+javafx.scene.control.TreeCell#accessibleRole=TREE_ITEM
+javafx.scene.control.TreeTableCell#accessibleRole=TREE_TABLE_CELL
+javafx.scene.control.TreeTableRow#accessibleRole=TREE_TABLE_ROW
+javafx.scene.control.TreeTableView#accessibleRole=TREE_TABLE_VIEW
+javafx.scene.control.TreeTableView#focusTraversable=true
+javafx.scene.control.TreeView#accessibleRole=TREE_VIEW
+javafx.scene.control.TreeView#focusTraversable=true
+javafx.scene.control.cell.CheckBoxTreeCell#accessibleRole=TREE_ITEM
+javafx.scene.control.cell.CheckBoxTreeCell#alignment=CENTER_LEFT
+javafx.scene.control.cell.CheckBoxTreeCell#focusTraversable=false
+javafx.scene.control.cell.CheckBoxTreeCell#mnemonicParsing=false
+javafx.scene.control.cell.CheckBoxTreeCell#nodeOrientation=INHERIT
+javafx.scene.control.cell.CheckBoxTreeCell#pickOnBounds=true
+javafx.scene.control.cell.ChoiceBoxTreeCell#accessibleRole=TREE_ITEM
+javafx.scene.control.cell.ChoiceBoxTreeCell#alignment=CENTER_LEFT
+javafx.scene.control.cell.ChoiceBoxTreeCell#focusTraversable=false
+javafx.scene.control.cell.ChoiceBoxTreeCell#mnemonicParsing=false
+javafx.scene.control.cell.ChoiceBoxTreeCell#nodeOrientation=INHERIT
+javafx.scene.control.cell.ChoiceBoxTreeCell#pickOnBounds=true
+javafx.scene.control.cell.ComboBoxTreeCell#accessibleRole=TREE_ITEM
+javafx.scene.control.cell.ComboBoxTreeCell#alignment=CENTER_LEFT
+javafx.scene.control.cell.ComboBoxTreeCell#focusTraversable=false
+javafx.scene.control.cell.ComboBoxTreeCell#mnemonicParsing=false
+javafx.scene.control.cell.ComboBoxTreeCell#nodeOrientation=INHERIT
+javafx.scene.control.cell.ComboBoxTreeCell#pickOnBounds=true
+javafx.scene.control.cell.TextFieldTreeCell#accessibleRole=TREE_ITEM
+javafx.scene.control.cell.TextFieldTreeCell#alignment=CENTER_LEFT
+javafx.scene.control.cell.TextFieldTreeCell#focusTraversable=false
+javafx.scene.control.cell.TextFieldTreeCell#mnemonicParsing=false
+javafx.scene.control.cell.TextFieldTreeCell#nodeOrientation=INHERIT
+javafx.scene.control.cell.TextFieldTreeCell#pickOnBounds=true
+javafx.scene.image.ImageView#accessibleRole=IMAGE_VIEW
+javafx.scene.image.ImageView#nodeOrientation=LEFT_TO_RIGHT
+javafx.scene.layout.Region#accessibleRole=PARENT
+javafx.scene.layout.Region#pickOnBounds=true
+javafx.scene.media.MediaView#nodeOrientation=LEFT_TO_RIGHT
+javafx.scene.text.Text#accessibleRole=TEXT
+javafx.scene.text.Text#pickOnBounds=true
+javafx.scene.text.TextFlow#accessibleRole=TEXT
+javafx.scene.web.HTMLEditor#focusTraversable=true
+javafx.scene.web.WebView#accessibleRole=PARENT
+javafx.scene.web.WebView#focusTraversable=true
+javafx.scene.web.WebView#nodeOrientation=LEFT_TO_RIGHT
 -------- Overridden properties' values ---------
 -- javafx.scene.Node#accessibleRole[BUTTON, CHECK_BOX, COMBO_BOX, DATE_PICKER, HYPERLINK, IMAGE_VIEW, LIST_ITEM, LIST_VIEW, MENU_BAR, MENU_BUTTON, NODE, PAGINATION, PARENT, PASSWORD_FIELD, PROGRESS_INDICATOR, RADIO_BUTTON, SCROLL_BAR, SCROLL_PANE, SLIDER, SPINNER, SPLIT_MENU_BUTTON, TABLE_CELL, TABLE_ROW, TABLE_VIEW, TAB_PANE, TEXT, TEXT_AREA, TEXT_FIELD, TITLED_PANE, TOGGLE_BUTTON, TOOL_BAR, TREE_ITEM, TREE_TABLE_CELL, TREE_TABLE_ROW, TREE_TABLE_VIEW, TREE_VIEW]
 -- javafx.scene.Node#focusTraversable[false, true]
index 2f7a7d800c7b36f35c34c0a3bc8e7aaa630ee13d..9f52ae28df1918ac8b0cc328cb6d92164954b22c 100644 (file)
@@ -87,7 +87,7 @@ public class JavaFxPropertyAttributeDescriptor extends BasicXmlAttributeDescript
       return ArrayUtil.toStringArray(enumConstants);
     }
 
-    final String propertyQName = getBoxedPropertyType(getDeclaration());
+    final String propertyQName = JavaFxPsiUtil.getBoxedPropertyType(getDeclaration());
     if (CommonClassNames.JAVA_LANG_FLOAT.equals(propertyQName) || CommonClassNames.JAVA_LANG_DOUBLE.equals(propertyQName)) {
       return new String[] {"Infinity", "-Infinity", "NaN",  "-NaN"};
     } else if (CommonClassNames.JAVA_LANG_BOOLEAN.equals(propertyQName)) {
@@ -193,7 +193,7 @@ public class JavaFxPropertyAttributeDescriptor extends BasicXmlAttributeDescript
             final PsiElement declaration = attributeDescriptor.getDeclaration();
             final String boxedQName;
             if (declaration != null) {
-              boxedQName = getBoxedPropertyType(declaration);
+              boxedQName = JavaFxPsiUtil.getBoxedPropertyType(declaration);
             }
             else {
               final PsiClass tagClass = JavaFxPsiUtil.getTagClass((XmlAttributeValue)context);
@@ -236,20 +236,6 @@ public class JavaFxPropertyAttributeDescriptor extends BasicXmlAttributeDescript
     return null;
   }
 
-  @Nullable
-  private static String getBoxedPropertyType(PsiElement declaration) {
-    PsiType attrType = JavaFxPsiUtil.getWritablePropertyType(declaration);
-
-    String boxedQName = null;
-    if (attrType instanceof PsiPrimitiveType) {
-      boxedQName = ((PsiPrimitiveType)attrType).getBoxedTypeName();
-    } else if (PsiPrimitiveType.getUnboxedType(attrType) != null) {
-      final PsiClass attrClass = PsiUtil.resolveClassInType(attrType);
-      boxedQName = attrClass != null ? attrClass.getQualifiedName() : null;
-    }
-    return boxedQName;
-  }
-
   @Override
   public PsiElement getDeclaration() {
     if (myPsiClass != null) {