modules/controls/src/main/java/javafx/scene/control/skin/ProgressIndicatorSkin.java

Print this page
rev 9240 : 8076423: JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization

@@ -21,31 +21,30 @@
  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 
-package com.sun.javafx.scene.control.skin;
+package javafx.scene.control.skin;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import com.sun.javafx.scene.control.behavior.BehaviorBase;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
 import javafx.animation.KeyValue;
 import javafx.animation.Timeline;
-import javafx.beans.InvalidationListener;
 import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.ObjectProperty;
 import javafx.beans.value.WritableValue;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.geometry.NodeOrientation;
 import javafx.geometry.VPos;
 import javafx.scene.Node;
+import javafx.scene.control.Control;
 import javafx.scene.control.ProgressIndicator;
 import javafx.scene.control.SkinBase;
 import javafx.scene.layout.Pane;
 import javafx.scene.layout.Region;
 import javafx.scene.layout.StackPane;

@@ -60,21 +59,91 @@
 import javafx.css.CssMetaData;
 import javafx.css.StyleableObjectProperty;
 import javafx.css.StyleableProperty;
 import javafx.css.StyleableBooleanProperty;
 import javafx.css.StyleableIntegerProperty;
-import com.sun.javafx.css.converters.BooleanConverter;
-import com.sun.javafx.css.converters.PaintConverter;
-import com.sun.javafx.css.converters.SizeConverter;
+import javafx.css.converter.BooleanConverter;
+import javafx.css.converter.PaintConverter;
+import javafx.css.converter.SizeConverter;
 import com.sun.javafx.scene.control.skin.resources.ControlResources;
 import javafx.css.Styleable;
 
