001 // License: GPL. Copyright 2007 by Immanuel Scholz and others
002 // Author: David Earl
003 package org.openstreetmap.josm.actions;
004
005 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
006 import static org.openstreetmap.josm.tools.I18n.tr;
007
008 import java.awt.event.ActionEvent;
009 import java.awt.event.KeyEvent;
010 import java.util.Collection;
011
012 import javax.swing.JOptionPane;
013
014 import org.openstreetmap.josm.Main;
015 import org.openstreetmap.josm.data.osm.OsmPrimitive;
016 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
017 import org.openstreetmap.josm.tools.Shortcut;
018 import org.openstreetmap.josm.tools.Utils;
019
020 public final class CopyAction extends JosmAction {
021
022 public CopyAction() {
023 super(tr("Copy"), "copy",
024 tr("Copy selected objects to paste buffer."),
025 Shortcut.registerShortcut("system:copy", tr("Edit: {0}", tr("Copy")), KeyEvent.VK_C, Shortcut.CTRL), true);
026 putValue("help", ht("/Action/Copy"));
027 }
028
029 @Override
030 public void actionPerformed(ActionEvent e) {
031 if(isEmptySelection()) return;
032 Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
033
034 copy(getEditLayer(), selection);
035 }
036
037 public static void copy(OsmDataLayer source, Collection<OsmPrimitive> primitives) {
038 /* copy ids to the clipboard */
039 StringBuilder idsBuilder = new StringBuilder();
040 for (OsmPrimitive p : primitives) {
041 idsBuilder.append(p.getId()).append(",");
042 }
043 String ids = idsBuilder.substring(0, idsBuilder.length() - 1);
044 Utils.copyToClipboard(ids);
045
046 Main.pasteBuffer.makeCopy(primitives);
047 Main.pasteSource = source;
048 }
049
050 @Override
051 protected void updateEnabledState() {
052 if (getCurrentDataSet() == null) {
053 setEnabled(false);
054 } else {
055 updateEnabledState(getCurrentDataSet().getSelected());
056 }
057 }
058
059 @Override
060 protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
061 setEnabled(selection != null && !selection.isEmpty());
062 }
063
064 private boolean isEmptySelection() {
065 Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
066 if (sel.isEmpty()) {
067 JOptionPane.showMessageDialog(
068 Main.parent,
069 tr("Please select something to copy."),
070 tr("Information"),
071 JOptionPane.INFORMATION_MESSAGE
072 );
073 return true;
074 }
075 return false;
076 }
077 }