Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Bokowski2009-02-03 15:27:46 +0000
committerBoris Bokowski2009-02-03 15:27:46 +0000
commitc6cca711ab741a7f30de8e2e5c2fe812a46cf812 (patch)
tree5a56b60ea9b2fb63b8b6f8121f1b7134a26fa154 /bundles/org.eclipse.core.databinding/src/org/eclipse/core
parentebee5c6e204667e19d19763a3a41fea511448f74 (diff)
downloadeclipse.platform.ui-c6cca711ab741a7f30de8e2e5c2fe812a46cf812.tar.gz
eclipse.platform.ui-c6cca711ab741a7f30de8e2e5c2fe812a46cf812.tar.xz
eclipse.platform.ui-c6cca711ab741a7f30de8e2e5c2fe812a46cf812.zip
Released patch for Bug 255734 [DataBinding] DecoratingObservable should self-dispose when the decorated observable is disposed
Diffstat (limited to 'bundles/org.eclipse.core.databinding/src/org/eclipse/core')
-rw-r--r--bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeManager.java35
-rw-r--r--bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservable.java7
2 files changed, 18 insertions, 24 deletions
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeManager.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeManager.java
index bf2be9ad8cb..a100ad6acb6 100644
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeManager.java
+++ b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeManager.java
@@ -7,7 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
- * Matthew Hall - bug 118516
+ * Matthew Hall - bugs 118516, 255734
*******************************************************************************/
package org.eclipse.core.databinding.observable;
@@ -61,20 +61,11 @@ import org.eclipse.core.runtime.ListenerList;
}
listenerTypes[length] = listenerType;
listenerLists[length] = new ListenerList();
- boolean hadListeners = hasListeners();
- listenerLists[length].add(listener);
- if (!hadListeners) {
- this.firstListenerAdded();
- }
- return;
+ listenerTypeIndex = length;
}
- ListenerList listenerList = listenerLists[listenerTypeIndex];
- boolean hadListeners = true;
- if (listenerList.size() == 0) {
- hadListeners = hasListeners();
- }
- listenerList.add(listener);
- if (!hadListeners) {
+ boolean hadListeners = hasListeners();
+ listenerLists[listenerTypeIndex].add(listener);
+ if (!hadListeners && hasListeners()) {
firstListenerAdded();
}
}
@@ -87,9 +78,10 @@ import org.eclipse.core.runtime.ListenerList;
IObservablesListener listener) {
int listenerTypeIndex = findListenerTypeIndex(listenerType);
if (listenerTypeIndex != -1) {
+ boolean hadListeners = hasListeners();
listenerLists[listenerTypeIndex].remove(listener);
if (listenerLists[listenerTypeIndex].size() == 0) {
- if (!hasListeners()) {
+ if (hadListeners && !hasListeners()) {
this.lastListenerRemoved();
}
}
@@ -97,14 +89,11 @@ import org.eclipse.core.runtime.ListenerList;
}
protected boolean hasListeners() {
- if (listenerTypes == null) {
- return false;
- }
- for (int i = 0; i < listenerTypes.length; i++) {
- if (listenerLists[i].size() > 0) {
- return true;
- }
- }
+ if (listenerTypes != null)
+ for (int i = 0; i < listenerTypes.length; i++)
+ if (listenerTypes[i] != DisposeEvent.TYPE)
+ if (listenerLists[i].size() > 0)
+ return true;
return false;
}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservable.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservable.java
index 642dfe6db42..cee04f8afc0 100644
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservable.java
+++ b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservable.java
@@ -7,7 +7,7 @@
*
* Contributors:
* Matthew Hall - initial API and implementation (bug 237718)
- * Matthew Hall - but 246626
+ * Matthew Hall - bugs 246626, 255734
******************************************************************************/
package org.eclipse.core.databinding.observable;
@@ -43,6 +43,11 @@ public class DecoratingObservable extends AbstractObservable implements
super(decorated.getRealm());
this.decorated = decorated;
this.disposedDecoratedOnDispose = disposeDecoratedOnDispose;
+ decorated.addDisposeListener(new IDisposeListener() {
+ public void handleDispose(DisposeEvent staleEvent) {
+ dispose();
+ }
+ });
}
public IObservable getDecorated() {

Back to the top