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