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}