source: josm/trunk/src/org/openstreetmap/josm/actions/CopyAction.java@ 6706

Last change on this file since 6706 was 6451, checked in by Don-vip, 10 years ago

fix #6614 - add CUA shortcuts for copy/paste (ctrl-inser and shift-inser)

  • Property svn:eol-style set to native
File size: 3.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2// Author: David Earl
3package org.openstreetmap.josm.actions;
4
5import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
6import static org.openstreetmap.josm.tools.I18n.tr;
7
8import java.awt.event.ActionEvent;
9import java.awt.event.KeyEvent;
10import java.util.Collection;
11
12import javax.swing.JOptionPane;
13
14import org.openstreetmap.josm.Main;
15import org.openstreetmap.josm.data.osm.OsmPrimitive;
16import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
17import org.openstreetmap.josm.gui.layer.OsmDataLayer;
18import org.openstreetmap.josm.tools.Shortcut;
19import org.openstreetmap.josm.tools.Utils;
20
21/**
22 * Copy OSM primitives to clipboard in order to paste them, or their tags, somewhere else.
23 * @since 404
24 */
25public final class CopyAction extends JosmAction {
26
27 // regular expression that matches text clipboard contents after copying
28 public static final String CLIPBOARD_REGEXP = "((node|way|relation)\\s\\d+,)*(node|way|relation)\\s\\d+";
29
30 /**
31 * Constructs a new {@code CopyAction}.
32 */
33 public CopyAction() {
34 super(tr("Copy"), "copy",
35 tr("Copy selected objects to paste buffer."),
36 Shortcut.registerShortcut("system:copy", tr("Edit: {0}", tr("Copy")), KeyEvent.VK_C, Shortcut.CTRL), true);
37 putValue("help", ht("/Action/Copy"));
38 // CUA shortcut for copy (http://en.wikipedia.org/wiki/IBM_Common_User_Access#Description)
39 Main.registerActionShortcut(this,
40 Shortcut.registerShortcut("system:copy:cua", tr("Edit: {0}", tr("Copy")), KeyEvent.VK_INSERT, Shortcut.CTRL));
41 }
42
43 @Override
44 public void actionPerformed(ActionEvent e) {
45 if(isEmptySelection()) return;
46 Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
47
48 copy(getEditLayer(), selection);
49 }
50
51 /**
52 * Copies the given primitive ids to the clipboard. The output by this function
53 * looks similar to: node 1089302677,node 1089303458,way 93793372
54 * @param source The OSM data layer source
55 * @param primitives The OSM primitives to copy
56 */
57 public static void copy(OsmDataLayer source, Collection<OsmPrimitive> primitives) {
58 /* copy ids to the clipboard */
59 StringBuilder idsBuilder = new StringBuilder();
60 for (OsmPrimitive p : primitives) {
61 idsBuilder.append(OsmPrimitiveType.from(p).getAPIName()).append(" ");
62 idsBuilder.append(p.getId()).append(",");
63 }
64 String ids = idsBuilder.substring(0, idsBuilder.length() - 1);
65 Utils.copyToClipboard(ids);
66
67 Main.pasteBuffer.makeCopy(primitives);
68 Main.pasteSource = source;
69 }
70
71 @Override
72 protected void updateEnabledState() {
73 if (getCurrentDataSet() == null) {
74 setEnabled(false);
75 } else {
76 updateEnabledState(getCurrentDataSet().getSelected());
77 }
78 }
79
80 @Override
81 protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
82 setEnabled(selection != null && !selection.isEmpty());
83 }
84
85 private boolean isEmptySelection() {
86 Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
87 if (sel.isEmpty()) {
88 JOptionPane.showMessageDialog(
89 Main.parent,
90 tr("Please select something to copy."),
91 tr("Information"),
92 JOptionPane.INFORMATION_MESSAGE
93 );
94 return true;
95 }
96 return false;
97 }
98}
Note: See TracBrowser for help on using the repository browser.