AbstractUIThreadAwareProperty.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.Property;
020 import javafx.beans.value.ChangeListener;
021 
022 import javax.annotation.Nonnull;
023 
024 import static java.util.Objects.requireNonNull;
025 
026 /**
027  @author Andres Almiray
028  @since 2.9.0
029  */
030 abstract class AbstractUIThreadAwareProperty<T> implements Property<T>, UIThreadAware {
031     private final Property<T> delegate;
032 
033     AbstractUIThreadAwareProperty(@Nonnull Property<T> delegate) {
034         this.delegate = requireNonNull(delegate, "Argument 'delegate' must not be null");
035     }
036 
037     @Nonnull
038     protected final Property<T> getDelegate() {
039         return delegate;
040     }
041 
042     @Override
043     public void unbind() {
044         delegate.unbind();
045     }
046 
047     @Override
048     public boolean isBound() {
049         return delegate.isBound();
050     }
051 
052     @Override
053     public void bindBidirectional(Property<T> other) {
054         delegate.bindBidirectional(other);
055     }
056 
057     @Override
058     public void unbindBidirectional(Property<T> other) {
059         delegate.unbindBidirectional(other);
060     }
061 
062     @Override
063     public Object getBean() {
064         return delegate.getBean();
065     }
066 
067     @Override
068     public String getName() {
069         return delegate.getName();
070     }
071 
072     @Override
073     public void addListener(ChangeListener<? super T> listener) {
074         if (listener instanceof UIThreadAware) {
075             delegate.addListener(listener);
076         else {
077             delegate.addListener(new UIThreadAwareChangeListener<>(listener));
078         }
079     }
080 
081     @Override
082     public void removeListener(ChangeListener<? super T> listener) {
083         if (listener instanceof UIThreadAware) {
084             delegate.removeListener(listener);
085         else {
086             delegate.removeListener(new UIThreadAwareChangeListener<>(listener));
087         }
088     }
089 
090     @Override
091     public void addListener(InvalidationListener listener) {
092         if (listener instanceof UIThreadAware) {
093             delegate.addListener(listener);
094         else {
095             delegate.addListener(new UIThreadAwareInvalidationListener(listener));
096         }
097     }
098 
099     @Override
100     public void removeListener(InvalidationListener listener) {
101         if (listener instanceof UIThreadAware) {
102             delegate.removeListener(listener);
103         else {
104             delegate.removeListener(new UIThreadAwareInvalidationListener(listener));
105         }
106     }
107 
108     @Override
109     public boolean equals(Object o) {
110         return this == o || delegate.equals(o);
111     }
112 
113     @Override
114     public int hashCode() {
115         return delegate.hashCode();
116     }
117 
118     @Override
119     public String toString() {
120         return getClass().getName() ":" + delegate.toString();
121     }
122 }