// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.conflict.pair.relation; import static org.openstreetmap.josm.tools.I18n.tr; import java.util.Map; import javax.swing.table.DefaultTableModel; import org.openstreetmap.josm.command.conflict.RelationMemberConflictResolverCommand; import org.openstreetmap.josm.data.conflict.Conflict; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.PrimitiveId; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.gui.conflict.pair.AbstractListMergeModel; import org.openstreetmap.josm.gui.conflict.pair.ListRole; import org.openstreetmap.josm.tools.CheckParameterUtil; /** * The model for merging two lists of relation members * @since 1631 */ public class RelationMemberListMergeModel extends AbstractListMergeModel<RelationMember, RelationMemberConflictResolverCommand> { @Override public boolean isEqualEntry(RelationMember e1, RelationMember e2) { return e1.equals(e2); } @Override protected void buildMergedEntriesTableModel() { // the table model for merged entries is different because it supports // editing cells in the first column // mergedEntriesTableModel = this.new EntriesTableModel(ListRole.MERGED_ENTRIES) { @Override public boolean isCellEditable(int row, int column) { switch(column) { case 1: return true; default: return false; } } }; } @Override protected void setValueAt(DefaultTableModel model, Object value, int row, int col) { if (model == getMergedTableModel() && col == 1) { RelationMember memberOld = getMergedEntries().get(row); RelationMember memberNew = new RelationMember((String) value, memberOld.getMember()); getMergedEntries().remove(row); getMergedEntries().add(row, memberNew); fireModelDataChanged(); } } /** * populates the model with the relation members in relation my and their * * @param my my relation. Must not be null. * @param their their relation. Must not be null. * @param mergedMap The map of merged primitives if the conflict results from merging two layers * * @throws IllegalArgumentException if my is null * @throws IllegalArgumentException if their is null */ public void populate(Relation my, Relation their, Map<PrimitiveId, PrimitiveId> mergedMap) { initPopulate(my, their, mergedMap); for (RelationMember n : my.getMembers()) { getMyEntries().add(n); } for (RelationMember n : their.getMembers()) { getTheirEntries().add(n); } if (myAndTheirEntriesEqual()) { for (RelationMember m : getMyEntries()) { getMergedEntries().add(cloneEntryForMergedList(m)); } setFrozen(true); } else { setFrozen(false); } fireModelDataChanged(); } @Override protected RelationMember cloneEntryForMergedList(RelationMember entry) { return new RelationMember(entry.getRole(), getMyPrimitive(entry)); } @Override public OsmPrimitive getMyPrimitive(RelationMember entry) { return getMyPrimitiveById(entry.getMember()); } @Override public RelationMemberConflictResolverCommand buildResolveCommand(Conflict<? extends OsmPrimitive> conflict) { CheckParameterUtil.ensureParameterNotNull(conflict, "conflict"); if (!isFrozen()) throw new IllegalArgumentException(tr("Merged members not frozen yet. Cannot build resolution command")); return new RelationMemberConflictResolverCommand(conflict, getMergedEntries()); } }