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}