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.Predicate; 018import org.openstreetmap.josm.tools.Utils; 019 020/** 021 * Action for downloading incomplete members of selected relations 022 * @since 5793 023 */ 024public class DownloadSelectedIncompleteMembersAction extends AbstractRelationAction { 025 026 private transient Collection<OsmPrimitive> incompleteMembers; 027 028 /** 029 * Constructs a new <code>DownloadSelectedIncompleteMembersAction</code>. 030 */ 031 public DownloadSelectedIncompleteMembersAction() { 032 putValue(SHORT_DESCRIPTION, tr("Download incomplete members of selected relations")); 033 putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected")); 034 putValue(NAME, tr("Download incomplete members")); 035 } 036 037 /** 038 * Returns the set of incomplete members of the given relations. 039 * @param rels The relations to inspect. 040 * @return The set of incomplete members of the given relations. 041 */ 042 public static Set<OsmPrimitive> buildSetOfIncompleteMembers(Collection<Relation> rels) { 043 Set<OsmPrimitive> ret = new HashSet<>(); 044 for (Relation r : rels) { 045 ret.addAll(Utils.filter(r.getIncompleteMembers(), new Predicate<OsmPrimitive>() { 046 @Override 047 public boolean evaluate(OsmPrimitive osm) { 048 return !osm.isNew(); 049 } 050 })); 051 } 052 return ret; 053 } 054 055 @Override 056 public void actionPerformed(ActionEvent e) { 057 if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return; 058 Main.worker.submit(new DownloadRelationMemberTask( 059 relations, 060 incompleteMembers, 061 Main.main.getEditLayer())); 062 } 063 064 @Override 065 public void setPrimitives(Collection<? extends OsmPrimitive> primitives) { 066 // selected relations with incomplete members 067 this.relations = Utils.filter(getRelations(primitives), new Predicate<Relation>() { 068 @Override 069 public boolean evaluate(Relation r) { 070 return r.hasIncompleteMembers(); 071 } 072 }); 073 this.incompleteMembers = buildSetOfIncompleteMembers(relations); 074 updateEnabledState(); 075 } 076 077 @Override 078 protected void updateEnabledState() { 079 setEnabled(!relations.isEmpty() && !incompleteMembers.isEmpty() && !Main.isOffline(OnlineResource.OSM_API)); 080 } 081}