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