154 */
155 @Override
156 public boolean isBound() {
157 return observable != null;
158 }
159
160 /**
161 * {@inheritDoc}
162 */
163 @Override
164 public void bind(final ObservableValue<? extends Number> rawObservable) {
165 if (rawObservable == null) {
166 throw new NullPointerException("Cannot bind to null");
167 }
168
169 ObservableFloatValue newObservable;
170 if (rawObservable instanceof ObservableFloatValue) {
171 newObservable = (ObservableFloatValue)rawObservable;
172 } else if (rawObservable instanceof ObservableNumberValue) {
173 final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable;
174 newObservable = new FloatBinding() {
175 {
176 super.bind(rawObservable);
177 }
178
179 @Override
180 protected float computeValue() {
181 return numberValue.floatValue();
182 }
183 };
184 } else {
185 newObservable = new FloatBinding() {
186 {
187 super.bind(rawObservable);
188 }
189
190 @Override
191 protected float computeValue() {
192 final Number value = rawObservable.getValue();
193 return (value == null)? 0.0f : value.floatValue();
194 }
195 };
196 }
197
198
199 if (!newObservable.equals(observable)) {
200 unbind();
201 observable = newObservable;
202 if (listener == null) {
203 listener = new Listener(this);
204 }
205 observable.addListener(listener);
206 markInvalid();
207 }
208 }
209
210 /**
211 * {@inheritDoc}
212 */
213 @Override
214 public void unbind() {
215 if (observable != null) {
216 value = observable.get();
217 observable.removeListener(listener);
218 observable = null;
219 }
220 }
221
222 /**
223 * Returns a string representation of this {@code FloatPropertyBase} object.
224 * @return a string representation of this {@code FloatPropertyBase} object.
225 */
226 @Override
227 public String toString() {
228 final Object bean = getBean();
229 final String name = getName();
230 final StringBuilder result = new StringBuilder("FloatProperty [");
231 if (bean != null) {
232 result.append("bean: ").append(bean).append(", ");
233 }
234 if ((name != null) && (!name.equals(""))) {
235 result.append("name: ").append(name).append(", ");
236 }
237 if (isBound()) {
252
253 private final WeakReference<FloatPropertyBase> wref;
254
255 public Listener(FloatPropertyBase ref) {
256 this.wref = new WeakReference<>(ref);
257 }
258
259 @Override
260 public void invalidated(Observable observable) {
261 FloatPropertyBase ref = wref.get();
262 if (ref == null) {
263 observable.removeListener(this);
264 } else {
265 ref.markInvalid();
266 }
267 }
268
269 @Override
270 public boolean wasGarbageCollected() {
271 return wref.get() == null;
272 }
273 }
274 }
|
154 */
155 @Override
156 public boolean isBound() {
157 return observable != null;
158 }
159
160 /**
161 * {@inheritDoc}
162 */
163 @Override
164 public void bind(final ObservableValue<? extends Number> rawObservable) {
165 if (rawObservable == null) {
166 throw new NullPointerException("Cannot bind to null");
167 }
168
169 ObservableFloatValue newObservable;
170 if (rawObservable instanceof ObservableFloatValue) {
171 newObservable = (ObservableFloatValue)rawObservable;
172 } else if (rawObservable instanceof ObservableNumberValue) {
173 final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable;
174 newObservable = new ValueWrapper(rawObservable) {
175
176 @Override
177 protected float computeValue() {
178 return numberValue.floatValue();
179 }
180 };
181 } else {
182 newObservable = new ValueWrapper(rawObservable) {
183
184 @Override
185 protected float computeValue() {
186 final Number value = rawObservable.getValue();
187 return (value == null)? 0.0f : value.floatValue();
188 }
189 };
190 }
191
192
193 if (!newObservable.equals(observable)) {
194 unbind();
195 observable = newObservable;
196 if (listener == null) {
197 listener = new Listener(this);
198 }
199 observable.addListener(listener);
200 markInvalid();
201 }
202 }
203
204 /**
205 * {@inheritDoc}
206 */
207 @Override
208 public void unbind() {
209 if (observable != null) {
210 value = observable.get();
211 observable.removeListener(listener);
212 if (observable instanceof ValueWrapper) {
213 ((ValueWrapper)observable).dispose();
214 }
215 observable = null;
216 }
217 }
218
219 /**
220 * Returns a string representation of this {@code FloatPropertyBase} object.
221 * @return a string representation of this {@code FloatPropertyBase} object.
222 */
223 @Override
224 public String toString() {
225 final Object bean = getBean();
226 final String name = getName();
227 final StringBuilder result = new StringBuilder("FloatProperty [");
228 if (bean != null) {
229 result.append("bean: ").append(bean).append(", ");
230 }
231 if ((name != null) && (!name.equals(""))) {
232 result.append("name: ").append(name).append(", ");
233 }
234 if (isBound()) {
249
250 private final WeakReference<FloatPropertyBase> wref;
251
252 public Listener(FloatPropertyBase ref) {
253 this.wref = new WeakReference<>(ref);
254 }
255
256 @Override
257 public void invalidated(Observable observable) {
258 FloatPropertyBase ref = wref.get();
259 if (ref == null) {
260 observable.removeListener(this);
261 } else {
262 ref.markInvalid();
263 }
264 }
265
266 @Override
267 public boolean wasGarbageCollected() {
268 return wref.get() == null;
269 }
270 }
271
272 private abstract class ValueWrapper extends FloatBinding {
273
274 private ObservableValue<? extends Number> observable;
275
276 public ValueWrapper(ObservableValue<? extends Number> observable) {
277 this.observable = observable;
278 bind(observable);
279 }
280
281 @Override
282 public void dispose() {
283 unbind(observable);
284 }
285 }
286 }
|