001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.command; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.util.Collection; 007 008import javax.swing.Icon; 009 010import org.openstreetmap.josm.data.osm.OsmPrimitive; 011import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 012import org.openstreetmap.josm.data.osm.Relation; 013import org.openstreetmap.josm.data.osm.RelationMember; 014import org.openstreetmap.josm.gui.DefaultNameFormatter; 015import org.openstreetmap.josm.tools.ImageProvider; 016 017/** 018 * Command that changes the role of a relation member 019 * 020 * @author Teemu Koskinen <teemu.koskinen@mbnet.fi> 021 */ 022public class ChangeRelationMemberRoleCommand extends Command { 023 024 // The relation to be changed 025 private final Relation relation; 026 // Position of the member 027 private int position = -1; 028 // The new role 029 private final String newRole; 030 // The old role 031 private String oldRole; 032 // Old value of modified 033 private Boolean oldModified; 034 035 /** 036 * Constructs a new {@code ChangeRelationMemberRoleCommand}. 037 * @param relation The relation to be changed 038 * @param position Member position 039 * @param newRole New role 040 */ 041 public ChangeRelationMemberRoleCommand(Relation relation, int position, String newRole) { 042 this.relation = relation; 043 this.position = position; 044 this.newRole = newRole; 045 } 046 047 @Override 048 public boolean executeCommand() { 049 if (position < 0 || position >= relation.getMembersCount()) 050 return false; 051 052 oldRole = relation.getMember(position).getRole(); 053 if (newRole.equals(oldRole)) return true; 054 relation.setMember(position, new RelationMember(newRole, relation.getMember(position).getMember())); 055 056 oldModified = relation.isModified(); 057 relation.setModified(true); 058 return true; 059 } 060 061 @Override 062 public void undoCommand() { 063 relation.setMember(position, new RelationMember(oldRole, relation.getMember(position).getMember())); 064 relation.setModified(oldModified); 065 } 066 067 @Override 068 public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) { 069 modified.add(relation); 070 } 071 072 @Override 073 public String getDescriptionText() { 074 return tr("Change relation member role for {0} {1}", 075 OsmPrimitiveType.from(relation), 076 relation.getDisplayName(DefaultNameFormatter.getInstance())); 077 } 078 079 @Override 080 public Icon getDescriptionIcon() { 081 return ImageProvider.get(relation.getDisplayType()); 082 } 083}