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 }