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