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