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}