01: /* uDig - User Friendly Desktop Internet GIS client
02: * http://udig.refractions.net
03: * (C) 2004, Refractions Research Inc.
04: *
05: * This library is free software; you can redistribute it and/or
06: * modify it under the terms of the GNU Lesser General Public
07: * License as published by the Free Software Foundation;
08: * version 2.1 of the License.
09: *
10: * This library is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * Lesser General Public License for more details.
14: */
15: package net.refractions.udig.catalog.objectproperty;
16:
17: import java.util.List;
18: import java.util.concurrent.atomic.AtomicBoolean;
19:
20: import net.refractions.udig.catalog.IGeoResource;
21: import net.refractions.udig.catalog.IResolveChangeEvent;
22: import net.refractions.udig.catalog.IResolveChangeListener;
23: import net.refractions.udig.catalog.IResolveDelta;
24: import net.refractions.udig.catalog.IResolveChangeEvent.Type;
25: import net.refractions.udig.ui.operations.AbstractPropertyValue;
26:
27: public class ObjectPropertyCatalogListener implements
28: IResolveChangeListener {
29:
30: Object evaluationObject;
31: IGeoResource resource;
32: private AbstractPropertyValue<? extends Object> owner;
33: private AtomicBoolean isEvaluating;
34:
35: public ObjectPropertyCatalogListener(Object layer,
36: IGeoResource resource, AtomicBoolean isEvaluating,
37: AbstractPropertyValue<? extends Object> owner) {
38: this .evaluationObject = layer;
39: this .resource = resource;
40: this .isEvaluating = isEvaluating;
41: this .owner = owner;
42: }
43:
44: public void changed(IResolveChangeEvent event) {
45: if (isEvaluating.get())
46: return;
47: if (event.getType() == Type.POST_CHANGE) {
48: if (event.getResolve().getIdentifier().equals(
49: resource.getIdentifier())) {
50: if (isEvaluating.get())
51: return;
52: owner.notifyListeners(evaluationObject);
53: } else {
54: process(event.getDelta());
55: }
56: }
57: }
58:
59: private boolean process(IResolveDelta delta) {
60: if (isEvaluating.get())
61: return true;
62:
63: if (delta.getResolve().getIdentifier().equals(
64: resource.getIdentifier())) {
65: owner.notifyListeners(evaluationObject);
66: return true;
67: }
68:
69: List<IResolveDelta> children = delta.getChildren();
70:
71: for (IResolveDelta delta2 : children) {
72: if (isEvaluating.get())
73: return true;
74:
75: if (process(delta2))
76: return true;
77: }
78: return false;
79: }
80:
81: }
|