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