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}