/*
* SetTempDialog.java - Copyright(c) 2014 Joe Pasqua
* Provided under the MIT License. See the LICENSE file for details.
* Created: Feb 16, 2014
*/
package org.noroomattheinn.visibletesla.dialogs;
import org.noroomattheinn.fxextensions.VTDialog;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.stage.Stage;
/**
* SetTempDialog
*
* @author Joe Pasqua <joe at NoRoomAtTheInn dot org>
*/
public class SetTempDialog extends VTDialog.Controller {
/*------------------------------------------------------------------------------
*
* Internal State
*
*----------------------------------------------------------------------------*/
private boolean useDegreesF;
private double finalValue;
private boolean cancelled;
/*------------------------------------------------------------------------------
*
* Internal State - UI Components
*
*----------------------------------------------------------------------------*/
@FXML private Button okButton;
@FXML private Button cancelButton;
@FXML private Slider valueSlider;
@FXML private Label tempLabel;
@FXML private CheckBox useCarSetpoint;
/*------------------------------------------------------------------------------
*
* UI Initialization and Action Handlers
*
*----------------------------------------------------------------------------*/
@FXML void initialize() {
useDegreesF = true; // Default
cancelled = true;
finalValue = -1;
bind(valueSlider, tempLabel);
setUnits(useDegreesF);
useCarSetpoint.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
valueSlider.setDisable(t1);
tempLabel.setDisable(t1);
}
});
}
@FXML void buttonHandler(ActionEvent event) {
Button b = (Button)event.getSource();
if (b == okButton) {
cancelled = false;
finalValue = valueSlider.getValue();
} else if (b == cancelButton) {
cancelled = true;
finalValue = -1;
}
dialogStage.close();
}
/*==============================================================================
* ------- -------
* ------- Public Interface To This Class -------
* ------- -------
*============================================================================*/
public static SetTempDialog show(Stage stage, boolean useDegreesF, double target) {
SetTempDialog std = VTDialog.<SetTempDialog>load(
SetTempDialog.class.getResource("SetTempDialog.fxml"),
"Target Temperature", stage);
std.setInitialValues(useDegreesF, target);
std.show();
return std;
}
public double getValue() { return finalValue; }
public boolean cancelled() { return cancelled; }
public boolean useCarsValue() { return useCarSetpoint.isSelected(); }
/*------------------------------------------------------------------------------
*
* Private Methods
*
*----------------------------------------------------------------------------*/
private void setInitialValues(boolean udf, double initTemp) {
setUnits(udf);
if (initTemp > 0) {
setValue(initTemp);
useCarSetpoint.setSelected(false);
} else {
useCarSetpoint.setSelected(true);
}
}
private void setUnits(boolean useDegreesF) {
if (useDegreesF) {
valueSlider.setMin(62);
valueSlider.setMax(90);
valueSlider.setMajorTickUnit(2);
valueSlider.setMinorTickCount(1);
valueSlider.setValue(70); // Default Value
} else {
valueSlider.setMin(17.0);
valueSlider.setMax(32.0);
valueSlider.setMajorTickUnit(1);
valueSlider.setMinorTickCount(1);
valueSlider.setValue(19.5); // Default Value
}
}
private double adjustValue(double orig) {
return useDegreesF ? Math.round(orig) : nearestHalf(orig);
}
private double nearestHalf(double val) { return Math.floor(val*2.0)/2.0; }
private void setValue(double value) {
finalValue = value;
valueSlider.setValue(value);
}
/*------------------------------------------------------------------------------
*
* PRIVATE - Utility Methods
*
*----------------------------------------------------------------------------*/
private void bind(final Slider slider, final Label label) {
double val = adjustValue(slider.getValue());
label.setText(String.format("%3f.1", val));
slider.valueProperty().addListener(new ChangeListener<Number>() {
@Override public void changed(ObservableValue<? extends Number> observableValue,
Number oldValue, Number newValue) {
if (newValue == null) {
label.setText("...");
} else {
double val = adjustValue(newValue.doubleValue());
label.setText(String.format("%3.1f", val));
}
}
});
}
}