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.value.ChangeListener;
021 import javafx.collections.ListChangeListener;
022 import javafx.collections.ObservableList;
023 
024 import javax.annotation.Nonnull;
025 
026 import static javafx.application.Platform.isFxApplicationThread;
027 import static javafx.application.Platform.runLater;
028 
029 /**
030  @author Andres Almiray
031  @since 2.9.0
032  */
033 class UIThreadAwareListProperty<E> extends ListPropertyDecorator<E> implements UIThreadAware {
034     UIThreadAwareListProperty(@Nonnull ListProperty<E> delegate) {
035         super(delegate);
036     }
037 
038     @Override
039     public void set(final ObservableList<E> value) {
040         if (isFxApplicationThread()) {
041             getDelegate().set(value);
042         else {
043             runLater(() -> getDelegate().set(value));
044         }
045     }
046 
047     @Override
048     public void addListener(ListChangeListener<? super E> listener) {
049         if (listener instanceof UIThreadAware) {
050             getDelegate().addListener(listener);
051         else {
052             getDelegate().addListener(new UIThreadAwareListChangeListener<>(listener));
053         }
054     }
055 
056     @Override
057     public void removeListener(ListChangeListener<? super E> listener) {
058         if (listener instanceof UIThreadAware) {
059             getDelegate().removeListener(listener);
060         else {
061             getDelegate().removeListener(new UIThreadAwareListChangeListener<>(listener));
062         }
063     }
064 
065     @Override
066     public void addListener(ChangeListener<? super ObservableList<E>> listener) {
067         if (listener instanceof UIThreadAware) {
068             getDelegate().addListener(listener);
069         else {
070             getDelegate().addListener(new UIThreadAwareChangeListener<>(listener));
071         }
072     }
073 
074     @Override
075     public void removeListener(ChangeListener<? super ObservableList<E>> listener) {
076         if (listener instanceof UIThreadAware) {
077             getDelegate().removeListener(listener);
078         else {
079             getDelegate().removeListener(new UIThreadAwareChangeListener<>(listener));
080         }
081     }
082 
083     @Override
084     public void addListener(InvalidationListener listener) {
085         if (listener instanceof UIThreadAware) {
086             getDelegate().addListener(listener);
087         else {
088             getDelegate().addListener(new UIThreadAwareInvalidationListener(listener));
089         }
090     }
091 
092     @Override
093     public void removeListener(InvalidationListener listener) {
094         if (listener instanceof UIThreadAware) {
095             getDelegate().removeListener(listener);
096         else {
097             getDelegate().removeListener(new UIThreadAwareInvalidationListener(listener));
098         }
099     }
100 }