/* * 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 java.io.IOException; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.embed.swing.SwingFXUtils; import javafx.scene.Node; import javafx.scene.control.Toggle; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javax.imageio.ImageIO; import org.geotoolkit.style.StyleConstants; import org.opengis.filter.expression.Expression; /** * * @author Johann Sorel (Geomatys) */ public class FXLineJoinExpression extends FXExpression { private static final Image IMG_BEVEL; private static final Image IMG_MITER; private static final Image IMG_ROUND; static { try{ //NOTE : for some unknown reason javafx fails to load images if we use new Image(url) in scenebuilder but not in a normal execution IMG_BEVEL = SwingFXUtils.toFXImage(ImageIO.read(FXLineCapExpression.class.getResource("/org/geotoolkit/gui/javafx/icon/crystalproject/16x16/actions/join_bevel.png")), null); IMG_MITER = SwingFXUtils.toFXImage(ImageIO.read(FXLineCapExpression.class.getResource("/org/geotoolkit/gui/javafx/icon/crystalproject/16x16/actions/join_miter.png")), null); IMG_ROUND = SwingFXUtils.toFXImage(ImageIO.read(FXLineCapExpression.class.getResource("/org/geotoolkit/gui/javafx/icon/crystalproject/16x16/actions/join_round.png")), null); }catch(IOException ex){ throw new RuntimeException("Failed to load line join icons."); } } private final ToggleGroup group = new ToggleGroup(); private final ToggleButton uiBevel = new ToggleButton(null, new ImageView(IMG_BEVEL)); private final ToggleButton uiMiter = new ToggleButton(null, new ImageView(IMG_MITER)); private final ToggleButton uiRound = new ToggleButton(null, new ImageView(IMG_ROUND)); private final HBox hbox = new HBox(uiBevel,uiMiter,uiRound); public FXLineJoinExpression(){ uiRound.setToggleGroup(group); uiMiter.setToggleGroup(group); uiBevel.setToggleGroup(group); group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() { @Override public void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) { if(newValue==uiBevel){ value.set(StyleConstants.STROKE_JOIN_BEVEL); }else if(newValue==uiMiter){ value.set(StyleConstants.STROKE_JOIN_MITRE); }else if(newValue==uiRound){ value.set(StyleConstants.STROKE_JOIN_ROUND); } } }); } @Override public Expression newValue() { return StyleConstants.STROKE_JOIN_BEVEL; } @Override protected Node getEditor() { return hbox; } @Override protected boolean canHandle(Expression styleElement) { final Toggle selected = group.getSelectedToggle(); if(StyleConstants.STROKE_JOIN_BEVEL.equals(styleElement)){ if(selected!=uiBevel) group.selectToggle(uiBevel); return true; }else if(StyleConstants.STROKE_JOIN_MITRE.equals(styleElement)){ if(selected!=uiMiter) group.selectToggle(uiMiter); return true; }else if(StyleConstants.STROKE_JOIN_ROUND.equals(styleElement)){ if(selected!=uiRound) group.selectToggle(uiRound); return true; } return false; } }