/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2014-2015, 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.style; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.geometry.HPos; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.util.StringConverter; import javax.measure.quantity.Length; import javax.measure.Unit; import org.geotoolkit.display2d.GO2Utilities; import org.geotoolkit.internal.GeotkFX; import org.geotoolkit.map.MapLayer; import org.opengis.filter.expression.Expression; import org.opengis.style.Description; import org.opengis.style.Symbolizer; import org.apache.sis.measure.Units; /** * * @author Johann Sorel (Geomatys) */ public class FXSymbolizerInfo extends GridPane{ protected MapLayer layer = null; protected volatile boolean updating = false; private final SimpleBooleanProperty value = new SimpleBooleanProperty(); @FXML private Label uiNameLbl; @FXML private Label uiTitleLbl; @FXML private Label uiAbstractLbl; @FXML private Label uiUnitLbl; @FXML private Label uiGeomLbl; @FXML private TextField uiName; @FXML private TextField uiTitle; @FXML private TextField uiAbstract; @FXML private ChoiceBox<Unit> uiUnit; @FXML private FXTextExpression uiGeom; public FXSymbolizerInfo() { GeotkFX.loadJRXML(this,FXSymbolizerInfo.class); FXStyleElementController.configureAdvancedProperty( uiTitle,uiTitleLbl, uiAbstract,uiAbstractLbl, uiUnit,uiUnitLbl, uiGeom,uiGeomLbl); final FXMode mode = new FXMode(); add(mode, 0, 0, 3, 1); setHalignment(mode, HPos.RIGHT); } /** * * @return fake property, just to have events */ public SimpleBooleanProperty valueProperty(){ return value; } public String getName(){ return uiName.getText(); } public Description getDescription(){ return GO2Utilities.STYLE_FACTORY.description(uiTitle.getText(), uiAbstract.getText()); } public Unit getUnit(){ return uiUnit.getValue(); } public Expression getGeom(){ return uiGeom.valueProperty().get(); } public void initialize() { uiUnit.setItems(FXCollections.observableArrayList(Units.POINT,Units.METRE, Units.INCH, Units.STATUTE_MILE, Units.FOOT)); uiUnit.getSelectionModel().select(0); uiUnit.setConverter(new StringConverter<Unit>() { @Override public String toString(Unit object) { if(object == Units.POINT) return "pixel"; else if(object == Units.METRE) return "metre"; else if(object == Units.INCH) return "inch"; else if(object == Units.STATUTE_MILE) return "mile"; else if(object == Units.FOOT) return "foot"; else return "pixel"; } @Override public Unit fromString(String string) { if("pixel".equals(string)) return Units.POINT; else if("metre".equals(string)) return Units.METRE; else if("inch".equals(string)) return Units.INCH; else if("mile".equals(string)) return Units.STATUTE_MILE; else if("foot".equals(string)) return Units.FOOT; else return Units.POINT; } }); //catch change events final EventHandler<ActionEvent> eventHandler = (ActionEvent event) -> { if(updating) return; value.setValue(!value.get()); }; uiName.setOnAction(eventHandler); uiTitle.setOnAction(eventHandler); uiAbstract.setOnAction(eventHandler); final ChangeListener changeListener = new ChangeListener() { @Override public void changed(ObservableValue observable, Object oldValue, Object newValue) { if(updating) return; value.setValue(!value.get()); } }; uiUnit.valueProperty().addListener(changeListener); uiGeom.valueProperty().addListener(changeListener); } public MapLayer getLayer() { return layer; } public void setLayer(MapLayer layer) { this.layer = layer; uiGeom.setLayer(layer); } public void parse(Symbolizer styleElement) { updating = true; uiName.setText(notNull(styleElement.getName())); final Description desc = styleElement.getDescription(); if(desc!=null){ uiTitle.setText(notNull(desc.getTitle())); uiAbstract.setText(notNull(desc.getAbstract())); }else{ uiTitle.setText(""); uiAbstract.setText(""); } final Unit<Length> uom = styleElement.getUnitOfMeasure(); uiUnit.setValue(uom==null? Units.POINT : uom); uiGeom.valueProperty().set(styleElement.getGeometry()); updating = false; } private static String notNull(CharSequence str){ return (str==null) ? "" : str.toString(); } }