UIThreadAwareListProperty.java
001 /*
002  * Copyright 2008-2017 the original author or authors.
003  *
004  * Licensed under the Apache License, Version 2.0 (the "License");
005  * you may not use this file except in compliance with the License.
006  * You may obtain a copy of the License at
007  *
008  *     http://www.apache.org/licenses/LICENSE-2.0
009  *
010  * Unless required by applicable law or agreed to in writing, software
011  * distributed under the License is distributed on an "AS IS" BASIS,
012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013  * See the License for the specific language governing permissions and
014  * limitations under the License.
015  */
016 package griffon.javafx.beans.binding;
017 
018 import javafx.beans.InvalidationListener;
019 import javafx.beans.property.ListProperty;
020 import javafx.beans.property.ReadOnlyBooleanProperty;
021 import javafx.beans.property.ReadOnlyIntegerProperty;
022 import javafx.beans.value.ChangeListener;
023 import javafx.beans.value.ObservableValue;
024 import javafx.collections.ListChangeListener;
025 import javafx.collections.ObservableList;
026 
027 import javax.annotation.Nonnull;
028 
029 import static java.util.Objects.requireNonNull;
030 import static javafx.application.Platform.isFxApplicationThread;
031 import static javafx.application.Platform.runLater;
032 
033 /**
034  @author Andres Almiray
035  @since 2.9.0
036  */
037 class UIThreadAwareListProperty<E> extends ListProperty<E> implements UIThreadAware {
038     private final ListProperty<E> delegate;
039 
040     UIThreadAwareListProperty(@Nonnull ListProperty<E> delegate) {
041         this.delegate = requireNonNull(delegate, "Argument 'delegate' must not be null");
042     }
043 
044     @Override
045     public ReadOnlyIntegerProperty sizeProperty() {
046         return delegate.sizeProperty();
047     }
048 
049     @Override
050     public ReadOnlyBooleanProperty emptyProperty() {
051         return delegate.emptyProperty();
052     }
053 
054     @Override
055     public void bind(ObservableValue<? extends ObservableList<E>> observable) {
056         delegate.bind(observable);
057     }
058 
059     @Override
060     public void unbind() {
061         delegate.unbind();
062     }
063 
064     @Override
065     public boolean isBound() {
066         return delegate.isBound();
067     }
068 
069     @Override
070     public Object getBean() {
071         return delegate.getBean();
072     }
073 
074     @Override
075     public String getName() {
076         return delegate.getName();
077     }
078 
079     @Override
080     public ObservableList<E> get() {
081         return delegate.get();
082     }
083 
084     @Override
085     public void set(final ObservableList<E> value) {
086         if (isFxApplicationThread()) {
087             delegate.set(value);
088         else {
089             runLater(() -> delegate.set(value));
090         }
091     }
092 
093     @Override
094     public void addListener(ListChangeListener<? super E> listener) {
095         if (listener instanceof UIThreadAware) {
096             delegate.addListener(listener);
097         else {
098             delegate.addListener(new UIThreadAwareListChangeListener<>(listener));
099         }
100     }
101 
102     @Override
103     public void removeListener(ListChangeListener<? super E> listener) {
104         if (listener instanceof UIThreadAware) {
105             delegate.removeListener(listener);
106         else {
107             delegate.removeListener(new UIThreadAwareListChangeListener<>(listener));
108         }
109     }
110 
111     @Override
112     public void addListener(ChangeListener<? super ObservableList<E>> listener) {
113         if (listener instanceof UIThreadAware) {
114             delegate.addListener(listener);
115         else {
116             delegate.addListener(new UIThreadAwareChangeListener<>(listener));
117         }
118     }
119 
120     @Override
121     public void removeListener(ChangeListener<? super ObservableList<E>> listener) {
122         if (listener instanceof UIThreadAware) {
123             delegate.removeListener(listener);
124         else {
125             delegate.removeListener(new UIThreadAwareChangeListener<>(listener));
126         }
127     }
128 
129     @Override
130     public void addListener(InvalidationListener listener) {
131         if (listener instanceof UIThreadAware) {
132             delegate.addListener(listener);
133         else {
134             delegate.addListener(new UIThreadAwareInvalidationListener(listener));
135         }
136     }
137 
138     @Override
139     public void removeListener(InvalidationListener listener) {
140         if (listener instanceof UIThreadAware) {
141             delegate.removeListener(listener);
142         else {
143             delegate.removeListener(new UIThreadAwareInvalidationListener(listener));
144         }
145     }
146 
147     @Override
148     public boolean equals(Object o) {
149         return this == o || delegate.equals(o);
150     }
151 
152     @Override
153     public int hashCode() {
154         return delegate.hashCode();
155     }
156 
157     @Override
158     public String toString() {
159         return getClass().getName() ":" + delegate.toString();
160     }
161 }