UIThreadAwareDoubleProperty.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.DoubleProperty;
020 import javafx.beans.value.ChangeListener;
021 import javafx.beans.value.ObservableValue;
022 
023 import javax.annotation.Nonnull;
024 
025 import static java.util.Objects.requireNonNull;
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 UIThreadAwareDoubleProperty extends DoubleProperty implements UIThreadAware {
034     private final DoubleProperty delegate;
035 
036     UIThreadAwareDoubleProperty(@Nonnull DoubleProperty delegate) {
037         this.delegate = requireNonNull(delegate, "Argument 'delegate' must not be null");
038     }
039 
040     @Override
041     public double get() {
042         return delegate.get();
043     }
044 
045     @Override
046     public void set(final double value) {
047         if (isFxApplicationThread()) {
048             delegate.set(value);
049         else {
050             runLater(() -> delegate.set(value));
051         }
052     }
053 
054     @Override
055     public void bind(ObservableValue<? extends Number> 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 void addListener(ChangeListener<? super Number> listener) {
081         if (listener instanceof UIThreadAware) {
082             delegate.addListener(listener);
083         else {
084             delegate.addListener(new UIThreadAwareChangeListener<>(listener));
085         }
086     }
087 
088     @Override
089     public void removeListener(ChangeListener<? super Number> listener) {
090         if (listener instanceof UIThreadAware) {
091             delegate.removeListener(listener);
092         else {
093             delegate.removeListener(new UIThreadAwareChangeListener<>(listener));
094         }
095     }
096 
097     @Override
098     public void addListener(InvalidationListener listener) {
099         if (listener instanceof UIThreadAware) {
100             delegate.addListener(listener);
101         else {
102             delegate.addListener(new UIThreadAwareInvalidationListener(listener));
103         }
104     }
105 
106     @Override
107     public void removeListener(InvalidationListener listener) {
108         if (listener instanceof UIThreadAware) {
109             delegate.removeListener(listener);
110         else {
111             delegate.removeListener(new UIThreadAwareInvalidationListener(listener));
112         }
113     }
114 
115     @Override
116     public boolean equals(Object o) {
117         return this == o || delegate.equals(o);
118     }
119 
120     @Override
121     public int hashCode() {
122         return delegate.hashCode();
123     }
124 
125     @Override
126     public String toString() {
127         return getClass().getName() ":" + delegate.toString();
128     }
129 }