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}