// 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.List; import javax.swing.table.DefaultTableModel; import org.openstreetmap.josm.command.RelationMemberConflictResolverCommand; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.gui.conflict.pair.ListMergeModel; import org.openstreetmap.josm.gui.conflict.pair.ListRole; import org.openstreetmap.josm.tools.CheckParameterUtil; /** * The model for merging two lists of relation members * */ public class RelationMemberListMergeModel extends ListMergeModel<RelationMember>{ //private static final Logger logger = Logger.getLogger(RelationMemberListMergeModel.class.getName()); private DataSet myDataset; @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. * * @throws IllegalArgumentException if my is null * @throws IllegalArgumentException if their is null */ public void populate(Relation my, Relation their) { this.myDataset = my.getDataSet(); CheckParameterUtil.ensureParameterNotNull(my, "my"); CheckParameterUtil.ensureParameterNotNull(their, "their"); getMergedEntries().clear(); getMyEntries().clear(); getTheirEntries().clear(); 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) { OsmPrimitive primitive = getMyPrimitive(entry); return new RelationMember(entry.getRole(), primitive); } @Override protected OsmPrimitive getMyPrimitive(RelationMember entry) { return myDataset.getPrimitiveById(entry.getMember()); } /** * Builds the command to resolve conflicts in the node list of a way * * @param my my relation. Must not be null. * @param their their relation. Must not be null * @return the command * @exception IllegalArgumentException thrown, if my is null * @exception IllegalArgumentException thrown, if their is null * @exception IllegalStateException thrown, if the merge is not yet frozen */ public RelationMemberConflictResolverCommand buildResolveCommand(Relation my, Relation their) { CheckParameterUtil.ensureParameterNotNull(my, "my"); CheckParameterUtil.ensureParameterNotNull(their, "their"); if (! isFrozen()) throw new IllegalArgumentException(tr("Merged nodes not frozen yet. Cannot build resolution command")); List<RelationMember> entries = getMergedEntries(); return new RelationMemberConflictResolverCommand(my, their, entries); } }