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