001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation.actions;
003
004import java.util.ArrayList;
005import java.util.Collections;
006import java.util.List;
007
008import org.openstreetmap.josm.data.osm.OsmPrimitive;
009import org.openstreetmap.josm.data.osm.Relation;
010import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
011import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
012import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
013
014/**
015 * Abstract superclass of "Add from selection" actions.
016 * @since 9496
017 */
018abstract class AddFromSelectionAction extends AbstractRelationEditorAction {
019    private static final long serialVersionUID = 1L;
020
021    protected AddFromSelectionAction(IRelationEditorActionAccess editorAccess,
022            IRelationEditorUpdateOn... updateOn) {
023        super(editorAccess, updateOn);
024    }
025
026    protected boolean isPotentialDuplicate(OsmPrimitive primitive) {
027        return editorAccess.getMemberTableModel().hasMembersReferringTo(Collections.singleton(primitive));
028    }
029
030    protected List<OsmPrimitive> filterConfirmedPrimitives(List<OsmPrimitive> primitives) throws AddAbortException {
031        if (primitives == null || primitives.isEmpty())
032            return primitives;
033        List<OsmPrimitive> ret = new ArrayList<>();
034        ConditionalOptionPaneUtil.startBulkOperation("add_primitive_to_relation");
035        for (OsmPrimitive primitive : primitives) {
036            if (primitive instanceof Relation
037                    && editorAccess.getEditor().getRelation() != null && editorAccess.getEditor().getRelation().equals(primitive)) {
038                GenericRelationEditor.warnOfCircularReferences(primitive);
039                continue;
040            }
041            if (isPotentialDuplicate(primitive)) {
042                if (GenericRelationEditor.confirmAddingPrimitive(primitive)) {
043                    ret.add(primitive);
044                }
045            } else {
046                ret.add(primitive);
047            }
048        }
049        ConditionalOptionPaneUtil.endBulkOperation("add_primitive_to_relation");
050        return ret;
051    }
052}