bug 419415 fix layout problems
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/ControlCreator.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/ControlCreator.java
index b39c60f..16a40b1 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/ControlCreator.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/ControlCreator.java
@@ -21,8 +21,11 @@
 
 	Set<T> controls = new HashSet<T>();
 
-	protected ControlCreator(UpdatingComposite parent) {
+	private Class<T> classOfControls;
+
+	protected ControlCreator(UpdatingComposite parent, Class<T> classOfControls) {
 		this.parent = parent;
+		this.classOfControls = classOfControls;
 	}
 
 	/**
@@ -75,6 +78,6 @@
 				return eachControl;
 			}
 		}
-		throw new RuntimeException("Control not in managed list"); //$NON-NLS-1$
+		return classOfControls.cast(control);
 	}
 }
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/UpdatingComposite.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/UpdatingComposite.java
index 57a316d..d7fd0b9 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/UpdatingComposite.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/UpdatingComposite.java
@@ -22,7 +22,7 @@
  * 419415 so it can be decided what to promote to general API.
  * <P>
  * A composite that automatically tracks and registers listeners on its
- * dsependencies as long as all of its dependencies are {@link IObservable}
+ * dependencies as long as all of its dependencies are {@link IObservable}
  * objects. The tracking is done while the child controls for this composite are
  * being created. So when any of the dependencies change, the child controls are
  * re-created.
@@ -50,6 +50,15 @@
  * 		ControlCreator companyNameControlCreator = new CompanyNameControlCreator(this);
  * 		ControlCreator genderComboCreator = new GenderComboCreator(this);
  * 
+ *  	MyComposite(Composite parent, int style) {
+ *  		super(parent, style);
+ *  
+ *  		// IMPORTANT: Constructors must always call this.  The constructor in the super class
+ *  		// cannot do this for you because trackControls calls createControls which may use fields in this class
+ *  		// that will not have been initialized when the super constructor is called.
+ *  		trackControls();
+ *   	}
+ *   
  * 	&#064;Override
  * 	protected void createControls() {
  * 		Label label1 = labelCreator.create();
@@ -128,7 +137,8 @@
 	private IObservable[] dependencies = null;
 
 	/**
-	 * Set to a non-null list only while controls are being re-built.
+	 * Set to a non-null list only while controls are being re-built, this being
+	 * the list of controls available for re-use and must be in order
 	 */
 	List<Control> remainder = null;
 
@@ -197,8 +207,6 @@
 			for (Control control : remainder) {
 				remove(control);
 			}
-
-			layout(true);
 		}
 	}
 
@@ -210,15 +218,6 @@
 
 	public UpdatingComposite(Composite parent, int style) {
 		super(parent, style);
-		/*
-		 * We must wait until after the derived class fields have been
-		 * initialized before attempting to create the child controls.
-		 */
-		// Display.getCurrent().asyncExec(new Runnable() {
-		// public void run() {
-		trackControls();
-		// }
-		// });
 
 		addDisposeListener(new DisposeListener() {
 			public void widgetDisposed(DisposeEvent e) {
@@ -249,7 +248,21 @@
 						return;
 					}
 
-					trackControls();
+					createAndTrackControls();
+
+					/*
+					 * Having added and removed controls, this composite now
+					 * needs to be laid out. The children are okay because they
+					 * should be laid out when they are created or re-used, so
+					 * passing <code>false</code> is fine.
+					 */
+					layout(false);
+
+					/*
+					 * Assume that the preferred size has changed. Parent
+					 * composites may need to re-layout their controls whenever
+					 * the size of this control changes.
+					 */
 					computeSizeObservable.fireChange();
 				}
 			});
@@ -259,12 +272,12 @@
 	/**
 	 * This line will do the following:
 	 * <UL>
-	 * <LI>Run the calculate method</LI>
+	 * <LI>Run the <code>createControls</code> method</LI>
 	 * <LI>While doing so, add any observable that is touched to the
 	 * dependencies list</LI>
 	 * </UL>
 	 */
-	protected void trackControls() {
+	protected void createAndTrackControls() {
 		IObservable[] newDependencies = ObservableTracker.runAndMonitor(
 				privateRunnableInterface, privateChangeInterface, null);
 
@@ -305,37 +318,51 @@
 		}
 	}
 
+	/**
+	 * This method is called while getters are being tracked. However we want to
+	 * track only getters on observables that were used to determine which
+	 * controls are created and setting properties on those controls outside of
+	 * the control creator. We really don't want to track getters that are used
+	 * while creating the control. For example it may be that
+	 * 
+	 * @param controlCreator
+	 * @return the control, which may be either re-used or just created by the
+	 *         control creator
+	 */
 	<T extends Control> T create(ControlCreator<T> controlCreator) {
-
-		T matchingControl = null;
-		for (Control control : remainder) {
-			if (controlCreator.equals(control.getData(key))) {
-				matchingControl = controlCreator.typeControl(control);
-				break;
+		ObservableTracker.setIgnore(true);
+		try {
+			T matchingControl = null;
+			for (Control control : remainder) {
+				if (controlCreator.equals(control.getData(key))) {
+					matchingControl = controlCreator.typeControl(control);
+					break;
+				}
 			}
+
+			if (matchingControl != null) {
+				/*
+				 * Move this control to be before any other remaining controls.
+				 */
+				if (matchingControl != remainder.get(0)) {
+					matchingControl.moveAbove(remainder.get(0));
+				}
+				remainder.remove(matchingControl);
+			} else {
+				matchingControl = controlCreator.createControl();
+				matchingControl.setData(key, controlCreator);
+				controlCreator.controls.add(matchingControl);
+				/*
+				 * Move this control to be before any other remaining controls.
+				 */
+				if (!remainder.isEmpty()) {
+					matchingControl.moveAbove(remainder.get(0));
+				}
+			}
+			return matchingControl;
+		} finally {
+			ObservableTracker.setIgnore(false);
 		}
-
-		if (matchingControl != null) {
-			/*
-			 * Move this control to be before any other remaining controls.
-			 */
-			if (matchingControl != remainder.get(0)) {
-				matchingControl.moveBelow(remainder.get(0));
-			}
-			remainder.remove(matchingControl);
-		} else {
-			matchingControl = controlCreator.createControl();
-			matchingControl.setData(key, controlCreator);
-			controlCreator.controls.add(matchingControl);
-			/*
-			 * Move this control to be before any other remaining controls.
-			 */
-			if (!remainder.isEmpty()) {
-				matchingControl.moveBelow(remainder.get(0));
-			}
-		}
-
-		return matchingControl;
 	}
 
 	/**