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}