001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.conflict.pair.relation;
003
004import javax.swing.JScrollPane;
005
006import org.openstreetmap.josm.data.conflict.Conflict;
007import org.openstreetmap.josm.data.osm.OsmPrimitive;
008import org.openstreetmap.josm.data.osm.Relation;
009import org.openstreetmap.josm.data.osm.RelationMember;
010import org.openstreetmap.josm.gui.conflict.pair.IConflictResolver;
011import org.openstreetmap.josm.gui.conflict.pair.ListMerger;
012
013/**
014 * A UI component for resolving conflicts in the member lists of two {@link Relation}s.
015 * @since 1631
016 */
017public class RelationMemberMerger extends ListMerger<RelationMember> implements IConflictResolver {
018
019    /**
020     * Constructs a new {@code RelationMemberMerger}.
021     */
022    public RelationMemberMerger() {
023        super(new RelationMemberListMergeModel());
024    }
025
026    @Override
027    protected JScrollPane buildMyElementsTable() {
028        myEntriesTable  = new RelationMemberTable(
029                "table.mymembers",
030                model,
031                model.getMyTableModel(),
032                model.getMySelectionModel()
033        );
034        return embeddInScrollPane(myEntriesTable);
035    }
036
037    @Override
038    protected JScrollPane buildMergedElementsTable() {
039        mergedEntriesTable  = new RelationMemberTable(
040                "table.mergedmembers",
041                model,
042                model.getMergedTableModel(),
043                model.getMergedSelectionModel()
044        );
045        mergedEntriesTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
046        return embeddInScrollPane(mergedEntriesTable);
047    }
048
049    @Override
050    protected JScrollPane buildTheirElementsTable() {
051        theirEntriesTable  = new RelationMemberTable(
052                "table.theirmembers",
053                model,
054                model.getTheirTableModel(),
055                model.getTheirSelectionModel()
056        );
057        return embeddInScrollPane(theirEntriesTable);
058    }
059
060    @Override
061    public void populate(Conflict<? extends OsmPrimitive> conflict) {
062        Relation myRel = (Relation) conflict.getMy();
063        Relation theirRel = (Relation) conflict.getTheir();
064        ((RelationMemberListMergeModel) model).populate(myRel, theirRel, conflict.getMergedMap());
065        myEntriesTable.setLayer(findLayerFor(myRel));
066        theirEntriesTable.setLayer(findLayerFor(theirRel));
067    }
068
069    @Override
070    public void deletePrimitive(boolean deleted) {
071        if (deleted) {
072            model.clearMerged();
073            model.setFrozen(true);
074        } else {
075            model.setFrozen(false);
076        }
077    }
078}