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}