001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.event.ActionEvent;
007import java.awt.event.KeyEvent;
008import java.util.Collection;
009import java.util.Collections;
010
011import org.openstreetmap.josm.data.osm.DataSet;
012import org.openstreetmap.josm.data.osm.Node;
013import org.openstreetmap.josm.data.osm.OsmPrimitive;
014import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
015import org.openstreetmap.josm.tools.Shortcut;
016import org.openstreetmap.josm.tools.Utils;
017
018public class CopyCoordinatesAction extends JosmAction {
019
020    public CopyCoordinatesAction() {
021        super(tr("Copy Coordinates"), null,
022                tr("Copy coordinates of selected nodes to clipboard."),
023                Shortcut.registerShortcut("copy:coordinates", tr("Edit: {0}", tr("Copy Coordinates")),
024                KeyEvent.VK_C, Shortcut.CTRL_SHIFT),
025                false);
026        putValue("toolbar", "copy/coordinates");
027    }
028
029    @Override
030    public void actionPerformed(ActionEvent ae) {
031        StringBuilder s = new StringBuilder();
032        for (Node n : getSelectedNodes()) {
033            s.append(n.getCoor().lat());
034            s.append(", ");
035            s.append(n.getCoor().lon());
036            s.append('\n');
037        }
038        ClipboardUtils.copyString(s.toString().trim());
039    }
040
041    @Override
042    protected void updateEnabledState() {
043        setEnabled(!getSelectedNodes().isEmpty());
044    }
045
046    @Override
047    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
048        updateEnabledState();
049    }
050
051    private Collection<Node> getSelectedNodes() {
052        DataSet ds = getLayerManager().getEditDataSet();
053        if (ds == null || ds.getSelected() == null) {
054            return Collections.emptyList();
055        } else {
056            return Utils.filteredCollection(ds.getSelected(), Node.class);
057        }
058    }
059}