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.ReadOnlyBooleanProperty;
020 import javafx.beans.property.ReadOnlyIntegerProperty;
021 import javafx.beans.property.SetProperty;
022 import javafx.beans.value.ChangeListener;
023 import javafx.beans.value.ObservableValue;
024 import javafx.collections.ObservableSet;
025 import javafx.collections.SetChangeListener;
026
027 import javax.annotation.Nonnull;
028
029 import static java.util.Objects.requireNonNull;
030 import static javafx.application.Platform.isFxApplicationThread;
031 import static javafx.application.Platform.runLater;
032
033 /**
034 * @author Andres Almiray
035 * @since 2.9.0
036 */
037 class UIThreadAwareSetProperty<E> extends SetProperty<E> implements UIThreadAware {
038 private final SetProperty<E> delegate;
039
040 UIThreadAwareSetProperty(@Nonnull SetProperty<E> delegate) {
041 this.delegate = requireNonNull(delegate, "Argument 'delegate' must not be null");
042 }
043
044 @Override
045 public ReadOnlyIntegerProperty sizeProperty() {
046 return delegate.sizeProperty();
047 }
048
049 @Override
050 public ReadOnlyBooleanProperty emptyProperty() {
051 return delegate.emptyProperty();
052 }
053
054 @Override
055 public void bind(ObservableValue<? extends ObservableSet<E>> 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 ObservableSet<E> get() {
081 return delegate.get();
082 }
083
084 @Override
085 public void set(final ObservableSet<E> value) {
086 if (isFxApplicationThread()) {
087 delegate.set(value);
088 } else {
089 runLater(() -> delegate.set(value));
090 }
091 }
092
093 @Override
094 public void addListener(SetChangeListener<? super E> listener) {
095 if (listener instanceof UIThreadAware) {
096 delegate.addListener(listener);
097 } else {
098 delegate.addListener(new UIThreadAwareSetChangeListener<>(listener));
099 }
100 }
101
102 @Override
103 public void removeListener(SetChangeListener<? super E> listener) {
104 if (listener instanceof UIThreadAware) {
105 delegate.removeListener(listener);
106 } else {
107 delegate.removeListener(new UIThreadAwareSetChangeListener<>(listener));
108 }
109 }
110
111 @Override
112 public void addListener(ChangeListener<? super ObservableSet<E>> listener) {
113 if (listener instanceof UIThreadAware) {
114 delegate.addListener(listener);
115 } else {
116 delegate.addListener(new UIThreadAwareChangeListener<>(listener));
117 }
118 }
119
120 @Override
121 public void removeListener(ChangeListener<? super ObservableSet<E>> listener) {
122 if (listener instanceof UIThreadAware) {
123 delegate.removeListener(listener);
124 } else {
125 delegate.removeListener(new UIThreadAwareChangeListener<>(listener));
126 }
127 }
128
129 @Override
130 public void addListener(InvalidationListener listener) {
131 if (listener instanceof UIThreadAware) {
132 delegate.addListener(listener);
133 } else {
134 delegate.addListener(new UIThreadAwareInvalidationListener(listener));
135 }
136 }
137
138 @Override
139 public void removeListener(InvalidationListener listener) {
140 if (listener instanceof UIThreadAware) {
141 delegate.removeListener(listener);
142 } else {
143 delegate.removeListener(new UIThreadAwareInvalidationListener(listener));
144 }
145 }
146
147 @Override
148 public boolean equals(Object o) {
149 return this == o || delegate.equals(o);
150 }
151
152 @Override
153 public int hashCode() {
154 return delegate.hashCode();
155 }
156
157 @Override
158 public String toString() {
159 return getClass().getName() + ":" + delegate.toString();
160 }
161 }
|