001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions.relation;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.event.ActionEvent;
007import java.util.Collection;
008import java.util.HashSet;
009import java.util.Set;
010
011import org.openstreetmap.josm.Main;
012import org.openstreetmap.josm.data.osm.OsmPrimitive;
013import org.openstreetmap.josm.data.osm.Relation;
014import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
015import org.openstreetmap.josm.tools.ImageProvider;
016import org.openstreetmap.josm.tools.Predicate;
017import org.openstreetmap.josm.tools.Utils;
018
019/**
020 * Action for downloading incomplete members of selected relations
021 * @since 5793
022 */
023public class DownloadSelectedIncompleteMembersAction extends AbstractRelationAction {
024
025    /**
026     * Constructs a new <code>DownloadSelectedIncompleteMembersAction</code>.
027     */
028    public DownloadSelectedIncompleteMembersAction() {
029        putValue(SHORT_DESCRIPTION, tr("Download incomplete members of selected relations"));
030        putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected"));
031        putValue(NAME, tr("Download incomplete members"));
032    }
033
034    /**
035     * Returns the set of incomplete members of the given relations.
036     * @param rels The relations to inspect.
037     * @return The set of incomplete members of the given relations.
038     */
039    public Set<OsmPrimitive> buildSetOfIncompleteMembers(Collection<Relation> rels) {
040        Set<OsmPrimitive> ret = new HashSet<>();
041        for (Relation r : rels) {
042            ret.addAll(r.getIncompleteMembers());
043        }
044        return ret;
045    }
046
047    @Override
048    public void actionPerformed(ActionEvent e) {
049        if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return;
050        Main.worker.submit(new DownloadRelationMemberTask(
051                relations,
052                buildSetOfIncompleteMembers(relations),
053                Main.main.getEditLayer()));
054    }
055
056    @Override
057    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
058        // selected relations with incomplete members
059        this.relations = Utils.filter(getRelations(primitives), new Predicate<Relation>(){
060            @Override public boolean evaluate(Relation r) {
061                return !r.isNew() && r.hasIncompleteMembers();
062            }});
063        updateEnabledState();
064    }
065}