001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation;
003
004import java.util.ArrayList;
005import java.util.List;
006
007import javax.swing.AbstractListModel;
008
009import org.openstreetmap.josm.data.osm.DataSet;
010import org.openstreetmap.josm.data.osm.Relation;
011import org.openstreetmap.josm.data.osm.RelationMember;
012
013public class ReferringRelationsBrowserModel extends AbstractListModel<Relation> {
014
015    /** the relation */
016    private Relation relation;
017    private List<Relation> referrers;
018
019    /**
020     * Constructs a new {@code ReferringRelationsBrowserModel}.
021     */
022    public ReferringRelationsBrowserModel() {
023        relation = null;
024        referrers = new ArrayList<>();
025    }
026
027    public ReferringRelationsBrowserModel(Relation relation) {
028        this();
029        this.relation = relation;
030    }
031
032    protected void fireModelUpdate() {
033        int upper = Math.max(0, referrers.size() -1);
034        fireContentsChanged(this, 0, upper);
035    }
036
037    public void setRelation(Relation relation) {
038        this.relation = relation;
039        referrers.clear();
040        fireModelUpdate();
041    }
042
043    @Override
044    public Relation getElementAt(int index) {
045        return referrers.get(index);
046    }
047
048    @Override
049    public int getSize() {
050        return referrers.size();
051    }
052
053    protected boolean isReferringRelation(Relation parent) {
054        if (parent == null) return false;
055        for (RelationMember m: parent.getMembers()) {
056            if (m.isRelation()) {
057                Relation child = m.getRelation();
058                if (child.equals(relation)) return true;
059            }
060        }
061        return false;
062    }
063
064    public void populate(List<Relation> parents) {
065        referrers.clear();
066        if (parents != null) {
067            for (Relation relation: parents) {
068                if (isReferringRelation(relation)) {
069                    referrers.add(relation);
070                }
071            }
072        }
073        fireModelUpdate();
074    }
075
076    /**
077     * Populates the browser with the list of referring relations in the {@link DataSet} ds.
078     *
079     * @param ds the data set
080     */
081    public void populate(DataSet ds) {
082        referrers.clear();
083        if (ds == null) {
084            fireModelUpdate();
085            return;
086        }
087        for (Relation parent : ds.getRelations()) {
088            if (isReferringRelation(parent)) {
089                referrers.add(parent);
090            }
091        }
092        fireModelUpdate();
093    }
094
095    public boolean canReload() {
096        return relation != null && !relation.isNew();
097    }
098
099    public Relation getRelation() {
100        return relation;
101    }
102}