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.MemberTable;
014import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
015import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
016import org.openstreetmap.josm.gui.layer.OsmDataLayer;
017import org.openstreetmap.josm.tools.ImageProvider;
018
019/**
020 * Action for editing the currently selected relation.
021 * @since 9496
022 */
023public class EditAction extends AbstractRelationEditorAction {
024
025    /**
026     * Constructs a new {@code EditAction}.
027     * @param memberTable member table
028     * @param memberTableModel member table model
029     * @param layer layer
030     */
031    public EditAction(MemberTable memberTable, MemberTableModel memberTableModel, OsmDataLayer layer) {
032        super(memberTable, memberTableModel, null, layer, null);
033        putValue(SHORT_DESCRIPTION, tr("Edit the relation the currently selected relation member refers to"));
034        new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this, true);
035        updateEnabledState();
036    }
037
038    @Override
039    protected void updateEnabledState() {
040        setEnabled(memberTable.getSelectedRowCount() == 1
041                && memberTableModel.isEditableRelation(memberTable.getSelectedRow()));
042    }
043
044    protected Collection<RelationMember> getMembersForCurrentSelection(Relation r) {
045        Collection<RelationMember> members = new HashSet<>();
046        Collection<OsmPrimitive> selection = layer.data.getSelected();
047        for (RelationMember member: r.getMembers()) {
048            if (selection.contains(member.getMember())) {
049                members.add(member);
050            }
051        }
052        return members;
053    }
054
055    @Override
056    public void actionPerformed(ActionEvent e) {
057        if (!isEnabled())
058            return;
059        int idx = memberTable.getSelectedRow();
060        if (idx < 0)
061            return;
062        OsmPrimitive primitive = memberTableModel.getReferredPrimitive(idx);
063        if (!(primitive instanceof Relation))
064            return;
065        Relation r = (Relation) primitive;
066        if (r.isIncomplete())
067            return;
068
069        RelationEditor.getEditor(layer, r, getMembersForCurrentSelection(r)).setVisible(true);
070    }
071}