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