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.Node;
012import org.openstreetmap.josm.data.osm.OsmPrimitive;
013import org.openstreetmap.josm.tools.Shortcut;
014import org.openstreetmap.josm.tools.Utils;
015
016public class CopyCoordinatesAction extends JosmAction {
017
018    public CopyCoordinatesAction() {
019        super(tr("Copy Coordinates"), null,
020                tr("Copy coordinates of selected nodes to clipboard."),
021                Shortcut.registerShortcut("copy:coordinates", tr("Edit: {0}", tr("Copy Coordinates")),
022                KeyEvent.VK_C, Shortcut.CTRL_SHIFT),
023                false);
024        putValue("toolbar", "copy/coordinates");
025    }
026
027    @Override
028    public void actionPerformed(ActionEvent ae) {
029        StringBuilder s = new StringBuilder();
030        for (Node n : getSelectedNodes()) {
031            s.append(n.getCoor().lat());
032            s.append(", ");
033            s.append(n.getCoor().lon());
034            s.append('\n');
035        }
036        Utils.copyToClipboard(s.toString().trim());
037    }
038
039    @Override
040    protected void updateEnabledState() {
041        setEnabled(!getSelectedNodes().isEmpty());
042    }
043
044    @Override
045    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
046        updateEnabledState();
047    }
048
049    private static Collection<Node> getSelectedNodes() {
050        if (getCurrentDataSet() == null || getCurrentDataSet().getSelected() == null) {
051            return Collections.emptyList();
052        } else {
053            return Utils.filteredCollection(getCurrentDataSet().getSelected(), Node.class);
054        }
055    }
056}