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 transient Relation relation;
017    private final transient List<Relation> referrers = new ArrayList<>();
018
019    /**
020     * Constructs a new {@code ReferringRelationsBrowserModel}.
021     * @param relation relation
022     */
023    public ReferringRelationsBrowserModel(Relation relation) {
024        this.relation = relation;
025    }
026
027    protected void fireModelUpdate() {
028        int upper = Math.max(0, referrers.size() -1);
029        fireContentsChanged(this, 0, upper);
030    }
031
032    public void setRelation(Relation relation) {
033        this.relation = relation;
034        referrers.clear();
035        fireModelUpdate();
036    }
037
038    @Override
039    public Relation getElementAt(int index) {
040        return referrers.get(index);
041    }
042
043    @Override
044    public int getSize() {
045        return referrers.size();
046    }
047
048    protected boolean isReferringRelation(Relation parent) {
049        if (parent == null) return false;
050        for (RelationMember m: parent.getMembers()) {
051            if (m.isRelation()) {
052                Relation child = m.getRelation();
053                if (child.equals(relation)) return true;
054            }
055        }
056        return false;
057    }
058
059    public void populate(List<Relation> parents) {
060        referrers.clear();
061        if (parents != null) {
062            for (Relation relation: parents) {
063                if (isReferringRelation(relation)) {
064                    referrers.add(relation);
065                }
066            }
067        }
068        fireModelUpdate();
069    }
070
071    /**
072     * Populates the browser with the list of referring relations in the {@link DataSet} ds.
073     *
074     * @param ds the data set
075     */
076    public void populate(DataSet ds) {
077        referrers.clear();
078        if (ds == null) {
079            fireModelUpdate();
080            return;
081        }
082        for (Relation parent : ds.getRelations()) {
083            if (isReferringRelation(parent)) {
084                referrers.add(parent);
085            }
086        }
087        fireModelUpdate();
088    }
089
090    public boolean canReload() {
091        return relation != null && !relation.isNew();
092    }
093
094    public Relation getRelation() {
095        return relation;
096    }
097}