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}