Index: src/org/eclipse/jface/databinding/dialog/DialogPageSupport.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/dialog/DialogPageSupport.java,v retrieving revision 1.2 diff -u -r1.2 DialogPageSupport.java --- src/org/eclipse/jface/databinding/dialog/DialogPageSupport.java 23 Oct 2008 17:47:08 -0000 1.2 +++ src/org/eclipse/jface/databinding/dialog/DialogPageSupport.java 22 Jan 2009 21:04:19 -0000 @@ -15,21 +15,13 @@ package org.eclipse.jface.databinding.dialog; -import java.util.Iterator; - import org.eclipse.core.databinding.AggregateValidationStatus; import org.eclipse.core.databinding.DataBindingContext; -import org.eclipse.core.databinding.ValidationStatusProvider; +import org.eclipse.core.databinding.TargetsListener; import org.eclipse.core.databinding.observable.ChangeEvent; import org.eclipse.core.databinding.observable.IChangeListener; -import org.eclipse.core.databinding.observable.IObservable; import org.eclipse.core.databinding.observable.IStaleListener; import org.eclipse.core.databinding.observable.StaleEvent; -import org.eclipse.core.databinding.observable.list.IListChangeListener; -import org.eclipse.core.databinding.observable.list.IObservableList; -import org.eclipse.core.databinding.observable.list.ListChangeEvent; -import org.eclipse.core.databinding.observable.list.ListDiff; -import org.eclipse.core.databinding.observable.list.ListDiffEntry; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.IValueChangeListener; import org.eclipse.core.databinding.observable.value.ValueChangeEvent; @@ -68,55 +60,9 @@ private DataBindingContext dbc; private IObservableValue aggregateStatus; private boolean uiChanged = false; - private IChangeListener uiChangeListener = new IChangeListener() { - public void handleChange(ChangeEvent event) { - handleUIChanged(); - } - }; - private IListChangeListener validationStatusProvidersListener = new IListChangeListener() { - public void handleListChange(ListChangeEvent event) { - ListDiff diff = event.diff; - ListDiffEntry[] differences = diff.getDifferences(); - for (int i = 0; i < differences.length; i++) { - ListDiffEntry listDiffEntry = differences[i]; - ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) listDiffEntry - .getElement(); - IObservableList targets = validationStatusProvider.getTargets(); - if (listDiffEntry.isAddition()) { - targets - .addListChangeListener(validationStatusProviderTargetsListener); - for (Iterator it = targets.iterator(); it.hasNext();) { - ((IObservable) it.next()) - .addChangeListener(uiChangeListener); - } - } else { - targets - .removeListChangeListener(validationStatusProviderTargetsListener); - for (Iterator it = targets.iterator(); it.hasNext();) { - ((IObservable) it.next()) - .removeChangeListener(uiChangeListener); - } - } - } - } - }; - private IListChangeListener validationStatusProviderTargetsListener = new IListChangeListener() { - public void handleListChange(ListChangeEvent event) { - ListDiff diff = event.diff; - ListDiffEntry[] differences = diff.getDifferences(); - for (int i = 0; i < differences.length; i++) { - ListDiffEntry listDiffEntry = differences[i]; - IObservable target = (IObservable) listDiffEntry.getElement(); - if (listDiffEntry.isAddition()) { - target.addChangeListener(uiChangeListener); - } else { - target.removeChangeListener(uiChangeListener); - } - } - } - }; protected IStatus currentStatus; protected boolean currentStatusStale; + private TargetsListener targetsListener; /** * @param dialogPage @@ -161,19 +107,11 @@ currentStatus = (IStatus) aggregateStatus.getValue(); currentStatusStale = aggregateStatus.isStale(); handleStatusChanged(); - dbc.getValidationStatusProviders().addListChangeListener( - validationStatusProvidersListener); - for (Iterator it = dbc.getValidationStatusProviders().iterator(); it - .hasNext();) { - ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it - .next(); - IObservableList targets = validationStatusProvider.getTargets(); - targets - .addListChangeListener(validationStatusProviderTargetsListener); - for (Iterator iter = targets.iterator(); iter.hasNext();) { - ((IObservable) iter.next()).addChangeListener(uiChangeListener); + targetsListener = TargetsListener.listenOnce(dbc, new IChangeListener() { + public void handleChange(ChangeEvent event) { + handleUIChanged(); } - } + }); } /** @@ -184,20 +122,6 @@ if (currentStatus != null) { handleStatusChanged(); } - dbc.getValidationStatusProviders().removeListChangeListener( - validationStatusProvidersListener); - for (Iterator it = dbc.getValidationStatusProviders().iterator(); it - .hasNext();) { - ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it - .next(); - IObservableList targets = validationStatusProvider.getTargets(); - targets - .removeListChangeListener(validationStatusProviderTargetsListener); - for (Iterator iter = targets.iterator(); iter.hasNext();) { - ((IObservable) iter.next()) - .removeChangeListener(uiChangeListener); - } - } } /** @@ -298,26 +222,10 @@ public void dispose() { aggregateStatus.dispose(); if (!uiChanged) { - for (Iterator it = dbc.getValidationStatusProviders().iterator(); it - .hasNext();) { - ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it - .next(); - IObservableList targets = validationStatusProvider.getTargets(); - targets - .removeListChangeListener(validationStatusProviderTargetsListener); - for (Iterator iter = targets.iterator(); iter.hasNext();) { - ((IObservable) iter.next()) - .removeChangeListener(uiChangeListener); - } - } - dbc.getValidationStatusProviders().removeListChangeListener( - validationStatusProvidersListener); + targetsListener.dispose(); } aggregateStatus = null; dbc = null; - uiChangeListener = null; - validationStatusProvidersListener = null; - validationStatusProviderTargetsListener = null; dialogPage = null; } }