package org.eclipse.jface.examples.databinding.nestedselection;

import org.eclipse.jface.internal.provisional.databinding.DataBinding;
import org.eclipse.jface.internal.provisional.databinding.IDataBindingContext;
import org.eclipse.jface.internal.provisional.databinding.IUpdatableFactory;
import org.eclipse.jface.internal.provisional.databinding.beans.BeanUpdatableFactory;
import org.eclipse.jface.internal.provisional.databinding.beans.NestedUpdatableFactory;
import org.eclipse.jface.internal.provisional.databinding.swt.SWTUpdatableFactory;
import org.eclipse.jface.internal.provisional.databinding.viewers.ViewersUpdatableFactory;
import org.eclipse.swt.widgets.Control;

/**
 * An example application-level data binding factory implementation. This should
 * be copied into your application and be modified to include the specific
 * updatable factories your application needs in the order it needs them.
 * <p>
 * Note that the search order for IUpdatableFactory implementations is last to
 * first.
 * </p>
 * 
 * @since 3.2
 */
public class BindingFactory {

	/**
	 * Creates a data binding context whose lifecycle is bound to an SWT
	 * control, and which supports binding to SWT controls, JFace viewers, and
	 * POJO model objects with JavaBeans-style notification.
	 * <p>
	 * This method is a convenience method; its implementation is equivalent to
	 * calling {@link DataBinding#createContext(Control, IUpdatableFactory[]) }
	 * where the array of factories consists of a {@link NestedUpdatableFactory},
	 * a {@link BeanUpdatableFactory} instance, a {@link SWTUpdatableFactory},
	 * and a {@link ViewersUpdatableFactory}.
	 * </p>
	 * 
	 * @param control
	 * @return a data binding context
	 */
	public static IDataBindingContext createContext(Control control) {
		return DataBinding.createContext(control, new IUpdatableFactory[] {
				new NestedUpdatableFactory(), new BeanUpdatableFactory(),
				new SWTUpdatableFactory(), new ViewersUpdatableFactory() });
	}

	/**
	 * Creates a data binding context which supports binding to SWT controls,
	 * JFace viewers, and POJO model objects with JavaBeans-style notification.
	 * This data binding context's life cycle is not bound to the dispose event
	 * of any SWT control. Consequently, the programmer is responsible to
	 * manually dispose any IUpdatables created using this data binding context
	 * as necessary.
	 * <p>
	 * This method is a convenience method; its implementation is equivalent to
	 * calling {@link DataBinding#createContext(Control, IUpdatableFactory[]) }
	 * where the array of factories consists of a {@link NestedUpdatableFactory},
	 * a {@link BeanUpdatableFactory} instance, a {@link SWTUpdatableFactory},
	 * and a {@link ViewersUpdatableFactory}.
	 * </p>
	 * 
	 * @return a data binding context
	 */
	public static IDataBindingContext createContext() {
		return DataBinding.createContext(new IUpdatableFactory[] {
				new NestedUpdatableFactory(), new BeanUpdatableFactory(),
				new SWTUpdatableFactory(), new ViewersUpdatableFactory() });
	}
}
