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.data.validation.tests.RelationChecker; 011import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil; 012import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor; 013import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException; 014import org.openstreetmap.josm.tools.Utils; 015 016/** 017 * Abstract superclass of "Add from selection" actions. 018 * @since 9496 019 */ 020abstract class AddFromSelectionAction extends AbstractRelationEditorAction { 021 private static final long serialVersionUID = 1L; 022 023 protected AddFromSelectionAction(IRelationEditorActionAccess editorAccess, 024 IRelationEditorUpdateOn... updateOn) { 025 super(editorAccess, updateOn); 026 } 027 028 protected boolean isPotentialDuplicate(OsmPrimitive primitive) { 029 return editorAccess.getMemberTableModel().hasMembersReferringTo(Collections.singleton(primitive)); 030 } 031 032 protected List<OsmPrimitive> filterConfirmedPrimitives(List<OsmPrimitive> primitives) throws AddAbortException { 033 if (Utils.isEmpty(primitives)) 034 return primitives; 035 List<OsmPrimitive> ret = new ArrayList<>(); 036 ConditionalOptionPaneUtil.startBulkOperation("add_primitive_to_relation"); 037 for (OsmPrimitive primitive : primitives) { 038 if (primitive instanceof Relation) { 039 List<Relation> loop = RelationChecker.checkAddMember(editorAccess.getEditor().getRelation(), (Relation) primitive); 040 if (!loop.isEmpty() && loop.get(0).equals(loop.get(loop.size() - 1))) { 041 GenericRelationEditor.warnOfCircularReferences(primitive, loop); 042 continue; 043 } 044 } 045 if (isPotentialDuplicate(primitive)) { 046 if (GenericRelationEditor.confirmAddingPrimitive(primitive)) { 047 ret.add(primitive); 048 } 049 } else { 050 ret.add(primitive); 051 } 052 } 053 ConditionalOptionPaneUtil.endBulkOperation("add_primitive_to_relation"); 054 return ret; 055 } 056}