001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.command; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.util.Collection; 007 008 import javax.swing.Icon; 009 010 import org.openstreetmap.josm.data.osm.OsmPrimitive; 011 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 012 import org.openstreetmap.josm.data.osm.Relation; 013 import org.openstreetmap.josm.data.osm.RelationMember; 014 import org.openstreetmap.josm.gui.DefaultNameFormatter; 015 import 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 */ 022 public 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 public ChangeRelationMemberRoleCommand(Relation relation, int position, String newRole) { 036 super(); 037 this.relation = relation; 038 this.position = position; 039 this.newRole = newRole; 040 } 041 042 @Override public boolean executeCommand() { 043 if (position < 0 || position >= relation.getMembersCount()) 044 return false; 045 046 oldRole = relation.getMember(position).getRole(); 047 if (newRole.equals(oldRole)) return true; 048 relation.setMember(position, new RelationMember(newRole, relation.getMember(position).getMember())); 049 050 oldModified = relation.isModified(); 051 relation.setModified(true); 052 return true; 053 } 054 055 @Override public void undoCommand() { 056 relation.setMember(position, new RelationMember(oldRole, relation.getMember(position).getMember())); 057 relation.setModified(oldModified); 058 } 059 060 @Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) { 061 modified.add(relation); 062 } 063 064 @Override 065 public String getDescriptionText() { 066 return tr("Change relation member role for {0} {1}", 067 OsmPrimitiveType.from(relation), 068 relation.getDisplayName(DefaultNameFormatter.getInstance())); 069 } 070 071 @Override 072 public Icon getDescriptionIcon() { 073 return ImageProvider.get(relation.getDisplayType()); 074 } 075 }