/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2012, 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.render2d.control.edition; import com.vividsolutions.jts.geom.Geometry; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.util.Collections; import java.util.logging.Level; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.SwingUtilities; import org.apache.sis.feature.FeatureExt; import org.apache.sis.internal.feature.AttributeConvention; import org.geotoolkit.data.FeatureCollection; import org.geotoolkit.data.FeatureStoreUtilities; import org.geotoolkit.factory.FactoryFinder; import org.geotoolkit.gui.swing.render2d.JMap2D; import org.geotoolkit.gui.swing.util.JOptionDialog; import org.geotoolkit.gui.swing.propertyedit.JFeatureOutLine; import org.geotoolkit.gui.swing.resource.MessageBundle; import org.geotoolkit.map.FeatureMapLayer; import org.geotoolkit.map.MapBuilder; import org.geotoolkit.map.MapContext; import org.apache.sis.storage.DataStoreException; import org.geotoolkit.style.RandomStyleBuilder; import org.opengis.feature.Feature; import org.opengis.geometry.Envelope; /** * Feature attribut and geometry tool delegate. * * @author Johann Sorel * @module */ public class FeatureEditTDelegate extends AbstractFeatureEditionDelegate { private final FeatureMapLayer originalLayer; private Feature feature = null; public FeatureEditTDelegate(final JMap2D map, final FeatureMapLayer candidate) { super(map,candidate); this.originalLayer = candidate; } private void reset(){ feature = null; decoration.setGeometries(null); } private void setCurrentFeature(final Feature feature){ this.feature = feature; if(feature != null){ final Geometry geom = (Geometry) FeatureExt.getDefaultGeometryAttributeValue(feature); decoration.setGeometries(Collections.singleton(helper.toObjectiveCRS(geom))); final JSplitPane split = new JSplitPane(); final JFeatureOutLine fe = new JFeatureOutLine(); fe.setEdited(feature); final JPanel editPane = new JPanel(new BorderLayout()); final JMap2D map = new JMap2D(); final MapContext context = MapBuilder.createContext(); final FeatureCollection col = FeatureStoreUtilities.collection(feature); final FeatureMapLayer layer = MapBuilder.createFeatureLayer(col, RandomStyleBuilder.createDefaultVectorStyle(col.getFeatureType())); context.layers().add(layer); //zoom on this single feature map.setPreferredSize(new Dimension(350, 350)); map.getContainer().setContext(context); try { map.getCanvas().setObjectiveCRS(FeatureExt.getCRS(feature.getType())); map.getCanvas().setVisibleArea((Envelope)feature.getPropertyValue(AttributeConvention.ENVELOPE_PROPERTY.toString())); } catch (Exception ex) { LOGGER.log(Level.WARNING, ex.getMessage(), ex); } //activate a node edition tool GeometryNodeTool t = new GeometryNodeTool(); if(t.canHandle(layer)){ final EditionDelegate delegate = t.createDelegate(map, layer); final EditionHandler handler = new EditionHandler(map,delegate); map.setHandler(handler); } editPane.add(BorderLayout.CENTER, map); split.setLeftComponent(new JScrollPane(fe)); split.setRightComponent(editPane); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final String save = MessageBundle.format("save"); final String cancel = MessageBundle.format("cancel"); final String delete = MessageBundle.format("delete"); final Object res = JOptionDialog.show(null,split,new String[]{delete,cancel,save}); if(save == res){ final Feature geofeature = layer.getCollection().iterator().next(); feature.setPropertyValue(AttributeConvention.GEOMETRY_PROPERTY.toString(), geofeature.getPropertyValue(AttributeConvention.GEOMETRY_PROPERTY.toString())); try { originalLayer.getCollection().update(feature); } catch (DataStoreException ex) { LOGGER.log(Level.WARNING, ex.getMessage(),ex); } }else if(delete == res){ try { originalLayer.getCollection().remove(FactoryFinder.getFilterFactory(null).id(Collections.singleton(FeatureExt.getId(feature)))); } catch (DataStoreException ex) { LOGGER.log(Level.WARNING, ex.getMessage(),ex); } } reset(); } }); } } @Override public void mouseClicked(final MouseEvent e) { final int button = e.getButton(); if(button == MouseEvent.BUTTON1){ reset(); setCurrentFeature(helper.grabFeature(e.getX(), e.getY(), false)); } } }