/* * 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.layer.style; import java.io.File; import java.util.logging.Level; import javafx.collections.FXCollections; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.ChoiceBox; import javafx.stage.FileChooser; import javax.xml.bind.JAXBException; import org.apache.sis.util.logging.Logging; import org.geotoolkit.gui.javafx.layer.FXLayerStylePane; import org.geotoolkit.internal.GeotkFX; import org.geotoolkit.map.MapLayer; import org.geotoolkit.sld.MutableLayer; import org.geotoolkit.sld.MutableStyledLayerDescriptor; import org.geotoolkit.sld.xml.Specification; import org.geotoolkit.sld.xml.StyleXmlIO; import org.geotoolkit.style.MutableStyle; import org.opengis.sld.LayerStyle; import org.opengis.sld.NamedLayer; import org.opengis.sld.UserLayer; import org.opengis.style.Style; import org.opengis.util.FactoryException; /** * * @author Johann Sorel (Geomatys) */ public class FXStyleXMLPane extends FXLayerStylePane { @FXML private ChoiceBox<Specification.StyledLayerDescriptor> uiVersion; private MapLayer layer = null; public FXStyleXMLPane() { GeotkFX.loadJRXML(this,FXStyleXMLPane.class); } @FXML void importXMl(ActionEvent event) { final Specification.StyledLayerDescriptor version = uiVersion.getValue(); if(layer != null){ final FileChooser chooser = new FileChooser(); final File result = chooser.showOpenDialog(null); parse: if(result != null){ final StyleXmlIO tool = new StyleXmlIO(); try { final MutableStyledLayerDescriptor sld = tool.readSLD(result, version); if(sld != null ){ for(MutableLayer sldLayer : sld.layers()){ if(sldLayer instanceof NamedLayer){ final NamedLayer nl = (NamedLayer) sldLayer; for(LayerStyle ls : nl.styles()){ if(ls instanceof MutableStyle){ layer.setStyle((MutableStyle) ls); } } }else if(sldLayer instanceof UserLayer){ final UserLayer ul = (UserLayer) sldLayer; for(Style ls : ul.styles()){ if(ls instanceof MutableStyle){ layer.setStyle((MutableStyle) ls); } } } } } break parse; } catch (JAXBException | FactoryException ex) { Logging.getLogger("org.geotoolkit.gui.javafx.layer.style").log(Level.FINEST,ex.getMessage(),ex); } try { final MutableStyle style = tool.readStyle(result, (version==Specification.StyledLayerDescriptor.V_1_0_0) ? Specification.SymbologyEncoding.SLD_1_0_0 : Specification.SymbologyEncoding.V_1_1_0); layer.setStyle(style); break parse; } catch (JAXBException | FactoryException ex) { Logging.getLogger("org.geotoolkit.gui.javafx.layer.style").log(Level.FINEST,ex.getMessage(),ex); } } } } @FXML void exportXML(ActionEvent event) { final Specification.StyledLayerDescriptor version = uiVersion.getValue(); if(layer != null && layer.getStyle() != null){ final MutableStyle style = layer.getStyle(); final FileChooser chooser = new FileChooser(); final File result = chooser.showSaveDialog(null); if(result != null){ final StyleXmlIO tool = new StyleXmlIO(); try { tool.writeStyle(result, style, version); } catch (JAXBException ex) { Logging.getLogger("org.geotoolkit.gui.javafx.layer.style").log(Level.WARNING,ex.getMessage(),ex); } } } } @Override public String getTitle() { return GeotkFX.getString(this,"title"); } @Override public String getCategory() { return GeotkFX.getString(this,"category"); } /** * Called by FXMLLoader after creating controller. */ public void initialize(){ uiVersion.setItems(FXCollections.observableArrayList(Specification.StyledLayerDescriptor.values())); if(!uiVersion.getItems().isEmpty()){ uiVersion.getSelectionModel().select(uiVersion.getItems().size()-1); } } @Override public boolean init(MapLayer candidate, Object StyleElement) { if(!(candidate instanceof MapLayer)) return false; layer = (MapLayer) candidate; return true; } @Override public MutableStyle getMutableStyle() { if(layer!=null) return layer.getStyle(); return null; } }