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}