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