// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.actions.relation;
import static org.openstreetmap.josm.tools.I18n.tr;
import static org.openstreetmap.josm.tools.I18n.trn;
import java.awt.event.ActionEvent;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JOptionPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.osm.RelationMember;
import org.openstreetmap.josm.gui.MainApplication;
import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.tools.ImageProvider;
/**
* The action for editing a relation.
* @since 5793
*/
public class EditRelationAction extends AbstractRelationAction {
/**
* Constructs a new EditRelationAction
.
*/
public EditRelationAction() {
putValue(NAME, tr("Edit"));
putValue(SHORT_DESCRIPTION, tr("Call relation editor for selected relation"));
new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this, true);
}
/**
* Returns the set of currently selected relation members for the given relation.
* @param r The relation to inspect
* @return The set of currently selected relation members for the given relation.
*/
public static Set getMembersForCurrentSelection(Relation r) {
Set members = new HashSet<>();
if (MainApplication.isDisplayingMapView()) {
OsmDataLayer editLayer = MainApplication.getLayerManager().getEditLayer();
if (editLayer != null && editLayer.data != null) {
Collection selection = editLayer.data.getSelected();
for (RelationMember member: r.getMembers()) {
if (selection.contains(member.getMember())) {
members.add(member);
}
}
}
}
return members;
}
/**
* Launches relation editor for the given relation.
* @param toEdit The relation to edit
*/
public static void launchEditor(Relation toEdit) {
if (toEdit == null || toEdit.isDeleted() || !MainApplication.isDisplayingMapView()) return;
RelationEditor.getEditor(MainApplication.getLayerManager().getEditLayer(), toEdit,
getMembersForCurrentSelection(toEdit)).setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (!isEnabled() || relations.isEmpty()) return;
if (relations.size() > Main.pref.getInt("warn.open.maxrelations", 5) &&
/* I18N english text for value 1 makes no real sense, never called for values <= maxrel (usually 5) */
JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(Main.parent,
""+trn("You are about to open {0} different relation editor simultaneously.
Do you want to continue?",
"You are about to open {0} different relation editors simultaneously.
Do you want to continue?",
relations.size(), relations.size())+"",
tr("Confirmation"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE)) {
return;
}
for (Relation r : relations) {
launchEditor(r);
}
}
@Override
protected void updateEnabledState() {
boolean enabled = false;
for (Relation r : relations) {
if (!r.isDeleted()) {
enabled = true;
break;
}
}
setEnabled(enabled);
}
}