// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.dialogs.relation.actions;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import java.util.Collection;
import java.util.HashSet;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.osm.RelationMember;
import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.tools.ImageProvider;
/**
* Action for editing the currently selected relation.
* @since 9496
*/
public class EditAction extends AbstractRelationEditorAction {
/**
* Constructs a new {@code EditAction}.
* @param memberTable member table
* @param memberTableModel member table model
* @param layer layer
*/
public EditAction(MemberTable memberTable, MemberTableModel memberTableModel, OsmDataLayer layer) {
super(memberTable, memberTableModel, null, layer, null);
putValue(SHORT_DESCRIPTION, tr("Edit the relation the currently selected relation member refers to"));
putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
updateEnabledState();
}
@Override
protected void updateEnabledState() {
setEnabled(memberTable.getSelectedRowCount() == 1
&& memberTableModel.isEditableRelation(memberTable.getSelectedRow()));
}
protected Collection<RelationMember> getMembersForCurrentSelection(Relation r) {
Collection<RelationMember> members = new HashSet<>();
Collection<OsmPrimitive> selection = layer.data.getSelected();
for (RelationMember member: r.getMembers()) {
if (selection.contains(member.getMember())) {
members.add(member);
}
}
return members;
}
@Override
public void actionPerformed(ActionEvent e) {
if (!isEnabled())
return;
int idx = memberTable.getSelectedRow();
if (idx < 0)
return;
OsmPrimitive primitive = memberTableModel.getReferredPrimitive(idx);
if (!(primitive instanceof Relation))
return;
Relation r = (Relation) primitive;
if (r.isIncomplete())
return;
RelationEditor.getEditor(layer, r, getMembersForCurrentSelection(r)).setVisible(true);
}
}