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