All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.javagimmicks.collections.event.ObservableEventList Maven / Gradle / Ivy

package net.sf.javagimmicks.collections.event;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import net.sf.javagimmicks.collections.event.ListEvent.Type;

public class ObservableEventList extends AbstractEventList
{
   private static final long serialVersionUID = -6317396247733734848L;

   protected transient List> _listeners;
   
   public ObservableEventList(List decorated)
   {
      super(decorated);
   }

   public void addEventListListener(EventListListener listener)
   {
      if(_listeners == null)
      {
         _listeners = new ArrayList>();
      }
      
      _listeners.add(listener);
   }
   
   public void removeEventListListener(EventListListener listener)
   {
      if(_listeners != null)
      {
         _listeners.remove(listener);
      }
   }
   
   @Override
   public ObservableEventList subList(int fromIndex, int toIndex)
   {
      return new ObservableEventSubList(this, fromIndex, toIndex);
   }

   @Override
   protected void fireElementsAdded(int index, Collection elements)
   {
      ListEvent event = new ListEvent(
         this,
         Type.ADDED,
         index,
         index + elements.size(),
         Collections.unmodifiableList(new ArrayList(elements)));
      
      fireEvent(event);
   }

   @Override
   protected void fireElementUpdated(int index, E element, E newElement)
   {
      ListEvent event = new ListEvent(
         this,
         Type.UPDATED,
         index,
         index,
         Collections.singletonList(element),
         Collections.singletonList(newElement));
      
      fireEvent(event);
   }

   @Override
   protected void fireElementRemoved(int index, E element)
   {
      ListEvent event = new ListEvent(
         this,
         Type.REMOVED,
         index,
         index,
         Collections.singletonList(element));

      fireEvent(event);
   }
   
   private void fireEvent(ListEvent event)
   {
      if(_listeners == null)
      {
         return;
      }
      
      for(EventListListener listener : _listeners)
      {
         listener.eventOccured(event);
      }
   }

   protected static class ObservableEventSubList extends ObservableEventList
   {
      private static final long serialVersionUID = 1996968483016862598L;

      protected final ObservableEventList _parent;
      protected final int _offset;
      
      protected ObservableEventSubList(ObservableEventList parent, int fromIndex, int toIndex)
      {
         super(parent._decorated.subList(fromIndex, toIndex));
         
         _parent = parent;
         _offset = fromIndex;
      }

      @Override
      protected void fireElementsAdded(int index, Collection elements)
      {
         super.fireElementsAdded(index, elements);
         _parent.fireElementsAdded(index + _offset, elements);
      }

      @Override
      protected void fireElementRemoved(int index, E element)
      {
         super.fireElementRemoved(index, element);
         _parent.fireElementRemoved(index + _offset, element);
      }

      @Override
      protected void fireElementUpdated(int index, E element, E newElement)
      {
         super.fireElementUpdated(index, element, newElement);
         _parent.fireElementUpdated(index + _offset, element, newElement);
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy