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.data.osm.RelationMember; 015import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor; 016import org.openstreetmap.josm.gui.layer.OsmDataLayer; 017import org.openstreetmap.josm.tools.ImageProvider; 018 019/** 020 * The action for editing a relation 021 * @since 5793 022 */ 023public class EditRelationAction extends AbstractRelationAction { 024 025 /** 026 * Constructs a new <code>EditRelationAction</code>. 027 */ 028 public EditRelationAction() { 029 putValue(NAME, tr("Edit")); 030 putValue(SHORT_DESCRIPTION, tr("Call relation editor for selected relation")); 031 putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit")); 032 } 033 034 /** 035 * Returns the set of currently selected relation members for the given relation. 036 * @param r The relation to inspect 037 * @return The set of currently selected relation members for the given relation. 038 */ 039 public static Set<RelationMember> getMembersForCurrentSelection(Relation r) { 040 Set<RelationMember> members = new HashSet<RelationMember>(); 041 if (Main.isDisplayingMapView()) { 042 OsmDataLayer editLayer = Main.main.getEditLayer(); 043 if (editLayer != null && editLayer.data != null) { 044 Collection<OsmPrimitive> selection = editLayer.data.getSelected(); 045 for (RelationMember member: r.getMembers()) { 046 if (selection.contains(member.getMember())) { 047 members.add(member); 048 } 049 } 050 } 051 } 052 return members; 053 } 054 055 /** 056 * Launches relation editor for the given relation. 057 * @param toEdit The relation to edit 058 */ 059 public static void launchEditor(Relation toEdit) { 060 if (toEdit == null || !Main.isDisplayingMapView()) return; 061 RelationEditor.getEditor(Main.main.getEditLayer(), toEdit, 062 getMembersForCurrentSelection(toEdit)).setVisible(true); 063 } 064 065 @Override 066 public void actionPerformed(ActionEvent e) { 067 if (!isEnabled() || relations.size()!=1) return; 068 launchEditor(relations.iterator().next()); 069 } 070 071 @Override 072 protected void updateEnabledState() { 073 // only one selected relation can be edited 074 setEnabled( relations.size()==1 ); 075 } 076}