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 }