diff options
author | Boris Bokowski | 2009-02-03 15:27:46 +0000 |
---|---|---|
committer | Boris Bokowski | 2009-02-03 15:27:46 +0000 |
commit | c6cca711ab741a7f30de8e2e5c2fe812a46cf812 (patch) | |
tree | 5a56b60ea9b2fb63b8b6f8121f1b7134a26fa154 /bundles/org.eclipse.core.databinding/src/org/eclipse/core | |
parent | ebee5c6e204667e19d19763a3a41fea511448f74 (diff) | |
download | eclipse.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')
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() { |