All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eu.hansolo.medusa.Gauge Maven / Gradle / Ivy

/*
 * SPDX-License-Identifier: Apache-2.0
 *
 * Copyright 2016-2021 Gerrit Grunwald.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package eu.hansolo.medusa;

import eu.hansolo.medusa.events.UpdateEvent;
import eu.hansolo.medusa.events.UpdateEventListener;
import eu.hansolo.medusa.skins.*;
import eu.hansolo.medusa.tools.Data;
import eu.hansolo.medusa.tools.GradientLookup;
import eu.hansolo.medusa.tools.Helper;
import eu.hansolo.medusa.tools.MarkerComparator;
import eu.hansolo.medusa.tools.MovingAverage;
import eu.hansolo.medusa.tools.SectionComparator;
import javafx.animation.Animation.Status;
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Platform;
import javafx.beans.NamedArg;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.BooleanPropertyBase;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.DoublePropertyBase;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.IntegerPropertyBase;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ObjectPropertyBase;
import javafx.beans.property.ReadOnlyDoubleProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.property.StringPropertyBase;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.event.EventTarget;
import javafx.event.EventType;
import javafx.geometry.NodeOrientation;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.control.Control;
import javafx.scene.control.Skin;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.paint.Stop;
import javafx.scene.text.Font;
import javafx.util.Duration;

import java.time.Instant;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Queue;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


/**
 * Created by hansolo on 11.12.15.
 */
public class Gauge extends Control {
    public enum NeedleType { BIG, FAT, STANDARD, SCIENTIFIC, AVIONIC, VARIOMETER }

    public enum NeedleShape { ANGLED, ROUND, FLAT }

    public enum NeedleSize {
        THIN(0.015),
        STANDARD(0.025),
        THICK(0.05);

        public final double FACTOR;

        NeedleSize(final double FACTOR) {
            this.FACTOR = FACTOR;
        }
    }

    public enum NeedleBehavior { STANDARD, OPTIMIZED }

    public enum KnobType { STANDARD, PLAIN, METAL, FLAT }

    public enum LedType { STANDARD, FLAT }

    public enum ScaleDirection { CLOCKWISE, COUNTER_CLOCKWISE, LEFT_TO_RIGHT, RIGHT_TO_LEFT, BOTTOM_TO_TOP, TOP_TO_BOTTOM }

    public enum SkinType {
        AMP, PLAIN_AMP, BULLET_CHART, DASHBOARD, FLAT, GAUGE, INDICATOR, KPI,
        MODERN, SIMPLE, SLIM, SPACE_X, QUARTER, HORIZONTAL, VERTICAL,
        LCD, TINY, BATTERY, LEVEL, LINEAR, DIGITAL, SIMPLE_DIGITAL, SECTION,
        BAR, WHITE, CHARGE, SIMPLE_SECTION, TILE_KPI, TILE_TEXT_KPI, TILE_SPARK_LINE,
        NASA
    }

    public  static final Color   DARK_COLOR          = Color.rgb(36, 36, 36);    // #242424
    public  static final Color   BRIGHT_COLOR        = Color.rgb(223, 223, 223); // #dfdfdf
    private static final long    LED_BLINK_INTERVAL  = 500l;
    private static final int     MAX_NO_OF_DECIMALS  = 3;

    public  final ButtonEvent    BTN_PRESSED_EVENT   = new ButtonEvent(ButtonEvent.BTN_PRESSED);
    public  final ButtonEvent    BTN_RELEASED_EVENT  = new ButtonEvent(ButtonEvent.BTN_RELEASED);
    private final ThresholdEvent EXCEEDED_EVENT      = new ThresholdEvent(ThresholdEvent.THRESHOLD_EXCEEDED);
    private final ThresholdEvent UNDERRUN_EVENT      = new ThresholdEvent(ThresholdEvent.THRESHOLD_UNDERRUN);
    private final UpdateEvent    RECALC_EVENT        = new UpdateEvent(Gauge.this, UpdateEvent.EventType.RECALC);
    private final UpdateEvent    REDRAW_EVENT        = new UpdateEvent(Gauge.this, UpdateEvent.EventType.REDRAW);
    private final UpdateEvent    RESIZE_EVENT        = new UpdateEvent(Gauge.this, UpdateEvent.EventType.RESIZE);
    private final UpdateEvent    LED_EVENT           = new UpdateEvent(Gauge.this, UpdateEvent.EventType.LED);
    private final UpdateEvent    LCD_EVENT           = new UpdateEvent(Gauge.this, UpdateEvent.EventType.LCD);
    private final UpdateEvent    VISIBILITY_EVENT    = new UpdateEvent(Gauge.this, UpdateEvent.EventType.VISIBILITY);
    private final UpdateEvent    INTERACTIVITY_EVENT = new UpdateEvent(Gauge.this, UpdateEvent.EventType.INTERACTIVITY);
    private final UpdateEvent    FINISHED_EVENT      = new UpdateEvent(Gauge.this, UpdateEvent.EventType.FINISHED);
    private final UpdateEvent    SECTION_EVENT       = new UpdateEvent(Gauge.this, UpdateEvent.EventType.SECTION);
    private final UpdateEvent    ALERT_EVENT         = new UpdateEvent(Gauge.this, UpdateEvent.EventType.ALERT);
    private final UpdateEvent    VALUE_EVENT         = new UpdateEvent(Gauge.this, UpdateEvent.EventType.VALUE);

    private        volatile Future               blinkFuture;
    private static ScheduledExecutorService      blinkService = new ScheduledThreadPoolExecutor(2, Helper.getThreadFactory("BlinkTask", true));
    private        volatile Callable       blinkTask;

    private static          String               userAgentStyleSheet;

    private                 BooleanBinding       showing;

    // Update events
    private              Queue      updateEventQueue = new LinkedBlockingQueue<>();
    private List            listenerList     = new CopyOnWriteArrayList<>();

