diff --git a/desktop/src/main/java/bisq/desktop/components/indicator/behavior/StaticProgressIndicatorBehavior.java b/desktop/src/main/java/bisq/desktop/components/indicator/behavior/StaticProgressIndicatorBehavior.java deleted file mode 100644 index cbd2c83d3f..0000000000 --- a/desktop/src/main/java/bisq/desktop/components/indicator/behavior/StaticProgressIndicatorBehavior.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -/* - * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * 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 bisq.desktop.components.indicator.behavior; - -import bisq.desktop.components.indicator.TxConfidenceIndicator; - -import com.sun.javafx.scene.control.behavior.BehaviorBase; - -import java.util.Collections; - -// TODO Copied form OpenJFX, check license issues and way how we integrated it -// We changed behaviour which was not exposed via APIs - -/** - * @param - */ -public class StaticProgressIndicatorBehavior extends BehaviorBase { - - /** - * ************************************************************************ - * * - * Constructors * - * * - * ************************************************************************ - */ - - public StaticProgressIndicatorBehavior(final C progress) { - super(progress, Collections.emptyList()); - } -} diff --git a/desktop/src/main/java/bisq/desktop/components/indicator/skin/StaticProgressIndicatorSkin.java b/desktop/src/main/java/bisq/desktop/components/indicator/skin/StaticProgressIndicatorSkin.java deleted file mode 100644 index 38b28e0961..0000000000 --- a/desktop/src/main/java/bisq/desktop/components/indicator/skin/StaticProgressIndicatorSkin.java +++ /dev/null @@ -1,775 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -/* - * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * 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 bisq.desktop.components.indicator.skin; - -import bisq.desktop.components.indicator.TxConfidenceIndicator; -import bisq.desktop.components.indicator.behavior.StaticProgressIndicatorBehavior; - -import javafx.scene.Node; -import javafx.scene.control.SkinBase; -import javafx.scene.layout.Pane; -import javafx.scene.layout.Region; -import javafx.scene.layout.StackPane; -import javafx.scene.paint.Color; -import javafx.scene.paint.Paint; -import javafx.scene.shape.Arc; -import javafx.scene.shape.ArcType; -import javafx.scene.shape.Circle; -import javafx.scene.transform.Scale; - -import com.sun.javafx.scene.control.skin.BehaviorSkinBase; - -import javafx.css.CssMetaData; -import javafx.css.StyleOrigin; -import javafx.css.Styleable; -import javafx.css.StyleableBooleanProperty; -import javafx.css.StyleableIntegerProperty; -import javafx.css.StyleableObjectProperty; -import javafx.css.StyleableProperty; - -import com.sun.javafx.css.converters.BooleanConverter; -import com.sun.javafx.css.converters.PaintConverter; -import com.sun.javafx.css.converters.SizeConverter; - -import javafx.geometry.Insets; -import javafx.geometry.NodeOrientation; - -import javafx.beans.InvalidationListener; -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.IntegerProperty; -import javafx.beans.property.ObjectProperty; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -// TODO Copied form OpenJFX, check license issues and way how we integrated it -// We changed behaviour which was not exposed via APIs - -public class StaticProgressIndicatorSkin extends BehaviorSkinBase> { - - /** - * ************************************************************************ - * * - * UI SubComponents * - * * - * ************************************************************************ - */ - - private IndeterminateSpinner spinner; - /** - * The number of segments in the spinner. - */ - - private final IntegerProperty indeterminateSegmentCount = new StyleableIntegerProperty(8) { - - @Override - protected void invalidated() { - if (spinner != null) { - spinner.rebuild(); - } - } - - - @Override - public Object getBean() { - return StaticProgressIndicatorSkin.this; - } - - - @Override - public String getName() { - return "indeterminateSegmentCount"; - } - - - @Override - public CssMetaData getCssMetaData() { - return StyleableProperties.INDETERMINATE_SEGMENT_COUNT; - } - }; - /** - * True if the progress indicator should rotate as well as animate opacity. - */ - - private final BooleanProperty spinEnabled = new StyleableBooleanProperty(false) { - @Override - protected void invalidated() { - if (spinner != null) { - spinner.setSpinEnabled(get()); - } - } - - - @Override - public CssMetaData getCssMetaData() { - return StyleableProperties.SPIN_ENABLED; - } - - - @Override - public Object getBean() { - return StaticProgressIndicatorSkin.this; - } - - - @Override - public String getName() { - return "spinEnabled"; - } - }; - - private DeterminateIndicator determinateIndicator; - /** - * The colour of the progress segment. - */ - - private final ObjectProperty progressColor = new StyleableObjectProperty(null) { - - @Override - public void set(Paint newProgressColor) { - final Paint color = (newProgressColor instanceof Color) ? newProgressColor : null; - super.set(color); - } - - @Override - protected void invalidated() { - if (spinner != null) { - spinner.setFillOverride(get()); - } - if (determinateIndicator != null) { - determinateIndicator.setFillOverride(get()); - } - } - - - @Override - public Object getBean() { - return StaticProgressIndicatorSkin.this; - } - - - @Override - public String getName() { - return "progressColorProperty"; - } - - - @Override - public CssMetaData getCssMetaData() { - return StyleableProperties.PROGRESS_COLOR; - } - }; - private boolean timeLineNulled = false; - - /** - * ************************************************************************ - * * - * Constructors * - * * - * ************************************************************************ - */ - @SuppressWarnings("deprecation") - public StaticProgressIndicatorSkin(TxConfidenceIndicator control) { - super(control, new StaticProgressIndicatorBehavior<>(control)); - - InvalidationListener indeterminateListener = valueModel -> initialize(); - control.indeterminateProperty().addListener(indeterminateListener); - - InvalidationListener visibilityListener = valueModel -> { - if (getSkinnable().isIndeterminate() && timeLineNulled && spinner == null) { - timeLineNulled = false; - spinner = new IndeterminateSpinner( - getSkinnable(), StaticProgressIndicatorSkin.this, - spinEnabled.get(), progressColor.get()); - getChildren().add(spinner); - } - - if (spinner != null) { - if (!(getSkinnable().impl_isTreeVisible() && getSkinnable().getScene() != null)) { - getChildren().remove(spinner); - spinner = null; - timeLineNulled = true; - } - } - }; - control.visibleProperty().addListener(visibilityListener); - control.parentProperty().addListener(visibilityListener); - - InvalidationListener sceneListener = valueModel -> { - if (spinner != null) { - if (getSkinnable().getScene() == null) { - getChildren().remove(spinner); - spinner = null; - timeLineNulled = true; - } - } else { - if (getSkinnable().getScene() != null && getSkinnable().isIndeterminate()) { - timeLineNulled = false; - spinner = new IndeterminateSpinner( - getSkinnable(), StaticProgressIndicatorSkin.this, - spinEnabled.get(), progressColor.get()); - getChildren().add(spinner); - getSkinnable().requestLayout(); - } - } - }; - control.sceneProperty().addListener(sceneListener); - - initialize(); - getSkinnable().requestLayout(); - } - - /** - * @return The CssMetaData associated with this class, which may include the - * CssMetaData of its super classes. - */ - @SuppressWarnings("SameReturnValue") - public static List> getClassCssMetaData() { - return StyleableProperties.STYLEABLES; - } - - @SuppressWarnings("deprecation") - private void initialize() { - TxConfidenceIndicator control = getSkinnable(); - boolean isIndeterminate = control.isIndeterminate(); - if (isIndeterminate) { - // clean up determinateIndicator - determinateIndicator = null; - // create spinner - spinner = new IndeterminateSpinner(control, this, spinEnabled.get(), progressColor.get()); - getChildren().clear(); - getChildren().add(spinner); - } else { - // clean up after spinner - if (spinner != null) { - spinner = null; - } - // create determinateIndicator - determinateIndicator = - new StaticProgressIndicatorSkin.DeterminateIndicator(control, this, progressColor.get()); - getChildren().clear(); - getChildren().add(determinateIndicator); - } - } - - @Override - public void dispose() { - super.dispose(); - if (spinner != null) { - spinner = null; - } - } - - @Override - protected void layoutChildren(final double x, final double y, final double w, final double h) { - if (spinner != null && getSkinnable().isIndeterminate()) { - spinner.layoutChildren(); - spinner.resizeRelocate(0, 0, w, h); - } else if (determinateIndicator != null) { - determinateIndicator.layoutChildren(); - determinateIndicator.resizeRelocate(0, 0, w, h); - } - } - - public Paint getProgressColor() { - return progressColor.get(); - } - - /** - * {@inheritDoc} - */ - @Override - public List> getCssMetaData() { - return getClassCssMetaData(); - } - - // *********** Stylesheet Handling ***************************************** - - /** - * ************************************************************************ - * * - * DeterminateIndicator * - * * - * ************************************************************************ - */ - - @SuppressWarnings({"SameReturnValue", "UnusedParameters"}) - static class DeterminateIndicator extends Region { - //private double textGap = 2.0F; - - - private final TxConfidenceIndicator control; - //private Text text; - - private final StackPane indicator; - - private final StackPane progress; - - private final StackPane tick; - - private final Arc arcShape; - - private final Circle indicatorCircle; - // only update progress text on whole percentages - private int intProgress; - // only update pie arc to nearest degree - private int degProgress; - - public DeterminateIndicator(TxConfidenceIndicator control, StaticProgressIndicatorSkin s, - Paint fillOverride) { - this.control = control; - - getStyleClass().add("determinate-indicator"); - - intProgress = (int) Math.round(control.getProgress() * 100.0); - degProgress = (int) (360 * control.getProgress()); - - InvalidationListener progressListener = valueModel -> updateProgress(); - control.progressProperty().addListener(progressListener); - - getChildren().clear(); - - // The circular background for the progress pie piece - indicator = new StackPane(); - indicator.setScaleShape(false); - indicator.setCenterShape(false); - indicator.getStyleClass().setAll("indicator"); - indicatorCircle = new Circle(); - indicator.setShape(indicatorCircle); - - // The shape for our progress pie piece - arcShape = new Arc(); - arcShape.setType(ArcType.ROUND); - arcShape.setStartAngle(90.0F); - - // Our progress pie piece - progress = new StackPane(); - progress.getStyleClass().setAll("progress"); - progress.setScaleShape(false); - progress.setCenterShape(false); - progress.setShape(arcShape); - progress.getChildren().clear(); - setFillOverride(fillOverride); - - // The check mark that's drawn at 100% - tick = new StackPane(); - tick.getStyleClass().setAll("tick"); - - getChildren().setAll(indicator, progress, /*text,*/ tick); - updateProgress(); - } - - private void setFillOverride(Paint fillOverride) { - if (fillOverride instanceof Color) { - Color c = (Color) fillOverride; - progress.setStyle("-fx-background-color: rgba(" + ((int) (255 * c.getRed())) + "," + - "" + ((int) (255 * c.getGreen())) + "," + ((int) (255 * c.getBlue())) + "," + - "" + c.getOpacity() + ");"); - } else { - progress.setStyle(null); - } - } - - //@Override - public boolean isAutomaticallyMirrored() { - // This is used instead of setting NodeOrientation, - // allowing the Text node to inherit the current - // orientation. - return false; - } - - private void updateProgress() { - intProgress = (int) Math.round(control.getProgress() * 100.0); - // text.setText((control.getProgress() >= 1) ? (DONE) : ("" + intProgress + "%")); - - degProgress = (int) (360 * control.getProgress()); - arcShape.setLength(-degProgress); - indicator.setOpacity(control.getProgress() == 0 ? 0 : 1); - requestLayout(); - } - - @Override - protected void layoutChildren() { - // Position and size the circular background - //double doneTextHeight = doneText.getLayoutBounds().getHeight(); - final Insets controlInsets = control.getInsets(); - final double left = snapSize(controlInsets.getLeft()); - final double right = snapSize(controlInsets.getRight()); - final double top = snapSize(controlInsets.getTop()); - final double bottom = snapSize(controlInsets.getBottom()); - - /* - ** use the min of width, or height, keep it a circle - */ - final double areaW = control.getWidth() - left - right; - final double areaH = control.getHeight() - top - bottom /*- textGap - doneTextHeight*/; - final double radiusW = areaW / 2; - final double radiusH = areaH / 2; - final double radius = Math.round(Math.min(radiusW, radiusH)); // use round instead of floor - final double centerX = snapPosition(left + radiusW); - final double centerY = snapPosition(top + radius); - - // find radius that fits inside radius - insetsPadding - final Insets indicatorInsets = indicator.getInsets(); - final double iLeft = snapSize(indicatorInsets.getLeft()); - final double iRight = snapSize(indicatorInsets.getRight()); - final double iTop = snapSize(indicatorInsets.getTop()); - final double iBottom = snapSize(indicatorInsets.getBottom()); - final double progressRadius = snapSize(Math.min(Math.min(radius - iLeft, radius - iRight), - Math.min(radius - iTop, radius - iBottom))); - - indicatorCircle.setRadius(radius); - indicator.setLayoutX(centerX); - indicator.setLayoutY(centerY); - - arcShape.setRadiusX(progressRadius); - arcShape.setRadiusY(progressRadius); - progress.setLayoutX(centerX); - progress.setLayoutY(centerY); - - // find radius that fits inside progressRadius - progressInsets - final Insets progressInsets = progress.getInsets(); - final double pLeft = snapSize(progressInsets.getLeft()); - final double pRight = snapSize(progressInsets.getRight()); - final double pTop = snapSize(progressInsets.getTop()); - final double pBottom = snapSize(progressInsets.getBottom()); - final double indicatorRadius = snapSize(Math.min(Math.min(progressRadius - pLeft, - progressRadius - pRight), Math.min(progressRadius - pTop, progressRadius - pBottom))); - - // find size of spare box that fits inside indicator radius - double squareBoxHalfWidth = Math.ceil(Math.sqrt((indicatorRadius * indicatorRadius) / 2)); - // double squareBoxHalfWidth2 = indicatorRadius * (Math.sqrt(2) / 2); - - tick.setLayoutX(centerX - squareBoxHalfWidth); - tick.setLayoutY(centerY - squareBoxHalfWidth); - tick.resize(squareBoxHalfWidth + squareBoxHalfWidth, squareBoxHalfWidth + squareBoxHalfWidth); - tick.setVisible(control.getProgress() >= 1); - } - - @Override - protected double computePrefWidth(double height) { - final Insets controlInsets = control.getInsets(); - final double left = snapSize(controlInsets.getLeft()); - final double right = snapSize(controlInsets.getRight()); - final Insets indicatorInsets = indicator.getInsets(); - final double iLeft = snapSize(indicatorInsets.getLeft()); - final double iRight = snapSize(indicatorInsets.getRight()); - final double iTop = snapSize(indicatorInsets.getTop()); - final double iBottom = snapSize(indicatorInsets.getBottom()); - final double indicatorMax = snapSize(Math.max(Math.max(iLeft, iRight), Math.max(iTop, iBottom))); - final Insets progressInsets = progress.getInsets(); - final double pLeft = snapSize(progressInsets.getLeft()); - final double pRight = snapSize(progressInsets.getRight()); - final double pTop = snapSize(progressInsets.getTop()); - final double pBottom = snapSize(progressInsets.getBottom()); - final double progressMax = snapSize(Math.max(Math.max(pLeft, pRight), Math.max(pTop, pBottom))); - final Insets tickInsets = tick.getInsets(); - final double tLeft = snapSize(tickInsets.getLeft()); - final double tRight = snapSize(tickInsets.getRight()); - final double indicatorWidth = indicatorMax + progressMax + tLeft + tRight + progressMax + indicatorMax; - return left + indicatorWidth + /*Math.max(indicatorWidth, doneText.getLayoutBounds().getWidth()) + */right; - } - - @Override - protected double computePrefHeight(double width) { - final Insets controlInsets = control.getInsets(); - final double top = snapSize(controlInsets.getTop()); - final double bottom = snapSize(controlInsets.getBottom()); - final Insets indicatorInsets = indicator.getInsets(); - final double iLeft = snapSize(indicatorInsets.getLeft()); - final double iRight = snapSize(indicatorInsets.getRight()); - final double iTop = snapSize(indicatorInsets.getTop()); - final double iBottom = snapSize(indicatorInsets.getBottom()); - final double indicatorMax = snapSize(Math.max(Math.max(iLeft, iRight), Math.max(iTop, iBottom))); - final Insets progressInsets = progress.getInsets(); - final double pLeft = snapSize(progressInsets.getLeft()); - final double pRight = snapSize(progressInsets.getRight()); - final double pTop = snapSize(progressInsets.getTop()); - final double pBottom = snapSize(progressInsets.getBottom()); - final double progressMax = snapSize(Math.max(Math.max(pLeft, pRight), Math.max(pTop, pBottom))); - final Insets tickInsets = tick.getInsets(); - final double tTop = snapSize(tickInsets.getTop()); - final double tBottom = snapSize(tickInsets.getBottom()); - final double indicatorHeight = indicatorMax + progressMax + tTop + tBottom + progressMax + indicatorMax; - return top + indicatorHeight /*+ textGap + doneText.getLayoutBounds().getHeight()*/ + bottom; - } - - @Override - protected double computeMaxWidth(double height) { - return computePrefWidth(height); - } - - @Override - protected double computeMaxHeight(double width) { - return computePrefHeight(width); - } - } - - /** - * ************************************************************************ - * * - * IndeterminateSpinner * - * * - * ************************************************************************ - */ - - @SuppressWarnings({"ConstantConditions", "MismatchedQueryAndUpdateOfCollection"}) - static class IndeterminateSpinner extends Region { - private final TxConfidenceIndicator control; - private final StaticProgressIndicatorSkin skin; - - private final IndicatorPaths pathsG; - - private final List opacities = new ArrayList<>(); - private boolean spinEnabled = false; - - private Paint fillOverride = null; - - public IndeterminateSpinner(TxConfidenceIndicator control, StaticProgressIndicatorSkin s, - boolean spinEnabled, Paint fillOverride) { - this.control = control; - this.skin = s; - this.spinEnabled = spinEnabled; - this.fillOverride = fillOverride; - - setNodeOrientation(NodeOrientation.LEFT_TO_RIGHT); - getStyleClass().setAll("spinner"); - - pathsG = new IndicatorPaths(this); - getChildren().add(pathsG); - - rebuild(); - } - - public void setFillOverride(Paint fillOverride) { - this.fillOverride = fillOverride; - rebuild(); - } - - public void setSpinEnabled(boolean spinEnabled) { - this.spinEnabled = spinEnabled; - } - - @Override - protected void layoutChildren() { - Insets controlInsets = control.getInsets(); - final double w = control.getWidth() - controlInsets.getLeft() - controlInsets.getRight(); - final double h = control.getHeight() - controlInsets.getTop() - controlInsets.getBottom(); - final double prefW = pathsG.prefWidth(-1); - final double prefH = pathsG.prefHeight(-1); - double scaleX = w / prefW; - double scale = scaleX; - if ((scaleX * prefH) > h) { - scale = h / prefH; - } - double indicatorW = prefW * scale - 3; - double indicatorH = prefH * scale - 3; - pathsG.resizeRelocate((w - indicatorW) / 2, (h - indicatorH) / 2, indicatorW, indicatorH); - } - - private void rebuild() { - // update indeterminate indicator - final int segments = skin.indeterminateSegmentCount.get(); - opacities.clear(); - pathsG.getChildren().clear(); - final double step = 0.8 / (segments - 1); - for (int i = 0; i < segments; i++) { - Region region = new Region(); - region.setScaleShape(false); - region.setCenterShape(false); - region.getStyleClass().addAll("segment", "segment" + i); - if (fillOverride instanceof Color) { - Color c = (Color) fillOverride; - region.setStyle("-fx-background-color: rgba(" + ((int) (255 * c.getRed())) + "," + - "" + ((int) (255 * c.getGreen())) + "," + ((int) (255 * c.getBlue())) + "," + - "" + c.getOpacity() + ");"); - } else { - region.setStyle(null); - } - double opacity = Math.min(1, i * step); - opacities.add(opacity); - region.setOpacity(opacity); - pathsG.getChildren().add(region); - } - } - - @SuppressWarnings("deprecation") - private class IndicatorPaths extends Pane { - final IndeterminateSpinner piSkin; - - IndicatorPaths(IndeterminateSpinner pi) { - super(); - piSkin = pi; - } - - @Override - protected double computePrefWidth(double height) { - double w = 0; - for (Node child : getChildren()) { - if (child instanceof Region) { - Region region = (Region) child; - if (region.getShape() != null) { - w = Math.max(w, region.getShape().getLayoutBounds().getMaxX()); - } else { - w = Math.max(w, region.prefWidth(height)); - } - } - } - return w; - } - - @Override - protected double computePrefHeight(double width) { - double h = 0; - for (Node child : getChildren()) { - if (child instanceof Region) { - Region region = (Region) child; - if (region.getShape() != null) { - h = Math.max(h, region.getShape().getLayoutBounds().getMaxY()); - } else { - h = Math.max(h, region.prefHeight(width)); - } - } - } - return h; - } - - @Override - protected void layoutChildren() { - // calculate scale - double scale = getWidth() / computePrefWidth(-1); - getChildren().stream().filter(child -> child instanceof Region).forEach(child -> { - Region region = (Region) child; - if (region.getShape() != null) { - region.resize(region.getShape().getLayoutBounds().getMaxX(), - region.getShape().getLayoutBounds().getMaxY()); - region.getTransforms().setAll(new Scale(scale, scale, 0, 0)); - } else { - region.autosize(); - } - }); - } - } - } - - /** - * Super-lazy instantiation pattern from Bill Pugh. - */ - @SuppressWarnings({"deprecation", "unchecked", "ConstantConditions"}) - private static class StyleableProperties { - public static final List> STYLEABLES; - - private static final CssMetaData PROGRESS_COLOR = - new CssMetaData( - "-fx-progress-color", PaintConverter.getInstance(), null) { - - @Override - public boolean isSettable(TxConfidenceIndicator n) { - final StaticProgressIndicatorSkin skin = (StaticProgressIndicatorSkin) n.getSkin(); - return skin.progressColor == null || !skin.progressColor.isBound(); - } - - - @Override - public StyleableProperty getStyleableProperty(TxConfidenceIndicator n) { - final StaticProgressIndicatorSkin skin = (StaticProgressIndicatorSkin) n.getSkin(); - return (StyleableProperty) skin.progressColor; - } - }; - - - private static final CssMetaData INDETERMINATE_SEGMENT_COUNT = - new CssMetaData( - "-fx-indeterminate-segment-count", SizeConverter.getInstance(), 8) { - - @Override - public void set(TxConfidenceIndicator node, Number value, StyleOrigin origin) { - super.set(node, value.intValue(), origin); - } - - @Override - public boolean isSettable(TxConfidenceIndicator n) { - final StaticProgressIndicatorSkin skin = (StaticProgressIndicatorSkin) n.getSkin(); - return skin.indeterminateSegmentCount == null || !skin.indeterminateSegmentCount.isBound(); - } - - - @Override - public StyleableProperty getStyleableProperty(TxConfidenceIndicator n) { - final StaticProgressIndicatorSkin skin = (StaticProgressIndicatorSkin) n.getSkin(); - return (StyleableProperty) skin.indeterminateSegmentCount; - } - }; - - private static final CssMetaData SPIN_ENABLED = new - CssMetaData("-fx-spin-enabled", - BooleanConverter.getInstance(), - Boolean.FALSE) { - - @Override - public boolean isSettable(TxConfidenceIndicator node) { - final StaticProgressIndicatorSkin skin = (StaticProgressIndicatorSkin) node.getSkin(); - return skin.spinEnabled == null || !skin.spinEnabled.isBound(); - } - - - @Override - public StyleableProperty getStyleableProperty(TxConfidenceIndicator node) { - final StaticProgressIndicatorSkin skin = (StaticProgressIndicatorSkin) node.getSkin(); - return (StyleableProperty) skin.spinEnabled; - } - }; - - static { - final List> styleables = - new ArrayList<>(SkinBase.getClassCssMetaData()); - styleables.add(PROGRESS_COLOR); - styleables.add(INDETERMINATE_SEGMENT_COUNT); - styleables.add(SPIN_ENABLED); - STYLEABLES = Collections.unmodifiableList(styleables); - } - } - -}