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 }
|