// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.turnrestrictions.list; import java.util.Collection; import java.util.LinkedList; import java.util.List; import javax.swing.DefaultListSelectionModel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; import org.openstreetmap.josm.data.osm.event.DataChangedEvent; import org.openstreetmap.josm.data.osm.event.DataSetListener; import org.openstreetmap.josm.data.osm.event.NodeMovedEvent; import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent; import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent; import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent; import org.openstreetmap.josm.data.osm.event.TagsChangedEvent; import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent; import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener; import org.openstreetmap.josm.gui.layer.OsmDataLayer; /** * <p>This is the list model for the list of turn restrictions in the current data set.</p> * * <p>The model is a {@link ActiveLayerChangeListener}. It initializes itself from the data set of * the current edit layer.</p> * * <p>The model is a {@link DataSetListener}. It updates itself to reflect the list of turn * restrictions in the current data set.</p> * */ public class TurnRestrictionsInDatasetListModel extends TurnRestrictionsListModel implements ActiveLayerChangeListener, DataSetListener { //private static final Logger logger = Logger.getLogger(TurnRestrictionsInDatasetListModel.class.getName()); public TurnRestrictionsInDatasetListModel( DefaultListSelectionModel selectionModel) { super(selectionModel); } /** * Filters the list of turn restrictions from a collection of OSM primitives. * * @param primitives the primitives * @return the list of turn restrictions */ protected List<Relation> filterTurnRestrictions(Collection<? extends OsmPrimitive> primitives) { List<Relation> ret = new LinkedList<>(); if (primitives == null) return ret; for (OsmPrimitive p: primitives) { if (!isTurnRestriction(p)) continue; ret.add((Relation) p); } return ret; } /* --------------------------------------------------------------------------- */ /* interface ActiveLayerChangeListener */ /* --------------------------------------------------------------------------- */ @Override public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) { OsmDataLayer newLayer = Main.getLayerManager().getEditLayer(); if (newLayer == null) { setTurnRestrictions(null); return; } List<Relation> turnRestrictions = new LinkedList<>(); for (Relation r: newLayer.data.getRelations()) { if (isValid(r) && isTurnRestriction(r)) { turnRestrictions.add(r); } } setTurnRestrictions(turnRestrictions); } /* --------------------------------------------------------------------------- */ /* interface DataSetListener */ /* --------------------------------------------------------------------------- */ @Override public void dataChanged(DataChangedEvent event) { OsmDataLayer layer = Main.getLayerManager().getEditLayer(); if (layer == null) { setTurnRestrictions(null); } else { List<Relation> turnRestrictions = filterTurnRestrictions(layer.data.getRelations()); setTurnRestrictions(turnRestrictions); } } @Override public void primitivesAdded(PrimitivesAddedEvent event) { List<Relation> turnRestrictions = filterTurnRestrictions(event.getPrimitives()); if (!turnRestrictions.isEmpty()) { addTurnRestrictions(turnRestrictions); } } @Override public void primitivesRemoved(PrimitivesRemovedEvent event) { List<Relation> turnRestrictions = filterTurnRestrictions(event.getPrimitives()); if (!turnRestrictions.isEmpty()) { removeTurnRestrictions(turnRestrictions); } } @Override public void relationMembersChanged(RelationMembersChangedEvent event) { List<Relation> turnRestrictions = filterTurnRestrictions(event.getPrimitives()); if (!turnRestrictions.isEmpty()) { List<Relation> sel = getSelectedTurnRestrictions(); for (Relation tr: turnRestrictions) { // enforce a repaint of the respective turn restriction int idx = getTurnRestrictionIndex(tr); fireContentsChanged(this, idx, idx); } setSelectedTurnRestrictions(sel); } } @Override public void tagsChanged(TagsChangedEvent event) { List<Relation> turnRestrictions = filterTurnRestrictions(event.getPrimitives()); if (!turnRestrictions.isEmpty()) { List<Relation> sel = getSelectedTurnRestrictions(); for (Relation tr: turnRestrictions) { // enforce a repaint of the respective turn restriction int idx = getTurnRestrictionIndex(tr); fireContentsChanged(this, idx, idx); } setSelectedTurnRestrictions(sel); } } @Override public void wayNodesChanged(WayNodesChangedEvent event) {/* ignore */} @Override public void nodeMoved(NodeMovedEvent event) {/* ignore */} @Override public void otherDatasetChange(AbstractDatasetChangedEvent event) {/* ignore */} }