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