001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.conflict.pair.relation;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.util.List;
007 import java.util.Map;
008
009 import javax.swing.table.DefaultTableModel;
010
011 import org.openstreetmap.josm.command.RelationMemberConflictResolverCommand;
012 import org.openstreetmap.josm.data.osm.OsmPrimitive;
013 import org.openstreetmap.josm.data.osm.PrimitiveId;
014 import org.openstreetmap.josm.data.osm.Relation;
015 import org.openstreetmap.josm.data.osm.RelationMember;
016 import org.openstreetmap.josm.gui.conflict.pair.ListMergeModel;
017 import org.openstreetmap.josm.gui.conflict.pair.ListRole;
018 import org.openstreetmap.josm.tools.CheckParameterUtil;
019 /**
020 * The model for merging two lists of relation members
021 *
022 */
023 public class RelationMemberListMergeModel extends ListMergeModel<RelationMember>{
024
025 @Override
026 public boolean isEqualEntry(RelationMember e1, RelationMember e2) {
027 return e1.equals(e2);
028 }
029
030 @Override
031 protected void buildMergedEntriesTableModel() {
032 // the table model for merged entries is different because it supports
033 // editing cells in the first column
034 //
035 mergedEntriesTableModel = this.new EntriesTableModel(ListRole.MERGED_ENTRIES) {
036 @Override
037 public boolean isCellEditable(int row, int column) {
038 switch(column) {
039 case 1: return true;
040 default: return false;
041 }
042 }
043 };
044 }
045
046 @Override
047 protected void setValueAt(DefaultTableModel model, Object value, int row, int col) {
048 if (model == getMergedTableModel() && col == 1) {
049 RelationMember memberOld = getMergedEntries().get(row);
050 RelationMember memberNew = new RelationMember((String)value,memberOld.getMember());
051 getMergedEntries().remove(row);
052 getMergedEntries().add(row,memberNew);
053 fireModelDataChanged();
054 }
055 }
056
057 /**
058 * populates the model with the relation members in relation my and their
059 *
060 * @param my my relation. Must not be null.
061 * @param their their relation. Must not be null.
062 * @param mergedMap The map of merged primitives if the conflict results from merging two layers
063 *
064 * @throws IllegalArgumentException if my is null
065 * @throws IllegalArgumentException if their is null
066 */
067 public void populate(Relation my, Relation their, Map<PrimitiveId, PrimitiveId> mergedMap) {
068 initPopulate(my, their, mergedMap);
069
070 for (RelationMember n : my.getMembers()) {
071 getMyEntries().add(n);
072 }
073 for (RelationMember n : their.getMembers()) {
074 getTheirEntries().add(n);
075 }
076 if (myAndTheirEntriesEqual()) {
077 for (RelationMember m : getMyEntries()) {
078 getMergedEntries().add(cloneEntryForMergedList(m));
079 }
080 setFrozen(true);
081 } else {
082 setFrozen(false);
083 }
084
085 fireModelDataChanged();
086 }
087
088 @Override
089 protected RelationMember cloneEntryForMergedList(RelationMember entry) {
090 return new RelationMember(entry.getRole(), getMyPrimitive(entry));
091 }
092
093 @Override
094 public OsmPrimitive getMyPrimitive(RelationMember entry) {
095 return getMyPrimitiveById(entry.getMember());
096 }
097
098 /**
099 * Builds the command to resolve conflicts in the node list of a way
100 *
101 * @param my my relation. Must not be null.
102 * @param their their relation. Must not be null
103 * @return the command
104 * @exception IllegalArgumentException thrown, if my is null
105 * @exception IllegalArgumentException thrown, if their is null
106 * @exception IllegalStateException thrown, if the merge is not yet frozen
107 */
108 public RelationMemberConflictResolverCommand buildResolveCommand(Relation my, Relation their) {
109 CheckParameterUtil.ensureParameterNotNull(my, "my");
110 CheckParameterUtil.ensureParameterNotNull(their, "their");
111 if (! isFrozen())
112 throw new IllegalArgumentException(tr("Merged nodes not frozen yet. Cannot build resolution command"));
113 List<RelationMember> entries = getMergedEntries();
114 return new RelationMemberConflictResolverCommand(my, their, entries);
115 }
116 }