001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation.actions;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.event.ActionEvent;
007import java.util.ArrayList;
008import java.util.List;
009
010import javax.swing.JOptionPane;
011
012import org.openstreetmap.josm.Main;
013import org.openstreetmap.josm.data.osm.DataSet;
014import org.openstreetmap.josm.data.osm.OsmPrimitive;
015import org.openstreetmap.josm.data.osm.PrimitiveData;
016import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
017import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
018import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
019import org.openstreetmap.josm.gui.layer.OsmDataLayer;
020
021/**
022 * Paste members.
023 * @since 9496
024 */
025public class PasteMembersAction extends AddFromSelectionAction {
026
027    /**
028     * Constructs a new {@code PasteMembersAction}.
029     * @param memberTableModel member table model
030     * @param layer OSM data layer
031     * @param editor relation editor
032     */
033    public PasteMembersAction(MemberTableModel memberTableModel, OsmDataLayer layer, IRelationEditor editor) {
034        super(null, memberTableModel, null, null, null, layer, editor);
035    }
036
037    @Override
038    public void actionPerformed(ActionEvent e) {
039        try {
040            List<PrimitiveData> primitives = Main.pasteBuffer.getDirectlyAdded();
041            DataSet ds = layer.data;
042            List<OsmPrimitive> toAdd = new ArrayList<>();
043            boolean hasNewInOtherLayer = false;
044
045            for (PrimitiveData primitive: primitives) {
046                OsmPrimitive primitiveInDs = ds.getPrimitiveById(primitive);
047                if (primitiveInDs != null) {
048                    toAdd.add(primitiveInDs);
049                } else if (!primitive.isNew()) {
050                    OsmPrimitive p = primitive.getType().newInstance(primitive.getUniqueId(), true);
051                    ds.addPrimitive(p);
052                    toAdd.add(p);
053                } else {
054                    hasNewInOtherLayer = true;
055                    break;
056                }
057            }
058
059            if (hasNewInOtherLayer) {
060                JOptionPane.showMessageDialog(Main.parent,
061                        tr("Members from paste buffer cannot be added because they are not included in current layer"));
062                return;
063            }
064
065            toAdd = filterConfirmedPrimitives(toAdd);
066            int index = memberTableModel.getSelectionModel().getMaxSelectionIndex();
067            if (index == -1) {
068                index = memberTableModel.getRowCount() - 1;
069            }
070            memberTableModel.addMembersAfterIdx(toAdd, index);
071
072        } catch (AddAbortException ex) {
073            if (Main.isTraceEnabled()) {
074                Main.trace(ex.getMessage());
075            }
076        }
077    }
078
079    @Override
080    protected void updateEnabledState() {
081        // Do nothing
082    }
083}