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