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;
010import java.util.Objects;
011import java.util.stream.Collectors;
012
013import org.openstreetmap.josm.data.coor.conversion.CoordinateFormatManager;
014import org.openstreetmap.josm.data.coor.conversion.ICoordinateFormat;
015import org.openstreetmap.josm.data.osm.DataSet;
016import org.openstreetmap.josm.data.osm.Node;
017import org.openstreetmap.josm.data.osm.OsmPrimitive;
018import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
019import org.openstreetmap.josm.tools.Shortcut;
020
021/**
022 * User action to copy the coordinates of one or several node(s) to the clipboard.
023 */
024public class CopyCoordinatesAction extends JosmAction {
025
026    /**
027     * Constructs a new {@code CopyCoordinatesAction}.
028     */
029    public CopyCoordinatesAction() {
030        super(tr("Copy Coordinates"), "copy",
031                tr("Copy coordinates of selected nodes to clipboard."),
032                Shortcut.registerShortcut("copy:coordinates", tr("Edit: {0}", tr("Copy Coordinates")),
033                KeyEvent.VK_C, Shortcut.CTRL_SHIFT),
034                false);
035        setToolbarId("copy/coordinates");
036    }
037
038    @Override
039    public void actionPerformed(ActionEvent ae) {
040        ICoordinateFormat coordinateFormat = CoordinateFormatManager.getDefaultFormat();
041        String string = getSelectedNodes().stream()
042                .map(Node::getCoor)
043                .filter(Objects::nonNull)
044                .map(c -> coordinateFormat.toString(c, ", "))
045                .collect(Collectors.joining("\n"));
046        ClipboardUtils.copyString(string);
047    }
048
049    @Override
050    protected void updateEnabledState() {
051        setEnabled(!getSelectedNodes().isEmpty());
052    }
053
054    @Override
055    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
056        updateEnabledState();
057    }
058
059    private Collection<Node> getSelectedNodes() {
060        DataSet ds = getLayerManager().getActiveDataSet();
061        if (ds == null) {
062            return Collections.emptyList();
063        } else {
064            return ds.getSelectedNodes();
065        }
066    }
067}