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

Last change on this file was 34822, checked in by gerdp, 3 months ago
  • revert changes to equals methods made in r34812 (pmd complains about new version, errorprone about the previous, no iea which is better)
  • fix remaining checkstyle issue
File size: 5.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins.utilsplugin2.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.datatransfer.UnsupportedFlavorException;
7import java.awt.event.ActionEvent;
8import java.awt.event.KeyEvent;
9import java.io.IOException;
10import java.util.ArrayList;
11import java.util.Collection;
12import java.util.Collections;
13import java.util.HashMap;
14import java.util.List;
15import java.util.Map;
16import java.util.Map.Entry;
17
18import org.openstreetmap.josm.actions.JosmAction;
19import org.openstreetmap.josm.command.ChangeCommand;
20import org.openstreetmap.josm.command.Command;
21import org.openstreetmap.josm.command.SequenceCommand;
22import org.openstreetmap.josm.data.UndoRedoHandler;
23import org.openstreetmap.josm.data.osm.OsmPrimitive;
24import org.openstreetmap.josm.data.osm.PrimitiveData;
25import org.openstreetmap.josm.data.osm.Relation;
26import org.openstreetmap.josm.data.osm.RelationMember;
27import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
28import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
29import org.openstreetmap.josm.tools.Logging;
30import org.openstreetmap.josm.tools.Shortcut;
31import org.openstreetmap.josm.tools.Utils;
32
33/**
34 * Pastes relation membership from objects in the paste buffer onto selected object(s).
35 *
36 * @author Zverik
37 */
38public class PasteRelationsAction extends JosmAction {
39    private static final String TITLE = tr("Paste Relations");
40
41    public PasteRelationsAction() {
42        super(TITLE, "dumbutils/pasterelations", tr("Paste relation membership from objects in the buffer onto selected object(s)"),
43              Shortcut.registerShortcut("tools:pasterelations", tr("Tool: {0}", tr("Paste Relations")), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE),
44              true);
45    }
46
47    @Override
48    public void actionPerformed(ActionEvent e) {
49        Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
50        if (selection.isEmpty())
51            return;
52
53        Map<Relation, String> relations = new HashMap<>();
54        Collection<PrimitiveData> data = Collections.emptySet();
55        try {
56            data = ((PrimitiveTransferData) ClipboardUtils.getClipboard().getData(PrimitiveTransferData.DATA_FLAVOR)).getDirectlyAdded();
57        } catch (UnsupportedFlavorException | IOException ex) {
58            Logging.warn(ex);
59        }
60        for (PrimitiveData pdata : data) {
61            OsmPrimitive p = getLayerManager().getEditDataSet().getPrimitiveById(pdata.getUniqueId(), pdata.getType());
62            if (p != null) {
63                for (Relation r : Utils.filteredCollection(p.getReferrers(), Relation.class)) {
64                    String role = relations.get(r);
65                    for (RelationMember m : r.getMembers()) {
66                        if (m.getMember().equals(p)) {
67                            String newRole = m.getRole();
68                            if (newRole != null && role == null)
69                                role = newRole;
70                            else if (newRole != null ? !newRole.equals(role) : role != null) {
71                                role = "";
72                                break;
73                            }
74                        }
75                    }
76                    relations.put(r, role);
77                }
78            }
79        }
80
81        List<Command> commands = new ArrayList<>();
82        for (Entry<Relation, String> entry : relations.entrySet()) {
83            Relation rel = entry.getKey();
84            Relation r = new Relation(rel);
85            boolean changed = false;
86            for (OsmPrimitive p : selection) {
87                if (!r.getMemberPrimitives().contains(p) && !r.equals(p)) {
88                    String role = entry.getValue();
89                    if ("associatedStreet".equals(r.get("type"))) {
90                        if (p.get("highway") != null) {
91                            role = "street";
92                        } else if (p.get("addr:housenumber") != null) {
93                            role = "house";
94                        }
95                    }
96                    r.addMember(new RelationMember(role, p));
97                    changed = true;
98                }
99            }
100            if (changed)
101                commands.add(new ChangeCommand(rel, r));
102        }
103
104        if (!commands.isEmpty())
105            UndoRedoHandler.getInstance().add(new SequenceCommand(TITLE, commands));
106    }
107
108    @Override
109    protected void updateEnabledState() {
110        updateEnabledStateOnCurrentSelection();
111    }
112
113    @Override
114    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
115        try {
116            setEnabled(selection != null && !selection.isEmpty()
117                    && ClipboardUtils.getClipboard().isDataFlavorAvailable(PrimitiveTransferData.DATA_FLAVOR));
118        } catch (IllegalStateException e) {
119            Logging.warn(e);
120        } catch (NullPointerException e) {
121            // JDK-6322854: On Linux/X11, NPE can happen for unknown reasons, on all versions of Java
122            Logging.error(e);
123        }
124    }
125}
Note: See TracBrowser for help on using the repository browser.