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}