001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.actions.relation; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005import static org.openstreetmap.josm.tools.I18n.trn; 006 007import java.awt.event.ActionEvent; 008import java.util.Collection; 009import java.util.Objects; 010 011import javax.swing.JOptionPane; 012 013import org.openstreetmap.josm.command.Command; 014import org.openstreetmap.josm.command.SequenceCommand; 015import org.openstreetmap.josm.data.UndoRedoHandler; 016import org.openstreetmap.josm.data.osm.DataSelectionListener; 017import org.openstreetmap.josm.data.osm.IPrimitive; 018import org.openstreetmap.josm.data.osm.OsmData; 019import org.openstreetmap.josm.data.osm.OsmUtils; 020import org.openstreetmap.josm.data.osm.Relation; 021import org.openstreetmap.josm.gui.MainApplication; 022import org.openstreetmap.josm.gui.Notification; 023import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor; 024import org.openstreetmap.josm.gui.util.GuiHelper; 025import org.openstreetmap.josm.tools.ImageProvider; 026import org.openstreetmap.josm.tools.StreamUtils; 027import org.openstreetmap.josm.tools.Utils; 028 029/** 030 * Add all objects selected in the current dataset after the last member of relation(s). 031 * @since 5799 032 */ 033public class AddSelectionToRelations extends AbstractRelationAction implements DataSelectionListener { 034 /** 035 * Constructs a new <code>AddSelectionToRelation</code>. 036 */ 037 public AddSelectionToRelations() { 038 new ImageProvider("dialogs/conflict", "copyendright").getResource().attachImageIcon(this, true); 039 putValue(SHORT_DESCRIPTION, tr("Add all objects selected in the current dataset after the last member")); 040 } 041 042 @Override 043 public void actionPerformed(ActionEvent e) { 044 Collection<Command> cmds = Utils.filteredCollection(relations, Relation.class).stream() 045 .map(r -> GenericRelationEditor.addPrimitivesToRelation(r, MainApplication.getLayerManager().getActiveDataSet().getSelected())) 046 .filter(Objects::nonNull) 047 .collect(StreamUtils.toUnmodifiableList()); 048 if (!cmds.isEmpty()) { 049 UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Add selection to relation"), cmds)); 050 new Notification( 051 "<html>"+ 052 tr("{0}Add selection to relation{1}: Verify every single relation to avoid damage!", "<strong>", "</strong>")+ 053 "</html>") 054 .setIcon(JOptionPane.WARNING_MESSAGE) 055 .show(); 056 } 057 } 058 059 @Override 060 public void updateEnabledState() { 061 int size = relations.size(); 062 putValue(NAME, trn("Add selection to {0} relation", "Add selection to {0} relations", size, size)); 063 OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData(); 064 if (ds != null) { 065 selectionChanged(ds.getSelected()); 066 } else { 067 setEnabled(false); 068 } 069 } 070 071 private void selectionChanged(final Collection<? extends IPrimitive> newSelection) { 072 GuiHelper.runInEDT(() -> setEnabled(!Utils.isEmpty(newSelection) 073 && OsmUtils.isOsmCollectionEditable(relations))); 074 } 075 076 @Override 077 public void selectionChanged(SelectionChangeEvent event) { 078 selectionChanged(event.getSelection()); 079 } 080}