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}