001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.actions.relation; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005import static org.openstreetmap.josm.tools.I18n.trn; 006 007import java.awt.event.ActionEvent; 008import java.util.Collection; 009import java.util.HashSet; 010import java.util.Set; 011 012import javax.swing.JOptionPane; 013 014import org.openstreetmap.josm.Main; 015import org.openstreetmap.josm.data.osm.OsmPrimitive; 016import org.openstreetmap.josm.data.osm.Relation; 017import org.openstreetmap.josm.data.osm.RelationMember; 018import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor; 019import org.openstreetmap.josm.gui.layer.OsmDataLayer; 020import org.openstreetmap.josm.tools.ImageProvider; 021 022/** 023 * The action for editing a relation. 024 * @since 5793 025 */ 026public class EditRelationAction extends AbstractRelationAction { 027 028 /** 029 * Constructs a new <code>EditRelationAction</code>. 030 */ 031 public EditRelationAction() { 032 putValue(NAME, tr("Edit")); 033 putValue(SHORT_DESCRIPTION, tr("Call relation editor for selected relation")); 034 new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this, true); 035 } 036 037 /** 038 * Returns the set of currently selected relation members for the given relation. 039 * @param r The relation to inspect 040 * @return The set of currently selected relation members for the given relation. 041 */ 042 public static Set<RelationMember> getMembersForCurrentSelection(Relation r) { 043 Set<RelationMember> members = new HashSet<>(); 044 if (Main.isDisplayingMapView()) { 045 OsmDataLayer editLayer = Main.getLayerManager().getEditLayer(); 046 if (editLayer != null && editLayer.data != null) { 047 Collection<OsmPrimitive> selection = editLayer.data.getSelected(); 048 for (RelationMember member: r.getMembers()) { 049 if (selection.contains(member.getMember())) { 050 members.add(member); 051 } 052 } 053 } 054 } 055 return members; 056 } 057 058 /** 059 * Launches relation editor for the given relation. 060 * @param toEdit The relation to edit 061 */ 062 public static void launchEditor(Relation toEdit) { 063 if (toEdit == null || toEdit.isDeleted() || !Main.isDisplayingMapView()) return; 064 RelationEditor.getEditor(Main.getLayerManager().getEditLayer(), toEdit, 065 getMembersForCurrentSelection(toEdit)).setVisible(true); 066 } 067 068 @Override 069 public void actionPerformed(ActionEvent e) { 070 if (!isEnabled() || relations.isEmpty()) return; 071 if (relations.size() > Main.pref.getInteger("warn.open.maxrelations", 5) && 072 /* I18N english text for value 1 makes no real sense, never called for values <= maxrel (usually 5) */ 073 JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(Main.parent, 074 "<html>"+trn("You are about to open <b>{0}</b> different relation editor simultaneously.<br/>Do you want to continue?", 075 "You are about to open <b>{0}</b> different relation editors simultaneously.<br/>Do you want to continue?", 076 relations.size(), relations.size())+"</html>", 077 tr("Confirmation"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE)) { 078 return; 079 } 080 for (Relation r : relations) { 081 launchEditor(r); 082 } 083 } 084 085 @Override 086 protected void updateEnabledState() { 087 boolean enabled = false; 088 for (Relation r : relations) { 089 if (!r.isDeleted()) { 090 enabled = true; 091 break; 092 } 093 } 094 setEnabled(enabled); 095 } 096}