ObservableSetBase.java
001 /*
002  * SPDX-License-Identifier: Apache-2.0
003  *
004  * Copyright 2008-2017 the original author or authors.
005  *
006  * Licensed under the Apache License, Version 2.0 (the "License");
007  * you may not use this file except in compliance with the License.
008  * You may obtain a copy of the License at
009  *
010  *     http://www.apache.org/licenses/LICENSE-2.0
011  *
012  * Unless required by applicable law or agreed to in writing, software
013  * distributed under the License is distributed on an "AS IS" BASIS,
014  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015  * See the License for the specific language governing permissions and
016  * limitations under the License.
017  */
018 package griffon.javafx.collections;
019 
020 import com.sun.javafx.collections.SetListenerHelper;
021 import javafx.beans.InvalidationListener;
022 import javafx.collections.ObservableSet;
023 import javafx.collections.SetChangeListener;
024 
025 import javax.annotation.Nonnull;
026 import java.util.AbstractSet;
027 
028 import static java.util.Objects.requireNonNull;
029 
030 /**
031  @author Andres Almiray
032  @since 2.9.0
033  */
034 public abstract class ObservableSetBase<E> extends AbstractSet<E> implements ObservableSet<E> {
035     private SetListenerHelper<E> listenerHelper;
036 
037     @Override
038     public final void addListener(InvalidationListener listener) {
039         listenerHelper = SetListenerHelper.addListener(listenerHelper, listener);
040     }
041 
042     @Override
043     public final void removeListener(InvalidationListener listener) {
044         listenerHelper = SetListenerHelper.removeListener(listenerHelper, listener);
045     }
046 
047     @Override
048     public final void addListener(SetChangeListener<? super E> listener) {
049         listenerHelper = SetListenerHelper.addListener(listenerHelper, listener);
050     }
051 
052     @Override
053     public final void removeListener(SetChangeListener<? super E> listener) {
054         listenerHelper = SetListenerHelper.removeListener(listenerHelper, listener);
055     }
056 
057     protected final void fireChange(SetChangeListener.Change<? extends E> change) {
058         SetListenerHelper.fireValueChangedEvent(listenerHelper, change);
059     }
060 
061     /**
062      * Returns true if there are some listeners registered for this list.
063      */
064     protected final boolean hasListeners() {
065         return SetListenerHelper.hasListeners(listenerHelper);
066     }
067 
068     public static class BaseAddChange<T> extends SetChangeListener.Change<T> {
069         private final T added;
070 
071         public BaseAddChange(@Nonnull ObservableSet<T> set, @Nonnull T added) {
072             super(requireNonNull(set, "Argument 'set' must not be null"));
073             this.added = requireNonNull(added, "Argument 'added' must not be null");
074         }
075 
076         @Override
077         public boolean wasAdded() {
078             return true;
079         }
080 
081         @Override
082         public boolean wasRemoved() {
083             return false;
084         }
085 
086         @Override
087         public T getElementAdded() {
088             return added;
089         }
090 
091         @Override
092         public T getElementRemoved() {
093             return null;
094         }
095 
096         @Override
097         public String toString() {
098             return "added " + added;
099         }
100     }
101 
102     public static class BaseRemoveChange<T> extends SetChangeListener.Change<T> {
103         private final T removed;
104 
105         public BaseRemoveChange(@Nonnull ObservableSet<T> set, @Nonnull T removed) {
106             super(requireNonNull(set, "Argument 'set' must not be null"));
107             this.removed = requireNonNull(removed, "Argument 'removed' must not be null");
108         }
109 
110         @Override
111         public boolean wasAdded() {
112             return false;
113         }
114 
115         @Override
116         public boolean wasRemoved() {
117             return true;
118         }
119 
120         @Override
121         public T getElementAdded() {
122             return null;
123         }
124 
125         @Override
126         public T getElementRemoved() {
127             return removed;
128         }
129 
130         @Override
131         public String toString() {
132             return "removed " + removed;
133         }
134     }
135 }