/******************************************************************************* * Copyright (c) 2011 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.ui.databinding; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.conversion.IConverter; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.validation.IValidator; /** * * A builder that offers a nice(r) semantic to build bindings. * * @author André Dietisheim * @see DataBindingContext#bindValue(IObservableValue, IObservableValue) * */ public class ValueBindingBuilder { public static TargetDefinition bind(IObservableValue target) { return new TargetDefinition(target); } private static Binding bind(TargetDefinition targetDefinition, ModelDefinition modelDefinition, DataBindingContext dbc) { return dbc.bindValue( targetDefinition.getObservable() , modelDefinition.getObservable() , targetDefinition.getStrategy() , modelDefinition.getStrategy()); } public static class TargetDefinition extends BindingParticipantDefinition<TargetDefinition> { public TargetDefinition(IObservableValue target) { super(target); } public ModelDefinition to(IObservableValue model) { return new ModelDefinition(model, this); } public ModelDefinition notUpdating(IObservableValue model) { notUpdatingParticipant(); return to(model); } } public static class ModelDefinition extends BindingParticipantDefinition<ModelDefinition> { private TargetDefinition targetDefinition; public ModelDefinition(IObservableValue model, TargetDefinition targetDefinition) { super(model); this.targetDefinition = targetDefinition; } public Binding in(DataBindingContext dbc) { return bind(targetDefinition, this, dbc); } } private abstract static class BindingParticipantDefinition<PARTICIPANT> { private IObservableValue observable; private UpdateValueStrategy strategy; public BindingParticipantDefinition(IObservableValue observable) { this.observable = observable; } public PARTICIPANT notUpdatingParticipant() { return withStrategy(new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER)); } @SuppressWarnings("unchecked") public PARTICIPANT withStrategy(UpdateValueStrategy strategy) { this.strategy = strategy; return (PARTICIPANT) this; } @SuppressWarnings("unchecked") public PARTICIPANT validatingAfterGet(IValidator validator) { ensureHasStrategy(); strategy.setAfterGetValidator(validator); return (PARTICIPANT) this; } @SuppressWarnings("unchecked") public PARTICIPANT validatingAfterConvert(IValidator validator) { ensureHasStrategy(); strategy.setAfterConvertValidator(validator); return (PARTICIPANT) this; } @SuppressWarnings("unchecked") public PARTICIPANT validatingBeforeSet(IValidator validator) { ensureHasStrategy(); strategy.setBeforeSetValidator(validator); return (PARTICIPANT) this; } @SuppressWarnings("unchecked") public PARTICIPANT converting(IConverter converter) { ensureHasStrategy(); strategy.setConverter(converter); return (PARTICIPANT) this; } private UpdateValueStrategy ensureHasStrategy() { if (strategy == null) { this.strategy = new UpdateValueStrategy(); } return strategy; } IObservableValue getObservable() { return observable; } UpdateValueStrategy getStrategy() { return strategy; } } }