001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation.actions;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.event.ActionEvent;
007import java.util.Collection;
008import java.util.HashSet;
009
010import org.openstreetmap.josm.data.osm.OsmPrimitive;
011import org.openstreetmap.josm.data.osm.Relation;
012import org.openstreetmap.josm.data.osm.RelationMember;
013import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
014import org.openstreetmap.josm.tools.ImageProvider;
015
016/**
017 * Action for editing the currently selected relation.
018 * @since 9496
019 */
020public class EditAction extends AbstractRelationEditorAction {
021    private static final long serialVersionUID = 1L;
022
023    /**
024     * Constructs a new {@code EditAction}.
025     * @param editorAccess An interface to access the relation editor contents.
026     */
027    public EditAction(IRelationEditorActionAccess editorAccess) {
028        super(editorAccess, IRelationEditorUpdateOn.MEMBER_TABLE_SELECTION);
029        putValue(SHORT_DESCRIPTION, tr("Edit the relation the currently selected relation member refers to"));
030        new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this, true);
031        updateEnabledState();
032    }
033
034    @Override
035    protected void updateEnabledState() {
036        setEnabled(editorAccess.getMemberTable().getSelectedRowCount() == 1
037                && editorAccess.getMemberTableModel()
038                        .isEditableRelation(editorAccess.getMemberTable().getSelectedRow()));
039    }
040
041    protected Collection<RelationMember> getMembersForCurrentSelection(Relation r) {
042        Collection<RelationMember> members = new HashSet<>();
043        Collection<OsmPrimitive> selection = getLayer().data.getSelected();
044        for (RelationMember member: r.getMembers()) {
045            if (selection.contains(member.getMember())) {
046                members.add(member);
047            }
048        }
049        return members;
050    }
051
052    @Override
053    public void actionPerformed(ActionEvent e) {
054        if (!isEnabled())
055            return;
056        int idx = editorAccess.getMemberTable().getSelectedRow();
057        if (idx < 0)
058            return;
059        OsmPrimitive primitive = editorAccess.getMemberTableModel().getReferredPrimitive(idx);
060        if (!(primitive instanceof Relation))
061            return;
062        Relation r = (Relation) primitive;
063        if (r.isIncomplete())
064            return;
065
066        RelationEditor.getEditor(getLayer(), r, getMembersForCurrentSelection(r)).setVisible(true);
067    }
068}