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