001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions.relation;
003
004import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005import static org.openstreetmap.josm.tools.I18n.tr;
006
007import java.awt.event.ActionEvent;
008import java.util.List;
009import java.util.stream.Collectors;
010
011import org.openstreetmap.josm.data.osm.IPrimitive;
012import org.openstreetmap.josm.data.osm.PrimitiveId;
013import org.openstreetmap.josm.gui.MainApplication;
014import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask;
015import org.openstreetmap.josm.tools.ImageProvider;
016
017/**
018 * The action for downloading members of relations
019 * @since 5793
020 */
021public class DownloadMembersAction extends AbstractRelationAction {
022
023    /**
024     * Constructs a new <code>DownloadMembersAction</code>.
025     */
026    public DownloadMembersAction() {
027        putValue(SHORT_DESCRIPTION, tr("Download all members of the selected relations"));
028        putValue(NAME, tr("Download members"));
029        new ImageProvider("dialogs", "downloadincomplete").getResource().attachImageIcon(this, true);
030        setHelpId(ht("/Dialog/RelationList#DownloadMembers"));
031    }
032
033    @Override
034    public void actionPerformed(ActionEvent e) {
035        if (!isEnabled() || relations.isEmpty() || !MainApplication.isDisplayingMapView()) return;
036        List<PrimitiveId> members = relations.stream()
037                .flatMap(r -> r.getMemberPrimitivesList().stream().filter(osm -> !osm.isNew()).map(IPrimitive::getOsmPrimitiveId))
038                .distinct()
039                .collect(Collectors.toList());
040
041        MainApplication.worker.submit(new DownloadPrimitivesTask(MainApplication.getLayerManager().getEditLayer(), members, false));
042    }
043
044    @Override
045    protected void updateEnabledState() {
046        setEnabled(canDownload());
047    }
048}