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.io.OnlineResource;
016import org.openstreetmap.josm.tools.ImageProvider;
017import org.openstreetmap.josm.tools.SubclassFilteredCollection;
018
019/**
020 * Action for downloading incomplete members of selected relations
021 * @since 5793
022 */
023public class DownloadSelectedIncompleteMembersAction extends AbstractRelationAction {
024
025    private transient Collection<OsmPrimitive> incompleteMembers;
026
027    /**
028     * Constructs a new <code>DownloadSelectedIncompleteMembersAction</code>.
029     */
030    public DownloadSelectedIncompleteMembersAction() {
031        putValue(SHORT_DESCRIPTION, tr("Download incomplete members of selected relations"));
032        putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected"));
033        putValue(NAME, tr("Download incomplete members"));
034    }
035
036    /**
037     * Returns the set of incomplete members of the given relations.
038     * @param rels The relations to inspect.
039     * @return The set of incomplete members of the given relations.
040     */
041    public static Set<OsmPrimitive> buildSetOfIncompleteMembers(Collection<Relation> rels) {
042        Set<OsmPrimitive> ret = new HashSet<>();
043        for (Relation r : rels) {
044            ret.addAll(SubclassFilteredCollection.filter(r.getIncompleteMembers(), osm -> !osm.isNew()));
045        }
046        return ret;
047    }
048
049    @Override
050    public void actionPerformed(ActionEvent e) {
051        if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return;
052        Main.worker.submit(new DownloadRelationMemberTask(
053                relations,
054                incompleteMembers,
055                Main.getLayerManager().getEditLayer()));
056    }
057
058    @Override
059    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
060        // selected relations with incomplete members
061        this.relations = SubclassFilteredCollection.filter(getRelations(primitives), Relation::hasIncompleteMembers);
062        this.incompleteMembers = buildSetOfIncompleteMembers(relations);
063        updateEnabledState();
064    }
065
066    @Override
067    protected void updateEnabledState() {
068        setEnabled(!relations.isEmpty() && !incompleteMembers.isEmpty() && !Main.isOffline(OnlineResource.OSM_API));
069    }
070}