/******************************************************************************* * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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: * Soyatec - initial API and implementation *******************************************************************************/ package org.eclipse.papyrus.xwt.core; import java.util.HashMap; import org.eclipse.core.databinding.observable.ChangeEvent; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.papyrus.xwt.XWT; import org.eclipse.papyrus.xwt.internal.utils.UserData; import org.eclipse.swt.widgets.Widget; public class MultiDataTrigger extends TriggerBase { private Condition[] conditions = Condition.EMPTY_ARRAY; private Setter[] setters; private ValueChangeListener changeListener; public Condition[] getConditions() { return conditions; } public void setConditions(Condition[] conditions) { this.conditions = conditions; } public Setter[] getSetters() { return setters; } public void setSetters(Setter[] setters) { this.setters = setters; } class ValueChangeListener extends AbstractChangeListener { public ValueChangeListener(Object element) { super(element); } public void handleChange(ChangeEvent event) { doHandleChange(true); } public void doHandleChange(boolean update) { for(Condition condition : getConditions()) { if(!condition.evaluate(element)) { restoreValues(); return; } } for(SetterBase setter : getSetters()) { try { Object oldValue = setter.applyTo(element, update); if(oldvalues == null) { oldvalues = new HashMap<SetterBase, Object>(); } oldvalues.put(setter, oldValue); } catch (RuntimeException e) { continue; } } } } @Override public void prepare(Object target) { if(getConditions().length == 0) { return; } Widget widget = UserData.getWidget(target); if(widget == null) { return; } changeListener = new ValueChangeListener(target); for(Condition condition : getConditions()) { String sourceName = condition.getSourceName(); IBinding binding = condition.getBinding(); Object bindingTarget = null; if(binding != null) { if(binding instanceof IDynamicBinding) { IDynamicBinding dynamicBinding = (IDynamicBinding)binding; bindingTarget = dynamicBinding.createBoundSource(); } else { bindingTarget = binding.getValue(null); } } else { Object sourceObject = getElementByName(target, sourceName); Widget sourceWidget = UserData.getWidget(sourceObject); bindingTarget = XWT.getDataContext(sourceWidget); } if(!(bindingTarget instanceof IObservableValue)) { return; } IObservableValue observableValue = (IObservableValue)bindingTarget; observableValue.addChangeListener(changeListener); } changeListener.doHandleChange(false); } public void on(Object target) { changeListener.doHandleChange(true); } }