UIThreadAwareListProperty.java
001 /*
002  * SPDX-License-Identifier: Apache-2.0
003  *
004  * Copyright 2008-2021 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.beans.binding;
019 
020 import javafx.beans.InvalidationListener;
021 import javafx.beans.property.ListProperty;
022 import javafx.beans.value.ChangeListener;
023 import javafx.collections.ListChangeListener;
024 import javafx.collections.ObservableList;
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(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 }