/******************************************************************************* * Copyright (c) 2006-2013 The RCP Company and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * The RCP Company - initial API and implementation *******************************************************************************/ package com.rcpcompany.uibindings.internal.utils; import org.eclipse.core.databinding.observable.ChangeEvent; import org.eclipse.core.databinding.observable.IChangeListener; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.emf.ecore.EcorePackage; import com.rcpcompany.uibindings.IBindingContext; import com.rcpcompany.uibindings.IBindingContextFinalizer; import com.rcpcompany.uibindings.IValueBinding; import com.rcpcompany.uibindings.model.utils.BasicUtils; import com.rcpcompany.uibindings.utils.IBindingEnabler; /** * Implementation of {@link IBindingEnabler}. * * @author Tonny Madsen, The RCP Company */ public class BindingEnabler implements IBindingEnabler, IBindingContextFinalizer { private final IValueBinding myBinding; private final IObservableValue mySourceOV; private final Object[] myValues; private final String myAttribute = "enabled"; private IValueBinding myEnableBinding; private IObservableValue myEnabledOV; /** * {@inheritDoc IBindingEnabler.Factory#add(IValueBinding, IObservableValue, Object...)}. * * @see IBindingEnabler.Factory#add(IValueBinding, IObservableValue, Object...) */ public BindingEnabler(IValueBinding b, IObservableValue sourceOV, Object... values) { myBinding = b; mySourceOV = sourceOV; myValues = values; final IBindingContext context = myBinding.getContext(); switch (myBinding.getState()) { case OK: run(context); break; case INIT: case PHASE1: case PHASE2: case PHASE3: context.getFinalizers().add(this); break; default: break; } } @Override public void dispose() { myBinding.getContext().getFinalizers().remove(this); if (myEnableBinding != null && !myEnableBinding.isDisposed()) { myEnableBinding.dispose(); } myEnableBinding = null; if (myEnabledOV != null && !myEnabledOV.isDisposed()) { myEnabledOV.dispose(); } myEnabledOV = null; } @Override public void run(IBindingContext context) { context.getFinalizers().remove(this); myEnabledOV = WritableValue.withValueType(EcorePackage.Literals.EBOOLEAN); mySourceOV.addChangeListener(new IChangeListener() { @Override public void handleChange(ChangeEvent event) { myEnabledOV.setValue(isEnabled()); } }); myEnabledOV.setValue(isEnabled()); myEnableBinding = context.addBinding().ui(myBinding.getControl(), myAttribute).model(myEnabledOV); context.finish(); } /** * Returns the current enabled state for this enabler based on the current value of the source * value. * * @return the current enablement state */ public boolean isEnabled() { final Object currentValue = mySourceOV.getValue(); boolean enabled = false; for (final Object v : myValues) { if (BasicUtils.equals(currentValue, v)) { enabled = true; break; } } return enabled; } }