source: subversion/applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/actions/CopyTagsAction.java

Last change on this file was 34454, checked in by donvip, 8 months ago

update to JOSM 14153

File size: 3.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins.utilsplugin2.actions;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.event.ActionEvent;
8import java.awt.event.KeyEvent;
9import java.util.Collection;
10import java.util.Map.Entry;
11import java.util.Set;
12import java.util.TreeSet;
13
14import javax.swing.JOptionPane;
15
16import org.openstreetmap.josm.actions.JosmAction;
17import org.openstreetmap.josm.data.osm.OsmPrimitive;
18import org.openstreetmap.josm.data.osm.Tag;
19import org.openstreetmap.josm.gui.MainApplication;
20import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
21import org.openstreetmap.josm.gui.layer.OsmDataLayer;
22import org.openstreetmap.josm.tools.Shortcut;
23import org.openstreetmap.josm.tools.Utils;
24
25/**
26 * Copy OSM primitives to clipboard in order to paste them, or their tags, somewhere else.
27 * @since 404
28 */
29public final class CopyTagsAction extends JosmAction {
30
31    /**
32     * Constructs a new {@code CopyTagsAction}.
33     */
34    public CopyTagsAction() {
35        super(tr("Copy Tags"), "copy",
36                tr("Copy all tags of selected objects to paste buffer."),
37                createShortcut(), true, CopyTagsAction.class.getName(), true);
38        putValue("help", ht("/Action/CopyTags"));
39    }
40
41    public static Shortcut createShortcut() {
42        return Shortcut.registerShortcut("system:copytags", tr("Edit: {0}", tr("Copy Tags")), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE);
43    }
44
45    @Override
46    public void actionPerformed(ActionEvent e) {
47        if (isEmptySelection()) return;
48        Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
49        copy(getLayerManager().getEditLayer(), selection);
50    }
51
52    /**
53     * Copies the tags of object to the clipboard. The output by this function
54     * looks similar to: key=value\nkey=value
55     * @param source The OSM data layer source
56     * @param primitives The OSM primitives to copy
57     */
58    public static void copy(OsmDataLayer source, Collection<OsmPrimitive> primitives) {
59        Set<String> values = new TreeSet<>();
60        for (OsmPrimitive p : primitives) {
61            for (Entry<String, String> kv : p.getKeys().entrySet()) {
62                values.add(new Tag(kv.getKey(), kv.getValue()).toString());
63            }
64        }
65        if (!values.isEmpty())
66            ClipboardUtils.copyString(Utils.join("\n", values));
67    }
68
69    @Override
70    protected void updateEnabledState() {
71        updateEnabledStateOnCurrentSelection();
72    }
73
74    @Override
75    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
76        setEnabled(selection != null && !selection.isEmpty());
77    }
78
79    private boolean isEmptySelection() {
80        Collection<OsmPrimitive> sel = getLayerManager().getEditDataSet().getSelected();
81        if (sel.isEmpty()) {
82            JOptionPane.showMessageDialog(
83                    MainApplication.getMainFrame(),
84                    tr("Please select something to copy."),
85                    tr("Information"),
86                    JOptionPane.INFORMATION_MESSAGE
87                    );
88            return true;
89        }
90        return false;
91    }
92}
Note: See TracBrowser for help on using the repository browser.