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.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 Set<IPrimitive> ret = new HashSet<>(); 045 for (IRelation<?> r : rels) { 046 ret.addAll(SubclassFilteredCollection.filter(r.getIncompleteMembers(), osm -> !osm.isNew())); 047 } 048 return ret; 049 } 050 051 @Override 052 public void actionPerformed(ActionEvent e) { 053 if (!isEnabled() || relations.isEmpty() || !MainApplication.isDisplayingMapView()) return; 054 MainApplication.worker.submit(new DownloadRelationMemberTask( 055 Utils.filteredCollection(relations, Relation.class), 056 Utils.filteredCollection(incompleteMembers, OsmPrimitive.class), 057 MainApplication.getLayerManager().getEditLayer())); 058 } 059 060 @Override 061 public void setPrimitives(Collection<? extends IPrimitive> primitives) { 062 // selected relations with incomplete members 063 this.relations = SubclassFilteredCollection.filter(getRelations(primitives), IRelation::hasIncompleteMembers); 064 this.incompleteMembers = buildSetOfIncompleteMembers(relations); 065 updateEnabledState(); 066 } 067 068 @Override 069 protected void updateEnabledState() { 070 setEnabled(!incompleteMembers.isEmpty() && canDownload()); 071 } 072}