/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2014, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.gui.javafx.util;
import java.text.DecimalFormat;
import java.text.ParseException;
import javafx.geometry.Pos;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.SpinnerValueFactory;
import javafx.util.StringConverter;
/**
*
* @author Johann Sorel (Geomatys)
*/
public class FXNumberCell<S> extends FXTableCell<S, Number> {
private final DecimalFormat df = new DecimalFormat("#.###");
protected final FXNumberSpinner field = new FXNumberSpinner();
public FXNumberCell(Class clazz) {
if(clazz==Integer.class){
field.getSpinner().setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 1));
}else{
final SpinnerValueFactory.DoubleSpinnerValueFactory f = new SpinnerValueFactory.DoubleSpinnerValueFactory(Double.MIN_VALUE, Double.MAX_VALUE, 0, 1);
f.setConverter(new StringConverter<Double>() {
@Override public String toString(Double value) {
// If the specified value is null, return a zero-length String
if (value == null) {
return "";
}
return df.format(value);
}
@Override public Double fromString(String value) {
try {
// If the specified value is null or zero-length, return null
if (value == null) {
return null;
}
value = value.trim();
if (value.length() < 1) {
return null;
}
// Perform the requested parsing
return df.parse(value).doubleValue();
} catch (ParseException ex) {
throw new RuntimeException(ex);
}
}
});
field.getSpinner().setValueFactory(f);
}
setGraphic(field);
setAlignment(Pos.CENTER_RIGHT);
setContentDisplay(ContentDisplay.CENTER);
}
@Override
public void terminateEdit() {
commitEdit(field.valueProperty().get());
}
@Override
public void startEdit() {
Number value = (Number) getItem();
if (value == null) {
value = 0;
}
field.valueProperty().set(value);
super.startEdit();
setText(null);
setGraphic(field);
field.getSpinner().requestFocus();
}
@Override
public void commitEdit(Number newValue) {
itemProperty().set(newValue);
super.commitEdit(newValue);
updateItem(newValue, false);
}
@Override
public void cancelEdit() {
super.cancelEdit();
updateItem(getItem(), false);
}
@Override
protected void updateItem(Number item, boolean empty) {
super.updateItem(item, empty);
setGraphic(null);
if (item != null) {
setText(df.format(item));
} else {
setText(null);
}
}
public static class Float<T> extends FXNumberCell<T> {
public Float() {
super(Double.class);
}
@Override
public void commitEdit(Number newValue) {
super.commitEdit(newValue.floatValue()); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void terminateEdit() {
super.commitEdit(this.field.valueProperty().get().floatValue());
}
}
}