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        putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
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.main.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 || !Main.isDisplayingMapView()) return;
064        RelationEditor.getEditor(Main.main.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        setEnabled( !relations.isEmpty() );
088    }
089}