001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.dialogs.relation.actions; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.event.ActionEvent; 007import java.util.ArrayList; 008import java.util.List; 009 010import javax.swing.JOptionPane; 011 012import org.openstreetmap.josm.Main; 013import org.openstreetmap.josm.data.osm.DataSet; 014import org.openstreetmap.josm.data.osm.OsmPrimitive; 015import org.openstreetmap.josm.data.osm.PrimitiveData; 016import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException; 017import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor; 018import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel; 019import org.openstreetmap.josm.gui.layer.OsmDataLayer; 020 021/** 022 * Paste members. 023 * @since 9496 024 */ 025public class PasteMembersAction extends AddFromSelectionAction { 026 027 /** 028 * Constructs a new {@code PasteMembersAction}. 029 * @param memberTableModel member table model 030 * @param layer OSM data layer 031 * @param editor relation editor 032 */ 033 public PasteMembersAction(MemberTableModel memberTableModel, OsmDataLayer layer, IRelationEditor editor) { 034 super(null, memberTableModel, null, null, null, layer, editor); 035 } 036 037 @Override 038 public void actionPerformed(ActionEvent e) { 039 try { 040 List<PrimitiveData> primitives = Main.pasteBuffer.getDirectlyAdded(); 041 DataSet ds = layer.data; 042 List<OsmPrimitive> toAdd = new ArrayList<>(); 043 boolean hasNewInOtherLayer = false; 044 045 for (PrimitiveData primitive: primitives) { 046 OsmPrimitive primitiveInDs = ds.getPrimitiveById(primitive); 047 if (primitiveInDs != null) { 048 toAdd.add(primitiveInDs); 049 } else if (!primitive.isNew()) { 050 OsmPrimitive p = primitive.getType().newInstance(primitive.getUniqueId(), true); 051 ds.addPrimitive(p); 052 toAdd.add(p); 053 } else { 054 hasNewInOtherLayer = true; 055 break; 056 } 057 } 058 059 if (hasNewInOtherLayer) { 060 JOptionPane.showMessageDialog(Main.parent, 061 tr("Members from paste buffer cannot be added because they are not included in current layer")); 062 return; 063 } 064 065 toAdd = filterConfirmedPrimitives(toAdd); 066 int index = memberTableModel.getSelectionModel().getMaxSelectionIndex(); 067 if (index == -1) { 068 index = memberTableModel.getRowCount() - 1; 069 } 070 memberTableModel.addMembersAfterIdx(toAdd, index); 071 072 } catch (AddAbortException ex) { 073 Main.trace(ex); 074 } 075 } 076 077 @Override 078 protected void updateEnabledState() { 079 // Do nothing 080 } 081}