/******************************************************************************* * 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.conversion.IConverter; import org.eclipse.core.databinding.observable.ChangeEvent; import org.eclipse.core.databinding.observable.IObservable; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.papyrus.xwt.XWT; import org.eclipse.papyrus.xwt.XWTException; import org.eclipse.papyrus.xwt.databinding.JFaceXWTDataBinding; import org.eclipse.papyrus.xwt.internal.core.ScopeManager; import org.eclipse.papyrus.xwt.internal.core.UpdateSourceTrigger; import org.eclipse.papyrus.xwt.internal.utils.LoggerManager; import org.eclipse.papyrus.xwt.internal.utils.UserData; import org.eclipse.swt.widgets.Widget; public class Trigger extends TriggerBase { private String property; private String sourceName; private Operator operator = Operator.EQ; private Object value; private SetterBase[] setters; public Operator getOperator() { return operator; } public void setOperator(Operator operator) { this.operator = operator; } public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } public String getSourceName() { return sourceName; } public void setSourceName(String sourceName) { this.sourceName = sourceName; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } public SetterBase[] getSetters() { if(setters == null) { return SetterBase.EMPTY_SETTERS; } return setters; } public void setSetters(SetterBase[] setters) { this.setters = setters; } public void on(Object target) { } public void prepare(Object target) { if(property != null) { final Object source = getElementByName(target, sourceName); if(source == null) { throw new XWTException("No element is found with the name = " + sourceName); } IObservable observableValue = ScopeManager.observeValue(source, source, property, UpdateSourceTrigger.PropertyChanged); observableValue.addChangeListener(new AbstractChangeListener(target) { public void handleChange(ChangeEvent event) { Class<?> valueType = JFaceXWTDataBinding.getValueType(source.getClass(), property); if(valueType == null) { LoggerManager.log("Type of the property " + property + " is not found in " + source.getClass().getName()); return; } Widget widget = UserData.getWidget(source); if(widget == null) { return; } // // test value == // Object realValue = value; if(value != null) { IConverter converter = XWT.findConvertor(value.getClass(), valueType); if(converter != null) { realValue = converter.convert(value); } } Object newValue = event.getSource(); if(newValue instanceof IObservableValue) { IObservableValue observableValue = (IObservableValue)newValue; newValue = observableValue.getValue(); } if(newValue != null) { IConverter newConverter = XWT.findConvertor(newValue.getClass(), valueType); if(newConverter != null) { newValue = newConverter.convert(newValue); } } if(!Operator.compare(newValue, operator, realValue)) { restoreValues(); if(oldvalues != null) { oldvalues.clear(); } return; } if(oldvalues != null && !oldvalues.isEmpty()) { return; } for(SetterBase setter : getSetters()) { try { Object oldValue = setter.applyTo(element, true); if(oldvalues == null) { oldvalues = new HashMap<SetterBase, Object>(); } oldvalues.put(setter, oldValue); } catch (RuntimeException e) { continue; } } } }); } } }