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;
013import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
014import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
015import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
016import org.openstreetmap.josm.gui.dialogs.relation.SelectionTable;
017import org.openstreetmap.josm.gui.dialogs.relation.SelectionTableModel;
018import org.openstreetmap.josm.gui.layer.OsmDataLayer;
019
020/**
021 * Abstract superclass of "Add from selection" actions.
022 * @since 9496
023 */
024abstract class AddFromSelectionAction extends AbstractRelationEditorAction {
025
026    protected final SelectionTable selectionTable;
027    protected final SelectionTableModel selectionTableModel;
028
029    protected AddFromSelectionAction(MemberTable memberTable, MemberTableModel memberTableModel, SelectionTable selectionTable,
030            SelectionTableModel selectionTableModel, String actionMapKey, OsmDataLayer layer, IRelationEditor editor) {
031        super(memberTable, memberTableModel, actionMapKey, layer, editor);
032        this.selectionTable = selectionTable;
033        this.selectionTableModel = selectionTableModel;
034    }
035
036    protected boolean isPotentialDuplicate(OsmPrimitive primitive) {
037        return memberTableModel.hasMembersReferringTo(Collections.singleton(primitive));
038    }
039
040    protected List<OsmPrimitive> filterConfirmedPrimitives(List<OsmPrimitive> primitives) throws AddAbortException {
041        if (primitives == null || primitives.isEmpty())
042            return primitives;
043        List<OsmPrimitive> ret = new ArrayList<>();
044        ConditionalOptionPaneUtil.startBulkOperation("add_primitive_to_relation");
045        for (OsmPrimitive primitive : primitives) {
046            if (primitive instanceof Relation && editor.getRelation() != null && editor.getRelation().equals(primitive)) {
047                GenericRelationEditor.warnOfCircularReferences(primitive);
048                continue;
049            }
050            if (isPotentialDuplicate(primitive)) {
051                if (GenericRelationEditor.confirmAddingPrimitive(primitive)) {
052                    ret.add(primitive);
053                }
054                continue;
055            } else {
056                ret.add(primitive);
057            }
058        }
059        ConditionalOptionPaneUtil.endBulkOperation("add_primitive_to_relation");
060        return ret;
061    }
062}