|
@@ -0,0 +1,107 @@
|
|
|
|
|
+package net.ranides.assira.observable;
|
|
|
|
|
+
|
|
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
|
|
+import net.ranides.assira.events.Event;
|
|
|
|
|
+import net.ranides.assira.events.EventListener;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+
|
|
|
|
|
+@RequiredArgsConstructor
|
|
|
|
|
+class ObservableList<T> extends AbstractList<T> {
|
|
|
|
|
+
|
|
|
|
|
+ private final List<T> list;
|
|
|
|
|
+
|
|
|
|
|
+ private final EventListener<Event> listener;
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public T get(int index) {
|
|
|
|
|
+ return list.get(index);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public int size() {
|
|
|
|
|
+ return list.size();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean add(T t) {
|
|
|
|
|
+ list.add(t);
|
|
|
|
|
+ listener.handleEvent(new ListEvent.Add<>(list, t));
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public T set(int index, T element) {
|
|
|
|
|
+ T prev = list.set(index, element);
|
|
|
|
|
+ listener.handleEvent(new ListEvent.Set<>(list, prev, element));
|
|
|
|
|
+ return prev;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void add(int index, T element) {
|
|
|
|
|
+ list.add(index, element);
|
|
|
|
|
+ listener.handleEvent(new ListEvent.Add<>(list, element));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public T remove(int index) {
|
|
|
|
|
+ T prev = list.remove(index);
|
|
|
|
|
+ listener.handleEvent(new ListEvent.Remove<>(list, prev));
|
|
|
|
|
+ return prev;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void clear() {
|
|
|
|
|
+ list.clear();
|
|
|
|
|
+ listener.handleEvent(new ListEvent.Clear<>(list));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean addAll(int index, Collection<? extends T> c) {
|
|
|
|
|
+ list.addAll(index, c);
|
|
|
|
|
+ listener.handleEvent(new ListEvent.AddMany<>(list, c));
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Iterator<T> iterator() {
|
|
|
|
|
+ return new ObservableListIterator<>(list, list.listIterator(), listener);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ListIterator<T> listIterator() {
|
|
|
|
|
+ return new ObservableListIterator<>(list, list.listIterator(), listener);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ListIterator<T> listIterator(int index) {
|
|
|
|
|
+ return new ObservableListIterator<>(list, list.listIterator(index), listener);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean remove(Object o) {
|
|
|
|
|
+ if (list.remove(o)) {
|
|
|
|
|
+ listener.handleEvent(new ListEvent.Remove<>(list, (T) o));
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean addAll(Collection<? extends T> c) {
|
|
|
|
|
+ if (list.addAll(c)) {
|
|
|
|
|
+ listener.handleEvent(new ListEvent.AddMany<>(list, c));
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean removeAll(Collection<?> c) {
|
|
|
|
|
+ if (list.removeAll(c)) {
|
|
|
|
|
+ listener.handleEvent(new ListEvent.Clear<>(list));
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|