package org.openjump.core.ui.plugin.mousemenu; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.io.StringReader; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import javax.swing.JPopupMenu; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateFilter; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jump.I18N; import com.vividsolutions.jump.feature.Feature; import com.vividsolutions.jump.feature.FeatureCollection; import com.vividsolutions.jump.geom.CoordUtil; import com.vividsolutions.jump.io.WKTReader; import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.UndoableCommand; import com.vividsolutions.jump.workbench.plugin.PlugInContext; import com.vividsolutions.jump.workbench.ui.EditTransaction; import com.vividsolutions.jump.workbench.ui.GUIUtil; import com.vividsolutions.jump.workbench.ui.LayerViewPanel; import com.vividsolutions.jump.workbench.ui.SelectionManager; import com.vividsolutions.jump.workbench.ui.cursortool.editing.EditingPlugIn; import com.vividsolutions.jump.workbench.ui.cursortool.editing.MoveSelectedItemsTool; import com.vividsolutions.jump.workbench.ui.plugin.FeatureInstaller; import com.vividsolutions.jump.workbench.ui.plugin.clipboard.CollectionOfFeaturesTransferable; import com.vividsolutions.jump.workbench.ui.plugin.clipboard.PasteItemsPlugIn; import com.vividsolutions.jump.workbench.ui.toolbox.ToolboxDialog; public class PasteItemsAtPlugIn extends PasteItemsPlugIn { WKTReader reader = new WKTReader(); private static final String PASTE_ITEMS_AT_POINT = I18N.get("org.openjump.core.ui.plugin.mousemenu.PasteItemsAtPlugIn.Paste-Items-At-Point"); public void initialize(PlugInContext context) throws Exception { WorkbenchContext workbenchContext = context.getWorkbenchContext(); FeatureInstaller featureInstaller = new FeatureInstaller(workbenchContext); JPopupMenu popupMenu = LayerViewPanel.popupMenu(); featureInstaller.addPopupMenuItem(popupMenu, this, getNameWithMnemonic() + "{pos:10}", false, null, //to do: add icon this.createEnableCheck(workbenchContext)); } public String getName() { return PASTE_ITEMS_AT_POINT; } public boolean execute(final PlugInContext context) throws Exception { reportNothingToUndoYet(context); Collection features; Transferable transferable = GUIUtil.getContents(Toolkit.getDefaultToolkit() .getSystemClipboard()); if (transferable.isDataFlavorSupported( CollectionOfFeaturesTransferable.COLLECTION_OF_FEATURES_FLAVOR)) { features = (Collection) GUIUtil.getContents(Toolkit.getDefaultToolkit() .getSystemClipboard()) .getTransferData(CollectionOfFeaturesTransferable.COLLECTION_OF_FEATURES_FLAVOR); } else { //Allow the user to paste features using WKT. [Jon Aquino] features = reader.read(new StringReader( (String) transferable.getTransferData( DataFlavor.stringFlavor))).getFeatures(); } final SelectionManager selectionManager = context.getLayerViewPanel().getSelectionManager(); final Layer layer = context.getSelectedLayer(0); final Collection featureCopies = conform(features, layer.getFeatureCollectionWrapper().getFeatureSchema()); Feature feature = ((Feature) featureCopies.iterator().next()); Coordinate firstPoint = feature.getGeometry().getCoordinate(); Coordinate cursorPt = context.getLayerViewPanel().getViewport().toModelCoordinate( context.getLayerViewPanel().getLastClickedPoint()); Coordinate displacement = CoordUtil.subtract(cursorPt, firstPoint); moveAll(featureCopies,displacement); execute(new UndoableCommand(getName()) { public void execute() { layer.getFeatureCollectionWrapper().addAll(featureCopies); selectionManager.clear(); selectionManager.getFeatureSelection().selectItems(layer, featureCopies); } public void unexecute() { layer.getFeatureCollectionWrapper().removeAll(featureCopies); } }, context); return true; } private void moveAll( Collection featureCopies, Coordinate displacement) { for (Iterator j = featureCopies.iterator(); j.hasNext();) { Feature item = (Feature) j.next(); move(item.getGeometry(), displacement); item.getGeometry().geometryChanged(); } } private void move(Geometry geometry, final Coordinate displacement) { geometry.apply(new CoordinateFilter() { public void filter(Coordinate coordinate) { //coordinate.setCoordinate(CoordUtil.add(coordinate, displacement)); coordinate.x += displacement.x; coordinate.y += displacement.y; } }); } }