/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2009-2011, Johann Sorel * (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.swing.propertyedit.styleproperty; import java.util.logging.Level; import javax.swing.JFileChooser; import javax.xml.bind.JAXBException; import org.apache.sis.util.logging.Logging; import org.geotoolkit.gui.swing.propertyedit.AbstractPropertyPane; import org.geotoolkit.gui.swing.resource.IconBundle; import org.geotoolkit.gui.swing.resource.MessageBundle; 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.Specification.StyledLayerDescriptor; import org.geotoolkit.sld.xml.StyleXmlIO; import org.geotoolkit.style.MutableStyle; import org.jdesktop.swingx.combobox.EnumComboBoxModel; 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; /** * Panel to export styles as SLD. * * @author Johann Sorel (Puzzle-GIS) */ public class JSLDImportExportPanel extends AbstractPropertyPane{ private MapLayer layer = null; /** Creates new form JSLDExportPanel */ public JSLDImportExportPanel() { super(MessageBundle.format("import_export"), IconBundle.getIcon("16_advanced_style"), null, null); initComponents(); guiVersion.setModel(new EnumComboBoxModel(StyledLayerDescriptor.class)); guiVersion.setSelectedItem(StyledLayerDescriptor.V_1_1_0); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jButton1 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); guiVersion = new javax.swing.JComboBox(); jButton1.setText("export sld"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { exp100(evt); } }); jButton3.setText("import sld"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(guiVersion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton1) .addContainerGap(89, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(guiVersion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jButton3) .addComponent(jButton1)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// </editor-fold>//GEN-END:initComponents private void exp100(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exp100 write(); }//GEN-LAST:event_exp100 private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed read(); }//GEN-LAST:event_jButton3ActionPerformed private void write(){ final StyledLayerDescriptor version = (StyledLayerDescriptor)guiVersion.getSelectedItem(); if(layer != null && layer.getStyle() != null){ final MutableStyle style = layer.getStyle(); final JFileChooser chooser = new JFileChooser(); final int result = chooser.showSaveDialog(this); if(result == JFileChooser.APPROVE_OPTION){ final StyleXmlIO tool = new StyleXmlIO(); try { tool.writeStyle(chooser.getSelectedFile(), style, version); } catch (JAXBException ex) { Logging.getLogger("org.geotoolkit.gui.swing.propertyedit.styleproperty").log(Level.WARNING,ex.getMessage(),ex); } } } } private void read(){ final StyledLayerDescriptor version = (StyledLayerDescriptor)guiVersion.getSelectedItem(); if(layer != null){ final JFileChooser chooser = new JFileChooser(); final int result = chooser.showOpenDialog(this); parse: if(result == JFileChooser.APPROVE_OPTION){ final StyleXmlIO tool = new StyleXmlIO(); try { final MutableStyledLayerDescriptor sld = tool.readSLD(chooser.getSelectedFile(), 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.swing.propertyedit.styleproperty").log(Level.FINEST,ex.getMessage(),ex); } try { final MutableStyle style = tool.readStyle(chooser.getSelectedFile(), (version==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.swing.propertyedit.styleproperty").log(Level.FINEST,ex.getMessage(),ex); } } } } @Override public boolean canHandle(Object target) { return target instanceof MapLayer; } @Override public void setTarget(Object candidate) { if(candidate instanceof MapLayer){ this.layer = (MapLayer) candidate; } } @Override public void apply() { } @Override public void reset() { } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JComboBox guiVersion; private javax.swing.JButton jButton1; private javax.swing.JButton jButton3; // End of variables declaration//GEN-END:variables }