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