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