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;
016
017/**
018 * User action to copy the coordinates of one or several node(s) to the clipboard.
019 */
020public class CopyCoordinatesAction extends JosmAction {
021
022    /**
023     * Constructs a new {@code CopyCoordinatesAction}.
024     */
025    public CopyCoordinatesAction() {
026        super(tr("Copy Coordinates"), null,
027                tr("Copy coordinates of selected nodes to clipboard."),
028                Shortcut.registerShortcut("copy:coordinates", tr("Edit: {0}", tr("Copy Coordinates")),
029                KeyEvent.VK_C, Shortcut.CTRL_SHIFT),
030                false);
031        putValue("toolbar", "copy/coordinates");
032    }
033
034    @Override
035    public void actionPerformed(ActionEvent ae) {
036        StringBuilder s = new StringBuilder();
037        for (Node n : getSelectedNodes()) {
038            s.append(n.lat());
039            s.append(", ");
040            s.append(n.lon());
041            s.append('\n');
042        }
043        ClipboardUtils.copyString(s.toString().trim());
044    }
045
046    @Override
047    protected void updateEnabledState() {
048        setEnabled(!getSelectedNodes().isEmpty());
049    }
050
051    @Override
052    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
053        updateEnabledState();
054    }
055
056    private Collection<Node> getSelectedNodes() {
057        DataSet ds = getLayerManager().getActiveDataSet();
058        if (ds == null) {
059            return Collections.emptyList();
060        } else {
061            return ds.getSelectedNodes();
062        }
063    }
064}