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}