1 package org.djutils.event.util; 2 3 import java.io.Serializable; 4 import java.util.ListIterator; 5 6 import org.djutils.event.EventType; 7 import org.djutils.event.IdProvider; 8 import org.djutils.metadata.MetaData; 9 10 /** 11 * EventProducingListIterator provides an iterator embedding the ListIterator, which fires an event when an object has been 12 * removed. Note that one does not have to subscribe specifically to the events of the EventProducingListIterator, as the 13 * EventProducing collection subscribes to the EventProducingListIterator's remove events and fires these again to its 14 * subscribers. 15 * <p> 16 * Copyright (c) 2002-2022 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See 17 * for project information <a href="https://djutils.org" target="_blank"> https://djutils.org</a>. The DJUTILS project is 18 * distributed under a three-clause BSD-style license, which can be found at 19 * <a href="https://djutils.org/docs/license.html" target="_blank"> https://djutils.org/docs/license.html</a>. This class was 20 * originally part of the DSOL project, see <a href="https://simulation.tudelft.nl/dsol/manual" target="_blank"> 21 * https://simulation.tudelft.nl/dsol/manual</a>. 22 * </p> 23 * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a> 24 * @param <T> the type of elements to iterate on 25 */ 26 public class EventProducingListIterator<T> extends EventProducingIterator<T> implements ListIterator<T> 27 { 28 /** */ 29 private static final long serialVersionUID = 20191230L; 30 31 /** OBJECT_ADDED_EVENT is fired on adding of entries. */ 32 public static final EventType OBJECT_ADDED_EVENT = new EventType("OBJECT_ADDED_EVENT", MetaData.EMPTY); 33 34 /** OBJECT_CHANGED_EVENT is fired on changing of entries. */ 35 public static final EventType OBJECT_CHANGED_EVENT = new EventType("OBJECT_CHANGED_EVENT", MetaData.EMPTY); 36 37 /** 38 * constructs a new EventProducingListIterator, embedding the parent ListIterator. 39 * @param parent ListIterator<T>; embedded iterator. 40 * @param sourceId Serializable; the id by which the EventProducer can be identified by the EventListener 41 */ 42 public EventProducingListIterator(final ListIterator<T> parent, final Serializable sourceId) 43 { 44 super(parent, sourceId); 45 } 46 47 /** 48 * Constructs a new EventProducingListIterator, embedding the parent iterator. 49 * @param parent ListIterator<T>; the parent set. 50 * @param sourceIdProvider IdProvider; the function that produces the id by which the EventProducer can be identified by the 51 * EventListener 52 */ 53 public EventProducingListIterator(final ListIterator<T> parent, final IdProvider sourceIdProvider) 54 { 55 super(parent, sourceIdProvider); 56 } 57 58 /** {@inheritDoc} */ 59 @Override 60 protected ListIterator<T> getParent() 61 { 62 return (ListIterator<T>) super.getParent(); 63 } 64 65 /** {@inheritDoc} */ 66 @Override 67 public boolean hasPrevious() 68 { 69 return getParent().hasPrevious(); 70 } 71 72 /** {@inheritDoc} */ 73 @Override 74 public T previous() 75 { 76 return getParent().previous(); 77 } 78 79 /** {@inheritDoc} */ 80 @Override 81 public int nextIndex() 82 { 83 return getParent().nextIndex(); 84 } 85 86 /** {@inheritDoc} */ 87 @Override 88 public int previousIndex() 89 { 90 return getParent().previousIndex(); 91 } 92 93 /** {@inheritDoc} */ 94 @Override 95 public void set(final T e) 96 { 97 getParent().set(e); 98 fireEvent(OBJECT_CHANGED_EVENT); 99 } 100 101 /** {@inheritDoc} */ 102 @Override 103 public void add(final T e) 104 { 105 getParent().add(e); 106 fireEvent(OBJECT_ADDED_EVENT); 107 } 108 109 }