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