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.stream.Collectors;
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<OsmPrimitive> selection = getLayer().data.getSelected();
043        return r.getMembers().stream()
044                .filter(member -> selection.contains(member.getMember()))
045                .collect(Collectors.toSet());
046    }
047
048    @Override
049    public void actionPerformed(ActionEvent e) {
050        if (!isEnabled())
051            return;
052        int idx = editorAccess.getMemberTable().getSelectedRow();
053        if (idx < 0)
054            return;
055        OsmPrimitive primitive = editorAccess.getMemberTableModel().getReferredPrimitive(idx);
056        if (!(primitive instanceof Relation))
057            return;
058        Relation r = (Relation) primitive;
059        if (r.isIncomplete())
060            return;
061
062        RelationEditor.getEditor(getLayer(), r, getMembersForCurrentSelection(r)).setVisible(true);
063    }
064}