/* * 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.style; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.scene.control.SpinnerValueFactory; import org.geotoolkit.gui.javafx.util.FXNumberSpinner; import org.geotoolkit.map.MapLayer; import org.geotoolkit.style.StyleConstants; import org.opengis.style.Stroke; /** * * @author Johann Sorel (Geomatys) */ public class FXStroke extends FXStyleElementController<Stroke> { @FXML private FXColorExpression uiColor; @FXML private FXNumberExpression uiOpacity; @FXML private FXNumberExpression uiWidth; @FXML private FXLineCapExpression uiLineCap; @FXML private FXLineJoinExpression uiLineJoin; @FXML private FXNumberSpinner uiDash1; @FXML private FXNumberSpinner uiDash2; @FXML private FXNumberSpinner uiDash3; @Override public Class<Stroke> getEditedClass() { return Stroke.class; } @Override public Stroke newValue() { return StyleConstants.DEFAULT_STROKE; } @Override public void initialize() { super.initialize(); uiWidth.getEditor().getSpinner().setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 200, 1, 1)); uiOpacity.getEditor().getSpinner().setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 1, 1, 0.1)); uiDash1.getSpinner().setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 1000, 0, 1)); uiDash2.getSpinner().setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 1000, 0, 1)); uiDash3.getSpinner().setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 1000, 0, 1)); final ChangeListener changeListener = (ChangeListener) (ObservableValue observable, Object oldValue, Object newValue) -> { if(updating) return; final Stroke stroke; // if (guiGraphicFill.isSelected() && graphicFill != null) { // stroke = getStyleFactory().stroke( // graphicFill, // GuiStrokeColor.create(), // GuiStrokeAlpha.create(), // GuiStrokeWidth.create(), // GuiStrokeLineJoin.create(), // GuiStrokeLineCap.create(), // GuiStrokeDashes.getDashes(), // GuiStrokeDashes.getOffset()); // } else if (guiGraphicStroke.isSelected() && graphicStroke != null) { // stroke = getStyleFactory().stroke( // graphicStroke, // GuiStrokeColor.create(), // GuiStrokeAlpha.create(), // GuiStrokeWidth.create(), // GuiStrokeLineJoin.create(), // GuiStrokeLineCap.create(), // GuiStrokeDashes.getDashes(), // GuiStrokeDashes.getOffset()); // } else { // stroke = getStyleFactory().stroke( // GuiStrokeColor.create(), // GuiStrokeAlpha.create(), // GuiStrokeWidth.create(), // GuiStrokeLineJoin.create(), // GuiStrokeLineCap.create(), // GuiStrokeDashes.getDashes(), // GuiStrokeDashes.getOffset()); final float d0 = uiDash1.valueProperty().get().floatValue(); final float d1 = uiDash2.valueProperty().get().floatValue(); final float d2 = uiDash3.valueProperty().get().floatValue(); stroke = getStyleFactory().stroke( uiColor.valueProperty().get(), uiOpacity.valueProperty().get(), uiWidth.valueProperty().get(), uiLineJoin.valueProperty().get(), uiLineCap.valueProperty().get(), (d0!=0&&d1!=0&&d2!=0)?new float[]{d0,d1,d2}:null, StyleConstants.DEFAULT_STROKE_OFFSET); // } value.set(stroke); }; uiWidth.valueProperty().addListener(changeListener); uiOpacity.valueProperty().addListener(changeListener); uiColor.valueProperty().addListener(changeListener); uiLineCap.valueProperty().addListener(changeListener); uiLineJoin.valueProperty().addListener(changeListener); uiDash1.valueProperty().addListener(changeListener); uiDash2.valueProperty().addListener(changeListener); uiDash3.valueProperty().addListener(changeListener); } @Override public void setLayer(MapLayer layer) { super.setLayer(layer); uiWidth.setLayer(layer); uiOpacity.setLayer(layer); uiColor.setLayer(layer); uiLineCap.setLayer(layer); uiLineJoin.setLayer(layer); } @Override protected void updateEditor(Stroke styleElement) { uiWidth.valueProperty().setValue(styleElement.getWidth()); uiOpacity.valueProperty().setValue(styleElement.getOpacity()); uiColor.valueProperty().setValue(styleElement.getColor()); uiLineCap.valueProperty().setValue(styleElement.getLineCap()); uiLineJoin.valueProperty().setValue(styleElement.getLineJoin()); final Double d = styleElement.getDashOffset().evaluate(null, Double.class); final float[] dashes = styleElement.getDashArray(); float d0 = 0f; float d1 = 0f; float d2 = 0f; if(dashes!=null){ if(dashes.length>0) d0 = dashes[0]; if(dashes.length>1) d1 = dashes[1]; if(dashes.length>2) d2 = dashes[2]; } uiDash1.valueProperty().set(d0); uiDash2.valueProperty().set(d1); uiDash3.valueProperty().set(d2); } }