    // Data related
    private DoubleProperty                       value;
    private DoubleProperty                       oldValue;      // last value
    private DoubleProperty                       currentValue;
    private DoubleProperty                       formerValue;   // last current value
    private double                               _minValue;
    private DoubleProperty                       minValue;
    private double                               _maxValue;
    private DoubleProperty                       maxValue;
    private double                               _range;
    private DoubleProperty                       range;
    private double                               _threshold;
    private DoubleProperty                       threshold;
    private String                               _title;
    private StringProperty                       title;
    private String                               _subTitle;
    private StringProperty                       subTitle;
    private String                               _unit;
    private StringProperty                       unit;
    private boolean                              _averagingEnabled;
    private BooleanProperty                      averagingEnabled;
    private int                                  _averagingPeriod;
    private IntegerProperty                      averagingPeriod;
    private MovingAverage                        movingAverage;
    private ObservableList
sections; private ObservableList
areas; private ObservableList
tickMarkSections; private ObservableList
tickLabelSections; private ObservableList markers; // UI related private SkinType skinType; private boolean _startFromZero; private BooleanProperty startFromZero; private boolean _returnToZero; private BooleanProperty returnToZero; private Color _zeroColor; private ObjectProperty zeroColor; private double _minMeasuredValue; private DoubleProperty minMeasuredValue; private double _maxMeasuredValue; private DoubleProperty maxMeasuredValue; private boolean _minMeasuredValueVisible; private BooleanProperty minMeasuredValueVisible; private boolean _maxMeasuredValueVisible; private BooleanProperty maxMeasuredValueVisible; private boolean _oldValueVisible; private BooleanProperty oldValueVisible; private boolean _valueVisible; private BooleanProperty valueVisible; private Paint _backgroundPaint; private ObjectProperty backgroundPaint; private Paint _borderPaint; private ObjectProperty borderPaint; private double _borderWidth; private DoubleProperty borderWidth; private Paint _foregroundPaint; private ObjectProperty foregroundPaint; private Color _knobColor; private ObjectProperty knobColor; private KnobType _knobType; private ObjectProperty knobType; private Pos _knobPosition; private ObjectProperty knobPosition; private boolean _knobVisible; private BooleanProperty knobVisible; private boolean _animated; private BooleanProperty animated; private long animationDuration; private double _startAngle; private DoubleProperty startAngle; private double _angleRange; private DoubleProperty angleRange; private double _angleStep; private DoubleProperty angleStep; private double _arcExtend; private DoubleProperty arcExtend; private boolean _autoScale; private BooleanProperty autoScale; private boolean _shadowsEnabled; private BooleanProperty shadowsEnabled; private boolean _barEffectEnabled; private BooleanProperty barEffectEnabled; private ScaleDirection _scaleDirection; private ObjectProperty scaleDirection; private TickLabelLocation _tickLabelLocation; private ObjectProperty tickLabelLocation; private TickLabelOrientation _tickLabelOrientation; private ObjectProperty tickLabelOrientation; private Color _tickLabelColor; private ObjectProperty tickLabelColor; private Color _tickMarkColor; private ObjectProperty tickMarkColor; private Color _majorTickMarkColor; private ObjectProperty majorTickMarkColor; private double _majorTickMarkLengthFactor; private DoubleProperty majorTickMarkLengthFactor; private double _majorTickMarkWidthFactor; private DoubleProperty majorTickMarkWidthFactor; private Color _mediumTickMarkColor; private ObjectProperty mediumTickMarkColor; private double _mediumTickMarkLengthFactor; private DoubleProperty mediumTickMarkLengthFactor; private double _mediumTickMarkWidthFactor; private DoubleProperty mediumTickMarkWidthFactor; private Color _minorTickMarkColor; private ObjectProperty minorTickMarkColor; private double _minorTickMarkLengthFactor; private DoubleProperty minorTickMarkLengthFactor; private double _minorTickMarkWidthFactor; private DoubleProperty minorTickMarkWidthFactor; private TickMarkType _majorTickMarkType; private ObjectProperty majorTickMarkType; private TickMarkType _mediumTickMarkType; private ObjectProperty mediumTickMarkType; private TickMarkType _minorTickMarkType; private ObjectProperty minorTickMarkType; private Locale _locale; private ObjectProperty locale; private int _decimals; private IntegerProperty decimals; private int _tickLabelDecimals; private IntegerProperty tickLabelDecimals; private NeedleType _needleType; private ObjectProperty needleType; private NeedleShape _needleShape; private ObjectProperty needleShape; private NeedleSize _needleSize; private ObjectProperty needleSize; private NeedleBehavior _needleBehavior; private ObjectProperty needleBehavior; private Color _needleColor; private ObjectProperty needleColor; private Color _needleBorderColor; private ObjectProperty needleBorderColor; private Color _barColor; private ObjectProperty barColor; private Color _barBorderColor; private ObjectProperty barBorderColor; private Color _barBackgroundColor; private ObjectProperty barBackgroundColor; private LcdDesign _lcdDesign; private ObjectProperty lcdDesign; private LcdFont _lcdFont; private ObjectProperty lcdFont; private Color _ledColor; private ObjectProperty ledColor; private LedType _ledType; private ObjectProperty ledType; private Color _titleColor; private ObjectProperty titleColor; private Color _subTitleColor; private ObjectProperty subTitleColor; private Color _unitColor; private ObjectProperty unitColor; private Color _valueColor; private ObjectProperty valueColor; private Color _thresholdColor; private ObjectProperty thresholdColor; private Color _averageColor; private ObjectProperty averageColor; private boolean _checkSectionsForValue; private BooleanProperty checkSectionsForValue; private boolean _checkAreasForValue; private BooleanProperty checkAreasForValue; private boolean _checkThreshold; private BooleanProperty checkThreshold; private boolean _innerShadowEnabled; private BooleanProperty innerShadowEnabled; private boolean _thresholdVisible; private BooleanProperty thresholdVisible; private boolean _averageVisible; private BooleanProperty averageVisible; private boolean _sectionsVisible; private BooleanProperty sectionsVisible; private boolean _sectionsAlwaysVisible; private BooleanProperty sectionsAlwaysVisible; private boolean _sectionTextVisible; private BooleanProperty sectionTextVisible; private boolean _sectionIconsVisible; private BooleanProperty sectionIconsVisible; private boolean _highlightSections; private BooleanProperty highlightSections; private boolean _areasVisible; private BooleanProperty areasVisible; private boolean _areaTextVisible; private BooleanProperty areaTextVisible; private boolean _areaIconsVisible; private BooleanProperty areaIconsVisible; private boolean _highlightAreas; private BooleanProperty highlightAreas; private boolean _tickMarkSectionsVisible; private BooleanProperty tickMarkSectionsVisible; private boolean _tickLabelSectionsVisible; private BooleanProperty tickLabelSectionsVisible; private boolean _markersVisible; private BooleanProperty markersVisible; private boolean _majorTickMarksVisible; private BooleanProperty majorTickMarksVisible; private boolean _mediumTickMarksVisible; private BooleanProperty mediumTickMarksVisible; private boolean _minorTickMarksVisible; private BooleanProperty minorTickMarksVisible; private boolean _tickMarkRingVisible; private BooleanProperty tickMarkRingVisible; private boolean _tickLabelsVisible; private BooleanProperty tickLabelsVisible; private boolean _onlyFirstAndLastTickLabelVisible; private BooleanProperty onlyFirstAndLastTickLabelVisible; private double _majorTickSpace; private DoubleProperty majorTickSpace; private double _minorTickSpace; private DoubleProperty minorTickSpace; private boolean _lcdVisible; private BooleanProperty lcdVisible; private boolean _lcdCrystalEnabled; private BooleanProperty lcdCrystalEnabled; private boolean _ledVisible; private BooleanProperty ledVisible; private boolean _ledOn; private BooleanProperty ledOn; private boolean _ledBlinking; private BooleanProperty ledBlinking; private Orientation _orientation; private ObjectProperty orientation; private boolean _gradientBarEnabled; private BooleanProperty gradientBarEnabled; private GradientLookup gradientLookup; private boolean _customTickLabelsEnabled; private BooleanProperty customTickLabelsEnabled; private boolean _customTickLabelFontSizeEnabled; private BooleanProperty customTickLabelFontSizeEnabled; private ObservableList customTickLabels; private double _customTickLabelFontSize; private DoubleProperty customTickLabelFontSize; private boolean _interactive; private BooleanProperty interactive; private String _buttonTooltipText; private StringProperty buttonTooltipText; private boolean _keepAspect; private BooleanProperty keepAspect; private boolean _customFontEnabled; private BooleanProperty customFontEnabled; private Font _customFont; private ObjectProperty customFont; private boolean _alert; private BooleanProperty alert; private String _alertMessage; private StringProperty alertMessage; private boolean _smoothing; private BooleanProperty smoothing; private String formatString; // others private double originalMinValue; private double originalMaxValue; private double originalThreshold; private Timeline timeline; private Instant lastCall; private boolean withinSpeedLimit; // ******************** Constructors ************************************** public Gauge() { this(SkinType.GAUGE); } public Gauge(@NamedArg(value="skinType", defaultValue="SkinType.GAUGE") final SkinType SKIN_TYPE) { setNodeOrientation(NodeOrientation.LEFT_TO_RIGHT); skinType = SKIN_TYPE; getStyleClass().add("gauge"); init(); registerListeners(); setSkinType(SKIN_TYPE); } public Gauge(@NamedArg(value="skinType", defaultValue="SkinType.GAUGE") SkinType skinType, @NamedArg(value="minValue", defaultValue="0") double minValue, @NamedArg(value="maxValue", defaultValue="100") double maxValue, @NamedArg(value="value", defaultValue="0") double value, @NamedArg(value="threshold", defaultValue="100") double threshold, @NamedArg(value="title", defaultValue="") String title, @NamedArg(value="subTitle", defaultValue="") String subTitle, @NamedArg(value="unit", defaultValue="") String unit, @NamedArg(value="averagingEnabled", defaultValue="false") boolean averagingEnabled, @NamedArg(value="startFromZero", defaultValue="false") boolean startFromZero, @NamedArg(value="returnToZero", defaultValue="false") boolean returnToZero, @NamedArg(value="zeroColor", defaultValue="#242424") Color zeroColor, @NamedArg(value="minMeasuredValue", defaultValue="100") double minMeasuredValue, @NamedArg(value="maxMeasuredValue", defaultValue="0") double maxMeasuredValue, @NamedArg(value="minMeasuredValueVisible", defaultValue="false") boolean minMeasuredValueVisible, @NamedArg(value="maxMeasuredValueVisible", defaultValue="false") boolean maxMeasuredValueVisible, @NamedArg(value="oldValueVisible", defaultValue="false") boolean oldValueVisible, @NamedArg(value="valueVisible", defaultValue="true") boolean valueVisible, @NamedArg(value="backgroundPaint", defaultValue="#00000000") Paint backgroundPaint, @NamedArg(value="borderPaint", defaultValue="#00000000") Paint borderPaint, @NamedArg(value="foregroundPaint", defaultValue="#00000000") Paint foregroundPaint, @NamedArg(value="borderWidth", defaultValue="1") double borderWidth, @NamedArg(value="knobColor", defaultValue="#cccccc") Color knobColor, @NamedArg(value="knobType", defaultValue="KnobType.STANDARD") KnobType knobType, @NamedArg(value="knobVisible", defaultValue="true") boolean knobVisible, @NamedArg(value="animated", defaultValue="false") boolean animated, @NamedArg(value="animationDuration", defaultValue="800") long animationDuration, @NamedArg(value="startAngle", defaultValue="320") double startAngle, @NamedArg(value="angleRange", defaultValue="280") double angleRange, @NamedArg(value="autoScale", defaultValue="true") boolean autoScale, @NamedArg(value="shadowsEnabled", defaultValue="false") boolean shadowsEnabled, @NamedArg(value="barEffectEnabled", defaultValue="false") boolean barEffectEnabled, @NamedArg(value="scaleDirection", defaultValue="ScaleDiretion.CLOCKWISE") ScaleDirection scaleDirection, @NamedArg(value="tickLabelLocation", defaultValue="TickLabelLocation.INSIDE") TickLabelLocation tickLabelLocation, @NamedArg(value="tickLabelOrientation", defaultValue="TickLabelOrientation.HORIZONTAL") TickLabelOrientation tickLabelOrientation, @NamedArg(value="tickLabelColor", defaultValue="#242424") Color tickLabelColor, @NamedArg(value="tickMarkColor", defaultValue="#242424") Color tickMarkColor, @NamedArg(value="majorTickMarkColor", defaultValue="#242424") Color majorTickMarkColor, @NamedArg(value="mediumTickMarkColor", defaultValue="#242424") Color mediumTickMarkColor, @NamedArg(value="minorTickMarkColor", defaultValue="#242424") Color minorTickMarkColor, @NamedArg(value="majorTickMarkType", defaultValue="TickMarkType.LINE") TickMarkType majorTickMarkType, @NamedArg(value="mediumTickMarkType", defaultValue="TickMarkType.LINE") TickMarkType mediumTickMarkType, @NamedArg(value="minorTickMarkType", defaultValue="TickMarkType.LINE") TickMarkType minorTickMarkType, @NamedArg(value="locale", defaultValue="Locale.US") Locale locale, @NamedArg(value="decimals", defaultValue="1") int decimals, @NamedArg(value="tickLabelDecimals", defaultValue="0") int tickLabelDecimals, @NamedArg(value="needleType", defaultValue="NeedleType.STANDARD") NeedleType needleType, @NamedArg(value="needleShape", defaultValue="NeedleShape.ANGLED") NeedleShape needleShape, @NamedArg(value="needleSize", defaultValue="NeedleSize.STANDARD") NeedleSize needleSize, @NamedArg(value="needleBehavior", defaultValue="NeedleBehavior.STANDARD") NeedleBehavior needleBehavior, @NamedArg(value="needleColor", defaultValue="#c80000") Color needleColor, @NamedArg(value="needleBorderColor", defaultValue="#00000000") Color needleBorderColor, @NamedArg(value="barColor", defaultValue="#dfdfdf") Color barColor, @NamedArg(value="barBorderColor", defaultValue="#00000000") Color barBorderColor, @NamedArg(value="barBackgroundColor", defaultValue="#242424") Color barBackgroundColor, @NamedArg(value="lcdDesign", defaultValue="LcdDesign.STANDARD") LcdDesign lcdDesign, @NamedArg(value="lcdFont", defaultValue="LcdFont.DIGITAL_BOLD") LcdFont lcdFont, @NamedArg(value="ledColor", defaultValue="#ff0000") Color ledColor, @NamedArg(value="ledType", defaultValue="LedType.STANDARD") LedType ledType, @NamedArg(value="titleColor", defaultValue="#242424") Color titleColor, @NamedArg(value="subTitleColor", defaultValue="#242424") Color subTitleColor, @NamedArg(value="unitColor", defaultValue="#242424") Color unitColor, @NamedArg(value="valueColor", defaultValue="#242424") Color valueColor, @NamedArg(value="thresholdColor", defaultValue="#dc143c") Color thresholdColor, @NamedArg(value="averageColor", defaultValue="#ff00ff") Color averageColor, @NamedArg(value="checkSectionsForValue", defaultValue="false") boolean checkSectionsForValue, @NamedArg(value="checkAreasForValue", defaultValue="false") boolean checkAreasForValue, @NamedArg(value="checkTreshold", defaultValue="false") boolean checkThreshold, @NamedArg(value="innerShadowEnabled", defaultValue="false") boolean innerShadowVisible, @NamedArg(value="thresholdVisible", defaultValue="false") boolean thresholdVisible, @NamedArg(value="averageVisible", defaultValue="false") boolean averageVisible, @NamedArg(value="sectionsVisible", defaultValue="false") boolean sectionsVisible, @NamedArg(value="sectionsAlwaysVisible", defaultValue="false") boolean sectionsAlwaysVisible, @NamedArg(value="sectionTextVisible", defaultValue="false") boolean sectionTextVisible, @NamedArg(value="sectionIconsVisible", defaultValue="false") boolean sectionIconsVisible, @NamedArg(value="highlightSections", defaultValue="false") boolean highlightSections, @NamedArg(value="areasVisible", defaultValue="false") boolean areasVisible, @NamedArg(value="areaTextVisible", defaultValue="false") boolean areaTextVisible, @NamedArg(value="areaIconsVisible", defaultValue="false") boolean areaIconsVisible, @NamedArg(value="highlightAreas", defaultValue="false") boolean highlightAreas, @NamedArg(value="tickMarkSectionsVisible", defaultValue="false") boolean tickMarkSectionsVisible, @NamedArg(value="tickLabelSectionsVisible", defaultValue="false") boolean tickLabelSectionsVisible, @NamedArg(value="markersVisible", defaultValue="false") boolean markersVisible, @NamedArg(value="tickLabelsVisible", defaultValue="true") boolean tickLabelsVisible, @NamedArg(value="onlyFirstAndLastTickLabelVisible", defaultValue="false") boolean onlyFirstAndLastTickLabelVisible, @NamedArg(value="majorTickMarksVisible", defaultValue="true") boolean majorTickMarksVisible, @NamedArg(value="mediumTickMarksVisible", defaultValue="true") boolean mediumTickMarksVisible, @NamedArg(value="minorTickMarksVisible", defaultValue="true") boolean minorTickMarksVisible, @NamedArg(value="tickMarkRingVisible", defaultValue="false") boolean tickMarkRingVisible, @NamedArg(value="lcdVisible", defaultValue="false") boolean lcdVisible, @NamedArg(value="lcdCrystalEnalbed", defaultValue="false") boolean lcdCrystalEnabled, @NamedArg(value="ledVisible", defaultValue="false") boolean ledVisible, @NamedArg(value="orientation", defaultValue="Orientation.HORIZONTAL") Orientation orientation, @NamedArg(value="keepAspect", defaultValue="true") boolean keepAspect, @NamedArg(value="gradientBarEnabled", defaultValue="false") boolean gradientBarEnabled, @NamedArg(value="customTickLabelsEnabled", defaultValue="false") boolean customTickLabelsEnabled, @NamedArg(value="customTickLabelFontSize", defaultValue="18") double customTickLabelFontSize, @NamedArg(value="customTickLabelFontSizeEnabled", defaultValue="false") boolean customTickLabelFontSizeEnabled, @NamedArg(value="interactive", defaultValue="false") boolean interactive, @NamedArg(value="buttonTooltipText", defaultValue="") String buttonTooltipText, @NamedArg(value="customFontEnabled", defaultValue="false") boolean customFontEnabled, @NamedArg(value="customFont", defaultValue="Fonts.robotoRegular(12)") Font customFont, @NamedArg(value="alert", defaultValue="false") boolean alert, @NamedArg(value="alertMessage", defaultValue="") String alertMessage, @NamedArg(value="smoothing", defaultValue="false") boolean smoothing ) { setNodeOrientation(NodeOrientation.LEFT_TO_RIGHT); this.skinType = skinType; getStyleClass().add("gauge"); init(); registerListeners(); setSkinType(skinType); } // ******************** Initialization ************************************ private void init() { _minValue = 0; _maxValue = 100; value = new DoublePropertyBase(_minValue) { @Override protected void invalidated() { final double VALUE = get(); withinSpeedLimit = !(Instant.now().minusMillis(getAnimationDuration()).isBefore(lastCall)); lastCall = Instant.now(); if (isAnimated() && withinSpeedLimit) { long animationDuration = isReturnToZero() ? (long) (0.2 * getAnimationDuration()) : getAnimationDuration(); timeline.stop(); final KeyValue KEY_VALUE; if (NeedleBehavior.STANDARD == getNeedleBehavior()) { KEY_VALUE = new KeyValue(currentValue, VALUE, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0)); } else { // Optimized only useful in a gauge where the angle range is 360 deg and the shorter way has to be calculated. double ov = getOldValue(); double min = getMinValue(); double max = getMaxValue(); double halfRange = getRange() * 0.5; double cv = getCurrentValue(); double delta = VALUE - getCurrentValue(); if (delta < -halfRange) { double kv1 = max - cv; double kv2 = VALUE; } else if (delta > halfRange) { } double tmpValue; if (Math.abs(VALUE - ov) > getRange() * 0.5) { if (ov < VALUE) { tmpValue = min - max + VALUE; } else { tmpValue = ov + max - ov + min + VALUE - getRange(); } KEY_VALUE = new KeyValue(currentValue, tmpValue, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0)); } else { if (cv < min) currentValue.set(max + cv); KEY_VALUE = new KeyValue(currentValue, VALUE, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0)); } } final KeyFrame KEY_FRAME = new KeyFrame(Duration.millis(animationDuration), KEY_VALUE); timeline.getKeyFrames().setAll(KEY_FRAME); timeline.play(); } else { currentValue.set(VALUE); fireUpdateEvent(FINISHED_EVENT); } if (isAveragingEnabled()) { movingAverage.addData(new Data(VALUE)); } } @Override public void set(final double VALUE) { super.set(VALUE); fireUpdateEvent(VALUE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "value"; } }; oldValue = new SimpleDoubleProperty(Gauge.this, "oldValue", value.get()); currentValue = new DoublePropertyBase(value.get()) { @Override protected void invalidated() { final double VALUE = get(); if (isCheckThreshold()) { double thrshld = getThreshold(); if (formerValue.get() < thrshld && VALUE > thrshld) { fireEvent(EXCEEDED_EVENT); } else if (formerValue.get() > thrshld && VALUE < thrshld) { fireEvent(UNDERRUN_EVENT); } } if (VALUE < getMinMeasuredValue()) { setMinMeasuredValue(VALUE); } else if (VALUE > getMaxMeasuredValue()) { setMaxMeasuredValue(VALUE); } formerValue.set(VALUE); } @Override public void set(final double VALUE) { super.set(VALUE); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "currentValue";} }; formerValue = new SimpleDoubleProperty(Gauge.this, "formerValue", value.get()); _range = _maxValue - _minValue; _threshold = _maxValue; _title = ""; _subTitle = ""; _unit = ""; _averagingEnabled = false; _averagingPeriod = 10; movingAverage = new MovingAverage(_averagingPeriod); sections = FXCollections.observableArrayList(); areas = FXCollections.observableArrayList(); tickMarkSections = FXCollections.observableArrayList(); tickLabelSections = FXCollections.observableArrayList(); markers = FXCollections.observableArrayList(); _startFromZero = false; _returnToZero = false; _zeroColor = DARK_COLOR; _minMeasuredValue = _maxValue; _maxMeasuredValue = _minValue; _minMeasuredValueVisible = false; _maxMeasuredValueVisible = false; _oldValueVisible = false; _valueVisible = true; _backgroundPaint = Color.TRANSPARENT; _borderPaint = Color.TRANSPARENT; _borderWidth = 1; _foregroundPaint = Color.TRANSPARENT; _knobColor = Color.rgb(204, 204, 204); _knobType = KnobType.STANDARD; _knobPosition = Pos.CENTER; _knobVisible = true; _animated = false; animationDuration = 800; _startAngle = 320; _angleRange = 280; _angleStep = _angleRange / _range; _arcExtend = 9.2; _autoScale = true; _shadowsEnabled = false; _barEffectEnabled = false; _scaleDirection = ScaleDirection.CLOCKWISE; _tickLabelLocation = TickLabelLocation.INSIDE; _tickLabelOrientation = TickLabelOrientation.HORIZONTAL; _tickLabelColor = DARK_COLOR; _tickMarkColor = DARK_COLOR; _majorTickMarkColor = DARK_COLOR; _majorTickMarkLengthFactor = 0.42; _majorTickMarkWidthFactor = 0.275; _mediumTickMarkColor = DARK_COLOR; _mediumTickMarkLengthFactor = 0.41; _mediumTickMarkWidthFactor = 0.175; _minorTickMarkColor = DARK_COLOR; _minorTickMarkLengthFactor = 0.40; _minorTickMarkWidthFactor = 0.1125; _majorTickMarkType = TickMarkType.LINE; _mediumTickMarkType = TickMarkType.LINE; _minorTickMarkType = TickMarkType.LINE; _locale = Locale.US; _decimals = 1; _tickLabelDecimals = 0; _needleType = NeedleType.STANDARD; _needleShape = NeedleShape.ANGLED; _needleSize = NeedleSize.STANDARD; _needleBehavior = NeedleBehavior.STANDARD; _needleColor = Color.rgb(200, 0, 0); _needleBorderColor = Color.TRANSPARENT; _barColor = BRIGHT_COLOR; _barBorderColor = Color.TRANSPARENT; _barBackgroundColor = DARK_COLOR; _lcdDesign = LcdDesign.STANDARD; _lcdFont = LcdFont.DIGITAL_BOLD; _ledColor = Color.RED; _ledType = LedType.STANDARD; _titleColor = DARK_COLOR; _subTitleColor = DARK_COLOR; _unitColor = DARK_COLOR; _valueColor = DARK_COLOR; _thresholdColor = Color.CRIMSON; _averageColor = Color.MAGENTA; _checkSectionsForValue = false; _checkAreasForValue = false; _checkThreshold = false; _innerShadowEnabled = false; _thresholdVisible = false; _averageVisible = false; _sectionsVisible = false; _sectionsAlwaysVisible = false; _sectionTextVisible = false; _sectionIconsVisible = false; _highlightSections = false; _areasVisible = false; _areaTextVisible = false; _areaIconsVisible = false; _highlightAreas = false; _tickMarkSectionsVisible = false; _tickLabelSectionsVisible = false; _markersVisible = false; _tickLabelsVisible = true; _onlyFirstAndLastTickLabelVisible = false; _majorTickMarksVisible = true; _mediumTickMarksVisible = true; _minorTickMarksVisible = true; _tickMarkRingVisible = false; _majorTickSpace = 10; _minorTickSpace = 1; _lcdVisible = false; _lcdCrystalEnabled = false; _ledVisible = false; _ledOn = false; _ledBlinking = false; _orientation = Orientation.HORIZONTAL; _gradientBarEnabled = false; _customTickLabelsEnabled = false; customTickLabels = FXCollections.observableArrayList(); _customTickLabelFontSize = 18; _customTickLabelFontSizeEnabled = false; _interactive = false; _buttonTooltipText = ""; _keepAspect = true; _customFontEnabled = false; _customFont = Fonts.robotoRegular(12); _alert = false; _alertMessage = ""; _smoothing = false; formatString = "%.2f"; originalMinValue = -Double.MAX_VALUE; originalMaxValue = Double.MAX_VALUE; originalThreshold = Double.MAX_VALUE; lastCall = Instant.now(); timeline = new Timeline(); timeline.setOnFinished(e -> { if (isReturnToZero() && Double.compare(currentValue.get(), 0.0) != 0.0) { final KeyValue KEY_VALUE2 = new KeyValue(value, 0, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0)); final KeyFrame KEY_FRAME2 = new KeyFrame(Duration.millis((long) (0.8 * getAnimationDuration())), KEY_VALUE2); timeline.getKeyFrames().setAll(KEY_FRAME2); timeline.play(); } fireUpdateEvent(FINISHED_EVENT); }); } public void reInit() { setZeroColor(DARK_COLOR); setMinMeasuredValueVisible(false); setMaxMeasuredValueVisible(false); setOldValueVisible(false); setValueVisible(true); setBackgroundPaint(Color.TRANSPARENT); setBorderPaint(Color.TRANSPARENT); setBorderWidth(1); setForegroundPaint(Color.TRANSPARENT); setKnobColor(Color.rgb(204, 204, 204)); setKnobType(KnobType.STANDARD); setKnobPosition(Pos.CENTER); setKnobVisible(true); setShadowsEnabled(false); setBarEffectEnabled(false); setTickLabelLocation(TickLabelLocation.INSIDE); setTickLabelOrientation(TickLabelOrientation.HORIZONTAL); setTickLabelColor(DARK_COLOR); setTickMarkColor(DARK_COLOR); setMajorTickMarkColor(DARK_COLOR); setMajorTickMarkLengthFactor(0.42); setMajorTickMarkWidthFactor(0.275); setMediumTickMarkColor(DARK_COLOR); setMediumTickMarkLengthFactor(0.41); setMediumTickMarkWidthFactor(0.175); setMinorTickMarkColor(DARK_COLOR); setMinorTickMarkLengthFactor(0.40); setMinorTickMarkWidthFactor(0.1125); setMajorTickMarkType(TickMarkType.LINE); setMediumTickMarkType(TickMarkType.LINE); setMinorTickMarkType(TickMarkType.LINE); setNeedleType(NeedleType.STANDARD); setNeedleShape(NeedleShape.ANGLED); setNeedleSize(NeedleSize.STANDARD); setNeedleBehavior(NeedleBehavior.STANDARD); setNeedleColor(Color.rgb(200, 0, 0)); setNeedleBorderColor(Color.TRANSPARENT); setBarColor(BRIGHT_COLOR); setBarBorderColor(Color.TRANSPARENT); setBarBackgroundColor(DARK_COLOR); setLcdDesign(LcdDesign.STANDARD); setLcdFont(LcdFont.DIGITAL_BOLD); setLedColor(Color.RED); setLedType(LedType.STANDARD); setTitleColor(DARK_COLOR); setSubTitleColor(DARK_COLOR); setUnitColor(DARK_COLOR); setValueColor(DARK_COLOR); setThresholdColor(Color.CRIMSON); setAverageColor(Color.MAGENTA); setCheckSectionsForValue(false); setCheckAreasForValue(false); setCheckThreshold(false); setInnerShadowEnabled(false); setThresholdVisible(false); setAverageVisible(false); setSectionsVisible(false); setSectionsAlwaysVisible(false); setSectionTextVisible(false); setSectionIconsVisible(false); setHighlightSections(false); setAreasVisible(false); setAreaTextVisible(false); setAreaIconsVisible(false); setHighlightAreas(false); setTickMarkSectionsVisible(false); setTickLabelSectionsVisible(false); setMarkersVisible(false); setTickLabelsVisible(true); setOnlyFirstAndLastTickLabelVisible(false); setMajorTickMarksVisible(true); setMediumTickMarksVisible(true); setMinorTickMarksVisible(true); setTickMarkRingVisible(false); setLcdVisible(false); setLcdCrystalEnabled(false); setLedVisible(false); setLedOn(false); setLedBlinking(false); setOrientation(Orientation.HORIZONTAL); setGradientBarEnabled(false); setCustomTickLabelsEnabled(false); setCustomTickLabels(FXCollections.observableArrayList()); setCustomTickLabelFontSize(18); setInteractive(false); setButtonTooltipText(""); setKeepAspect(true); setCustomFontEnabled(false); setAlert(false); setAlertMessage(""); setSmoothing(false); } private void registerListeners() { disabledProperty().addListener(o -> setOpacity(isDisabled() ? 0.4 : 1)); valueProperty().addListener((o, ov, nv) -> oldValue.set(ov.doubleValue())); if (null != getScene()) { setupBinding(); } else { sceneProperty().addListener((o1, ov1, nv1) -> { if (null == nv1) { return; } if (null != getScene().getWindow()) { setupBinding(); } else { sceneProperty().get().windowProperty().addListener((o2, ov2, nv2) -> { if (null == nv2) { return; } setupBinding(); }); } }); } } // ******************** Data related methods ****************************** /** * Returns the value of the Gauge. If animated == true this value represents * the value at the end of the animation. Where currentValue represents the * current value during the animation. * * @return the value of the gauge */ public double getValue() { return value.get(); } /** * Sets the value of the Gauge to the given double. If animated == true this * value will be the end value after the animation is finished. * * @param VALUE */ public void setValue(final double VALUE) { value.set(VALUE); } public DoubleProperty valueProperty() { return value; } /** * Returns the current value of the Gauge. If animated == true this value * represents the current value during the animation. Otherwise it's returns * the same value as the getValue() method. * * @return the current value of the gauge */ public double getCurrentValue() { return currentValue.get(); } public ReadOnlyDoubleProperty currentValueProperty() { return currentValue; } /** * Returns the last value of the Gauge. This will not be the last value during * an animation but the final last value after the animation was finished. * If you need to get the last value during an animation you should use * formerValue instead. * * @return the last value of the gauge */ public double getOldValue() { return oldValue.get(); } public ReadOnlyDoubleProperty oldValueProperty() { return oldValue; } /** * Returns the last value of the Gauge. This will be the last value during * an animation. * If you need to get the last value after the animation is finished or if * you don't use animation at all (when using real values) you should use * oldValue instead. * * @return the last value of the gauge during an animation */ public double getFormerValue() { return formerValue.get(); } public ReadOnlyDoubleProperty formerValueProperty() { return formerValue; } /** * Returns the minimum value of the scale. This value represents the lower * limit of the visible gauge values. * * @return the minimum value of the gauge scale */ public double getMinValue() { return null == minValue ? _minValue : minValue.get(); } /** * Sets the minimum value of the gauge scale to the given value * * @param VALUE */ public void setMinValue(final double VALUE) { if (Status.RUNNING == timeline.getStatus()) { timeline.jumpTo(Duration.ONE); } if (null == minValue) { if (VALUE > getMaxValue()) { setMaxValue(VALUE); } _minValue = Helper.clamp(-Double.MAX_VALUE, getMaxValue(), VALUE); setRange(getMaxValue() - _minValue); if (Double.compare(originalMinValue, -Double.MAX_VALUE) == 0) originalMinValue = _minValue; if (isStartFromZero() && _minValue < 0) setValue(0); if (Double.compare(originalThreshold, getThreshold()) < 0) { setThreshold(Helper.clamp(_minValue, getMaxValue(), originalThreshold)); } updateFormatString(); fireUpdateEvent(RECALC_EVENT); if (!valueProperty().isBound()) Gauge.this.setValue(Helper.clamp(getMinValue(), getMaxValue(), Gauge.this.getValue())); } else { minValue.set(VALUE); } } public DoubleProperty minValueProperty() { if (null == minValue) { minValue = new DoublePropertyBase(_minValue) { @Override protected void invalidated() { final double VALUE = get(); if (VALUE > getMaxValue()) setMaxValue(VALUE); setRange(getMaxValue() - VALUE); if (Double.compare(originalMinValue, -Double.MAX_VALUE) == 0) originalMinValue = VALUE; if (isStartFromZero() && _minValue < 0) Gauge.this.setValue(0); if (Double.compare(originalThreshold, getThreshold()) < 0) { setThreshold(Helper.clamp(VALUE, getMaxValue(), originalThreshold)); } updateFormatString(); fireUpdateEvent(RECALC_EVENT); if (!valueProperty().isBound()) Gauge.this.setValue(Helper.clamp(getMinValue(), getMaxValue(), Gauge.this.getValue())); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "minValue";} }; } return minValue; } /** * Returns the maximum value of the scale. This value represents the upper limit * of the visible gauge values. * * @return the maximum value of the gauge scale */ public double getMaxValue() { return null == maxValue ? _maxValue : maxValue.get(); } /** * Sets the maximum value of the gauge scale to the given value * * @param VALUE */ public void setMaxValue(final double VALUE) { if (Status.RUNNING == timeline.getStatus()) { timeline.jumpTo(Duration.ONE); } if (null == maxValue) { if (VALUE < getMinValue()) { setMinValue(VALUE); } _maxValue = Helper.clamp(getMinValue(), Double.MAX_VALUE, VALUE); setRange(_maxValue - getMinValue()); if (Double.compare(originalMaxValue, Double.MAX_VALUE) == 0) originalMaxValue = _maxValue; if (Double.compare(originalThreshold, getThreshold()) > 0) { setThreshold(Helper.clamp(getMinValue(), _maxValue, originalThreshold)); } if (!valueProperty().isBound()) Gauge.this.setValue(Helper.clamp(getMinValue(), getMaxValue(), Gauge.this.getValue())); updateFormatString(); fireUpdateEvent(RECALC_EVENT); } else { maxValue.set(VALUE); } } public DoubleProperty maxValueProperty() { if (null == maxValue) { maxValue = new DoublePropertyBase(_maxValue) { @Override protected void invalidated() { final double VALUE = get(); if (VALUE < getMinValue()) setMinValue(VALUE); setRange(VALUE - getMinValue()); if (Double.compare(originalMaxValue, Double.MAX_VALUE) == 0) originalMaxValue = VALUE; if (Double.compare(originalThreshold, getThreshold()) > 0) { setThreshold(Helper.clamp(getMinValue(), VALUE, originalThreshold)); } updateFormatString(); fireUpdateEvent(RECALC_EVENT); if (!valueProperty().isBound()) Gauge.this.setValue(Helper.clamp(getMinValue(), getMaxValue(), Gauge.this.getValue())); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "maxValue"; } }; } return maxValue; } /** * Always returns the range of the gauge scale (maxValue - minValue). * This value will be automatically calculated each time * the min- or maxValue will change. * * @return the range of the gauge scale */ public double getRange() { return null == range ? _range : range.get(); } /** * This is a private method that sets the range to the given value * which is always (maxValue - minValue). * * @param RANGE */ private void setRange(final double RANGE) { if (null == range) { _range = RANGE; setAngleStep(getAngleRange() / RANGE); } else { range.set(RANGE); } } public ReadOnlyDoubleProperty rangeProperty() { if (null == range) { range = new DoublePropertyBase((getMaxValue() - getMinValue())) { @Override protected void invalidated() { setAngleStep(getAngleRange() / get()); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "range"; } }; } return range; } /** * Returns the threshold value that can be used to visualize a * threshold value on the scale. There are also events that will * be fired if the threshold was exceeded or underrun. * The value will be clamped to range of the gauge. * * @return the threshold value of the gauge */ public double getThreshold() { return null == threshold ? _threshold : threshold.get(); } /** * Sets the threshold of the gauge to the given value. The value * will be clamped to the range of the gauge. * * @param THRESHOLD */ public void setThreshold(final double THRESHOLD) { originalThreshold = THRESHOLD; if (null == threshold) { _threshold = Helper.clamp(getMinValue(), getMaxValue(), THRESHOLD); fireUpdateEvent(RESIZE_EVENT); } else { threshold.set(THRESHOLD); } } public DoubleProperty tresholdProperty() { if (null == threshold) { threshold = new DoublePropertyBase(_threshold) { @Override protected void invalidated() { final double THRESHOLD = get(); if (THRESHOLD < getMinValue() || THRESHOLD > getMaxValue()) set(Helper.clamp(getMinValue(), getMaxValue(), THRESHOLD)); fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "threshold"; } }; } return threshold; } /** * Returns the title of the gauge. This title will usually * only be visible if it is not empty. * * @return the title of the gauge */ public String getTitle() { return null == title ? _title : title.get(); } /** * Sets the title of the gauge. This title will only be visible * if it is not empty. * * @param TITLE */ public void setTitle(final String TITLE) { if (null == title) { _title = TITLE; fireUpdateEvent(VISIBILITY_EVENT); fireUpdateEvent(REDRAW_EVENT); } else { title.set(TITLE); } } public StringProperty titleProperty() { if (null == title) { title = new StringPropertyBase(_title) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "title"; } }; _title = null; } return title; } /** * Returns the subtitle of the gauge. This subtitle will usually * only be visible if it is not empty. * * @return the subtitle of the gauge */ public String getSubTitle() { return null == subTitle ? _subTitle : subTitle.get(); } /** * Sets the subtitle of the gauge. This subtitle will usually * only be visible if it is not empty. * * @param SUBTITLE */ public void setSubTitle(final String SUBTITLE) { if (null == subTitle) { _subTitle = SUBTITLE; fireUpdateEvent(VISIBILITY_EVENT); fireUpdateEvent(REDRAW_EVENT); } else { subTitle.set(SUBTITLE); } } public StringProperty subTitleProperty() { if (null == subTitle) { subTitle = new StringPropertyBase(_subTitle) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "subTitle"; } }; _subTitle = null; } return subTitle; } /** * Returns the unit of the gauge. This unit will usually only * be visible if it is not empty. * * @return the unit of the gauge */ public String getUnit() { return null == unit ? _unit : unit.get(); } /** * Sets the unit of the gauge. This unit will usually only be * visible if it is not empty. * * @param UNIT */ public void setUnit(final String UNIT) { if (null == unit) { _unit = UNIT; fireUpdateEvent(VISIBILITY_EVENT); fireUpdateEvent(REDRAW_EVENT); } else { unit.set(UNIT); } } public StringProperty unitProperty() { if (null == unit) { unit = new StringPropertyBase(_unit) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "unit"; } }; _unit = null; } return unit; } /** * Returns the moving average object * @return the moving average object */ public MovingAverage getMovingAverage() { if (null == movingAverage) { movingAverage = new MovingAverage(getAveragingPeriod()); } return movingAverage; } /** * Returns true if the averaging functionality is enabled. * @return true if the averaging functionality is enabled */ public boolean isAveragingEnabled() { return null == averagingEnabled ? _averagingEnabled : averagingEnabled.get(); } /** * Defines if the averaging functionality will be enabled. */ public void setAveragingEnabled(final boolean ENABLED) { if (null == averagingEnabled) { _averagingEnabled = ENABLED; fireUpdateEvent(REDRAW_EVENT); } else { averagingEnabled.set(ENABLED); } } public BooleanProperty averagingEnabledProperty() { if (null == averagingEnabled) { averagingEnabled = new BooleanPropertyBase(_averagingEnabled) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "averagingEnabled"; } }; } return averagingEnabled; } /** * Returns the number of values that should be used for * the averaging of values. The value must be in the * range of 1 - 1000. * @return the number of values used for averaging */ public int getAveragingPeriod() { return null == averagingPeriod ? _averagingPeriod : averagingPeriod.get(); } /** * Defines the number values that should be used for * the averaging of values. The value must be in the * range of 1 - 1000. * @param PERIOD */ public void setAveragingPeriod(final int PERIOD) { if (null == averagingPeriod) { _averagingPeriod = PERIOD; getMovingAverage().setPeriod(_averagingPeriod); // MAX 1000 values fireUpdateEvent(REDRAW_EVENT); } else { averagingPeriod.set(PERIOD); } } public IntegerProperty averagingPeriodProperty() { if (null == averagingPeriod) { averagingPeriod = new IntegerPropertyBase(_averagingPeriod) { @Override protected void invalidated() { getMovingAverage().setPeriod(_averagingPeriod); // MAX 1000 values fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "averagingPeriod"; } }; } return averagingPeriod; } /** * Returns the current list of Data objects that will * be used to calculate the moving average. * @return the current list of Data objects used for the moving average */ public Queue getAveragingWindow() { return movingAverage.getWindow(); } /** * Returns the moving average over the number of values * defined by averagingPeriod. * @return the moving the average over the number of values defined by averagingPeriod */ public double getAverage() { return movingAverage.getAverage(); } /** * Returns the moving average over the given duration. * @param DURATION * @return the moving average over the given duration */ public double getTimeBasedAverageOf(final java.time.Duration DURATION) { return movingAverage.getTimeBasedAverageOf(DURATION); } /** * Returns an observable list of Section objects. The sections * will be used to colorize areas with a special meaning such * as the red area in a rpm gauge. Sections in the Medusa library * usually are less eye-catching than Areas. * * @return an observable list of Section objects */ public ObservableList
getSections() { return sections; } /** * Sets the sections to the given list of Section objects. The * sections will be used to colorize areas with a special * meaning such as the red area in a rpm gauge. * Sections in the Medusa library * usually are less eye-catching than Areas. * * @param SECTIONS */ public void setSections(final List
SECTIONS) { sections.setAll(SECTIONS); Collections.sort(sections, new SectionComparator()); fireUpdateEvent(SECTION_EVENT); } /** * Sets the sections to the given array of Section objects. The * sections will be used to colorize areas with a special * meaning such as the red area in a rpm gauge. * * @param SECTIONS */ public void setSections(final Section... SECTIONS) { setSections(Arrays.asList(SECTIONS)); } /** * Adds the given Section to the list of sections. * Sections in the Medusa library * usually are less eye-catching than Areas. * * @param SECTION */ public void addSection(final Section SECTION) { if (null == SECTION) return; sections.add(SECTION); Collections.sort(sections, new SectionComparator()); fireUpdateEvent(SECTION_EVENT); } /** * Removes the given Section from the list of sections. * Sections in the Medusa library * usually are less eye-catching than Areas. * * @param SECTION */ public void removeSection(final Section SECTION) { if (null == SECTION) return; sections.remove(SECTION); Collections.sort(sections, new SectionComparator()); fireUpdateEvent(SECTION_EVENT); } /** * Clears the list of sections. */ public void clearSections() { sections.clear(); fireUpdateEvent(SECTION_EVENT); } /** * Returns an observable list of Section objects. The sections * will be used to colorize areas with a special meaning such * as the red area in a rpm gauge. Areas in the Medusa library * usually are more eye-catching than Sections. * * @return an observable list of Section objects */ public ObservableList
getAreas() { return areas; } /** * Sets the sections to the given list of Section objects. The * sections will be used to colorize areas with a special * meaning such as the red area in a rpm gauge. * Areas in the Medusa library usually are more * eye-catching than Sections. * * @param AREAS */ public void setAreas(final List
AREAS) { areas.setAll(AREAS); Collections.sort(areas, new SectionComparator()); fireUpdateEvent(SECTION_EVENT); } /** * Sets the sections to the given array of Section objects. The * sections will be used to colorize areas with a special * meaning such as the red area in a rpm gauge. * Areas in the Medusa library usually are more * eye-catching than Sections. * * @param AREAS */ public void setAreas(final Section... AREAS) { setAreas(Arrays.asList(AREAS)); } /** * Adds the given Section to the list of areas. * Areas in the Medusa library usually are more * eye-catching than Sections. * * @param AREA */ public void addArea(final Section AREA) { if (null == AREA) return; areas.add(AREA); Collections.sort(areas, new SectionComparator()); fireUpdateEvent(SECTION_EVENT); } /** * Removes the given Section from the list of areas. * Areas in the Medusa library usually are more * eye-catching than Sections. * * @param AREA */ public void removeArea(final Section AREA) { if (null == AREA) return; areas.remove(AREA); Collections.sort(areas, new SectionComparator()); fireUpdateEvent(SECTION_EVENT); } /** * Clears the list of areas. */ public void clearAreas() { areas.clear(); fireUpdateEvent(SECTION_EVENT); } /** * Returns an observable list of Section objects. * The sections will be used to colorize tickmarks with a * special meaning such as the red area in a rpm gauge. * * @return an observable list of Section objects */ public ObservableList
getTickMarkSections() { return tickMarkSections; } /** * Sets the tickmark sections to the given list of Section objects. * * @param SECTIONS */ public void setTickMarkSections(final List
SECTIONS) { tickMarkSections.setAll(SECTIONS); Collections.sort(tickMarkSections, new SectionComparator()); fireUpdateEvent(REDRAW_EVENT); } /** * Sets the tickmark sections to the given array of Section objects. * * @param SECTIONS */ public void setTickMarkSections(final Section... SECTIONS) { setTickMarkSections(Arrays.asList(SECTIONS)); } /** * Adds the given Section to the list of tickmark sections. * * @param SECTION */ public void addTickMarkSection(final Section SECTION) { if (null == SECTION) return; tickMarkSections.add(SECTION); Collections.sort(tickMarkSections, new SectionComparator()); fireUpdateEvent(REDRAW_EVENT); } /** * Removes the given Section from the list of tickmark sections. * * @param SECTION */ public void removeTickMarkSection(final Section SECTION) { if (null == SECTION) return; tickMarkSections.remove(SECTION); Collections.sort(tickMarkSections, new SectionComparator()); fireUpdateEvent(REDRAW_EVENT); } /** * Clears the list of tickmark sections. */ public void clearTickMarkSections() { tickMarkSections.clear(); fireUpdateEvent(REDRAW_EVENT); } /** * Returns an observable list of Section objects. * The sections will be used to colorize ticklabels with * a special meaning such as the red area in a rpm gauge. * * @return an observable list of Section objects */ public ObservableList
getTickLabelSections() { return tickLabelSections; } /** * Sets the ticklabel sections to the given list of Section objects. * * @param SECTIONS */ public void setTickLabelSections(final List
SECTIONS) { tickLabelSections.setAll(SECTIONS); Collections.sort(tickLabelSections, new SectionComparator()); fireUpdateEvent(REDRAW_EVENT); } /** * Sets the ticklabel sections to the given array of Section objects. * * @param SECTIONS */ public void setTickLabelSections(final Section... SECTIONS) { setTickLabelSections(Arrays.asList(SECTIONS)); } /** * Adds the given Section to the list of ticklabel sections. * * @param SECTION */ public void addTickLabelSection(final Section SECTION) { if (null == SECTION) return; tickLabelSections.add(SECTION); Collections.sort(tickLabelSections, new SectionComparator()); fireUpdateEvent(REDRAW_EVENT); } /** * Removes the given Section from the list of ticklabel sections. * * @param SECTION */ public void removeTickLabelSection(final Section SECTION) { if (null == SECTION) return; tickLabelSections.remove(SECTION); Collections.sort(tickLabelSections, new SectionComparator()); fireUpdateEvent(REDRAW_EVENT); } /** * Clears the list of ticklabel sections. */ public void clearTickLabelSections() { tickLabelSections.clear(); fireUpdateEvent(REDRAW_EVENT); } /** * Returns an observable list of Marker objects. * Like the threshold the markers are used to visualize * specific values. The markers will be visualized using * nodes with mouse event support (pressed, released) and * tooltip. * * @return an observable list of Marker objects */ public ObservableList getMarkers() { return markers; } /** * Sets the list of markers to the given list of Marker objects. * The markers will be visualized using nodes with mouse event * support (pressed, released) and tooltip. * * @param MARKERS */ public void setMarkers(final List MARKERS) { markers.setAll(MARKERS); Collections.sort(markers, new MarkerComparator()); fireUpdateEvent(REDRAW_EVENT); } /** * Sets the list of markers to the given array of Marker objects. * The markers will be visualuzed using nodes with mouse event * support (pressed, released) and tooltip. * * @param MARKERS */ public void setMarkers(final Marker... MARKERS) { setMarkers(Arrays.asList(MARKERS)); } /** * Adds the given Marker to the list of markers. * * @param MARKER */ public void addMarker(final Marker MARKER) { if (null == MARKER) return; markers.add(MARKER); Collections.sort(markers, new MarkerComparator()); fireUpdateEvent(REDRAW_EVENT); } /** * Removes the given Marker from the list of markers. * * @param MARKER */ public void removeMarker(final Marker MARKER) { if (null == MARKER) return; markers.remove(MARKER); Collections.sort(markers, new MarkerComparator()); fireUpdateEvent(REDRAW_EVENT); } /** * Clears the list of markers. */ public void clearMarkers() { markers.clear(); fireUpdateEvent(REDRAW_EVENT); } // ******************** UI related methods ******************************** /** * A convenient method to set the color of foreground elements like * title, subTitle, unit, value, tickLabel and tickMark to the given * Color. * * @param COLOR */ public void setForegroundBaseColor(final Color COLOR) { if (null == titleColor) { _titleColor = COLOR; } else { titleColor.set(COLOR); } if (null == subTitleColor) { _subTitleColor = COLOR; } else { subTitleColor.set(COLOR); } if (null == unitColor) { _unitColor = COLOR; } else { unitColor.set(COLOR); } if (null == valueColor) { _valueColor = COLOR; } else { valueColor.set(COLOR); } if (null == tickLabelColor) { _tickLabelColor = COLOR; } else { tickLabelColor.set(COLOR); } if (null == zeroColor) { _zeroColor = COLOR; } else { zeroColor.set(COLOR); } if (null == tickMarkColor) { _tickMarkColor = COLOR; } else { tickMarkColor.set(COLOR); } if (null == majorTickMarkColor) { _majorTickMarkColor = COLOR; } else { majorTickMarkColor.set(COLOR); } if (null == mediumTickMarkColor) { _mediumTickMarkColor = COLOR; } else { mediumTickMarkColor.set(COLOR); } if (null == minorTickMarkColor) { _minorTickMarkColor = COLOR; } else { minorTickMarkColor.set(COLOR); } fireUpdateEvent(REDRAW_EVENT); } /** * Returns true if the visualization of the value should start from 0. This * is especially useful when you work for example with a gauge that has a * range with a negative minValue * * @return true if the visualization of the value should start from 0 */ public boolean isStartFromZero() { return null == startFromZero ? _startFromZero : startFromZero.get(); } /** * Defines the behavior of the visualization where the needle/bar should * start from 0 instead of the minValue. This is especially useful when * working with a gauge that has a range with a negative minValue * * @param IS_TRUE */ public void setStartFromZero(final boolean IS_TRUE) { if (null == startFromZero) { _startFromZero = IS_TRUE; //setValue(IS_TRUE && getMinValue() < 0 ? 0 : getMinValue()); fireUpdateEvent(REDRAW_EVENT); } else { startFromZero.set(IS_TRUE); } } public BooleanProperty startFromZeroProperty() { if (null == startFromZero) { startFromZero = new BooleanPropertyBase(_startFromZero) { @Override protected void invalidated() { //Gauge.this.setValue((get() && getMinValue() < 0) ? 0 : getMinValue()); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "startFromZero"; } }; } return startFromZero; } /** * Returns true if the needle/bar should always return to zero. This setting * only makes sense if animated == true and the data rate is not too high. * Set to false when using real measured live data. * * @return true if the needle/bar should always return to zero. */ public boolean isReturnToZero() { return null == returnToZero ? _returnToZero : returnToZero.get(); } /** * Defines the behavior of the visualization where the needle/bar should * always return to 0 after it reached the final value. This setting only makes * sense if animated == true and the data rate is not too high. * Set to false when using real measured live data. * * @param IS_TRUE */ public void setReturnToZero(final boolean IS_TRUE) { if (null == returnToZero) { _returnToZero = Double.compare(getMinValue(), 0.0) <= 0 ? IS_TRUE : false; fireUpdateEvent(REDRAW_EVENT); } else { returnToZero.set(IS_TRUE); } } public BooleanProperty returnToZeroProperty() { if (null == returnToZero) { returnToZero = new BooleanPropertyBase(_returnToZero) { @Override protected void invalidated() { if (Double.compare(getMaxValue(), 0.0) > 0) set(false); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "returnToZero"; } }; } return returnToZero; } /** * Returns the color that will be used to colorize the 0 tickmark and ticklabel * when the gauge range has a negative min- and positive maxValue. * * @return the color that will used to visualize the 0 tickmark and ticklabel */ public Color getZeroColor() { return null == zeroColor ? _zeroColor : zeroColor.get(); } /** * Defines the color that will be used to colorize the 0 tickmark and ticklabel * when the gauge range has a negative min- and positive maxValue. * * @param COLOR */ public void setZeroColor(final Color COLOR) { if (null == zeroColor) { _zeroColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { zeroColor.set(COLOR); } } public ObjectProperty zeroColorProperty() { if (null == zeroColor) { zeroColor = new ObjectPropertyBase(_zeroColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "zeroColor"; } }; _zeroColor = null; } return zeroColor; } /** * Returns the smallest value that was measured after the last reset. * The default value is the maxValue of the gauge. * * @return the smallest value that was measured after the last reset */ public double getMinMeasuredValue() { return null == minMeasuredValue ? _minMeasuredValue : minMeasuredValue.get(); } /** * Sets the minMeasuredValue to the given value. * * @param MIN_MEASURED_VALUE */ public void setMinMeasuredValue(final double MIN_MEASURED_VALUE) { if (null == minMeasuredValue) { _minMeasuredValue = MIN_MEASURED_VALUE; } else { minMeasuredValue.set(MIN_MEASURED_VALUE); } } public ReadOnlyDoubleProperty minMeasuredValueProperty() { if (null == minMeasuredValue) { minMeasuredValue = new SimpleDoubleProperty(this, "minMeasuredValue", _minMeasuredValue); } return minMeasuredValue; } /** * Returns the biggest value that was measured after the last reset. * The default value is the minValue of the gauge. * * @return the biggest value that was measured after the last reset */ public double getMaxMeasuredValue() { return null == maxMeasuredValue ? _maxMeasuredValue : maxMeasuredValue.get(); } /** * Sets the maxMeasuredVAlue to the given value. * * @param MAX_MEASURED_VALUE */ public void setMaxMeasuredValue(final double MAX_MEASURED_VALUE) { if (null == maxMeasuredValue) { _maxMeasuredValue = MAX_MEASURED_VALUE; } else { maxMeasuredValue.set(MAX_MEASURED_VALUE); } } public ReadOnlyDoubleProperty maxMeasuredValueProperty() { if (null == maxMeasuredValue) { maxMeasuredValue = new SimpleDoubleProperty(this, "maxMeasuredValue", _maxMeasuredValue); } return maxMeasuredValue; } /** * Resets the min- and maxMeasuredValue to the value of the gauge. */ public void resetMeasuredValues() { setMinMeasuredValue(getValue()); setMaxMeasuredValue(getValue()); } /** * Returns true if the indicator of the minMeasuredValue is visible. * * @return true if the indicator of the minMeasuredValue is visible */ public boolean isMinMeasuredValueVisible() { return null == minMeasuredValueVisible ? _minMeasuredValueVisible : minMeasuredValueVisible.get(); } /** * Defines if the indicator of the minMeasuredValue should be visible. * * @param VISIBLE */ public void setMinMeasuredValueVisible(final boolean VISIBLE) { if (null == minMeasuredValueVisible) { _minMeasuredValueVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { minMeasuredValueVisible.set(VISIBLE); } } public BooleanProperty minMeasuredValueVisibleProperty() { if (null == minMeasuredValueVisible) { minMeasuredValueVisible = new BooleanPropertyBase(_minMeasuredValueVisible) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "minMeasuredValueVisible"; } }; } return minMeasuredValueVisible; } /** * Returns true if the indicator of the maxMeasuredValue is visible. * * @return true if the indicator of the maxMeasuredValue is visible */ public boolean isMaxMeasuredValueVisible() { return null == maxMeasuredValueVisible ? _maxMeasuredValueVisible : maxMeasuredValueVisible.get(); } /** * Defines if the indicator of the maxMeasuredValue should be visible. * * @param VISIBLE */ public void setMaxMeasuredValueVisible(final boolean VISIBLE) { if (null == maxMeasuredValueVisible) { _maxMeasuredValueVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { maxMeasuredValueVisible.set(VISIBLE); } } public BooleanProperty maxMeasuredValueVisibleProperty() { if (null == maxMeasuredValueVisible) { maxMeasuredValueVisible = new BooleanPropertyBase(_maxMeasuredValueVisible) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "maxMeasuredValueVisible"; } }; } return maxMeasuredValueVisible; } /** * Returns true if the old value of the gauge is visible (not implemented) * * @return true if the old value of the gauge is visible (not implemented) */ public boolean isOldValueVisible() { return null == oldValueVisible ? _oldValueVisible : oldValueVisible.get(); } /** * Defines if the old value of the gauge should be visible (not implemented) * * @param VISIBLE */ public void setOldValueVisible(final boolean VISIBLE) { if (null == oldValueVisible) { _oldValueVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { oldValueVisible.set(VISIBLE); } } public BooleanProperty oldValueVisibleProperty() { if (null == oldValueVisible) { oldValueVisible = new BooleanPropertyBase(_oldValueVisible) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "oldValueVisible"; } }; } return oldValueVisible; } /** * Returns true if the visualization of the gauge value is visible. * Usually this is a Label or Text node. * * @return true if the visualization of the gauge value is visible */ public boolean isValueVisible() { return null == valueVisible ? _valueVisible : valueVisible.get(); } /** * Defines if the visualization of the gauge value should be visible. * * @param VISIBLE */ public void setValueVisible(final boolean VISIBLE) { if (null == valueVisible) { _valueVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { valueVisible.set(VISIBLE); } } public BooleanProperty valueVisibleProperty() { if (null == valueVisible) { valueVisible = new BooleanPropertyBase(_valueVisible) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "valueVisible"; } }; } return valueVisible; } /** * Returns the Paint object that will be used to fill the gauge background. * This is usally a Color object. * * @return the Paint object that will be used to fill the gauge background */ public Paint getBackgroundPaint() { return null == backgroundPaint ? _backgroundPaint : backgroundPaint.get(); } /** * Defines the Paint object that will be used to fill the gauge background. * * @param PAINT */ public void setBackgroundPaint(final Paint PAINT) { if (null == backgroundPaint) { _backgroundPaint = PAINT; fireUpdateEvent(REDRAW_EVENT); } else { backgroundPaint.set(PAINT); } } public ObjectProperty backgroundPaintProperty() { if (null == backgroundPaint) { backgroundPaint = new ObjectPropertyBase(_backgroundPaint) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "backgroundPaint"; } }; _backgroundPaint = null; } return backgroundPaint; } /** * Returns the Paint object that will be used to draw the border of the gauge. * Usually this is a Color object. * * @return the Paint object that will be used to draw the border of the gauge */ public Paint getBorderPaint() { return null == borderPaint ? _borderPaint : borderPaint.get(); } /** * Defines the Paint object that will be used to draw the border of the gauge. * * @param PAINT */ public void setBorderPaint(final Paint PAINT) { if (null == borderPaint) { _borderPaint = PAINT; fireUpdateEvent(REDRAW_EVENT); } else { borderPaint.set(PAINT); } } public ObjectProperty borderPaintProperty() { if (null == borderPaint) { borderPaint = new ObjectPropertyBase(_borderPaint) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "borderPaint"; } }; _borderPaint = null; } return borderPaint; } /** * Returns the width in pixels that will be used to draw the border of the gauge. * The value will be clamped between 0 and 50 pixels. * * @return the width in pixels that will be used to draw the border of the gauge */ public double getBorderWidth() { return null == borderWidth ? _borderWidth : borderWidth.get(); } /** * Defines the width in pixels that will be used to draw the border of the gauge. * The value will be clamped between 0 and 50 pixels. * * @param WIDTH */ public void setBorderWidth(final double WIDTH) { if (null == borderWidth) { _borderWidth = Helper.clamp(0.0, 50.0, WIDTH); fireUpdateEvent(REDRAW_EVENT); } else { borderWidth.set(WIDTH); } } public DoubleProperty borderWidthProperty() { if (null == borderWidth) { borderWidth = new DoublePropertyBase(_borderWidth) { @Override protected void invalidated() { final double WIDTH = get(); if (WIDTH < 0 || WIDTH > 50) set(Helper.clamp(0.0, 50.0, WIDTH)); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "borderWidth"; } }; } return borderWidth; } /** * Returns the Paint object that will be used to fill the foreground of the gauge. * This could be used to visualize glass effects etc. and is only rarely used. * * @return the Paint object that will be used to fill the foreground of the gauge */ public Paint getForegroundPaint() { return null == foregroundPaint ? _foregroundPaint : foregroundPaint.get(); } /** * Defines the Paint object that will be used to fill the foreground of the gauge. * This could be used to visualize glass effects etc. and is only rarely used. * * @param PAINT */ public void setForegroundPaint(final Paint PAINT) { if (null == foregroundPaint) { _foregroundPaint = PAINT; fireUpdateEvent(REDRAW_EVENT); } else { foregroundPaint.set(PAINT); } } public ObjectProperty foregroundPaintProperty() { if (null == foregroundPaint) { foregroundPaint = new ObjectPropertyBase(_foregroundPaint) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "foregroundPaint"; } }; _foregroundPaint = null; } return foregroundPaint; } /** * Returns the color that will be used to colorize the knob of * the radial gauges. * * @return the color that will be used to colorize the knob of the radial gauges */ public Color getKnobColor() { return null == knobColor ? _knobColor : knobColor.get(); } /** * Defines the color that will be used to colorize the knob of * the radial gauges. * * @param COLOR */ public void setKnobColor(final Color COLOR) { if (null == knobColor) { _knobColor = COLOR; fireUpdateEvent(RESIZE_EVENT); } else { knobColor.set(COLOR); } } public ObjectProperty knobColorProperty() { if (null == knobColor) { knobColor = new ObjectPropertyBase(_knobColor) { @Override protected void invalidated() { fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "knobColor"; } }; _knobColor = null; } return knobColor; } /** * Returns the type of knob that will be used in the radial * gauges. The values are STANDARD, PLAIN, METAL and FLAT. * * @return the type of knob that will be used in the radial gauges */ public KnobType getKnobType() { return null == knobType ? _knobType : knobType.get(); } /** * Defines the type of knob that will be used in the radial * gauges. The values are STANDARD, PLAIN, METAL and FLAT. * * @param TYPE */ public void setKnobType(final KnobType TYPE) { if (null == knobType) { _knobType = null == TYPE ? KnobType.STANDARD : TYPE; fireUpdateEvent(RESIZE_EVENT); } else { knobType.set(TYPE); } } public ObjectProperty knobTypeProperty() { if (null == knobType) { knobType = new ObjectPropertyBase(_knobType) { @Override protected void invalidated() { if (null == get()) set(KnobType.STANDARD); fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "knobType"; } }; _knobType = null; } return knobType; } /** * Returns the position of the knob in radial gauges. This * position also defines where the needle will be placed. * Dependent on the SkinType you can use the following values * GaugeSkin : CENTER * HSkin : TOP_CENTER, BOTTOM_CENTER * VSkin : CENTER_LEFT, CENTER_RIGHT * QuarterSkin: TOP_RIGHT, BOTTOM_RIGHT, BOTTOM_LEFT, TOP_LEFT * * @return the position of the knob in the radial gauges */ public Pos getKnobPosition() { return null == knobPosition ? _knobPosition : knobPosition.get(); } /** * Defines the position of the knob in radial gauges. This * position also defines where the needle will be placed. * Dependent on the SkinType you can use the following values * GaugeSkin : CENTER * HSkin : TOP_CENTER, BOTTOM_CENTER * VSkin : CENTER_LEFT, CENTER_RIGHT * QuarterSkin: TOP_RIGHT, BOTTOM_RIGHT, BOTTOM_LEFT, TOP_LEFT * * @param POSITION */ public void setKnobPosition(final Pos POSITION) { if (null == knobPosition) { _knobPosition = POSITION; fireUpdateEvent(RESIZE_EVENT); } else { knobPosition.set(POSITION); } } public ObjectProperty knobPositionProperty() { if (null == knobPosition) { knobPosition = new ObjectPropertyBase(_knobPosition) { @Override protected void invalidated() { final Pos POSITION = get(); if (null == POSITION) { switch (skinType) { case HORIZONTAL: super.set(Pos.CENTER_RIGHT); break; case VERTICAL : super.set(Pos.BOTTOM_CENTER); break; case QUARTER : super.set(Pos.BOTTOM_RIGHT); break; default : super.set(Pos.CENTER); } } fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "knobPosition"; } }; _knobPosition = null; } return knobPosition; } /** * Returns true if the knob is visible. * * @return true if the knob is visible */ public boolean isKnobVisible() { return null == knobVisible ? _knobVisible : knobVisible.get(); } /** * Defines if the knob is visible. * * @param VISIBLE */ public void setKnobVisible(final boolean VISIBLE) { if (null == knobVisible) { _knobVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { knobVisible.set(VISIBLE); } } public BooleanProperty knobVisibleProperty() { if (null == knobVisible) { knobVisible = new BooleanPropertyBase(_knobVisible) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "knobVisible"; } }; } return knobVisible; } /** * Returns true if setting the value of the gauge will be animated * using the duration defined in animationDuration [ms]. * Keep in mind that it only makes sense to animate the setting if * the data rate is low (more than 1 value per second). If you use real * live measured data you should set animated to false. * * @return true if setting the value of the gauge will be animated */ public boolean isAnimated() { return null == animated ? _animated : animated.get(); } /** * Defines if setting the value of the gauge should be animated using * the duration defined in animationDuration [ms]. * Keep in mind that it only makes sense to animate the setting if * the data rate is low (more than 1 value per second). If you use real * live measured data you should set animated to false. * * @param ANIMATED */ public void setAnimated(final boolean ANIMATED) { if (null == animated) { _animated = ANIMATED; } else { animated.set(ANIMATED); } } public BooleanProperty animatedProperty() { if (null == animated) { animated = new SimpleBooleanProperty(Gauge.this, "animated", _animated); } return animated; } /** * Returns the duration in milliseconds that will be used to animate * the needle/bar of the gauge from the last value to the next value. * This will only be used if animated == true. This value will be * clamped in the range of 10ms - 10s. * * @return the duration in ms that will be used to animate the needle/bar */ public long getAnimationDuration() { return animationDuration; } /** * Defines the duration in milliseconds that will be used to animate * the needle/bar of the gauge from the last value to the next value. * This will only be used if animated == true. This value will be * clamped in the range of 10ms - 10s. * * @param ANIMATION_DURATION */ public void setAnimationDuration(final long ANIMATION_DURATION) { animationDuration = Helper.clamp(10, 10000, ANIMATION_DURATION); } /** * Returns the angle in degree that defines the start of the scale with * it's minValue in a radial gauge. If set to 0 the scale will start at * the bottom center and the direction of counting is mathematical correct * counter-clockwise. * Means if you would like to start the scale on the left side in the * middle of the gauge height the startAngle should be set to 270 degrees. * * @return the angle in degree that defines the start of the scale */ public double getStartAngle() { return null == startAngle ? _startAngle : startAngle.get(); } /** * Defines the angle in degree that defines the start of the scale with * it's minValue in a radial gauge. If set to 0 the scale will start at * the bottom center and the direction of counting is mathematical correct * counter-clockwise. * Means if you would like to start the scale on the left side in the * middle of the gauge height the startAngle should be set to 270 degrees. * * @param ANGLE */ public void setStartAngle(final double ANGLE) { if (null == startAngle) { _startAngle = Helper.clamp(0.0, 360.0, ANGLE); fireUpdateEvent(RECALC_EVENT); } else { startAngle.set(ANGLE); } } public DoubleProperty startAngleProperty() { if (null == startAngle) { startAngle = new DoublePropertyBase(_startAngle) { @Override protected void invalidated() { final double ANGLE = get(); if (ANGLE < 0 || ANGLE > 360 ) set(Helper.clamp(0.0, 360.0, ANGLE)); fireUpdateEvent(RECALC_EVENT); } @Override public Object getBean() { return this; } @Override public String getName() { return "startAngle"; } }; } return startAngle; } /** * Returns the angle range in degree that will be used to draw the scale * of the radial gauge. The given range will be clamped in the range of * 0 - 360 degrees and will be drawn in the direction dependent on the * scaleDirection. * * @return the angle range in degree that will be used to draw the scale */ public double getAngleRange() { return null == angleRange ? _angleRange : angleRange.get(); } /** * Defines the angle range in degree that will be used to draw the scale * of the radial gauge. The given range will be clamped in the range of * 0 - 360 degrees. The range will start at the startAngle and will be * drawn in the direction dependent on the scaleDirection. * * @param RANGE */ public void setAngleRange(final double RANGE) { double tmpAngleRange = Helper.clamp(0.0, 360.0, RANGE); if (null == angleRange) { _angleRange = tmpAngleRange; setAngleStep(tmpAngleRange / getRange()); if (isAutoScale()) { calcAutoScale(); } fireUpdateEvent(RECALC_EVENT); } else { angleRange.set(tmpAngleRange); } } public DoubleProperty angleRangeProperty() { if (null == angleRange) { angleRange = new DoublePropertyBase(_angleRange) { @Override protected void invalidated() { final double ANGLE_RANGE = get(); set(Helper.clamp(0.0, 360.0, ANGLE_RANGE)); setAngleStep(get() / getRange()); if (isAutoScale()) { calcAutoScale(); } fireUpdateEvent(RECALC_EVENT); } @Override public Object getBean() { return this; } @Override public String getName() { return "angleRange"; } }; } return angleRange; } /** * Returns the value that is calculated by dividing the angleRange * by the range. The angleStep will always be recalculated when changing * the min-, maxValue or angleRange. * E.g. angleRange = 180 degrees, range = 0 - 100 will lead to angleStep = 180/100 = 1.8 * * @return the value that is calculated by dividing the angleRange by the range */ public double getAngleStep() { return null == angleStep ? _angleStep : angleStep.get(); } /** * Private method that will be used to set the angleStep * * @param STEP */ private void setAngleStep(final double STEP) { if (null == angleStep) { _angleStep = STEP; } else { angleStep.set(STEP); } } public ReadOnlyDoubleProperty angleStepProperty() { if (null == angleStep) { angleStep = new SimpleDoubleProperty(Gauge.this, "angleStep", _angleStep); } return angleStep; } /** * Returns the distance between the segments in the SIMPLE_DIGITAL skin. * @return the distance between the segments in the SIMPLE_DIGITAL skin. */ public double getArcExtend() { return null == arcExtend ? _arcExtend : arcExtend.get(); } /** * Defines the distance between the segments in the SIMPLE_DIGITAL_SKIN * @param ARC_EXTEND */ public void setArcExtend(final double ARC_EXTEND) { if (null == arcExtend) { _arcExtend = Helper.clamp(0.1, 10, ARC_EXTEND); fireUpdateEvent(REDRAW_EVENT); } else { arcExtend.set(ARC_EXTEND); } } public DoubleProperty arcExtendProperty() { if (null == arcExtend) { arcExtend = new DoublePropertyBase(_arcExtend) { @Override protected void invalidated() { set(Helper.clamp(0.1, 10, get())); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "arcExtend"; } }; } return arcExtend; } /** * Returns true if the scale will be calculated automatically based * on the defined values for min- and maxValue. * The autoscaling is on per default because otherwise you will * run into problems when having very large or very small scales like * 0 - 10000 or 0 - 1. * * @return true if the scale will be calculated automatically */ public boolean isAutoScale() { return null == autoScale ? _autoScale : autoScale.get(); } /** * Defines if the scale should be calculated automatically based on * the defined values for min- and maxValue. * The autoscaling is on per default because otherwise you will * run into problems when having very large or very small scales like * 0 - 10000 or 0 - 1. * * @param AUTO_SCALE */ public void setAutoScale(final boolean AUTO_SCALE) { if (null == autoScale) { _autoScale = AUTO_SCALE; if (_autoScale) { originalMinValue = getMinValue(); originalMaxValue = getMaxValue(); calcAutoScale(); } else { setMinValue(Double.compare(-Double.MAX_VALUE, originalMinValue) == 0 ? getMinValue() : originalMinValue); setMaxValue(Double.compare(Double.MAX_VALUE, originalMaxValue) == 0 ? getMaxValue() : originalMaxValue); } fireUpdateEvent(RECALC_EVENT); } else { autoScale.set(AUTO_SCALE); } } public BooleanProperty autoScaleProperty() { if (null == autoScale) { autoScale = new BooleanPropertyBase(_autoScale) { @Override protected void invalidated() { if (get()) { calcAutoScale(); } else { setMinValue(Double.compare(-Double.MAX_VALUE, originalMinValue) == 0 ? getMinValue() : originalMinValue); setMaxValue(Double.compare(Double.MAX_VALUE, originalMaxValue) == 0 ? getMaxValue() : originalMaxValue); } fireUpdateEvent(RECALC_EVENT); } @Override public Object getBean() { return this; } @Override public String getName() { return "autoScale"; } }; } return autoScale; } /** * Returns true if effects like shadows will be drawn. * In some gauges inner- and dropshadows will be used which will be * switched on/off by setting the shadowsEnabled property. * * @return true if effects like shadows will be drawn */ public boolean isShadowsEnabled() { return null == shadowsEnabled ? _shadowsEnabled : shadowsEnabled.get(); } /** * Defines if effects like shadows should be drawn. * In some gauges inner- and dropshadows will be used which will be * switched on/off by setting the shadowsEnabled property. * * @param ENABLED */ public void setShadowsEnabled(final boolean ENABLED) { if (null == shadowsEnabled) { _shadowsEnabled = ENABLED; fireUpdateEvent(REDRAW_EVENT); } else { shadowsEnabled.set(ENABLED); } } public BooleanProperty shadowsEnabledProperty() { if (null == shadowsEnabled) { shadowsEnabled = new BooleanPropertyBase(_shadowsEnabled) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "shadowsEnabled"; } }; } return shadowsEnabled; } /** * Returns true if the highlight effect on the gauges like the * LinearSkin bar will be drawn. If you would like to have a * more flat style you should set this to false. * * @return true if the highlight effect on a bar will be drawn */ public boolean isBarEffectEnabled() { return null == barEffectEnabled ? _barEffectEnabled : barEffectEnabled.get(); } /** * Defines if the the highlight effect on the gauges like the * LinearSkin bar will be drawn. If you would like to have a * more flat style you should set this to false. * * @param ENABLED */ public void setBarEffectEnabled(final boolean ENABLED) { if (null == barEffectEnabled) { _barEffectEnabled = ENABLED; fireUpdateEvent(VISIBILITY_EVENT); } else { barEffectEnabled.set(ENABLED); } } public BooleanProperty barEffectEnabledProperty() { if (null == barEffectEnabled) { barEffectEnabled = new BooleanPropertyBase(_barEffectEnabled) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "barEffectEnabled"; } }; } return barEffectEnabled; } /** * Returns the direction of the scale. The values are * CLOCKWISE and COUNTER_CLOCKWISE. This property is needed * to realize gauges like in QuarterSkin where the needle * and knob should be placed on the upper right corner and * the scale should start at the bottom. Here you need a * counter-clockwise direction of the scale. * * @return the direction of the scale */ public ScaleDirection getScaleDirection() { return null == scaleDirection ? _scaleDirection : scaleDirection.get(); } /** * Defines the direction of the scale. The values are * CLOCKWISE and COUNTER_CLOCKWISE. This property is needed * to realize gauges like in QuarterSkin where the needle * and knob should be placed on the upper right corner and * the scale should start at the bottom. Here you need a * counter-clockwise direction of the scale. * * @param DIRECTION */ public void setScaleDirection(final ScaleDirection DIRECTION) { if (null == scaleDirection) { _scaleDirection = null == DIRECTION ? ScaleDirection.CLOCKWISE : DIRECTION; fireUpdateEvent(RECALC_EVENT); } else { scaleDirection.set(DIRECTION); } } public ObjectProperty scaleDirectionProperty() { if (null == scaleDirection) { scaleDirection = new ObjectPropertyBase(_scaleDirection) { @Override protected void invalidated() { if (null == get()) set(ScaleDirection.CLOCKWISE); fireUpdateEvent(RECALC_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "scaleDirection"; } }; _scaleDirection = null; } return scaleDirection; } /** * Returns the location of the ticklabels. The values are * INSIDE and OUTSIDE. The location of the ticklabels has an * influence on the size of the tickmarks and length of the needle. * * @return the location of the ticklabels */ public TickLabelLocation getTickLabelLocation() { return null == tickLabelLocation ? _tickLabelLocation : tickLabelLocation.get(); } /** * Defines the location of the ticklabels. The values are * INSIDE and OUTSIDE. The location of the ticklabels has an * influence on the size of the tickmarks and length of the needle. * * @param LOCATION */ public void setTickLabelLocation(final TickLabelLocation LOCATION) { if (null == tickLabelLocation) { _tickLabelLocation = null == LOCATION ? TickLabelLocation.INSIDE : LOCATION; fireUpdateEvent(REDRAW_EVENT); } else { tickLabelLocation.set(LOCATION); } } public ObjectProperty tickLabelLocationProperty() { if (null == tickLabelLocation) { tickLabelLocation = new ObjectPropertyBase(_tickLabelLocation) { @Override protected void invalidated() { if(null == get()) set(TickLabelLocation.INSIDE); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "tickLabelLocation"; } }; _tickLabelLocation = null; } return tickLabelLocation; } /** * Returns the orientation of the ticklabels. The values are * HORIZONTAL, ORTHOGONAL and TANGENT. Especially the ORTHOGONAL * setting can be useful when using scales with big numbers. * * @return the orientation of the ticklabels */ public TickLabelOrientation getTickLabelOrientation() { return null == tickLabelOrientation ? _tickLabelOrientation : tickLabelOrientation.get(); } /** * Defines the orientation of the ticklabels. The values are * HORIZONTAL, ORTHOGONAL and TANGENT. Especially the ORTHOGONAL * setting can be useful when using scales with big numbers. * * @param ORIENTATION */ public void setTickLabelOrientation(final TickLabelOrientation ORIENTATION) { if (null == tickLabelOrientation) { _tickLabelOrientation = null == ORIENTATION ? TickLabelOrientation.HORIZONTAL : ORIENTATION; fireUpdateEvent(REDRAW_EVENT); } else { tickLabelOrientation.set(ORIENTATION); } } public ObjectProperty tickLabelOrientationProperty() { if (null == tickLabelOrientation) { tickLabelOrientation = new ObjectPropertyBase(_tickLabelOrientation) { @Override protected void invalidated() { if(null == get()) set(TickLabelOrientation.HORIZONTAL); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "tickLabelOrientation"; } }; _tickLabelOrientation = null; } return tickLabelOrientation; } /** * Returns the color that will be used to colorize the ticklabels. This color * will only be used if no ticklabel section defines a different color. * * @return the color that will be used to colorize the ticklabels */ public Color getTickLabelColor() { return null == tickLabelColor ? _tickLabelColor : tickLabelColor.get(); } /** * Defines the color that will be used to colorize the ticklabels. This color * will only be used if no ticklabel section defines a different color. * * @param COLOR */ public void setTickLabelColor(final Color COLOR) { if (null == tickLabelColor) { _tickLabelColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { tickLabelColor.set(COLOR); } } public ObjectProperty tickLabelColorProperty() { if (null == tickLabelColor) { tickLabelColor = new ObjectPropertyBase(_tickLabelColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "tickLabelColor"; } }; _tickLabelColor = null; } return tickLabelColor; } /** * Returns the color that will be used to colorize the tickmarks. This color * will only be used if no tickmark section or major-, medium- and minorTickMarkColor * is defined at the position of the tickmark. * * @return the color that will be used to colorize the tickmarks */ public Color getTickMarkColor() { return null == tickMarkColor ? _tickMarkColor : tickMarkColor.get(); } /** * Defines the color that will be used to colorize the tickmarks. This color * will only be used if no tickmark section or major-, medium- and minorTickMarkColor * is defined at the position of the tickmark. * * @param COLOR */ public void setTickMarkColor(final Color COLOR) { if (null == tickMarkColor) { _tickMarkColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { tickMarkColor.set(COLOR); } } public ObjectProperty tickMarkColorProperty() { if (null == tickMarkColor) { tickMarkColor = new ObjectPropertyBase(_tickMarkColor) { @Override protected void invalidated() { fireUpdateEvent( REDRAW_EVENT ); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "tickMarkColor"; } }; _tickMarkColor = null; } return tickMarkColor; } /** * Returns the color that will be used to colorize the major * tickmarks. This color will only be used if no tickmark * section is defined at the position of the tickmark. * * @return the color that will be used to colorize the major tickmarks */ public Color getMajorTickMarkColor() { return null == majorTickMarkColor ? _majorTickMarkColor : majorTickMarkColor.get(); } /** * Defines the color that will be used to colorize the major * tickmarks. This color will only be used if no tickmark * section is defined at the position of the tickmark. * * @param COLOR */ public void setMajorTickMarkColor(final Color COLOR) { if (null == majorTickMarkColor) { _majorTickMarkColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { majorTickMarkColor.set(COLOR); } } public ObjectProperty majorTickMarkColorProperty() { if (null == majorTickMarkColor) { majorTickMarkColor = new ObjectPropertyBase(_majorTickMarkColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "majorTickMarkColor"; } }; _majorTickMarkColor = null; } return majorTickMarkColor; } /** * Returns the factor that defines the length of the major tick mark. * The value can be in the range from 0 - 1; * * @return the factor that defines the length of the major tick mark */ public double getMajorTickMarkLengthFactor() { return null == majorTickMarkLengthFactor ? _majorTickMarkLengthFactor : majorTickMarkLengthFactor.get(); } /** * The factor defines the length of the major tick mark. * It can be in the range from 0 - 1. * * @param FACTOR */ public void setMajorTickMarkLengthFactor(final double FACTOR) { if (null == majorTickMarkLengthFactor) { _majorTickMarkLengthFactor = Helper.clamp(0.0, 1.0, FACTOR); fireUpdateEvent(REDRAW_EVENT); } else { majorTickMarkLengthFactor.set(FACTOR); } } public DoubleProperty majorTickMarkLengthFactorProperty() { if (null == majorTickMarkLengthFactor) { majorTickMarkLengthFactor = new DoublePropertyBase(_majorTickMarkLengthFactor) { @Override protected void invalidated() { final double VALUE = get(); if (VALUE < 0 || VALUE > 1) set(Helper.clamp(0.0, 1.0, VALUE)); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "majorTickMarkLengthFactor"; } }; } return majorTickMarkLengthFactor; } /** * Returns the factor that defines the width of the major tick mark. * The value can be in the range from 0 - 1. * * @return the factor that defines the width of the major tick mark */ public double getMajorTickMarkWidthFactor() { return null == majorTickMarkWidthFactor ? _majorTickMarkWidthFactor : majorTickMarkWidthFactor.get(); } /** * The factor defines the width of the major tick mark. * It can be in the range from 0 - 1. * * @param FACTOR */ public void setMajorTickMarkWidthFactor(final double FACTOR) { if (null == majorTickMarkWidthFactor) { _majorTickMarkWidthFactor = Helper.clamp(0.0, 1.0, FACTOR); fireUpdateEvent(REDRAW_EVENT); } else { majorTickMarkWidthFactor.set(FACTOR); } } public DoubleProperty majorTickMarkWidthFactorProperty() { if (null == majorTickMarkWidthFactor) { majorTickMarkWidthFactor = new DoublePropertyBase(_majorTickMarkWidthFactor) { @Override protected void invalidated() { final double VALUE = get(); if (VALUE < 0 || VALUE > 1) set(Helper.clamp(0.0, 1.0, VALUE)); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "majorTickMarkWidthFactor"; } }; } return majorTickMarkWidthFactor; } /** * Returns the color that will be used to colorize the medium * tickmarks. This color will only be used if no tickmark * section is defined at the position of the tickmark. * * @return the color that will be used to colorize the medium tickmark */ public Color getMediumTickMarkColor() { return null == mediumTickMarkColor ? _mediumTickMarkColor : mediumTickMarkColor.get(); } /** * Defines the color that will be used to colorize the medium * tickmarks. This color will only be used if no tickmark * section is defined at the position of the tickmark. * * @param COLOR */ public void setMediumTickMarkColor(final Color COLOR) { if (null == mediumTickMarkColor) { _mediumTickMarkColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { mediumTickMarkColor.set(COLOR); } } public ObjectProperty mediumTickMarkColorProperty() { if (null == mediumTickMarkColor) { mediumTickMarkColor = new ObjectPropertyBase(_mediumTickMarkColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "mediumTickMarkColor"; } }; _mediumTickMarkColor = null; } return mediumTickMarkColor; } /** * Returns the factor that defines the length of the medium tick mark. * The value can be in the range from 0 - 1; * * @return the factor that defines the length of the medium tick mark */ public double getMediumTickMarkLengthFactor() { return null == mediumTickMarkLengthFactor ? _mediumTickMarkLengthFactor : mediumTickMarkLengthFactor.get(); } /** * The factor defines the length of the medium tick mark. * It can be in the range from 0 - 1. * * @param FACTOR */ public void setMediumTickMarkLengthFactor(final double FACTOR) { if (null == mediumTickMarkLengthFactor) { _mediumTickMarkLengthFactor = Helper.clamp(0.0, 1.0, FACTOR); fireUpdateEvent(REDRAW_EVENT); } else { mediumTickMarkLengthFactor.set(FACTOR); } } public DoubleProperty mediumTickMarkLengthFactorProperty() { if (null == mediumTickMarkLengthFactor) { mediumTickMarkLengthFactor = new DoublePropertyBase(_mediumTickMarkLengthFactor) { @Override protected void invalidated() { final double VALUE = get(); if (VALUE < 0 || VALUE > 1) set(Helper.clamp(0.0, 1.0, VALUE)); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "mediumTickMarkLengthFactor"; } }; } return mediumTickMarkLengthFactor; } /** * Returns the factor that defines the width of the medium tick mark. * The value can be in the range from 0 - 1. * * @return the factor that defines the width of the medium tick mark */ public double getMediumTickMarkWidthFactor() { return null == mediumTickMarkWidthFactor ? _mediumTickMarkWidthFactor : mediumTickMarkWidthFactor.get(); } /** * The factor defines the width of the medium tick mark. * It can be in the range from 0 - 1. * * @param FACTOR */ public void setMediumTickMarkWidthFactor(final double FACTOR) { if (null == mediumTickMarkWidthFactor) { _mediumTickMarkWidthFactor = Helper.clamp(0.0, 1.0, FACTOR); fireUpdateEvent(REDRAW_EVENT); } else { mediumTickMarkWidthFactor.set(FACTOR); } } public DoubleProperty mediumTickMarkWidthFactorProperty() { if (null == mediumTickMarkWidthFactor) { mediumTickMarkWidthFactor = new DoublePropertyBase(_mediumTickMarkWidthFactor) { @Override protected void invalidated() { final double VALUE = get(); if (VALUE < 0 || VALUE > 1) set(Helper.clamp(0.0, 1.0, VALUE)); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "mediumTickMarkWidthFactor"; } }; } return mediumTickMarkWidthFactor; } /** * Returns the color that will be used to colorize the minor * tickmarks. This color will only be used if no tickmark * section is defined at the position of the tickmark. * * @return the color that will be used to colorize the minor tickmark */ public Color getMinorTickMarkColor() { return null == minorTickMarkColor ? _minorTickMarkColor : minorTickMarkColor.get(); } /** * Defines the color that will be used to colorize the minor * tickmarks. This color will only be used if no tickmark * section is defined at the position of the tickmark. * * @param COLOR */ public void setMinorTickMarkColor(final Color COLOR) { if (null == minorTickMarkColor) { _minorTickMarkColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { minorTickMarkColor.set(COLOR); } } public ObjectProperty minorTickMarkColorProperty() { if (null == minorTickMarkColor) { minorTickMarkColor = new ObjectPropertyBase(_minorTickMarkColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "minorTickMarkColor"; } }; _minorTickMarkColor = null; } return minorTickMarkColor; } /** * Returns the factor that defines the length of the minor tick mark. * The value can be in the range from 0 - 1; * * @return the factor that defines the length of the minor tick mark */ public double getMinorTickMarkLengthFactor() { return null == minorTickMarkLengthFactor ? _minorTickMarkLengthFactor : minorTickMarkLengthFactor.get(); } /** * The factor defines the length of the minor tick mark. * It can be in the range from 0 - 1. * * @param FACTOR */ public void setMinorTickMarkLengthFactor(final double FACTOR) { if (null == minorTickMarkLengthFactor) { _minorTickMarkLengthFactor = Helper.clamp(0.0, 1.0, FACTOR); fireUpdateEvent(REDRAW_EVENT); } else { minorTickMarkLengthFactor.set(FACTOR); } } public DoubleProperty minorTickMarkLengthFactorProperty() { if (null == minorTickMarkLengthFactor) { minorTickMarkLengthFactor = new DoublePropertyBase(_minorTickMarkLengthFactor) { @Override protected void invalidated() { final double VALUE = get(); if (VALUE < 0 || VALUE > 1) set(Helper.clamp(0.0, 1.0, VALUE)); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "minorTickMarkLengthFactor"; } }; } return minorTickMarkLengthFactor; } /** * Returns the factor that defines the width of the minor tick mark. * The value can be in the range from 0 - 1. * * @return the factor that defines the width of the minor tick mark */ public double getMinorTickMarkWidthFactor() { return null == minorTickMarkWidthFactor ? _minorTickMarkWidthFactor : minorTickMarkWidthFactor.get(); } /** * The factor defines the width of the minor tick mark. * It can be in the range from 0 - 1. * * @param FACTOR */ public void setMinorTickMarkWidthFactor(final double FACTOR) { if (null == minorTickMarkWidthFactor) { _minorTickMarkWidthFactor = Helper.clamp(0.0, 1.0, FACTOR); fireUpdateEvent(REDRAW_EVENT); } else { minorTickMarkWidthFactor.set(FACTOR); } } public DoubleProperty minorTickMarkWidthFactorProperty() { if (null == minorTickMarkWidthFactor) { minorTickMarkWidthFactor = new DoublePropertyBase(_minorTickMarkWidthFactor) { @Override protected void invalidated() { final double VALUE = get(); if (VALUE < 0 || VALUE > 1) set(Helper.clamp(0.0, 1.0, VALUE)); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "minorTickMarkWidthFactor"; } }; } return minorTickMarkWidthFactor; } /** * Returns the shape that will be used to visualize the major tickmark. * Values are LINE, DOT, TRAPEZOID, BOX, TICK_LABEL and PILL * * @return the shape that will be used to visualize the major tickmark */ public TickMarkType getMajorTickMarkType() { return null == majorTickMarkType ? _majorTickMarkType : majorTickMarkType.get(); } /** * Defines the shape that will be used to visualize the major tickmark. * Values are LINE, DOT, TRAPEZOID, BOX, TICK_LABEL and PILL * * @param TYPE */ public void setMajorTickMarkType(final TickMarkType TYPE) { if (null == majorTickMarkType) { _majorTickMarkType = null == TYPE ? TickMarkType.LINE : TYPE; fireUpdateEvent(REDRAW_EVENT); } else { majorTickMarkType.set(TYPE); } } public ObjectProperty majorTickMarkTypeProperty() { if (null == majorTickMarkType) { majorTickMarkType = new ObjectPropertyBase(_majorTickMarkType) { @Override protected void invalidated() { if (null == get()) set(TickMarkType.LINE); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "majorTickMarkType"; } }; _majorTickMarkType = null; } return majorTickMarkType; } /** * Returns the shape that will be used to visualize the medium tickmark. * Values are LINE, DOT, TRAPEZOID, BOX and PILL * * @return the shape that will be used to visualize the medium tickmark */ public TickMarkType getMediumTickMarkType() { return null == mediumTickMarkType ? _mediumTickMarkType : mediumTickMarkType.get(); } /** * Defines the shape that will be used to visualize the medium tickmark. * Values are LINE, DOT, TRAPEZOID, BOX and PILL * * @param TYPE */ public void setMediumTickMarkType(final TickMarkType TYPE) { if (null == mediumTickMarkType) { _mediumTickMarkType = null == TYPE ? TickMarkType.LINE : TYPE; fireUpdateEvent(REDRAW_EVENT); } else { mediumTickMarkType.set(TYPE); } } public ObjectProperty mediumTickMarkTypeProperty() { if (null == mediumTickMarkType) { mediumTickMarkType = new ObjectPropertyBase(_mediumTickMarkType) { @Override protected void invalidated() { if (null == get()) set(TickMarkType.LINE); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "mediumTickMarkType"; } }; _mediumTickMarkType = null; } return mediumTickMarkType; } /** * Returns the shape that will be used to visualize the minor tickmark. * Values are LINE, DOT, TRAPEZOID, BOX and PILL * * @return the shape that will be used to visualize the minor tickmark */ public TickMarkType getMinorTickMarkType() { return null == minorTickMarkType ? _minorTickMarkType : minorTickMarkType.get(); } /** * Defines the shape that will be used to visualize the minor tickmark. * Values are LINE, DOT, TRAPEZOID, BOX and PILL * * @param TYPE */ public void setMinorTickMarkType(final TickMarkType TYPE) { if (null == minorTickMarkType) { _minorTickMarkType = null == TYPE ? TickMarkType.LINE : TYPE; fireUpdateEvent(REDRAW_EVENT); } else { minorTickMarkType.set(TYPE); } } public ObjectProperty minorTickMarkTypeProperty() { if (null == minorTickMarkType) { minorTickMarkType = new ObjectPropertyBase(_minorTickMarkType) { @Override protected void invalidated() { if (null == get()) set(TickMarkType.LINE); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "minorTickMarkType"; } }; _minorTickMarkType = null; } return minorTickMarkType; } public Locale getLocale() { return null == locale ? _locale : locale.get(); } public void setLocale(final Locale LOCALE) { if (null == locale) { _locale = null == LOCALE ? Locale.US : LOCALE; fireUpdateEvent(REDRAW_EVENT); } else { locale.set(LOCALE); } } public ObjectProperty localeProperty() { if (null == locale) { locale = new ObjectPropertyBase(_locale) { @Override protected void invalidated() { if (null == get()) set(Locale.US); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "locale"; } }; _locale = null; } return locale; } /** * Returns the number of decimals that will be used to format the * value of the gauge. The number of decimals will be clamped to * a value between 0-3. * * @return the number of decimals that will be used to format the value */ public int getDecimals() { return null == decimals ? _decimals : decimals.get(); } /** * Defines the number of decimals that will be used to format the * value of the gauge. The number of decimals will be clamped to * a value between 0-3. * * @param DECIMALS */ public void setDecimals(final int DECIMALS) { if (null == decimals) { _decimals = Helper.clamp(0, MAX_NO_OF_DECIMALS, DECIMALS); updateFormatString(); fireUpdateEvent(REDRAW_EVENT); } else { decimals.set(DECIMALS); } } public IntegerProperty decimalsProperty() { if (null == decimals) { decimals = new IntegerPropertyBase(_decimals) { @Override protected void invalidated() { final int VALUE = get(); if (VALUE < 0 || VALUE > MAX_NO_OF_DECIMALS) set(Helper.clamp(0, MAX_NO_OF_DECIMALS, VALUE)); updateFormatString(); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "decimals"; } }; } return decimals; } /** * Returns the number of decimals that will be used to format the * value of the ticklabels. The number of decimals will be clamped to * a value between 0-3. * * @return */ public int getTickLabelDecimals() { return null == tickLabelDecimals ? _tickLabelDecimals : tickLabelDecimals.get(); } /** * Defines the number of decimals that will be used to format the * value of the gauge. The number of decimals will be clamped to * a value between 0-3. * * @param DECIMALS */ public void setTickLabelDecimals(final int DECIMALS) { if (null == tickLabelDecimals) { _tickLabelDecimals = Helper.clamp(0, MAX_NO_OF_DECIMALS, DECIMALS); fireUpdateEvent(REDRAW_EVENT); } else { tickLabelDecimals.set(DECIMALS); } } public IntegerProperty tickLabelDecimalsProperty() { if (null == tickLabelDecimals) { tickLabelDecimals = new IntegerPropertyBase(_tickLabelDecimals) { @Override protected void invalidated() { final int VALUE = get(); if (VALUE < 0 || VALUE > MAX_NO_OF_DECIMALS) set(Helper.clamp(0, MAX_NO_OF_DECIMALS, VALUE)); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "tickLabelDecimals"; } }; } return tickLabelDecimals; } /** * Returns the shape of the needle that will be used. This is * dependent on the used SkinType. Values are * GaugeSkin : STANDARD, FAT * HSkin : STANDARD * VSkin : STANDARD * QuarterSkin: STANDARD * * @return the shape of the needle that will be used */ public NeedleType getNeedleType() { return null == needleType ? _needleType : needleType.get(); } /** * Defines the shape of the needle that will be used. This is * dependent on the used SkinType. Values are * GaugeSkin : STANDARD, FAT * HSkin : STANDARD * VSkin : STANDARD * QuarterSkin: STANDARD * * @param TYPE */ public void setNeedleType(final NeedleType TYPE) { if (null == needleType) { _needleType = TYPE == null ? NeedleType.STANDARD : TYPE; fireUpdateEvent(RESIZE_EVENT); } else { needleType.set(TYPE); } } public ObjectProperty needleTypeProperty() { if (null == needleType) { needleType = new ObjectPropertyBase(_needleType) { @Override protected void invalidated() { if (null == get()) set(NeedleType.STANDARD); fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "needleType"; } }; _needleType = null; } return needleType; } /** * Returns the graphical representation of the needle that will be used. * Values are ANGLED, ROUND and FLAT * In principle it defines how the needle will be filled (gradient, color) * * @return the graphical representation of the needle */ public NeedleShape getNeedleShape() { return null == needleShape ? _needleShape : needleShape.get(); } /** * Defines the graphical representation of the needle that will be used. * Values are ANGLED, ROUND and FLAT * In principle it defines how the needle will be filled (gradient, color) * * @param SHAPE */ public void setNeedleShape(final NeedleShape SHAPE) { if (null == needleShape) { _needleShape = null == SHAPE ? NeedleShape.ANGLED : SHAPE; fireUpdateEvent(REDRAW_EVENT); } else { needleShape.set(SHAPE); } } public ObjectProperty needleShapeProperty() { if (null == needleShape) { needleShape = new ObjectPropertyBase(_needleShape) { @Override protected void invalidated() { if (null == get()) set(NeedleShape.ANGLED); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "needleShape"; } }; _needleShape = null; } return needleShape; } /** * Returns the thickness of the needle. * The values are THIN, STANDARD and THICK * * @return the thickness of the needle */ public NeedleSize getNeedleSize() { return null == needleSize ? _needleSize : needleSize.get(); } /** * Defines the thickness of the needle. * The values are THIN, STANDARD and THICK * * @param SIZE */ public void setNeedleSize(final NeedleSize SIZE) { if (null == needleSize) { _needleSize = null == SIZE ? NeedleSize.STANDARD : SIZE; fireUpdateEvent(RESIZE_EVENT); } else { needleSize.set(SIZE); } } public ObjectProperty needleSizeProperty() { if (null == needleSize) { needleSize = new ObjectPropertyBase(_needleSize) { @Override protected void invalidated() { if(null == get()) set(NeedleSize.STANDARD); fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "needleSize"; } }; _needleSize = null; } return needleSize; } /** * Returns the behavior of the needle movement. * The values are STANDARD and OPTIMIZED * This is an experimental feature that only makes sense in * gauges that use an angleRange of 360 degrees and where the * needle should be able to use the shortest way to the target * value. As an example one can think of a compass. If the value * in a compass changes from 20 degrees to 290 degrees the needle * will take the shortest way to the value, in this case this * means it will rotate counter-clockwise. * * @return the behavior of the needle movement (EXPERIMENTAL) */ public NeedleBehavior getNeedleBehavior() { return null == needleBehavior ? _needleBehavior : needleBehavior.get(); } /** * Defines the behavior of the needle movement. * The values are STANDARD and OPTIMIZED * This is an experimental feature that only makes sense in * gauges that use an angleRange of 360 degrees and where the * needle should be able to use the shortest way to the target * value. As an example one can think of a compass. If the value * in a compass changes from 20 degrees to 290 degrees the needle * will take the shortest way to the value, in this case this * means it will rotate counter-clockwise. * * @param BEHAVIOR */ public void setNeedleBehavior(final NeedleBehavior BEHAVIOR) { if (null == needleBehavior) { _needleBehavior = null == BEHAVIOR ? NeedleBehavior.STANDARD : BEHAVIOR; } else { needleBehavior.set(BEHAVIOR); } } public ObjectProperty needleBehaviorProperty() { if (null == needleBehavior) { needleBehavior = new ObjectPropertyBase(_needleBehavior) { @Override protected void invalidated() { if(null == get()) set(NeedleBehavior.STANDARD); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "needleBehavior"; } }; _needleBehavior = null; } return needleBehavior; } /** * Returns the color that will be used to colorize the needle of * the radial gauges. * * @return the color that wil be used to colorize the needle */ public Color getNeedleColor() { return null == needleColor ? _needleColor : needleColor.get(); } /** * Defines the color that will be used to colorize the needle of * the radial gauges. * * @param COLOR */ public void setNeedleColor(final Color COLOR) { if (null == needleColor) { _needleColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { needleColor.set(COLOR); } } public ObjectProperty needleColorProperty() { if (null == needleColor) { needleColor = new ObjectPropertyBase(_needleColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "needleColor"; } }; _needleColor = null; } return needleColor; } /** * Returns the color that is used to colorize the border of the needle. * * @return the color that is used to colorize the border of the needle */ public Color getNeedleBorderColor() { return null == needleBorderColor ? _needleBorderColor : needleBorderColor.get(); } /** * Defines the color that will be used to colorize the border of the needle. * * @param COLOR */ public void setNeedleBorderColor(final Color COLOR) { if (null == needleBorderColor) { _needleBorderColor = null == COLOR ? Color.TRANSPARENT : COLOR; fireUpdateEvent(REDRAW_EVENT); } else { needleBorderColor.set(COLOR); } } public ObjectProperty needleBorderColorProperty() { if (null == needleBorderColor) { needleBorderColor = new ObjectPropertyBase(_needleBorderColor) { @Override protected void invalidated() { if (null == get()) set(Color.TRANSPARENT); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "needleBorderColor"; } }; _needleBorderColor = null; } return needleBorderColor; } /** * Returns the color that will be used to colorize the bar of * the gauge (if it has a bar). * * @return the color that will be used to colorized the bar (if available) */ public Color getBarColor() { return null == barColor ? _barColor : barColor.get(); } /** * Defines the color that will be used to colorize the bar of * the gauge (if it has a bar). * * @param COLOR */ public void setBarColor(final Color COLOR) { if (null == barColor) { _barColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { barColor.set(COLOR); } } public ObjectProperty barColorProperty() { if (null == barColor) { barColor = new ObjectPropertyBase(_barColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "barColor"; } }; _barColor = null; } return barColor; } /** * Returns the color that is used to colorize the border of the bar. * * @return the color that is used to colorize the border of the bar */ public Color getBarBorderColor() { return null == barBorderColor ? _barBorderColor : barBorderColor.get(); } /** * Defines the color that will be used to colorize the border of the bar. * * @param COLOR */ public void setBarBorderColor(final Color COLOR) { if (null == barBorderColor) { _barBorderColor = null == COLOR ? Color.TRANSPARENT : COLOR; fireUpdateEvent(REDRAW_EVENT); } else { barBorderColor.set(COLOR); } } public ObjectProperty barBorderColorProperty() { if (null == barBorderColor) { barBorderColor = new ObjectPropertyBase(_barBorderColor) { @Override protected void invalidated() { if(null == get()) set(Color.TRANSPARENT); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "barBorderColor"; } }; _barBorderColor = null; } return barBorderColor; } /** * Returns the color that will be used to colorize the bar background of * the gauge (if it has a bar). * * @return the color that will be used to colorize the bar background */ public Color getBarBackgroundColor() { return null == barBackgroundColor ? _barBackgroundColor : barBackgroundColor.get(); } /** * Returns the color that will be used to colorize the bar background of * the gauge (if it has a bar). * * @param COLOR */ public void setBarBackgroundColor(final Color COLOR) { if (null == barBackgroundColor) { _barBackgroundColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { barBackgroundColor.set(COLOR); } } public ObjectProperty barBackgroundColorProperty() { if (null == barBackgroundColor) { barBackgroundColor = new ObjectPropertyBase(_barBackgroundColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "barBackgroundColor"; } }; _barBackgroundColor = null; } return barBackgroundColor; } /** * Returns the design that will be used to visualize the LCD display * of the gauge (if it has one). The values are * BEIGE, BLACK, BLUE, ORANGE, RED, YELLOW, WHITE, GRAY, * BLACK, GREEN, GREEN_DARKGREEN, BLUE2, BLUE_BLACK, * BLUE_DARKBLUE, BLUE_LIGHTBLUE, BLUE_GRAY, STANDARD, * LIGHTGREEN, STANDARD_GREEN, BLUE_BLUE, RED_DARKRED, * DARKBLUE, PURPLE, BLACK_RED, DARKGREEN, AMBER, * LIGHTBLUE, GREEN_BLACK, YELLOW_BLACK, BLACK_YELLOW, * LIGHTGREEN_BLACK, DARKPURPLE, DARKAMBER, BLUE_LIGHTBLUE2, * GRAY_PURPLE, YOCTOPUCE, SECTIONS, FLAT_CUSTOM * * @return the design that will be used to visualize the LCD display (if available) */ public LcdDesign getLcdDesign() { return null == lcdDesign ? _lcdDesign : lcdDesign.get(); } /** * Defines the design that will be used to visualize the LCD display * of the gauge (if it has one). The values are * BEIGE, BLACK, BLUE, ORANGE, RED, YELLOW, WHITE, GRAY, * BLACK, GREEN, GREEN_DARKGREEN, BLUE2, BLUE_BLACK, * BLUE_DARKBLUE, BLUE_LIGHTBLUE, BLUE_GRAY, STANDARD, * LIGHTGREEN, STANDARD_GREEN, BLUE_BLUE, RED_DARKRED, * DARKBLUE, PURPLE, BLACK_RED, DARKGREEN, AMBER, * LIGHTBLUE, GREEN_BLACK, YELLOW_BLACK, BLACK_YELLOW, * LIGHTGREEN_BLACK, DARKPURPLE, DARKAMBER, BLUE_LIGHTBLUE2, * GRAY_PURPLE, YOCTOPUCE, SECTIONS, FLAT_CUSTOM * * @param DESIGN */ public void setLcdDesign(final LcdDesign DESIGN) { if (null == lcdDesign) { _lcdDesign = null == DESIGN ? LcdDesign.STANDARD : DESIGN; fireUpdateEvent(LCD_EVENT); } else { lcdDesign.set(DESIGN); } } public ObjectProperty lcdDesignProperty() { if (null == lcdDesign) { lcdDesign = new ObjectPropertyBase(_lcdDesign) { @Override protected void invalidated() { if(null == get()) set(LcdDesign.STANDARD); fireUpdateEvent(LCD_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "lcdDesign"; } }; _lcdDesign = null; } return lcdDesign; } /** * Returns the font that will be used to visualize the LCD value * if the gauge has a LCD display. * The values are STANDARD, LCD, SLIM, DIGITAL_BOLD, ELEKTRA * * @return the font that will be used to visualize the LCD value */ public LcdFont getLcdFont() { return null == lcdFont ? _lcdFont : lcdFont.get(); } /** * Defines the font that will be used to visualize the LCD value * if the gauge has a LCD display. * The values are STANDARD, LCD, SLIM, DIGITAL_BOLD, ELEKTRA * * @param FONT */ public void setLcdFont(final LcdFont FONT) { if (null == lcdFont) { _lcdFont = null == FONT ? LcdFont.DIGITAL_BOLD : FONT; fireUpdateEvent(RESIZE_EVENT); } else { lcdFont.set(FONT); } } public ObjectProperty lcdFontProperty() { if (null == lcdFont) { lcdFont = new ObjectPropertyBase(_lcdFont) { @Override protected void invalidated() { if(null == get()) set(LcdFont.DIGITAL_BOLD); fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "lcdFont"; } }; _lcdFont = null; } return lcdFont; } /** * Returns the color that will be used to visualize the LED of the * gauge if it has one. * * @return the color that will be used to visualize the LED */ public Color getLedColor() { return null == ledColor ? _ledColor : ledColor.get(); } /** * Defines the color that will be used to visualize the LED of the * gauge if it has one. * * @param COLOR */ public void setLedColor(final Color COLOR) { if (null == ledColor) { _ledColor = null == COLOR ? Color.RED : COLOR; fireUpdateEvent(REDRAW_EVENT); } else { ledColor.set(COLOR); } } public ObjectProperty ledColorProperty() { if (null == ledColor) { ledColor = new ObjectPropertyBase(_ledColor) { @Override protected void invalidated() { if (null == get()) set(Color.RED); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "ledColor"; } }; _ledColor = null; } return ledColor; } /** * Returns the graphical representation of the LED. * The values are STANDARD and FLAT * In principle this represents how the LED will be filled (gradient or color). * * @return the graphical representation of the LED */ public LedType getLedType() { return null == ledType ? _ledType : ledType.get(); } /** * Defines the graphical representation of the LED. * The values are STANDARD and FLAT * In principle this represents how the LED will be filled (gradient or color). * * @param TYPE */ public void setLedType(final LedType TYPE) { if (null == ledType) { _ledType = null == TYPE ? LedType.STANDARD : TYPE; fireUpdateEvent(REDRAW_EVENT); } else { ledType.set(TYPE); } } public ObjectProperty ledTypeProperty() { if (null == ledType) { ledType = new ObjectPropertyBase(_ledType) { @Override protected void invalidated() { if(null == get()) set(LedType.STANDARD); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "ledType"; } }; _ledType = null; } return ledType; } /** * Returns the color that will be used to colorize the title * of the gauge. * * @return the color that will be used to colorize the title */ public Color getTitleColor() { return null == titleColor ? _titleColor : titleColor.get(); } /** * Defines the color that will be used to colorize the title * of the gauge. * * @param COLOR */ public void setTitleColor(final Color COLOR) { if (null == titleColor) { _titleColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { titleColor.set(COLOR); } } public ObjectProperty titleColorProperty() { if (null == titleColor) { titleColor = new ObjectPropertyBase(_titleColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "titleColor"; } }; _titleColor = null; } return titleColor; } /** * Returns the color that will be used to colorize the subTitle * of the gauge. * * @return the color that will be used to colorize the subTitle */ public Color getSubTitleColor() { return null == subTitleColor ? _subTitleColor : subTitleColor.get(); } /** * Defines the color that will be used to colorize the subTitle * of the gauge. * * @param COLOR */ public void setSubTitleColor(final Color COLOR) { if (null == subTitleColor) { _subTitleColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { subTitleColor.set(COLOR); } } public ObjectProperty subTitleColorProperty() { if (null == subTitleColor) { subTitleColor = new ObjectPropertyBase(_subTitleColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "subTitleColor"; } }; _subTitleColor = null; } return subTitleColor; } /** * Returns the color that will be used to colorize the unit * of the gauge. * * @return the color that will be used to colorize the unit */ public Color getUnitColor() { return null == unitColor ? _unitColor : unitColor.get(); } /** * Defines the color that will be used to colorize the unit * of the gauge. * * @param COLOR */ public void setUnitColor(final Color COLOR) { if (null == unitColor) { _unitColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { unitColor.set(COLOR); } } public ObjectProperty unitColorProperty() { if (null == unitColor) { unitColor = new ObjectPropertyBase(_unitColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "unitColor"; } }; _unitColor = null; } return unitColor; } /** * Returns the color that will be used to colorize the value * of the gauge. * * @return the color that will be used to colorize the value */ public Color getValueColor() { return null == valueColor ? _valueColor : valueColor.get(); } /** * Defines the color that will be used to colorize the value * of the gauge. * * @param COLOR */ public void setValueColor(final Color COLOR) { if (null == valueColor) { _valueColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { valueColor.set(COLOR); } } public ObjectProperty valueColorProperty() { if (null == valueColor) { valueColor = new ObjectPropertyBase(_valueColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "valueColor"; } }; _valueColor = null; } return valueColor; } /** * Returns the color that will be used to colorize the threshold * indicator of the gauge. * * @return the color that will be used to colorize the threshold indicator */ public Color getThresholdColor() { return null == thresholdColor ? _thresholdColor : thresholdColor.get(); } /** * Defines the color that will be used to colorize the threshold * indicator of the gauge. * * @param COLOR */ public void setThresholdColor(final Color COLOR) { if (null == thresholdColor) { _thresholdColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { thresholdColor.set(COLOR); } } public ObjectProperty thresholdColorProperty() { if (null == thresholdColor) { thresholdColor = new ObjectPropertyBase(_thresholdColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "thresholdColor"; } }; _thresholdColor = null; } return thresholdColor; } /** * Returns the color that will be used to colorize the average * indicator of the gauge. * * @return the color that will be used to colorize the average indicator */ public Color getAverageColor() { return null == averageColor ? _averageColor : averageColor.get(); } /** * Defines the color that will be used to colorize the average * indicator of the gauge. * * @param COLOR */ public void setAverageColor(final Color COLOR) { if (null == averageColor) { _averageColor = COLOR; fireUpdateEvent(REDRAW_EVENT); } else { averageColor.set(COLOR); } } public ObjectProperty averageColorProperty() { if (null == averageColor) { averageColor = new ObjectPropertyBase(_averageColor) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "averageColor"; } }; _averageColor = null; } return averageColor; } /** * Returns true if the value of the gauge should be checked against * all sections (if sections not empty). If a value enters a section * or leaves a section it will fire an event. The check will be performed * after the animation is finished (if animated == true). * * @return true if the value of the gauge should be checked against all sections */ public boolean getCheckSectionsForValue() { return null == checkSectionsForValue ? _checkSectionsForValue : checkSectionsForValue.get(); } /** * Defines if the value of the gauge should be checked against * all sections (if sections not empty). If a value enters a section * or leaves a section it will fire an event. The check will be performed * after the animation is finished (if animated == true). * * @param CHECK */ public void setCheckSectionsForValue(final boolean CHECK) { if (null == checkSectionsForValue) { _checkSectionsForValue = CHECK; } else { checkSectionsForValue.set(CHECK); } } public BooleanProperty checkSectionsForValueProperty() { if (null == checkSectionsForValue) { checkSectionsForValue = new SimpleBooleanProperty(Gauge.this, "checkSectionsForValue", _checkSectionsForValue); } return checkSectionsForValue; } /** * Returns true if the value of the gauge should be checked against * all areas (if areas not empty). If a value enters an area * or leaves an area it will fire an event. The check will be performed * after the animation is finished (if animated == true). * * @return true if the the value of the gauge should be checked against all areas */ public boolean getCheckAreasForValue() { return null == checkAreasForValue ? _checkAreasForValue : checkAreasForValue.get(); } /** * Defines if the value of the gauge should be checked against * all areas (if areas not empty). If a value enters an area * or leaves an area it will fire an event. The check will be performed * after the animation is finished (if animated == true). * * @param CHECK */ public void setCheckAreasForValue(final boolean CHECK) { if (null == checkAreasForValue) { _checkAreasForValue = CHECK; } else { checkAreasForValue.set(CHECK); } } public BooleanProperty checkAreasForValueProperty() { if (null == checkAreasForValue) { checkAreasForValue = new SimpleBooleanProperty(Gauge.this, "checkAreasForValue", _checkAreasForValue); } return checkAreasForValue; } /** * Returns true if the value of the gauge should be checked against * the threshold. If a value crosses the threshold it will fire an * event (EXCEEDED and UNDERRUN. The check will be performed * after the animation is finished (if animated == true). * * @return true if the value of the gauge should be checked against the threshold */ public boolean isCheckThreshold() { return null == checkThreshold ? _checkThreshold : checkThreshold.get(); } /** * Defines if the value of the gauge should be checked against * the threshold. If a value crosses the threshold it will fire an * event (EXCEEDED and UNDERRUN. The check will be performed * after the animation is finished (if animated == true). * * @param CHECK */ public void setCheckThreshold(final boolean CHECK) { if (null == checkThreshold) { _checkThreshold = CHECK; } else { checkThreshold.set(CHECK); } } public BooleanProperty checkThresholdProperty() { if (null == checkThreshold) { checkThreshold = new SimpleBooleanProperty(Gauge.this, "checkThreshold", _checkThreshold); } return checkThreshold; } /** * Returns true if an inner shadow should be drawn on the gauge * background. * * @return true if an inner shadow should be drawn on the gauge background */ public boolean isInnerShadowEnabled() { return null == innerShadowEnabled ? _innerShadowEnabled : innerShadowEnabled.get(); } /** * Defines if an inner shadow should be drawn on the gauge * background. * * @param ENABLED */ public void setInnerShadowEnabled(final boolean ENABLED) { if (null == innerShadowEnabled) { _innerShadowEnabled = ENABLED; fireUpdateEvent(REDRAW_EVENT); } else { innerShadowEnabled.set(ENABLED); } } public BooleanProperty innerShadowEnabledProperty() { if (null == innerShadowEnabled) { innerShadowEnabled = new BooleanPropertyBase(_innerShadowEnabled) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "innerShadowEnabled"; } }; } return innerShadowEnabled; } /** * Returns true if the threshold indicator should be drawn. * * @return true if the threshold indicator should be drawn */ public boolean isThresholdVisible() { return null == thresholdVisible ? _thresholdVisible : thresholdVisible.get(); } /** * Defines if the threshold indicator should be drawn * * @param VISIBLE */ public void setThresholdVisible(final boolean VISIBLE) { if (null == thresholdVisible) { _thresholdVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { thresholdVisible.set(VISIBLE); } } public BooleanProperty thresholdVisibleProperty() { if (null == thresholdVisible) { thresholdVisible = new BooleanPropertyBase(_thresholdVisible) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "thresholdVisible"; } }; } return thresholdVisible; } /** * Returns true if the average indicator should be drawn. * * @return true if the average indicator should be drawn */ public boolean isAverageVisible() { return null == averageVisible ? _averageVisible : averageVisible.get(); } /** * Defines if the average indicator should be drawn * * @param VISIBLE */ public void setAverageVisible(final boolean VISIBLE) { if (null == averageVisible) { _averageVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { averageVisible.set(VISIBLE); } } public BooleanProperty averageVisibleProperty() { if (null == averageVisible) { averageVisible = new BooleanPropertyBase() { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "averageVisible"; } }; } return averageVisible; } /** * Returns true if the sections will be drawn * * @return true if the sections will be drawn */ public boolean getSectionsVisible() { return null == sectionsVisible ? _sectionsVisible : sectionsVisible.get(); } /** * Defines if the sections will be drawn * * @param VISIBLE */ public void setSectionsVisible(final boolean VISIBLE) { if (null == sectionsVisible) { _sectionsVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { sectionsVisible.set(VISIBLE); } } public BooleanProperty sectionsVisibleProperty() { if (null == sectionsVisible) { sectionsVisible = new BooleanPropertyBase(_sectionsVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "sectionsVisible"; } }; } return sectionsVisible; } /** * Returns true if the sections in the IndicatorSkin * will always be visible * @return */ public boolean getSectionsAlwaysVisible() { return null == sectionsAlwaysVisible ? _sectionsAlwaysVisible : sectionsAlwaysVisible.get(); } /** * Defines if the sections will always be visible. * This is currently only used in the IndicatorSkin * @param VISIBLE */ public void setSectionsAlwaysVisible(final boolean VISIBLE) { if (null == sectionsAlwaysVisible) { _sectionsAlwaysVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { sectionsAlwaysVisible.set(VISIBLE); } } public BooleanProperty sectionsAlwaysVisibleProperty() { if (null == sectionsAlwaysVisible) { sectionsAlwaysVisible = new BooleanPropertyBase(_sectionsAlwaysVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "sectionsAlwaysVisible"; } }; } return sectionsAlwaysVisible; } /** * Returns true if the text of the sections should be drawn inside * the sections. This is currently only used in the SimpleSkin. * * @return true if the text of the sections should be drawn */ public boolean isSectionTextVisible() { return null == sectionTextVisible ? _sectionTextVisible : sectionTextVisible.get(); } /** * Defines if the text of the sections should be drawn inside * the sections. This is currently only used in the SimpleSkin. * * @param VISIBLE */ public void setSectionTextVisible(final boolean VISIBLE) { if (null == sectionTextVisible) { _sectionTextVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { sectionTextVisible.set(VISIBLE); } } public BooleanProperty sectionTextVisibleProperty() { if (null == sectionTextVisible) { sectionTextVisible = new BooleanPropertyBase(_sectionTextVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "sectionTextVisible"; } }; } return sectionTextVisible; } /** * Returns true if the icon of the sections should be drawn inside * the sections. This is currently only used in the SimpleSkin. * * @return true if the icon of the sections should be drawn */ public boolean getSectionIconsVisible() { return null == sectionIconsVisible ? _sectionIconsVisible : sectionIconsVisible.get(); } /** * Defines if the icon of the sections should be drawn inside * the sections. This is currently only used in the SimpleSkin. * * @param VISIBLE */ public void setSectionIconsVisible(final boolean VISIBLE) { if (null == sectionIconsVisible) { _sectionIconsVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { sectionIconsVisible.set(VISIBLE); } } public BooleanProperty sectionIconsVisibleProperty() { if (null == sectionIconsVisible) { sectionIconsVisible = new BooleanPropertyBase(_sectionIconsVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "sectionIconsVisible"; } }; } return sectionIconsVisible; } /** * Returns true if sections should be highlighted in case they * contain the current value. * * @return true if sections should be highlighted */ public boolean isHighlightSections() { return null == highlightSections ? _highlightSections : highlightSections.get(); } /** * Defines if sections should be highlighted in case they * contain the current value * * @param HIGHLIGHT */ public void setHighlightSections(final boolean HIGHLIGHT) { if (null == highlightSections) { _highlightSections = HIGHLIGHT; fireUpdateEvent(REDRAW_EVENT); } else { highlightSections.set(HIGHLIGHT); } } public BooleanProperty highlightSectionsProperty() { if (null == highlightSections) { highlightSections = new BooleanPropertyBase(_highlightSections) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "highlightSections"; } }; } return highlightSections; } /** * Returns true if the areas should be drawn * * @return true if the areas should be drawn */ public boolean getAreasVisible() { return null == areasVisible ? _areasVisible : areasVisible.get(); } /** * Defines if the areas should be drawn * * @param VISIBLE */ public void setAreasVisible(final boolean VISIBLE) { if (null == areasVisible) { _areasVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { areasVisible.set(VISIBLE); } } public BooleanProperty areasVisibleProperty() { if (null == areasVisible) { areasVisible = new BooleanPropertyBase(_areasVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "areasVisible"; } }; } return areasVisible; } /** * Returns true if the text of the areas should be drawn inside * the areas. This is currently only used in the SimpleSkin. * * @return true if the text of the areas should be drawn */ public boolean isAreaTextVisible() { return null == areaTextVisible ? _areaTextVisible : areaTextVisible.get(); } /** * Defines if the text of the areas should be drawn inside * the areas. * * @param VISIBLE */ public void setAreaTextVisible(final boolean VISIBLE) { if (null == areaTextVisible) { _areaTextVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { areaTextVisible.set(VISIBLE); } } public BooleanProperty areaTextVisibleProperty() { if (null == areaTextVisible) { areaTextVisible = new BooleanPropertyBase(_areaTextVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "areaTextVisible"; } }; } return areaTextVisible; } /** * Returns true if the icon of the areas should be drawn inside * the areas. * * @return true if the icon of the areas should be drawn */ public boolean getAreaIconsVisible() { return null == areaIconsVisible ? _areaIconsVisible : areaIconsVisible.get(); } /** * Defines if the icon of the areas should be drawn inside * the areas. * * @param VISIBLE */ public void setAreaIconsVisible(final boolean VISIBLE) { if (null == areaIconsVisible) { _areaIconsVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { areaIconsVisible.set(VISIBLE); } } public BooleanProperty areaIconsVisibleProperty() { if (null == areaIconsVisible) { areaIconsVisible = new BooleanPropertyBase(_areaIconsVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "areaIconsVisible"; } }; } return areaIconsVisible; } /** * Returns true if areas should be highlighted in case they * contain the current value. * * @return true if areas should be highlighted */ public boolean isHighlightAreas() { return null == highlightAreas ? _highlightAreas : highlightAreas.get(); } /** * Defines if areas should be highlighted in case they * contain the current value * * @param HIGHLIGHT */ public void setHighlightAreas(final boolean HIGHLIGHT) { if (null == highlightAreas) { _highlightAreas = HIGHLIGHT; fireUpdateEvent(REDRAW_EVENT); } else { highlightAreas.set(HIGHLIGHT); } } public BooleanProperty highlightAreasProperty() { if (null == highlightAreas) { highlightAreas = new BooleanPropertyBase(_highlightAreas) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "highlightAreas"; } }; } return highlightAreas; } /** * Returns true if the tickmark sections should be used to * colorize the tickmarks. * * @return true if the tickmark sections should be used */ public boolean getTickMarkSectionsVisible() { return null == tickMarkSectionsVisible ? _tickMarkSectionsVisible : tickMarkSectionsVisible.get(); } /** * Defines if the tickmark sections should be used to * colorize the tickmarks. * * @param VISIBLE */ public void setTickMarkSectionsVisible(final boolean VISIBLE) { if (null == tickMarkSectionsVisible) { _tickMarkSectionsVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { tickMarkSectionsVisible.set(VISIBLE); } } public BooleanProperty tickMarkSectionsVisibleProperty() { if (null == tickMarkSectionsVisible) { tickMarkSectionsVisible = new BooleanPropertyBase(_tickMarkSectionsVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "tickMarkSectionsVisible"; } }; } return tickMarkSectionsVisible; } /** * Returns true if the ticklabel sections should be used * to colorize the ticklabels. * * @return true if the ticklabel sections should be used */ public boolean getTickLabelSectionsVisible() { return null == tickLabelSectionsVisible ? _tickLabelSectionsVisible : tickLabelSectionsVisible.get(); } /** * Defines if the ticklabel sections should be used to * colorize the ticklabels. * * @param VISIBLE */ public void setTickLabelSectionsVisible(final boolean VISIBLE) { if (null == tickLabelSectionsVisible) { _tickLabelSectionsVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { tickLabelSectionsVisible.set(VISIBLE); } } public BooleanProperty tickLabelSectionsVisibleProperty() { if (null == tickLabelSectionsVisible) { tickLabelSectionsVisible = new BooleanPropertyBase(_tickLabelSectionsVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "tickLabelSectionsVisible"; } }; } return tickLabelSectionsVisible; } /** * Returns true if the markers should be drawn * * @return true if the markser should be drawn */ public boolean getMarkersVisible() { return null == markersVisible ? _markersVisible : markersVisible.get(); } /** * Defines if the markers should be drawn * * @param VISIBLE */ public void setMarkersVisible(final boolean VISIBLE) { if (null == markersVisible) { _markersVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { markersVisible.set(VISIBLE); } } public BooleanProperty markersVisibleProperty() { if (null == markersVisible) { markersVisible = new BooleanPropertyBase(_markersVisible) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "markersVisible"; } }; } return markersVisible; } /** * Returns true if the ticklabels should be drawn * * @return true if the ticklabels should be drawn */ public boolean getTickLabelsVisible() { return null == tickLabelsVisible ? _tickLabelsVisible : tickLabelsVisible.get(); } /** * Defines if the ticklabels should be drawn * * @param VISIBLE */ public void setTickLabelsVisible(final boolean VISIBLE) { if (null == tickLabelsVisible) { _tickLabelsVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { tickLabelsVisible.set(VISIBLE); } } public BooleanProperty tickLabelsVisibleProperty() { if (null == tickLabelsVisible) { tickLabelsVisible = new BooleanPropertyBase(_tickLabelsVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "tickLabelsVisible"; } }; } return tickLabelsVisible; } /** * Returns true if only the first and the last ticklabel * will be drawn. Sometimes this could be useful if a gauge * should for example only should show 0 and 1000. * * @return true if only the first and last ticklabel will be drawn */ public boolean isOnlyFirstAndLastTickLabelVisible() { return null == onlyFirstAndLastTickLabelVisible ? _onlyFirstAndLastTickLabelVisible : onlyFirstAndLastTickLabelVisible.get(); } /** * Defines if only the first and the last ticklabel * will be drawn. Sometimes this could be useful if a gauge * should for example only should show 0 and 1000. * * @param VISIBLE */ public void setOnlyFirstAndLastTickLabelVisible(final boolean VISIBLE) { if (null == onlyFirstAndLastTickLabelVisible) { _onlyFirstAndLastTickLabelVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { onlyFirstAndLastTickLabelVisible.set(VISIBLE); } } public BooleanProperty onlyFirstAndLastTickLabelVisibleProperty() { if (null == onlyFirstAndLastTickLabelVisible) { onlyFirstAndLastTickLabelVisible = new BooleanPropertyBase(_onlyFirstAndLastTickLabelVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "onlyFirstAndLastTickLabelVisible"; } }; } return onlyFirstAndLastTickLabelVisible; } /** * Returns true if the major tickmarks should be drawn * If set to false and minorTickmarks == true, a minor tickmark * will be drawn instead of the major tickmark. * * @return true if the major tickmarks should be drawn */ public boolean getMajorTickMarksVisible() { return null == majorTickMarksVisible ? _majorTickMarksVisible : majorTickMarksVisible.get(); } /** * Defines if the major tickmarks should be drawn * If set to false and minorTickmarks == true, a minor tickmark * will be drawn instead of the major tickmark. * * @param VISIBLE */ public void setMajorTickMarksVisible(final boolean VISIBLE) { if (null == majorTickMarksVisible) { _majorTickMarksVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { majorTickMarksVisible.set(VISIBLE); } } public BooleanProperty majorTickMarksVisibleProperty() { if (null == majorTickMarksVisible) { majorTickMarksVisible = new BooleanPropertyBase(_majorTickMarksVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "majorTickMarksVisible"; } }; } return majorTickMarksVisible; } /** * Returns true if the medium tickmarks should be drawn * If set to false and minorTickmarks == true, a minor tickmark * will be drawn instead of the medium tickmark. * * @return true if the medium tickmarks should be drawn */ public boolean getMediumTickMarksVisible() { return null == mediumTickMarksVisible ? _mediumTickMarksVisible : mediumTickMarksVisible.get(); } public void setMediumTickMarksVisible(final boolean VISIBLE) { if (null == mediumTickMarksVisible) { _mediumTickMarksVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { mediumTickMarksVisible.set(VISIBLE); } } public BooleanProperty mediumTickMarksVisibleProperty() { if (null == mediumTickMarksVisible) { mediumTickMarksVisible = new BooleanPropertyBase(_mediumTickMarksVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "mediumTickMarksVisible"; } }; } return mediumTickMarksVisible; } /** * Returns true if the minor tickmarks should be drawn * * @return true if the minor tickmarks should be drawn */ public boolean getMinorTickMarksVisible() { return null == minorTickMarksVisible ? _minorTickMarksVisible : minorTickMarksVisible.get(); } /** * Defines if the minor tickmarks should be drawn * * @param VISIBLE */ public void setMinorTickMarksVisible(final boolean VISIBLE) { if (null == minorTickMarksVisible) { _minorTickMarksVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { minorTickMarksVisible.set(VISIBLE); } } public BooleanProperty minorTickMarksVisibleProperty() { if (null == minorTickMarksVisible) { minorTickMarksVisible = new BooleanPropertyBase(_minorTickMarksVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "minorTickMarksVisible"; } }; } return minorTickMarksVisible; } /** * Returns true when an additional ring will be drawn that "connects" the * tick marks. * * @return true when an additional ring will be drawn that "connects" the tick marks */ public boolean isTickMarkRingVisible() { return null == tickMarkRingVisible ? _tickMarkRingVisible : tickMarkRingVisible.get(); } /** * Defines if an additional ring should be drawn that "connects" the tick marks. * * @param VISIBLE */ public void setTickMarkRingVisible(final boolean VISIBLE) { if (null == tickMarkRingVisible) { _tickMarkRingVisible = VISIBLE; fireUpdateEvent(REDRAW_EVENT); } else { tickMarkRingVisible.set(VISIBLE); } } public BooleanProperty tickMarkRingVisibleProperty() { if (null == tickMarkRingVisible) { tickMarkRingVisible = new BooleanPropertyBase(_tickMarkRingVisible) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "tickMarkRingVisible"; } }; } return tickMarkRingVisible; } /** * Returns the value that represents the space between major * tickmarks. This value will be automatically set by the * autoscale property. Be careful when changing it manually. * * @return the value that represents the space between major tickmarks */ public double getMajorTickSpace() { return null == majorTickSpace ? _majorTickSpace : majorTickSpace.get(); } /** * Defines the value that represents the space between major * tickmarks. This value will be automatically set by the * autoscale property. Be careful when changing it manually. * * @param SPACE */ public void setMajorTickSpace(final double SPACE) { if (null == majorTickSpace) { _majorTickSpace = SPACE; fireUpdateEvent(RECALC_EVENT); } else { majorTickSpace.set(SPACE); } } public DoubleProperty majorTickSpaceProperty() { if (null == majorTickSpace) { majorTickSpace = new DoublePropertyBase(_majorTickSpace) { @Override protected void invalidated() { fireUpdateEvent(RECALC_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "majorTickSpace"; } }; } return majorTickSpace; } /** * Returns the value that represents the space between minor * tickmarks. This value will be automatically set by the * autoscale property. Be careful when changing it manually. * * @return the value that represents the space between minor tickmarks */ public double getMinorTickSpace() { return null == minorTickSpace ? _minorTickSpace : minorTickSpace.get(); } /** * Defines the value that represents the space between major * tickmarks. This value will be automatically set by the * autoscale property. Be careful when changing it manually. * * @param SPACE */ public void setMinorTickSpace(final double SPACE) { if (null == minorTickSpace) { _minorTickSpace = SPACE; fireUpdateEvent(RECALC_EVENT); } else { minorTickSpace.set(SPACE); } } public DoubleProperty minorTickSpaceProperty() { if (null == minorTickSpace) { minorTickSpace = new DoublePropertyBase(_minorTickSpace) { @Override protected void invalidated() { fireUpdateEvent(RECALC_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "minorTickSpace"; } }; } return minorTickSpace; } /** * Returns true if the LCD display is visible (if available) * The LCD display won't be visible if valueVisible == false. * * @return true if the LCD display is visible */ public boolean isLcdVisible() { return null == lcdVisible ? _lcdVisible : lcdVisible.get(); } /** * Defines if the LCD display is visible (if available) * The LCD display won't be visible if valueVisible == false. * * @param VISIBLE */ public void setLcdVisible(final boolean VISIBLE) { if (null == lcdVisible) { _lcdVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { lcdVisible.set(VISIBLE); } } public BooleanProperty lcdVisibleProperty() { if (null == lcdVisible) { lcdVisible = new BooleanPropertyBase(_lcdVisible) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "lcdVisible"; } }; } return lcdVisible; } /** * Returns true if the crystal effect of the LCD display will be drawn. * This feature could decrease the performance if you run it on * embedded devices because it will calculate a bitmap image where * each pixel will be calculated. * * @return true if the crystal effect of the LCD display will be drawn */ public boolean isLcdCrystalEnabled() { return null == lcdCrystalEnabled ? _lcdCrystalEnabled : lcdCrystalEnabled.get(); } /** * Defines if the crystal effect of the LCD display will be drawn. * This feature could decrease the performance if you run it on * embedded devices because it will calculate a bitmap image where * each pixel will be calculated. * * @param ENABLED */ public void setLcdCrystalEnabled(final boolean ENABLED) { if (null == lcdCrystalEnabled) { _lcdCrystalEnabled = ENABLED; fireUpdateEvent(VISIBILITY_EVENT); } else { lcdCrystalEnabled.set(ENABLED); } } public BooleanProperty lcdCrystalEnabledProperty() { if (null == lcdCrystalEnabled) { lcdCrystalEnabled = new BooleanPropertyBase(_lcdCrystalEnabled) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "lcdCrystalEnabled"; } }; } return lcdCrystalEnabled; } /** * Returns true if the LED will be drawn (if available) * * @return true if the LED will be drawn */ public boolean isLedVisible() { return null == ledVisible ? _ledVisible : ledVisible.get(); } /** * Defines if the LED will be drawn (if available) * * @param VISIBLE */ public void setLedVisible(final boolean VISIBLE) { if (null == ledVisible) { _ledVisible = VISIBLE; fireUpdateEvent(VISIBILITY_EVENT); } else { ledVisible.set(VISIBLE); } } public BooleanProperty ledVisibleProperty() { if (null == ledVisible) { ledVisible = new BooleanPropertyBase(_ledVisible) { @Override protected void invalidated() { fireUpdateEvent(VISIBILITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "ledVisible"; } }; } return ledVisible; } /** * Returns true if the LED is on (if available) * * @return true if the LED is on */ public boolean isLedOn() { return null == ledOn ? _ledOn : ledOn.get(); } /** * Defines if the LED is on (if available) * * @param ON */ public void setLedOn(final boolean ON) { if (null == ledOn) { _ledOn = ON; fireUpdateEvent(LED_EVENT); } else { ledOn.set(ON); } } public BooleanProperty ledOnProperty() { if (null == ledOn) { ledOn = new BooleanPropertyBase(_ledOn) { @Override protected void invalidated() { fireUpdateEvent(LED_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "ledOn"; } }; } return ledOn; } /** * Returns true if the LED is blinking (if available) * * @return true if the LED is blinking */ public boolean isLedBlinking() { return null == ledBlinking ? _ledBlinking : ledBlinking.get(); } /** * Defines if the LED is blinking (if available) * * @param BLINKING */ public void setLedBlinking(final boolean BLINKING) { if (null == ledBlinking) { _ledBlinking = BLINKING; if (_ledBlinking) { startBlinkExecutorService(); } else { if (null != blinkFuture) blinkFuture.cancel(true); setLedOn(false); } } else { ledBlinking.set(BLINKING); } } public BooleanProperty ledBlinkingProperty() { if (null == ledBlinking) { ledBlinking = new BooleanPropertyBase(_ledBlinking) { @Override protected void invalidated() { if (get()) { startBlinkExecutorService(); } else { if (null != blinkFuture) blinkFuture.cancel(true); setLedOn(false); } } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "ledBlinking"; } }; } return ledBlinking; } /** * Returns the orientation of the control. This feature * will only be used in the BulletChartSkin and LinearSkin. * Values are HORIZONTAL and VERTICAL * * @return the orientation of the control */ public Orientation getOrientation() { return null == orientation ? _orientation : orientation.get(); } /** * Defines the orientation of the control. This feature * will only be used in the BulletChartSkin and LinearSkin. * Values are HORIZONTAL and VERTICAL * * @param ORIENTATION */ public void setOrientation(final Orientation ORIENTATION) { if (null == orientation) { _orientation = ORIENTATION; fireUpdateEvent(RESIZE_EVENT); } else { orientation.set(ORIENTATION); } } public ObjectProperty orientationProperty() { if (null == orientation) { orientation = new ObjectPropertyBase(_orientation) { @Override protected void invalidated() { fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "orientation"; } }; _orientation = null; } return orientation; } /** * Returns true if the gradient defined by the gradient lookup * will be used to visualize the bar (if available). * * @return true if the gradient defined by the gradient lookup will be used to visualize the bar */ public boolean isGradientBarEnabled() { return null == gradientBarEnabled ? _gradientBarEnabled : gradientBarEnabled.get(); } /** * Defines if the gradient defined by the gradient lookup * will be used to visualize the bar (if available). * * @param ENABLED */ public void setGradientBarEnabled(final boolean ENABLED) { if (null == gradientBarEnabled) { _gradientBarEnabled = ENABLED; fireUpdateEvent(REDRAW_EVENT); } else { gradientBarEnabled.set(ENABLED); } } public BooleanProperty gradientBarEnabledProperty() { if (null == gradientBarEnabled) { gradientBarEnabled = new BooleanPropertyBase(_gradientBarEnabled) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "gradientBarEnabled"; } }; } return gradientBarEnabled; } /** * Returns the GradientLookup that is used to colorize the bar * of the gauge (if avaiable) * * @return the GradientLookup that is used to colorize the bar */ public GradientLookup getGradientLookup() { if (null == gradientLookup) { gradientLookup = new GradientLookup(); } return gradientLookup; } /** * Defines the GradientLookup that is used to colorize the bar * of the gauge (if avaiable) * * @param GRADIENT_LOOKUP */ public void setGradientLookup(final GradientLookup GRADIENT_LOOKUP) { gradientLookup = GRADIENT_LOOKUP; fireUpdateEvent(REDRAW_EVENT); } /** * Returns a list of Stops that will be used to calculate the gradient * in the GradientLookup. * * @return a list of Stops that will be used to calculate the gradient in the GradientLookup */ public List getGradientBarStops() { return getGradientLookup().getStops(); } /** * Defines a list of Stops that will be used to calculate the gradient * in the GradientLookup. * * @param STOPS */ public void setGradientBarStops(final Stop... STOPS) { setGradientBarStops(Arrays.asList(STOPS)); } /** * Defines a list of Stops that will be used to calculate the gradient * in the GradientLookup. * * @param STOPS */ public void setGradientBarStops(final List STOPS) { getGradientLookup().setStops(STOPS); fireUpdateEvent(REDRAW_EVENT); } /** * Returns true if custom tick labels should be used instead of the * automatically calculated ones. This could be useful for gauges * like a compass where you need "N", "E", "S" and "W" instead of * numbers. * * @return true if custom tick labels should be used */ public boolean getCustomTickLabelsEnabled() { return null == customTickLabelsEnabled ? _customTickLabelsEnabled : customTickLabelsEnabled.get(); } /** * Defines if custom tick labels should be used instead of the * automatically calculated ones. This could be useful for gauges * like a compass where you need "N", "E", "S" and "W" instead of * numbers. * * @param ENABLED */ public void setCustomTickLabelsEnabled(final boolean ENABLED) { if (null == customTickLabelsEnabled) { _customTickLabelsEnabled = ENABLED; fireUpdateEvent(REDRAW_EVENT); } else { customTickLabelsEnabled.set(ENABLED); } } public BooleanProperty customTickLabelsEnabledProperty() { if (null == customTickLabelsEnabled) { customTickLabelsEnabled = new BooleanPropertyBase(_customTickLabelsEnabled) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "customTickLabelsEnabled"; } }; } return customTickLabelsEnabled; } /** * Returns true if custom font size for tick labels and/or custom tick labels will be used. * @return true if custom font size for tick labels and/or custom tick labels will be used */ public boolean getCustomTickLabelFontSizeEnabled() { return null == customTickLabelFontSizeEnabled ? _customTickLabelFontSizeEnabled : customTickLabelFontSizeEnabled.get(); } /** * Defines if custom font size for tick labels and/or custom tick labels should be used. * @param ENABLED */ public void setCustomTickLabelFontSizeEnabled(final boolean ENABLED) { if (null == customTickLabelFontSizeEnabled) { _customTickLabelFontSizeEnabled = ENABLED; fireUpdateEvent(REDRAW_EVENT); } else { customTickLabelFontSizeEnabled.set(ENABLED); } } public BooleanProperty customTickLabelFontSizeEnabledProperty() { if (null == customTickLabelFontSizeEnabled) { customTickLabelFontSizeEnabled = new BooleanPropertyBase(_customTickLabelFontSizeEnabled) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "customTickLabelFontSizeEnabled"; } }; } return customTickLabelFontSizeEnabled; } /** * Returns a list of Strings that represent the ticklabels that * will be used for the scale. * * @return a list of Strings that represent the ticklabels */ public List getCustomTickLabels() { return customTickLabels; } /** * Defines a list of Strings that represent the ticklabels that * will be used for the scale. * * @param TICK_LABELS */ public void setCustomTickLabels(final List TICK_LABELS) { customTickLabels.setAll(TICK_LABELS); fireUpdateEvent(REDRAW_EVENT); } /** * Defines a list of Strings that represent the ticklabels that * will be used for the scale. * * @param TICK_LABELS */ public void setCustomTickLabels(final String... TICK_LABELS) { setCustomTickLabels(Arrays.asList(TICK_LABELS)); } /** * Adds the given String to the list of custom ticklabels * * @param TICK_LABEL */ public void addCustomTickLabel(final String TICK_LABEL) { if (null == TICK_LABEL) return; if (!customTickLabels.contains(TICK_LABEL)) customTickLabels.add(TICK_LABEL); fireUpdateEvent(REDRAW_EVENT); } /** * Removes the given String from the list of custom ticklabels * * @param TICK_LABEL */ public void removeCustomTickLabel(final String TICK_LABEL) { if (null == TICK_LABEL) return; if (customTickLabels.contains(TICK_LABEL)) customTickLabels.remove(TICK_LABEL); fireUpdateEvent(REDRAW_EVENT); } /** * Clears the list of custom ticklabels */ public void clearCustomTickLabels() { customTickLabels.clear(); fireUpdateEvent(REDRAW_EVENT); } /** * Returns the custom font size. The default font size is 18px at * a size of 250px. This value will be used to calculate the current * font size for the ticklabels when scaling. * * @return the custom font size */ public double getCustomTickLabelFontSize() { return null == customTickLabelFontSize ? _customTickLabelFontSize : customTickLabelFontSize.get(); } /** * Defines the custom font size. The default font size is 18px at * a size of 250px. This value will be used to calculate the current * font size for the ticklabels when scaling. * * @param SIZE */ public void setCustomTickLabelFontSize(final double SIZE) { if (null == customTickLabelFontSize) { _customTickLabelFontSize = Helper.clamp(0.0, 72.0, SIZE); fireUpdateEvent(REDRAW_EVENT); } else { customTickLabelFontSize.set(SIZE); } } public DoubleProperty customTickLabelFontSizeProperty() { if (null == customTickLabelFontSize) { customTickLabelFontSize = new DoublePropertyBase(_customTickLabelFontSize) { @Override protected void invalidated() { final double SIZE = get(); if (SIZE < 0 || SIZE > 72) set(Helper.clamp(0.0, 72.0, SIZE)); fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "customTickLabelFontSize";} }; } return customTickLabelFontSize; } /** * Returns true if the gauge is in interactive mode. This is currently * implemented in the radial gauges that have a knob. If interactive == true * the knob can be pressed to trigger something. * * @return true if the gauge is in interactive mode */ public boolean isInteractive() { return null == interactive ? _interactive : interactive.get(); } /** * Defines if the gauge is in interactive mode. This is currently * implemented in the radial gauges that have a knob. If interactive == true * the knob can be pressed to trigger something. * * @param INTERACTIVE */ public void setInteractive(final boolean INTERACTIVE) { if (null == interactive) { _interactive = INTERACTIVE; fireUpdateEvent(INTERACTIVITY_EVENT); } else { interactive.set(INTERACTIVE); } } public BooleanProperty interactiveProperty() { if (null == interactive) { interactive = new BooleanPropertyBase(_interactive) { @Override protected void invalidated() { fireUpdateEvent(INTERACTIVITY_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "interactive"; } }; } return interactive; } /** * Returns the text that will be shown in the button tooltip. The * knob in the radial gauges acts as button if interactive == true. * * @return the text that will be shown in the button tooltip */ public String getButtonTooltipText() { return null == buttonTooltipText ? _buttonTooltipText : buttonTooltipText.get(); } /** * Defines the text that will be shown in the button tooltip. The * knob in the radial gauges acts as button if interactive == true. * * @param TEXT */ public void setButtonTooltipText(final String TEXT) { if (null == buttonTooltipText) { _buttonTooltipText = TEXT; fireUpdateEvent(REDRAW_EVENT); } else { buttonTooltipText.set(TEXT); } } public StringProperty buttonTooltipTextProperty() { if (null == buttonTooltipText) { buttonTooltipText = new StringPropertyBase(_buttonTooltipText) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "buttonTooltipText"; } }; _buttonTooltipText = null; } return buttonTooltipText; } /** * Returns true if the control should keep it's aspect. This is * in principle only needed if the control has different width and * height. * * @return true if the control should keep it's aspect */ public boolean isKeepAspect() { return null == keepAspect ? _keepAspect : keepAspect.get(); } /** * Defines if the control should keep it's aspect. This is * in principle only needed if the control has different width and * height. * * @param KEEP */ public void setKeepAspect(final boolean KEEP) { if (null == keepAspect) { _keepAspect = KEEP; } else { keepAspect.set(KEEP); } } public BooleanProperty keepAspectProperty() { if (null == keepAspect) { keepAspect = new SimpleBooleanProperty(Gauge.this, "keepAspect", _keepAspect); } return keepAspect; } /** * Returns true if the control uses the given customFont to * render all text elements. * @return true if the control uses the given customFont */ public boolean isCustomFontEnabled() { return null == customFontEnabled ? _customFontEnabled : customFontEnabled.get(); } /** * Defines if the control should use the given customFont * to render all text elements * @param ENABLED */ public void setCustomFontEnabled(final boolean ENABLED) { if (null == customFontEnabled) { _customFontEnabled = ENABLED; fireUpdateEvent(RESIZE_EVENT); } else { customFontEnabled.set(ENABLED); } } public BooleanProperty customFontEnabledProperty() { if (null == customFontEnabled) { customFontEnabled = new BooleanPropertyBase(_customFontEnabled) { @Override protected void invalidated() { fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "customFontEnabled"; } }; } return customFontEnabled; } /** * Returns the given custom Font that can be used to render * all text elements. To enable the custom font one has to set * customFontEnabled = true * @return the given custom Font */ public Font getCustomFont() { return null == customFont ? _customFont : customFont.get(); } /** * Defines the custom font that can be used to render all * text elements. To enable the custom font one has to set * customFontEnabled = true * @param FONT */ public void setCustomFont(final Font FONT) { if (null == customFont) { _customFont = FONT; fireUpdateEvent(RESIZE_EVENT); } else { customFont.set(FONT); } } public ObjectProperty customFontProperty() { if (null == customFont) { customFont = new ObjectPropertyBase() { @Override protected void invalidated() { fireUpdateEvent(RESIZE_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "customFont"; } }; _customFont = null; } return customFont; } /** * Returns true if the alert property was set. * This property can be used to visualize an alert * situation in a skin. * @return true if the alert property was set */ public boolean isAlert() { return null == alert ? _alert : alert.get(); } /** * Defines if the alert property should be set. This * property can be used to visualize an alert situation * in the skin. * @param ALERT */ public void setAlert(final boolean ALERT) { if (null == alert) { _alert = ALERT; fireUpdateEvent(ALERT_EVENT); } else { alert.set(ALERT); } } public BooleanProperty alertProperty() { if (null == alert) { alert = new BooleanPropertyBase(_alert) { @Override protected void invalidated() { fireUpdateEvent(ALERT_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "alert"; } }; } return alert; } /** * Returns the alert message text that could be used in a tooltip * in case of an alert. * @return the alert message text */ public String getAlertMessage() { return null == alertMessage ? _alertMessage : alertMessage.get(); } /** * Defines the text that could be used in a tooltip as an * alert message. * @param MESSAGE */ public void setAlertMessage(final String MESSAGE) { if (null == alertMessage) { _alertMessage = MESSAGE; fireUpdateEvent(ALERT_EVENT); } else { alertMessage.set(MESSAGE); } } public StringProperty alertMessageProperty() { if (null == alertMessage) { alertMessage = new StringPropertyBase(_alertMessage) { @Override protected void invalidated() { fireUpdateEvent(ALERT_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "alertMessage"; } }; _alertMessage = null; } return alertMessage; } /** * Returns true when smoothing is enabled. This property is only used * in the TileSparklineSkin to smooth the path. In a custom skin it * could be also used for other things. * @return true when smoothing is enabled */ public boolean isSmoothing() { return null == smoothing ? _smoothing : smoothing.get(); } /** * Defines if the smoothing property should be enabled/disabled. * At the moment this is only used in the TileSparklineSkin. * @param SMOOTHING */ public void setSmoothing(final boolean SMOOTHING) { if (null == smoothing) { _smoothing = SMOOTHING; fireUpdateEvent(REDRAW_EVENT); } else { smoothing.set(SMOOTHING); } } public BooleanProperty smoothingProperty() { if (null == smoothing) { smoothing = new BooleanPropertyBase(_smoothing) { @Override protected void invalidated() { fireUpdateEvent(REDRAW_EVENT); } @Override public Object getBean() { return Gauge.this; } @Override public String getName() { return "smoothing"; } }; } return smoothing; } public String getFormatString() { return formatString; } private void updateFormatString() { StringBuilder formatBuilder = new StringBuilder("%.").append(getDecimals()).append("f"); String format = formatBuilder.toString(); int minLength = String.format(Locale.US, format, getMinValue()).length(); int maxLength = String.format(Locale.US, format, getMaxValue()).length(); int length = Math.max(minLength, maxLength); formatBuilder.setLength(0); //formatBuilder.append("%").append(length).append(".").append(getDecimals()).append("f"); formatBuilder.append("%").append(".").append(getDecimals()).append("f"); formatString = formatBuilder.toString(); fireUpdateEvent(RESIZE_EVENT); } /** * Calling this method will lead to a recalculation of the scale */ public void calcAutoScale() { double maxNoOfMajorTicks = 10; double maxNoOfMinorTicks = 10; double minValue = getMinValue(); double maxValue = getMaxValue(); double range = maxValue - minValue; double niceRange = (Helper.calcNiceNumber(range, false)); setMajorTickSpace(Helper.calcNiceNumber(niceRange / (maxNoOfMajorTicks - 1), true)); double niceMinValue = (Math.floor(minValue / getMajorTickSpace()) * getMajorTickSpace()); double niceMaxValue = (Math.ceil(maxValue / getMajorTickSpace()) * getMajorTickSpace()); setMinorTickSpace(Helper.calcNiceNumber(getMajorTickSpace() / (maxNoOfMinorTicks - 1), true)); setMinValue(niceMinValue); setMaxValue(niceMaxValue); } // ******************** Misc ********************************************** private synchronized void createBlinkTask() { blinkTask = new Callable() { @Override public Void call() throws Exception { try { Platform.runLater(() -> setLedOn(!isLedOn())); } finally { if (!Thread.currentThread().isInterrupted()) { // Schedule the same Callable with the current updateInterval blinkFuture = blinkService.schedule(this, LED_BLINK_INTERVAL, TimeUnit.MILLISECONDS); } } return null; } }; } private synchronized void startBlinkExecutorService() { if (null == blinkTask) { createBlinkTask(); } if (null == blinkService) { blinkService = new ScheduledThreadPoolExecutor(2, Helper.getThreadFactory("BlinkTask", true)); } blinkFuture = blinkService.schedule(blinkTask, LED_BLINK_INTERVAL, TimeUnit.MILLISECONDS); } /** * Calling this method will stop all threads. This is needed when using * JavaFX on mobile devices when the device goes to sleep mode. */ public void stop() { setLedOn(false); if (null != blinkFuture) { blinkFuture.cancel(true); } if (null != blinkService) { blinkService.shutdownNow(); } } private void createShutdownHook() { Runtime.getRuntime().addShutdownHook(new Thread(() -> stop())); } @Override public String toString() { return new StringBuilder("{") .append("\"title\":").append("\"").append(getTitle()).append("\",") .append("\"subTitle\":").append("\"").append(getTitle()).append("\",") .append("\"unit\":").append("\"").append(getUnit()).append("\",") .append("\"value\":").append(getValue()).append(",") .append("\"minValue\":").append(getMinValue()).append(",") .append("\"maxValue\":").append(getMaxValue()).append(",") .append("\"threshold\":").append(getThreshold()).append(",") .append("\"minMeasuredValue\":").append(getMinMeasuredValue()).append(",") .append("\"maxMeasuredValue\":").append(getMaxMeasuredValue()) .append("}").toString(); } private void setupBinding() { showing = Bindings.createBooleanBinding(() -> { if (getScene() != null && getScene().getWindow() != null) { if (getScene().getWindow().isShowing()) { while(updateEventQueue.peek() != null) { UpdateEvent event = updateEventQueue.poll(); for (UpdateEventListener listener : listenerList) { listener.onUpdateEvent(event); } } } return getScene().getWindow().isShowing(); } else { return false; } }, sceneProperty(), getScene().windowProperty(), getScene().getWindow().showingProperty()); showing.addListener((o, ov, nv) -> { if (nv) { while(updateEventQueue.peek() != null) { UpdateEvent event = updateEventQueue.poll(); for (UpdateEventListener listener : listenerList) { listener.onUpdateEvent(event); } } } }); } // ******************** Style related ************************************* @Override protected Skin createDefaultSkin() { switch (skinType) { case AMP : return new AmpSkin(Gauge.this); case PLAIN_AMP : return new PlainAmpSkin(Gauge.this); case BULLET_CHART : return new BulletChartSkin(Gauge.this); case DASHBOARD : return new DashboardSkin(Gauge.this); case FLAT : return new FlatSkin(Gauge.this); case INDICATOR : return new IndicatorSkin(Gauge.this); case KPI : return new KpiSkin(Gauge.this); case MODERN : return new ModernSkin(Gauge.this); case SIMPLE : return new SimpleSkin(Gauge.this); case SLIM : return new SlimSkin(Gauge.this); case SPACE_X : return new SpaceXSkin(Gauge.this); case QUARTER : return new QuarterSkin(Gauge.this); case HORIZONTAL : return new HSkin(Gauge.this); case VERTICAL : return new VSkin(Gauge.this); case LCD : return new LcdSkin(Gauge.this); case TINY : return new TinySkin(Gauge.this); case BATTERY : return new BatterySkin(Gauge.this); case LEVEL : return new LevelSkin(Gauge.this); case LINEAR : return new LinearSkin(Gauge.this); case DIGITAL : return new DigitalSkin(Gauge.this); case SIMPLE_DIGITAL : return new SimpleDigitalSkin(Gauge.this); case SECTION : return new SectionSkin(Gauge.this); case BAR : return new BarSkin(Gauge.this); case WHITE : return new WhiteSkin(Gauge.this); case CHARGE : return new ChargeSkin(Gauge.this); case SIMPLE_SECTION : return new SimpleSectionSkin(Gauge.this); case TILE_KPI : return new TileKpiSkin(Gauge.this); case TILE_TEXT_KPI : return new TileTextKpiSkin(Gauge.this); case TILE_SPARK_LINE: return new TileSparklineSkin(Gauge.this); case NASA : return new NasaSkin(Gauge.this); case GAUGE : default : return new GaugeSkin(Gauge.this); } } @Override public String getUserAgentStylesheet() { if (null == userAgentStyleSheet) { userAgentStyleSheet = getClass().getResource("gauge.css").toExternalForm(); } return userAgentStyleSheet; } public SkinType getSkinType() { return skinType; } public void setSkinType(final SkinType SKIN_TYPE) { skinType = SKIN_TYPE; presetGaugeParameters(skinType); switch (SKIN_TYPE) { case AMP : super.setSkin(new AmpSkin(Gauge.this)); break; case PLAIN_AMP : super.setSkin(new PlainAmpSkin(Gauge.this)); break; case BULLET_CHART : super.setSkin(new BulletChartSkin(Gauge.this)); break; case DASHBOARD : super.setSkin(new DashboardSkin(Gauge.this)); break; case FLAT : super.setSkin(new FlatSkin(Gauge.this)); break; case INDICATOR : super.setSkin(new IndicatorSkin(Gauge.this)); break; case KPI : super.setSkin(new KpiSkin(Gauge.this)); break; case MODERN : super.setSkin(new ModernSkin(Gauge.this)); break; case SIMPLE : super.setSkin(new SimpleSkin(Gauge.this)); break; case SLIM : super.setSkin(new SlimSkin(Gauge.this)); break; case SPACE_X : super.setSkin(new SpaceXSkin(Gauge.this)); break; case QUARTER : super.setSkin(new QuarterSkin(Gauge.this)); break; case HORIZONTAL : super.setSkin(new HSkin(Gauge.this)); break; case VERTICAL : super.setSkin(new VSkin(Gauge.this)); break; case LCD : super.setSkin(new LcdSkin(Gauge.this)); break; case TINY : super.setSkin(new TinySkin(Gauge.this)); break; case BATTERY : super.setSkin(new BatterySkin(Gauge.this)); break; case LEVEL : super.setSkin(new LevelSkin(Gauge.this)); break; case LINEAR : super.setSkin(new LinearSkin(Gauge.this)); break; case DIGITAL : super.setSkin(new DigitalSkin(Gauge.this)); break; case SIMPLE_DIGITAL : super.setSkin(new SimpleDigitalSkin(Gauge.this)); break; case SECTION : super.setSkin(new SectionSkin(Gauge.this)); break; case BAR : super.setSkin(new BarSkin(Gauge.this)); break; case WHITE : super.setSkin(new WhiteSkin(Gauge.this)); break; case CHARGE : super.setSkin(new ChargeSkin(Gauge.this)); break; case SIMPLE_SECTION : super.setSkin(new SimpleSectionSkin(Gauge.this)); break; case TILE_KPI : super.setSkin(new TileKpiSkin(Gauge.this)); break; case TILE_TEXT_KPI : super.setSkin(new TileTextKpiSkin(Gauge.this)); break; case TILE_SPARK_LINE: super.setSkin(new TileSparklineSkin(Gauge.this)); break; case NASA : super.setSkin(new NasaSkin(Gauge.this)); break; case GAUGE : default : super.setSkin(new GaugeSkin(Gauge.this)); break; } fireUpdateEvent(RESIZE_EVENT); } public void presetGaugeParameters(final SkinType SKIN_TYPE) { reInit(); switch (SKIN_TYPE) { case AMP: setKnobPosition(Pos.BOTTOM_CENTER); setTitleColor(Color.WHITE); setLedVisible(isLedVisible()); setBackgroundPaint(Color.WHITE); setForegroundPaint(Color.BLACK); setLcdVisible(isLcdVisible()); setShadowsEnabled(isShadowsEnabled()); break; case PLAIN_AMP: setKnobPosition(Pos.BOTTOM_CENTER); setTitleColor(Color.WHITE); setLedVisible(isLedVisible()); setBackgroundPaint(Color.WHITE); setForegroundPaint(Color.BLACK); setLcdVisible(isLcdVisible()); setShadowsEnabled(isShadowsEnabled()); break; case BULLET_CHART: setKnobPosition(Pos.CENTER); setBarColor(Color.BLACK); setThresholdColor(Color.BLACK); break; case DASHBOARD: setKnobPosition(Pos.BOTTOM_CENTER); setDecimals(0); setBarBackgroundColor(Color.LIGHTGRAY); setBarColor(Color.rgb(93, 190, 205)); break; case FLAT: setKnobPosition(Pos.CENTER); setBarColor(Color.CYAN); setBackgroundPaint(Color.TRANSPARENT); setTitleColor(Gauge.DARK_COLOR); setValueColor(Gauge.DARK_COLOR); setUnitColor(Gauge.DARK_COLOR); setBorderPaint(Color.rgb(208, 208, 208)); setDecimals(0); break; case INDICATOR: setKnobPosition(Pos.BOTTOM_CENTER); setValueVisible(false); setGradientBarEnabled(false); setGradientBarStops(new Stop(0.0, Color.rgb(34, 180, 11)), new Stop(0.5, Color.rgb(255, 146, 0)), new Stop(1.0, Color.rgb(255, 0, 39))); setTickLabelsVisible(false); setNeedleColor(Color.rgb(71, 71, 71)); setBarBackgroundColor(Color.rgb(232, 231, 223)); setBarColor(Color.rgb(255, 0, 39)); setAngleRange(180); break; case KPI: setKnobPosition(Pos.BOTTOM_CENTER); setDecimals(0); setForegroundBaseColor(Color.rgb(126, 126, 127)); setBarColor(Color.rgb(168, 204, 254)); setThresholdVisible(true); setThresholdColor(Color.rgb(45, 86, 184)); setNeedleColor(Color.rgb(74, 74, 74)); setAngleRange(128); break; case MODERN: setKnobPosition(Pos.CENTER); setDecimals(0); setValueColor(Color.WHITE); setTitleColor(Color.WHITE); setSubTitleColor(Color.WHITE); setUnitColor(Color.WHITE); setBarColor(Color.rgb(0, 214, 215)); setNeedleColor(Color.WHITE); setThresholdColor(Color.rgb(204, 0, 0)); setTickLabelColor(Color.rgb(151, 151, 151)); setTickMarkColor(Color.BLACK); setTickLabelOrientation(TickLabelOrientation.ORTHOGONAL); break; case SIMPLE: setKnobPosition(Pos.CENTER); setBorderPaint(Color.WHITE); setNeedleBorderColor(Color.WHITE); setBackgroundPaint(Color.DARKGRAY); setDecimals(0); setTickLabelColor(Color.WHITE); setNeedleColor(Color.web("#5a615f")); setValueColor(Color.WHITE); setTitleColor(Color.WHITE); setSubTitleColor(Color.WHITE); setSectionsVisible(true); break; case SLIM: setKnobPosition(Pos.CENTER); setDecimals(2); setBarBackgroundColor(Color.rgb(62, 67, 73)); setBarColor(Color.rgb(93, 190, 205)); setTitleColor(Color.rgb(142, 147, 151)); setValueColor(Color.rgb(228, 231, 238)); setUnitColor(Color.rgb(142, 147, 151)); break; case SPACE_X: setKnobPosition(Pos.CENTER); setDecimals(0); setThresholdColor(Color.rgb(180, 0, 0)); setBarBackgroundColor(Color.rgb(169, 169, 169, 0.25)); setBarColor(Color.rgb(169, 169, 169)); setTitleColor(Color.WHITE); setValueColor(Color.WHITE); setUnitColor(Color.WHITE); break; case QUARTER: setKnobPosition(Pos.BOTTOM_RIGHT); setAngleRange(90); break; case HORIZONTAL: setKnobPosition(Pos.BOTTOM_CENTER); setAngleRange(180); break; case VERTICAL: setKnobPosition(Pos.CENTER_RIGHT); setAngleRange(180); break; case LCD: setDecimals(1); setTickLabelDecimals(1); setMinMeasuredValueVisible(isMinMeasuredValueVisible()); setMaxMeasuredValueVisible(isMaxMeasuredValueVisible()); setOldValueVisible(isOldValueVisible()); setBorderPaint(Color.WHITE); setForegroundPaint(Color.WHITE); break; case TINY: setBorderWidth(24); setBackgroundPaint(Color.rgb(216, 216, 216)); setBorderPaint(Color.rgb(76, 76, 76)); setBarBackgroundColor(Color.rgb(76, 76, 76, 0.2)); setNeedleColor(Color.rgb(76, 76, 76)); setSectionsVisible(true); setMajorTickMarksVisible(true); setMajorTickMarkColor(Color.WHITE); break; case BATTERY: setBarBackgroundColor(Color.BLACK); setBarColor(Color.BLACK); setValueColor(Color.WHITE); break; case LEVEL: setValueColor(Color.WHITE); setBarColor(Color.CYAN); setUnit("%"); break; case LINEAR: setOrientation(Orientation.VERTICAL); setBarColor(DARK_COLOR); setBarEffectEnabled(true); break; case DIGITAL: setBarColor(DARK_COLOR); break; case SIMPLE_DIGITAL: setBarBackgroundColor(Helper.getTranslucentColorFrom(DARK_COLOR, 0.1)); setBarColor(DARK_COLOR); break; case SECTION: setBackgroundPaint(Gauge.DARK_COLOR); setAutoScale(false); setValueVisible(false); setKnobColor(Color.rgb(82, 82, 84)); setSectionsVisible(true); setSectionTextVisible(true); break; case BAR: Color barColor = getBarColor(); setAnimated(true); setAnimationDuration(1000); setMinValue(0); setMaxValue(100); setGradientBarEnabled(true); setGradientBarStops(new Stop(0.0, barColor), new Stop(0.01, barColor), new Stop(0.75, barColor.deriveColor(-10, 1, 1, 1)), new Stop(1.0, barColor.deriveColor(-20, 1, 1, 1))); break; case WHITE: setAnimated(true); setAnimationDuration(1000); setAngleRange(360); setMinValue(0); setMaxValue(100); setBarColor(Color.WHITE); setValueColor(Color.WHITE); setUnitColor(Color.WHITE); break; case CHARGE: setAnimated(true); setMinValue(0.0); setMaxValue(1.0); break; case SIMPLE_SECTION: setAnimated(true); setStartAngle(150); setAngleRange(300); setSectionsVisible(true); setBarBackgroundColor(Color.rgb(150, 150, 150, 0.25)); setBarColor(Color.rgb(69, 106, 207)); setTitleColor(Color.rgb(90, 90, 90)); setUnitColor(Color.rgb(90, 90, 90)); setValueColor(Color.rgb(90, 90, 90)); break; case TILE_KPI: setKnobPosition(Pos.BOTTOM_CENTER); setDecimals(0); setValueColor(Color.rgb(238, 238, 238)); setBackgroundPaint(Color.rgb(42,42,42)); setForegroundBaseColor(Color.rgb(238,238,238)); setBarColor(Color.rgb(238,238,238)); setThresholdVisible(false); setThresholdColor(Color.rgb(41,177,255)); setNeedleColor(Color.rgb(238,238,238)); setAngleRange(180); break; case TILE_TEXT_KPI: setDecimals(0); setBackgroundPaint(Color.rgb(42,42,42)); setForegroundBaseColor(Color.rgb(238,238,238)); setBarColor(Color.rgb(41,177,255)); setValueColor(Color.rgb(238, 238, 238)); setUnitColor(Color.rgb(238, 238, 238)); setThresholdVisible(false); setThresholdColor(Color.rgb(139,144,146)); break; case TILE_SPARK_LINE: setDecimals(0); setBackgroundPaint(Color.rgb(42,42,42)); setForegroundBaseColor(Color.rgb(238,238,238)); setBarColor(Color.rgb(41,177,255)); setValueColor(Color.rgb(238, 238, 238)); setUnitColor(Color.rgb(238, 238, 238)); setAveragingEnabled(true); setAveragingPeriod(10); setAverageColor(Color.rgb(238, 238, 238, 0.5)); setAnimated(false); break; case NASA: setBarBackgroundColor(Color.TRANSPARENT); setForegroundBaseColor(Color.WHITE); setStartAngle(108); setAngleRange(216); setTickLabelsVisible(false); setMediumTickMarksVisible(false); setMajorTickMarksVisible(false); break; case GAUGE: setStartAngle(320); setAngleRange(280); default: break; } } // ******************** Event handling ************************************ public void setOnUpdate(final UpdateEventListener LISTENER) { addUpdateEventListener(LISTENER); } public void addUpdateEventListener(final UpdateEventListener LISTENER) { if (!listenerList.contains(LISTENER)) listenerList.add(LISTENER); } public void removeUpdateEventListener(final UpdateEventListener LISTENER) { if (listenerList.contains(LISTENER)) listenerList.remove(LISTENER); } public void fireUpdateEvent(final UpdateEvent EVENT) { if (null != showing && showing.get()) { for (UpdateEventListener listener : listenerList) { listener.onUpdateEvent(EVENT); } } else { updateEventQueue.add(EVENT); } } public void setOnButtonPressed(final EventHandler HANDLER) { addEventHandler(ButtonEvent.BTN_PRESSED, HANDLER); } public void removeOnButtonPressed(final EventHandler HANDLER) { removeEventHandler(ButtonEvent.BTN_PRESSED, HANDLER); } public void setOnButtonReleased(final EventHandler HANDLER) { addEventHandler(ButtonEvent.BTN_RELEASED, HANDLER); } public void removeOnButtonReleased(final EventHandler HANDLER) { removeEventHandler(ButtonEvent.BTN_RELEASED, HANDLER); } public void setOnThresholdExceeded(final EventHandler HANDLER) { addEventHandler(ThresholdEvent.THRESHOLD_EXCEEDED, HANDLER); } public void removeOnThresholdExceeded(final EventHandler HANDLER) { removeEventHandler(ThresholdEvent.THRESHOLD_EXCEEDED, HANDLER); } public void setOnThresholdUnderrun(final EventHandler HANDLER) { addEventHandler(ThresholdEvent.THRESHOLD_UNDERRUN, HANDLER); } public void removeOnThresholdUnderrun(final EventHandler HANDLER) { removeEventHandler(ThresholdEvent.THRESHOLD_UNDERRUN, HANDLER); } // ******************** Inner Classes ************************************* public static class ButtonEvent extends Event { public static final EventType BTN_PRESSED = new EventType<>(ANY, "BTN_PRESSED" + UUID.randomUUID().toString()); public static final EventType BTN_RELEASED = new EventType<>(ANY, "BTN_RELEASED" + UUID.randomUUID().toString()); // ******************** Constructors ************************************** public ButtonEvent(final EventType TYPE) { super(TYPE); } public ButtonEvent(final Object SOURCE, final EventTarget TARGET, EventType TYPE) { super(SOURCE, TARGET, TYPE); } } public static class ThresholdEvent extends Event { public static final EventType THRESHOLD_EXCEEDED = new EventType<>(ANY, "THRESHOLD_EXCEEDED" + UUID.randomUUID().toString()); public static final EventType THRESHOLD_UNDERRUN = new EventType<>(ANY, "THRESHOLD_UNDERRUN" + UUID.randomUUID().toString()); // ******************** Constructors ************************************** public ThresholdEvent(final EventType TYPE) { super(TYPE); } public ThresholdEvent(final Object SOURCE, final EventTarget TARGET, EventType TYPE) { super(SOURCE, TARGET, TYPE); } } }