-public class ProgressIndicatorSkin extends BehaviorSkinBase<ProgressIndicator, BehaviorBase<ProgressIndicator>> {
+/**
+ * Default skin implementation for the {@link ProgressIndicator} control.
+ *
+ * @see ProgressIndicator
+ * @since 9
+ */
+public class ProgressIndicatorSkin extends SkinBase<ProgressIndicator> {
+
+    /***************************************************************************
+     *                                                                         *
+     * Static fields                                                           *
+     *                                                                         *
+     **************************************************************************/
+
+    private static final String DONE = ControlResources.getString("ProgressIndicator.doneString");
+
+    /** doneText is just used to know the size of done as that is the biggest text we need to allow for */
+    private static final Text doneText = new Text(DONE);
+    static {
+        doneText.getStyleClass().add("text");
+    }
+
+
 
     /***************************************************************************
      *                                                                         *
-     * CSS properties                                                          *
+     * Private fields                                                          *
+     *                                                                         *
+     **************************************************************************/
+
+    final Duration CLIPPED_DELAY = new Duration(300);
+    final Duration UNCLIPPED_DELAY = new Duration(0);
+
+    private IndeterminateSpinner spinner;
+    private DeterminateIndicator determinateIndicator;
+    private ProgressIndicator control;
+
+    Animation indeterminateTransition;
+
+
+
+    /***************************************************************************
+     *                                                                         *
+     * Constructors                                                            *
+     *                                                                         *
+     **************************************************************************/
+
+    /**
+     * Creates a new ProgressIndicatorSkin instance, installing the necessary child
+     * nodes into the Control {@link Control#getChildren() children} list, as
+     * well as the necessary {@link Node#getInputMap() input mappings} for
+     * handling key, mouse, etc events.
+     *
+     * @param control The control that this skin should be installed onto.
+     */
+    public ProgressIndicatorSkin(ProgressIndicator control) {
+        super(control);
+
+        this.control = control;
+
+        // register listeners
+        registerChangeListener(control.indeterminateProperty(), e -> initialize());
+        registerChangeListener(control.progressProperty(), e -> updateProgress());
+        registerChangeListener(control.visibleProperty(), e -> updateAnimation());
+        registerChangeListener(control.parentProperty(), e -> updateAnimation());
+        registerChangeListener(control.sceneProperty(), e -> updateAnimation());
+
+        initialize();
+    }
+
+
+
+    /***************************************************************************
+     *                                                                         *
+     * Properties                                                              *
      *                                                                         *
      **************************************************************************/
 
     /**
      * The colour of the progress segment.

@@ -154,75 +223,51 @@
 
 
 
     /***************************************************************************
      *                                                                         *
-     * Private fields                                                          *
+     * Public API                                                              *
      *                                                                         *
      **************************************************************************/
 
-    private static final String DONE = ControlResources.getString("ProgressIndicator.doneString");
+    /** {@inheritDoc} */
+    @Override public void dispose() {
+        super.dispose();
 
-    /** doneText is just used to know the size of done as that is the biggest text we need to allow for */
-    private static final Text doneText = new Text(DONE);
-    static {
-        doneText.getStyleClass().add("text");
+        if (indeterminateTransition != null) {
+            indeterminateTransition.stop();
+            indeterminateTransition = null;
     }
 
-    private IndeterminateSpinner spinner;
-    private DeterminateIndicator determinateIndicator;
-    private ProgressIndicator control;
-
-    protected Animation indeterminateTransition;
-
-
-
-    /***************************************************************************
-     *                                                                         *
-     * Constructors                                                            *
-     *                                                                         *
-     **************************************************************************/
-
-    public ProgressIndicatorSkin(ProgressIndicator control) {
-        super(control, new BehaviorBase<ProgressIndicator>(control, Collections.emptyList()));
-
-        this.control = control;
+        if (spinner != null) {
+            spinner = null;
+        }
 
-        // register listeners
-        registerChangeListener(control.indeterminateProperty(), "INDETERMINATE");
-        registerChangeListener(control.progressProperty(), "PROGRESS");
-        registerChangeListener(control.visibleProperty(), "VISIBLE");
-        registerChangeListener(control.parentProperty(), "PARENT");
-        registerChangeListener(control.sceneProperty(), "SCENE");
+        control = null;
+    }
 
-        initialize();
+    /** {@inheritDoc} */
+    @Override protected void layoutChildren(final double x, final double y,
+                                            final double w, final double h) {
+        if (spinner != null && control.isIndeterminate()) {
+            spinner.layoutChildren();
+            spinner.resizeRelocate(0, 0, w, h);
+        } else if (determinateIndicator != null) {
+            determinateIndicator.layoutChildren();
+            determinateIndicator.resizeRelocate(0, 0, w, h);
     }
+    }
+
 
 
     /***************************************************************************
      *                                                                         *
-     * API (for ProgressBarSkin)                                               *
+     * Private implementation                                                  *
      *                                                                         *
      **************************************************************************/
 
-    @Override protected void handleControlPropertyChanged(String p) {
-        super.handleControlPropertyChanged(p);
-
-        if ("INDETERMINATE".equals(p)) {
-            initialize();
-        } else if ("PROGRESS".equals(p)) {
-            updateProgress();
-        } else if ("VISIBLE".equals(p)) {
-            updateAnimation();
-        } else if ("PARENT".equals(p)) {
-            updateAnimation();
-        } else if ("SCENE".equals(p)) {
-            updateAnimation();
-        }
-    }
-
-    protected void initialize() {
+    void initialize() {
         boolean isIndeterminate = control.isIndeterminate();
         if (isIndeterminate) {
             // clean up determinateIndicator
             determinateIndicator = null;
 

@@ -247,38 +292,23 @@
             determinateIndicator = new DeterminateIndicator(control, this, progressColor.get());
             getChildren().setAll(determinateIndicator);
         }
     }
 
-    @Override public void dispose() {
-        super.dispose();
-
-        if (indeterminateTransition != null) {
-            indeterminateTransition.stop();
-            indeterminateTransition = null;
-        }
-
-        if (spinner != null) {
-            spinner = null;
-        }
-
-        control = null;
-    }
-
-    protected void updateProgress() {
+    void updateProgress() {
         if (determinateIndicator != null) {
             determinateIndicator.updateProgress(control.getProgress());
         }
     }
 
-    protected void createIndeterminateTimeline() {
+    void createIndeterminateTimeline() {
         if (spinner != null) {
             spinner.rebuildTimeline();
         }
     }
 
-    protected void pauseTimeline(boolean pause) {
+    void pauseTimeline(boolean pause) {
         if (getSkinnable().isIndeterminate()) {
             if (indeterminateTransition == null) {
                 createIndeterminateTimeline();
             }
             if (pause) {

@@ -287,59 +317,111 @@
                 indeterminateTransition.play();
             }
         }
     }
 
-    protected void updateAnimation() {
+    void updateAnimation() {
         ProgressIndicator control = getSkinnable();
         final boolean isTreeVisible = control.isVisible() &&
                                       control.getParent() != null &&
                                       control.getScene() != null;
         if (indeterminateTransition != null) {
-            pauseTimeline(! isTreeVisible);
+            pauseTimeline(!isTreeVisible);
         } else if (isTreeVisible) {
             createIndeterminateTimeline();
         }
     }
 
 
 
     /***************************************************************************
      *                                                                         *
-     * Listeners                                                               *
+     * Stylesheet Handling                                                     *
      *                                                                         *
      **************************************************************************/
 
+    private static final CssMetaData<ProgressIndicator,Paint> PROGRESS_COLOR =
+            new CssMetaData<ProgressIndicator,Paint>("-fx-progress-color",
+                    PaintConverter.getInstance(), null) {
 
+                @Override
+                public boolean isSettable(ProgressIndicator n) {
+                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) n.getSkin();
+                    return skin.progressColor == null ||
+                            !skin.progressColor.isBound();
+                }
 
+                @Override
+                public StyleableProperty<Paint> getStyleableProperty(ProgressIndicator n) {
+                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) n.getSkin();
+                    return (StyleableProperty<Paint>)(WritableValue<Paint>)skin.progressColor;
+                }
+            };
+    private static final CssMetaData<ProgressIndicator,Number> INDETERMINATE_SEGMENT_COUNT =
+            new CssMetaData<ProgressIndicator,Number>("-fx-indeterminate-segment-count",
+                    SizeConverter.getInstance(), 8) {
 
-    /***************************************************************************
-     *                                                                         *
-     * Layout                                                                  *
-     *                                                                         *
-     **************************************************************************/
+                @Override public boolean isSettable(ProgressIndicator n) {
+                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) n.getSkin();
+                    return skin.indeterminateSegmentCount == null ||
+                            !skin.indeterminateSegmentCount.isBound();
+                }
 
-    @Override protected void layoutChildren(final double x, final double y,
-                                            final double w, final double h) {
-        if (spinner != null && control.isIndeterminate()) {
-            spinner.layoutChildren();
-            spinner.resizeRelocate(0, 0, w, h);
-        } else if (determinateIndicator != null) {
-            determinateIndicator.layoutChildren();
-            determinateIndicator.resizeRelocate(0, 0, w, h);
+                @Override public StyleableProperty<Number> getStyleableProperty(ProgressIndicator n) {
+                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) n.getSkin();
+                    return (StyleableProperty<Number>)(WritableValue<Number>)skin.indeterminateSegmentCount;
         }
+            };
+    private static final CssMetaData<ProgressIndicator,Boolean> SPIN_ENABLED =
+            new CssMetaData<ProgressIndicator,Boolean>("-fx-spin-enabled", BooleanConverter.getInstance(), Boolean.FALSE) {
+
+                @Override public boolean isSettable(ProgressIndicator node) {
+                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) node.getSkin();
+                    return skin.spinEnabled == null || !skin.spinEnabled.isBound();
+                }
+
+                @Override public StyleableProperty<Boolean> getStyleableProperty(ProgressIndicator node) {
+                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) node.getSkin();
+                    return (StyleableProperty<Boolean>)(WritableValue<Boolean>)skin.spinEnabled;
+                }
+            };
+
+    private static final List<CssMetaData<? extends Styleable, ?>> STYLEABLES;
+    static {
+        final List<CssMetaData<? extends Styleable, ?>> styleables =
+                new ArrayList<CssMetaData<? extends Styleable, ?>>(SkinBase.getClassCssMetaData());
+        styleables.add(PROGRESS_COLOR);
+        styleables.add(INDETERMINATE_SEGMENT_COUNT);
+        styleables.add(SPIN_ENABLED);
+        STYLEABLES = Collections.unmodifiableList(styleables);
+    }
+
+    /**
+     * Returns the CssMetaData associated with this class, which may include the
+     * CssMetaData of its super classes.
+     */
+    public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
+        return STYLEABLES;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public List<CssMetaData<? extends Styleable, ?>> getCssMetaData() {
+        return getClassCssMetaData();
     }
 
 
 
     /***************************************************************************
      *                                                                         *
-     * DeterminateIndicator                                                    *
+     * Support classes                                                         *
      *                                                                         *
      **************************************************************************/
 
-    private class DeterminateIndicator extends Region {
+    private final class DeterminateIndicator extends Region {
         private double textGap = 2.0F;
 
         // only update progress text on whole percentages
         private int intProgress;
 

@@ -533,20 +615,10 @@
             return computePrefHeight(width);
         }
     }
 
 
-
-    /***************************************************************************
-     *                                                                         *
-     * IndeterminateSpinner                                                    *
-     *                                                                         *
-     **************************************************************************/
-
-    protected final Duration CLIPPED_DELAY = new Duration(300);
-    protected final Duration UNCLIPPED_DELAY = new Duration(0);
-
     private final class IndeterminateSpinner extends Region {
         private IndicatorPaths pathsG;
         private final List<Double> opacities = new ArrayList<>();
         private boolean spinEnabled = false;
         private Paint fillOverride = null;

@@ -701,86 +773,6 @@
             for (int i = 0; i < segments; i++) {
                 pathsG.getChildren().get(i).setOpacity(opacities.get(i));
             }
         }
     }
-
-
-
-    /***************************************************************************
-     *                                                                         *
-     * Stylesheet Handling                                                     *
-     *                                                                         *
-     **************************************************************************/
-
-    private static final CssMetaData<ProgressIndicator,Paint> PROGRESS_COLOR =
-            new CssMetaData<ProgressIndicator,Paint>("-fx-progress-color",
-                    PaintConverter.getInstance(), null) {
-
-                @Override
-                public boolean isSettable(ProgressIndicator n) {
-                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) n.getSkin();
-                    return skin.progressColor == null ||
-                            !skin.progressColor.isBound();
-                }
-
-                @Override
-                public StyleableProperty<Paint> getStyleableProperty(ProgressIndicator n) {
-                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) n.getSkin();
-                    return (StyleableProperty<Paint>)(WritableValue<Paint>)skin.progressColor;
-                }
-            };
-    private static final CssMetaData<ProgressIndicator,Number> INDETERMINATE_SEGMENT_COUNT =
-            new CssMetaData<ProgressIndicator,Number>("-fx-indeterminate-segment-count",
-                    SizeConverter.getInstance(), 8) {
-
-                @Override public boolean isSettable(ProgressIndicator n) {
-                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) n.getSkin();
-                    return skin.indeterminateSegmentCount == null ||
-                            !skin.indeterminateSegmentCount.isBound();
-                }
-
-                @Override public StyleableProperty<Number> getStyleableProperty(ProgressIndicator n) {
-                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) n.getSkin();
-                    return (StyleableProperty<Number>)(WritableValue<Number>)skin.indeterminateSegmentCount;
-                }
-            };
-    private static final CssMetaData<ProgressIndicator,Boolean> SPIN_ENABLED =
-            new CssMetaData<ProgressIndicator,Boolean>("-fx-spin-enabled", BooleanConverter.getInstance(), Boolean.FALSE) {
-
-                @Override public boolean isSettable(ProgressIndicator node) {
-                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) node.getSkin();
-                    return skin.spinEnabled == null || !skin.spinEnabled.isBound();
-                }
-
-                @Override public StyleableProperty<Boolean> getStyleableProperty(ProgressIndicator node) {
-                    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) node.getSkin();
-                    return (StyleableProperty<Boolean>)(WritableValue<Boolean>)skin.spinEnabled;
-                }
-            };
-
-    public static final List<CssMetaData<? extends Styleable, ?>> STYLEABLES;
-    static {
-        final List<CssMetaData<? extends Styleable, ?>> styleables =
-                new ArrayList<CssMetaData<? extends Styleable, ?>>(SkinBase.getClassCssMetaData());
-        styleables.add(PROGRESS_COLOR);
-        styleables.add(INDETERMINATE_SEGMENT_COUNT);
-        styleables.add(SPIN_ENABLED);
-        STYLEABLES = Collections.unmodifiableList(styleables);
-    }
-
-    /**
-     * @return The CssMetaData associated with this class, which may include the
-     * CssMetaData of its super classes.
-     */
-    public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
-        return STYLEABLES;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<CssMetaData<? extends Styleable, ?>> getCssMetaData() {
-        return getClassCssMetaData();
-    }
 }