package org.marketcetera.photon.commons.ui.databinding; import org.eclipse.core.databinding.AggregateValidationStatus; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.ObservablesManager; import org.eclipse.core.databinding.observable.value.IValueChangeListener; import org.eclipse.core.databinding.observable.value.ValueChangeEvent; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.preference.PreferencePage; import org.marketcetera.util.misc.ClassVersion; /* $License$ */ /** * A {@link PreferencePage} that provides a {@link DataBindingContext} and an * {@link ObservablesManager} for convenience. Additionally, the page will have * its valid state bound to the data binding context such that it will only be * valid if the data binding context aggregate validation state is ok. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: DataBindingPreferencePage.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.0.0 */ @ClassVersion("$Id: DataBindingPreferencePage.java 16154 2012-07-14 16:34:05Z colin $") public abstract class DataBindingPreferencePage extends PreferencePage { private final DataBindingContext mDataBindingContext; private final ObservablesManager mObservablesManager; /** * Constructor. */ public DataBindingPreferencePage() { mDataBindingContext = new DataBindingContext(); mObservablesManager = new ObservablesManager(); final AggregateValidationStatus agg = new AggregateValidationStatus( mDataBindingContext, AggregateValidationStatus.MAX_SEVERITY); mObservablesManager.addObservable(agg); agg.addValueChangeListener(new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { setValid(((IStatus) event.diff.getNewValue()).isOK()); } }); } /** * Returns the data binding context. * * @return the data binding context */ protected DataBindingContext getDataBindingContext() { return mDataBindingContext; } /** * Returns the observables manager. * * @return the observables manager */ protected ObservablesManager getObservablesManager() { return mObservablesManager; } @Override public void dispose() { super.dispose(); // dispose the ObservablesManager first due to http://bugs.eclipse.org/287247 mObservablesManager.dispose(); mDataBindingContext.dispose(); } }