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 }