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