Ticket #12478: 12478-draft-v1.patch

File 12478-draft-v1.patch, 8.5 KB (added by simon04, 10 years ago)
  • src/org/openstreetmap/josm/actions/CopyAction.java

    diff --git a/src/org/openstreetmap/josm/actions/CopyAction.java b/src/org/openstreetmap/josm/actions/CopyAction.java
    index cc6cb5b..681c8ba 100644
    a b  
    55import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    66import static org.openstreetmap.josm.tools.I18n.tr;
    77
     8import java.awt.Toolkit;
    89import java.awt.event.ActionEvent;
    910import java.awt.event.KeyEvent;
    1011import java.util.Collection;
     
    1415import org.openstreetmap.josm.Main;
    1516import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1617import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     18import org.openstreetmap.josm.data.osm.PrimitiveDeepCopy;
     19import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
    1720import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    1821import org.openstreetmap.josm.tools.Shortcut;
    19 import org.openstreetmap.josm.tools.Utils;
    2022
    2123/**
    2224 * Copy OSM primitives to clipboard in order to paste them, or their tags, somewhere else.
    public void actionPerformed(ActionEvent e) {  
    5658     */
    5759    public static void copy(OsmDataLayer source, Collection<OsmPrimitive> primitives) {
    5860        /* copy ids to the clipboard */
    59         String ids = getCopyString(primitives);
    60         Utils.copyToClipboard(ids);
    61 
    62         Main.pasteBuffer.makeCopy(primitives);
    63         Main.pasteSource = source;
     61        final PrimitiveTransferable transferable = new PrimitiveTransferable(new PrimitiveDeepCopy(primitives).getAll(), true);
     62        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
    6463    }
    6564
    6665    public static String getCopyString(Collection<? extends OsmPrimitive> primitives) {
  • src/org/openstreetmap/josm/actions/DuplicateAction.java

    diff --git a/src/org/openstreetmap/josm/actions/DuplicateAction.java b/src/org/openstreetmap/josm/actions/DuplicateAction.java
    index 6c0d1d9..677868b 100644
    a b public DuplicateAction() {  
    2828
    2929    @Override
    3030    public void actionPerformed(ActionEvent e) {
    31         Main.main.menu.paste.pasteData(new PrimitiveDeepCopy(getCurrentDataSet().getSelected()), getEditLayer(), e);
     31//        Main.main.menu.paste.pasteData(new PrimitiveDeepCopy(getCurrentDataSet().getSelected()), getEditLayer(), e);
    3232    }
    3333
    3434    @Override
  • src/org/openstreetmap/josm/actions/PasteAction.java

    diff --git a/src/org/openstreetmap/josm/actions/PasteAction.java b/src/org/openstreetmap/josm/actions/PasteAction.java
    index 96e5873..8509eaa 100644
    a b  
    77
    88import java.awt.MouseInfo;
    99import java.awt.Point;
     10import java.awt.Toolkit;
     11import java.awt.datatransfer.UnsupportedFlavorException;
    1012import java.awt.event.ActionEvent;
    1113import java.awt.event.KeyEvent;
     14import java.io.IOException;
    1215import java.util.ArrayList;
    1316import java.util.HashMap;
    1417import java.util.List;
     
    2629import org.openstreetmap.josm.data.osm.RelationMemberData;
    2730import org.openstreetmap.josm.data.osm.WayData;
    2831import org.openstreetmap.josm.gui.ExtendedDialog;
     32import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
    2933import org.openstreetmap.josm.gui.layer.Layer;
    3034import org.openstreetmap.josm.tools.Shortcut;
    3135
    public PasteAction() {  
    4852        Main.pasteBuffer.addPasteBufferChangedListener(this);
    4953    }
    5054
     55    @SuppressWarnings("unchecked")
    5156    @Override
    5257    public void actionPerformed(ActionEvent e) {
    53         if (!isEnabled())
    54             return;
    55         pasteData(Main.pasteBuffer, Main.pasteSource, e);
     58        try {
     59            pasteData((Iterable<PrimitiveData>) Toolkit.getDefaultToolkit().getSystemClipboard().getData(PrimitiveTransferable.PRIMITIVE_DATA), Main.pasteSource, e);
     60        } catch (UnsupportedFlavorException | IOException e1) {
     61            e1.printStackTrace();
     62        }
    5663    }
    5764
    5865    /**
    5966     * Paste OSM primitives from the given paste buffer and OSM data layer source to the current edit layer.
    60      * @param pasteBuffer The paste buffer containing primitive ids to copy
     67     * @param paste The primitive ids to paste
    6168     * @param source The OSM data layer used to look for primitive ids
    6269     * @param e The ActionEvent that triggered this operation
    6370     */
    64     public void pasteData(PrimitiveDeepCopy pasteBuffer, Layer source, ActionEvent e) {
     71    public void pasteData(Iterable<PrimitiveData> paste, Layer source, ActionEvent e) {
    6572        /* Find the middle of the pasteBuffer area */
    6673        double maxEast = -1E100, minEast = 1E100, maxNorth = -1E100, minNorth = 1E100;
    6774        boolean incomplete = false;
    68         for (PrimitiveData data : pasteBuffer.getAll()) {
     75        for (PrimitiveData data : paste) {
    6976            if (data instanceof NodeData) {
    7077                NodeData n = (NodeData) data;
    7178                if (n.getEastNorth() != null) {
    public void pasteData(PrimitiveDeepCopy pasteBuffer, Layer source, ActionEvent e  
    118125        Map<Long, Long> newNodeIds = new HashMap<>();
    119126        Map<Long, Long> newWayIds = new HashMap<>();
    120127        Map<Long, Long> newRelationIds = new HashMap<>();
    121         for (PrimitiveData data: pasteBuffer.getAll()) {
     128        for (PrimitiveData data: paste) {
    122129            if (data.isIncomplete()) {
    123130                continue;
    124131            }
    public void pasteData(PrimitiveDeepCopy pasteBuffer, Layer source, ActionEvent e  
    132139                newRelationIds.put(data.getUniqueId(), copy.getUniqueId());
    133140            }
    134141            bufferCopy.add(copy);
    135             if (pasteBuffer.getDirectlyAdded().contains(data)) {
    136                 toSelect.add(copy);
    137             }
     142//            if (pasteBuffer.getDirectlyAdded().contains(data)) {
     143//                toSelect.add(copy);
     144//            }
    138145        }
    139146
    140147        // Update references in copied buffer
    protected boolean confirmDeleteIncomplete() {  
    196203
    197204    @Override
    198205    protected void updateEnabledState() {
    199         if (getCurrentDataSet() == null || Main.pasteBuffer == null) {
    200             setEnabled(false);
    201             return;
    202         }
    203         setEnabled(!Main.pasteBuffer.isEmpty());
     206        setEnabled(Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(PrimitiveTransferable.PRIMITIVE_DATA));
    204207    }
    205208
    206209    @Override
  • src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java

    diff --git a/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java b/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java
    index c01e5c7..2f25945 100644
    a b  
    66import java.awt.datatransfer.UnsupportedFlavorException;
    77import java.util.ArrayList;
    88import java.util.Collection;
     9import java.util.Collections;
    910
    1011import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1112import org.openstreetmap.josm.data.osm.PrimitiveData;
     
    2223     */
    2324    public static final DataFlavor PRIMITIVE_DATA = new DataFlavor(PrimitiveData.class, PrimitiveData.class.getName());
    2425    private final Collection<? extends OsmPrimitive> primitives;
     26    private final Collection<? extends PrimitiveData> primitiveData;
    2527
    2628    /**
    2729     * Constructs a new {@code PrimitiveTransferable}.
     
    2931     */
    3032    public PrimitiveTransferable(Collection<? extends OsmPrimitive> primitives) {
    3133        this.primitives = primitives;
     34        this.primitiveData = Collections.emptyList();
     35    }
     36
     37    public PrimitiveTransferable(Collection<? extends PrimitiveData> primitiveData, boolean marker) {
     38        this.primitives = Collections.emptyList();
     39        this.primitiveData = primitiveData;
    3240    }
    3341
    3442    @Override
    protected String getStringData() {  
    5967            sb.append(" # ").append(primitive.getDisplayName(DefaultNameFormatter.getInstance()));
    6068            sb.append("\n");
    6169        }
     70        for (PrimitiveData data : primitiveData) {
     71            sb.append(data.getType());
     72            sb.append(" ").append(data.getUniqueId());
     73            sb.append("\n");
     74        }
    6275        return sb.toString().replace("\u200E", "").replace("\u200F", "");
    6376    }
    6477
    6578    protected Collection<PrimitiveData> getRelationMemberData() {
    66         final Collection<PrimitiveData> r = new ArrayList<>(primitives.size());
     79        final Collection<PrimitiveData> r = new ArrayList<>(primitives.size() + primitiveData.size());
    6780        for (OsmPrimitive primitive : primitives) {
    6881            r.add(primitive.save());
    6982        }
     83        r.addAll(primitiveData);
    7084        return r;
    7185    }
    7286}