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 084 @Override 085 public int hashCode() { 086 final int prime = 31; 087 int result = super.hashCode(); 088 result = prime * result + ((newRole == null) ? 0 : newRole.hashCode()); 089 result = prime * result + ((oldModified == null) ? 0 : oldModified.hashCode()); 090 result = prime * result + ((oldRole == null) ? 0 : oldRole.hashCode()); 091 result = prime * result + position; 092 result = prime * result + ((relation == null) ? 0 : relation.hashCode()); 093 return result; 094 } 095 096 @Override 097 public boolean equals(Object obj) { 098 if (this == obj) 099 return true; 100 if (!super.equals(obj)) 101 return false; 102 if (getClass() != obj.getClass()) 103 return false; 104 ChangeRelationMemberRoleCommand other = (ChangeRelationMemberRoleCommand) obj; 105 if (newRole == null) { 106 if (other.newRole != null) 107 return false; 108 } else if (!newRole.equals(other.newRole)) 109 return false; 110 if (oldModified == null) { 111 if (other.oldModified != null) 112 return false; 113 } else if (!oldModified.equals(other.oldModified)) 114 return false; 115 if (oldRole == null) { 116 if (other.oldRole != null) 117 return false; 118 } else if (!oldRole.equals(other.oldRole)) 119 return false; 120 if (position != other.position) 121 return false; 122 if (relation == null) { 123 if (other.relation != null) 124 return false; 125 } else if (!relation.equals(other.relation)) 126 return false; 127 return true; 128 } 129}