UIThreadAwareStringProperty.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.StringProperty;
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 UIThreadAwareStringProperty extends StringProperty implements UIThreadAware {
034     private final StringProperty delegate;
035 
036     UIThreadAwareStringProperty(@Nonnull StringProperty delegate) {
037         this.delegate = requireNonNull(delegate, "Argument 'delegate' must not be null");
038     }
039 
040     @Override
041     public void bind(ObservableValue<? extends String> observable) {
042         delegate.bind(observable);
043     }
044 
045     @Override
046     public void unbind() {
047         delegate.unbind();
048     }
049 
050     @Override
051     public boolean isBound() {
052         return delegate.isBound();
053     }
054 
055     @Override
056     public Object getBean() {
057         return delegate.getBean();
058     }
059 
060     @Override
061     public String getName() {
062         return delegate.getName();
063     }
064 
065     @Override
066     public String get() {
067         return delegate.get();
068     }
069 
070     @Override
071     public void set(final String value) {
072         if (isFxApplicationThread()) {
073             delegate.set(value);
074         else {
075             runLater(() -> delegate.set(value));
076         }
077     }
078 
079     @Override
080     public void addListener(ChangeListener<? super String> 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 String> 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 }