]> source.dussan.org Git - vaadin-framework.git/commitdiff
Refactor #8313 based on API review
authorLeif Åstrand <leif@vaadin.com>
Mon, 27 Feb 2012 11:42:15 +0000 (13:42 +0200)
committerLeif Åstrand <leif@vaadin.com>
Mon, 27 Feb 2012 11:42:15 +0000 (13:42 +0200)
31 files changed:
src/com/vaadin/terminal/gwt/client/ApplicationConnection.java
src/com/vaadin/terminal/gwt/client/CalculatingLayout.java [deleted file]
src/com/vaadin/terminal/gwt/client/DirectionalManagedLayout.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/FastStringSet.java
src/com/vaadin/terminal/gwt/client/LayoutManager.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/MeasureManager.java [deleted file]
src/com/vaadin/terminal/gwt/client/MeasuredSize.java
src/com/vaadin/terminal/gwt/client/VPaintableMap.java
src/com/vaadin/terminal/gwt/client/VPaintableWidget.java
src/com/vaadin/terminal/gwt/client/ui/LayoutPhaseListener.java [deleted file]
src/com/vaadin/terminal/gwt/client/ui/ManagedLayout.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/PostLayoutListener.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/ResizeRequired.java [deleted file]
src/com/vaadin/terminal/gwt/client/ui/SimpleManagedLayout.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayoutPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VAbstractPaintableWidget.java
src/com/vaadin/terminal/gwt/client/ui/VAbstractSplitPanelPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VAccordionPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VCustomLayoutPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VFilterSelectPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VFormPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java
src/com/vaadin/terminal/gwt/client/ui/VGridLayoutPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VMeasuringOrderedLayoutPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VMenuBarPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VPanelPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VScrollTablePaintable.java
src/com/vaadin/terminal/gwt/client/ui/VTabsheetPaintable.java
src/com/vaadin/terminal/gwt/client/ui/VWindowPaintable.java
src/com/vaadin/terminal/gwt/client/ui/layout/VPaintableLayoutSlot.java
tests/testbench/com/vaadin/tests/components/root/RootInitException.java [new file with mode: 0644]

index 2cb1b1fcd02458861bd5417e802a1a697ed9b980..24683b0c9c33f64259f7ec94994df6e7fa1de0f0 100644 (file)
@@ -162,7 +162,7 @@ public class ApplicationConnection {
 
     private Set<VPaintableWidget> zeroHeightComponents = null;
 
-    private final MeasureManager measureManager = new MeasureManager();
+    private final LayoutManager layoutManager = new LayoutManager(this);
 
     public ApplicationConnection() {
         view = GWT.create(VViewPaintable.class);
@@ -1594,16 +1594,7 @@ public class ApplicationConnection {
     public void forceLayout() {
         Duration duration = new Duration();
 
-        VPaintableMap paintableMap = getPaintableMap();
-        VPaintableWidget[] paintableWidgets = paintableMap
-                .getRegisteredPaintableWidgets();
-        for (VPaintableWidget vPaintableWidget : paintableWidgets) {
-            MeasuredSize measuredSize = vPaintableWidget.getMeasuredSize();
-            measuredSize.setHeightNeedsUpdate();
-            measuredSize.setWidthNeedsUpdate();
-        }
-
-        doLayout(false);
+        layoutManager.foceLayout();
 
         VConsole.log("forceLayout in " + duration.elapsedMillis() + " ms");
     }
@@ -2015,7 +2006,7 @@ public class ApplicationConnection {
         public void execute() {
             layoutScheduled = false;
 
-            measureManager.doLayout(ApplicationConnection.this);
+            layoutManager.doLayout();
         }
     };
 
@@ -2027,4 +2018,8 @@ public class ApplicationConnection {
             Scheduler.get().scheduleDeferred(layoutCommand);
         }
     }
+
+    LayoutManager getLayoutManager() {
+        return layoutManager;
+    }
 }
diff --git a/src/com/vaadin/terminal/gwt/client/CalculatingLayout.java b/src/com/vaadin/terminal/gwt/client/CalculatingLayout.java
deleted file mode 100644 (file)
index 2409505..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/* 
-@VaadinApache2LicenseForJavaFiles@
- */
-package com.vaadin.terminal.gwt.client;
-
-public interface CalculatingLayout extends VPaintableWidgetContainer {
-    public void updateVerticalSizes();
-
-    public void updateHorizontalSizes();
-}
\ No newline at end of file
diff --git a/src/com/vaadin/terminal/gwt/client/DirectionalManagedLayout.java b/src/com/vaadin/terminal/gwt/client/DirectionalManagedLayout.java
new file mode 100644 (file)
index 0000000..296fbb2
--- /dev/null
@@ -0,0 +1,12 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+package com.vaadin.terminal.gwt.client;
+
+import com.vaadin.terminal.gwt.client.ui.ManagedLayout;
+
+public interface DirectionalManagedLayout extends ManagedLayout {
+    public void layoutVertically();
+
+    public void layoutHorizontally();
+}
\ No newline at end of file
index b5b4b8dc1dad134108f72839446aaaa48aff8cc8..05ed8addc8315b0ed1630029431c959c94ea32bd 100644 (file)
@@ -32,7 +32,9 @@ public final class FastStringSet extends JavaScriptObject {
     /*-{
         var array = [];
         for(var string in this) {
-            array.push(string);
+            if (this.hasOwnProperty(string)) {
+                array.push(string);
+            }
         }
         return array;
     }-*/;
@@ -42,6 +44,16 @@ public final class FastStringSet extends JavaScriptObject {
         delete this[string];
     }-*/;
 
+    public native boolean isEmpty()
+    /*-{
+        for(var string in this) {
+            if (this.hasOwnProperty(string)) {
+                return false;
+            }
+        }
+        return true;
+    }-*/;
+
     public static FastStringSet create() {
         return JavaScriptObject.createObject().cast();
     }
diff --git a/src/com/vaadin/terminal/gwt/client/LayoutManager.java b/src/com/vaadin/terminal/gwt/client/LayoutManager.java
new file mode 100644 (file)
index 0000000..d125543
--- /dev/null
@@ -0,0 +1,334 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+package com.vaadin.terminal.gwt.client;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import com.google.gwt.core.client.Duration;
+import com.google.gwt.core.client.JsArrayString;
+import com.google.gwt.dom.client.Element;
+import com.vaadin.terminal.gwt.client.ui.ManagedLayout;
+import com.vaadin.terminal.gwt.client.ui.PostLayoutListener;
+import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout;
+
+public class LayoutManager {
+    private final ApplicationConnection connection;
+    private final Set<Element> nonPaintableElements = new HashSet<Element>();
+    private final MeasuredSize nullSize = new MeasuredSize();
+
+    public LayoutManager(ApplicationConnection connection) {
+        this.connection = connection;
+    }
+
+    public static LayoutManager get(ApplicationConnection connection) {
+        return connection.getLayoutManager();
+    }
+
+    public void registerDependency(ManagedLayout owner, Element element) {
+        MeasuredSize measuredSize = ensureMeasured(element);
+
+        MeasuredSize ownerSize = getMeasuredSize(owner);
+        if (measuredSize.isHeightNeedsUpdate()) {
+            ownerSize.setHeightNeedsUpdate();
+        }
+        if (measuredSize.isWidthNeedsUpdate()) {
+            ownerSize.setWidthNeedsUpdate();
+        }
+        measuredSize.addDependent(owner.getId());
+    }
+
+    private MeasuredSize ensureMeasured(Element element) {
+        MeasuredSize measuredSize = getMeasuredSize(element, null);
+        if (measuredSize == null) {
+            measuredSize = new MeasuredSize();
+
+            if (VPaintableMap.get(connection).getPaintable(element) == null) {
+                nonPaintableElements.add(element);
+            }
+            setMeasuredSize(element, measuredSize);
+        }
+        return measuredSize;
+    }
+
+    private boolean needsMeasure(Element e) {
+        if (connection.getPaintableMap().getPid(e) != null) {
+            return true;
+        } else if (getMeasuredSize(e, nullSize).hasDependents()) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private static native void setMeasuredSize(Element element,
+            MeasuredSize measuredSize)
+    /*-{
+        if (measuredSize) {
+            element.vMeasuredSize = measuredSize;
+        } else {
+            delete element.vMeasuredSize;
+        }
+    }-*/;
+
+    private static native final MeasuredSize getMeasuredSize(Element element,
+            MeasuredSize defaultSize)
+    /*-{
+        return element.vMeasuredSize || defaultSize;
+    }-*/;
+
+    private static final MeasuredSize getMeasuredSize(VPaintableWidget paintable) {
+        Element element = paintable.getWidgetForPaintable().getElement();
+        MeasuredSize measuredSize = getMeasuredSize(element, null);
+        if (measuredSize == null) {
+            measuredSize = new MeasuredSize();
+            setMeasuredSize(element, measuredSize);
+        }
+        return measuredSize;
+    }
+
+    public void unregisterDependency(ManagedLayout owner, Element element) {
+        MeasuredSize measuredSize = getMeasuredSize(element, null);
+        if (measuredSize == null) {
+            return;
+        }
+        measuredSize.removeDependent(owner.getId());
+        if (!needsMeasure(element)) {
+            nonPaintableElements.remove(element);
+            setMeasuredSize(element, null);
+        }
+    }
+
+    public void doLayout() {
+        VPaintableMap paintableMap = connection.getPaintableMap();
+        VPaintableWidget[] paintableWidgets = paintableMap
+                .getRegisteredPaintableWidgets();
+
+        int passes = 0;
+        Duration totalDuration = new Duration();
+
+        while (true) {
+            Duration passDuration = new Duration();
+            passes++;
+            measureElements(paintableWidgets);
+
+            FastStringSet needsHeightUpdate = FastStringSet.create();
+            FastStringSet needsWidthUpdate = FastStringSet.create();
+
+            for (VPaintableWidget paintable : paintableWidgets) {
+                MeasuredSize measuredSize = getMeasuredSize(paintable);
+                boolean notifiableType = isNotifiableType(paintable);
+
+                VPaintableWidgetContainer parent = paintable.getParent();
+                boolean parentNotifiable = parent != null
+                        && isNotifiableType(parent);
+
+                if (measuredSize.isHeightNeedsUpdate()) {
+                    if (notifiableType) {
+                        needsHeightUpdate.add(paintable.getId());
+                    }
+                    if (!paintable.isRelativeHeight() && parentNotifiable) {
+                        needsHeightUpdate.add(parent.getId());
+                    }
+                }
+                if (measuredSize.isWidthNeedsUpdate()) {
+                    if (notifiableType) {
+                        needsWidthUpdate.add(paintable.getId());
+                    }
+                    if (!paintable.isRelativeWidth() && parentNotifiable) {
+                        needsWidthUpdate.add(parent.getId());
+                    }
+                }
+                measuredSize.clearDirtyState();
+            }
+
+            int measureTime = passDuration.elapsedMillis();
+            VConsole.log("Measure in " + measureTime + " ms");
+
+            FastStringSet updatedSet = FastStringSet.create();
+
+            JsArrayString needsWidthUpdateArray = needsWidthUpdate.dump();
+
+            for (int i = 0; i < needsWidthUpdateArray.length(); i++) {
+                String pid = needsWidthUpdateArray.get(i);
+
+                VPaintable paintable = paintableMap.getPaintable(pid);
+                if (paintable instanceof DirectionalManagedLayout) {
+                    DirectionalManagedLayout cl = (DirectionalManagedLayout) paintable;
+                    cl.layoutHorizontally();
+                } else if (paintable instanceof SimpleManagedLayout) {
+                    SimpleManagedLayout rr = (SimpleManagedLayout) paintable;
+                    rr.layout();
+                    needsHeightUpdate.remove(pid);
+                }
+                updatedSet.add(pid);
+            }
+
+            JsArrayString needsHeightUpdateArray = needsHeightUpdate.dump();
+            for (int i = 0; i < needsHeightUpdateArray.length(); i++) {
+                String pid = needsHeightUpdateArray.get(i);
+
+                VPaintableWidget paintable = (VPaintableWidget) paintableMap
+                        .getPaintable(pid);
+                if (paintable instanceof DirectionalManagedLayout) {
+                    DirectionalManagedLayout cl = (DirectionalManagedLayout) paintable;
+                    cl.layoutVertically();
+                } else if (paintable instanceof SimpleManagedLayout) {
+                    SimpleManagedLayout rr = (SimpleManagedLayout) paintable;
+                    rr.layout();
+                }
+                updatedSet.add(pid);
+            }
+
+            JsArrayString changed = updatedSet.dump();
+            VConsole.log(changed.length() + " requestLayout invocations in "
+                    + (passDuration.elapsedMillis() - measureTime) + "ms");
+
+            StringBuilder b = new StringBuilder();
+            b.append(changed.length());
+            b.append(" changed widgets in pass ");
+            b.append(passes);
+            b.append(" in ");
+            b.append(passDuration.elapsedMillis());
+            b.append(" ms: ");
+            if (changed.length() < 10) {
+                for (int i = 0; i < changed.length(); i++) {
+                    if (i != 0) {
+                        b.append(", ");
+                    }
+                    b.append(changed.get(i));
+                }
+            }
+            VConsole.log(b.toString());
+
+            if (changed.length() == 0) {
+                VConsole.log("No more changes in pass " + passes);
+                break;
+            }
+
+            if (passes > 100) {
+                VConsole.log("Aborting layout");
+                break;
+            }
+        }
+
+        for (VPaintableWidget vPaintableWidget : paintableWidgets) {
+            if (vPaintableWidget instanceof PostLayoutListener) {
+                ((PostLayoutListener) vPaintableWidget).postLayout();
+            }
+        }
+
+        VConsole.log("Total layout time: " + totalDuration.elapsedMillis()
+                + "ms");
+    }
+
+    private void measureElements(VPaintableWidget[] paintableWidgets) {
+
+        for (VPaintableWidget paintableWidget : paintableWidgets) {
+            Element element = paintableWidget.getWidgetForPaintable()
+                    .getElement();
+            MeasuredSize measuredSize = getMeasuredSize(paintableWidget);
+            measuredAndUpdate(element, measuredSize);
+        }
+
+        for (Element element : nonPaintableElements) {
+            MeasuredSize measuredSize = getMeasuredSize(element, null);
+            measuredAndUpdate(element, measuredSize);
+        }
+    }
+
+    private void measuredAndUpdate(Element element, MeasuredSize measuredSize) {
+        if (measuredSize.measure(element)) {
+            JsArrayString dependents = measuredSize.getDependents();
+            for (int i = 0; i < dependents.length(); i++) {
+                String pid = dependents.get(i);
+                VPaintableWidget dependent = (VPaintableWidget) connection
+                        .getPaintableMap().getPaintable(pid);
+                if (dependent != null) {
+                    MeasuredSize dependentSize = getMeasuredSize(dependent);
+                    if (measuredSize.isHeightNeedsUpdate()) {
+                        dependentSize.setHeightNeedsUpdate();
+                    }
+                    if (measuredSize.isWidthNeedsUpdate()) {
+                        dependentSize.setWidthNeedsUpdate();
+                    }
+                }
+            }
+        }
+    }
+
+    private static boolean isNotifiableType(VPaintableWidget paintable) {
+        return paintable instanceof SimpleManagedLayout
+                || paintable instanceof DirectionalManagedLayout;
+    }
+
+    public void foceLayout() {
+        VPaintableMap paintableMap = connection.getPaintableMap();
+        VPaintableWidget[] paintableWidgets = paintableMap
+                .getRegisteredPaintableWidgets();
+        for (VPaintableWidget vPaintableWidget : paintableWidgets) {
+            MeasuredSize measuredSize = getMeasuredSize(vPaintableWidget);
+            measuredSize.setHeightNeedsUpdate();
+            measuredSize.setWidthNeedsUpdate();
+        }
+        doLayout();
+    }
+
+    public final void setNeedsUpdate(ManagedLayout layout) {
+        setWidthNeedsUpdate(layout);
+        setHeightNeedsUpdate(layout);
+    }
+
+    public final void setWidthNeedsUpdate(ManagedLayout layout) {
+        getMeasuredSize(layout).setWidthNeedsUpdate();
+    }
+
+    public final void setHeightNeedsUpdate(ManagedLayout layout) {
+        getMeasuredSize(layout).setHeightNeedsUpdate();
+    }
+
+    public boolean isMeasured(Element element) {
+        return getMeasuredSize(element, nullSize) != nullSize;
+    }
+
+    public final int getOuterHeight(Element element) {
+        return getMeasuredSize(element, nullSize).getOuterHeight();
+    }
+
+    public final int getOuterWidth(Element element) {
+        return getMeasuredSize(element, nullSize).getOuterWidth();
+    }
+
+    public final int getInnerHeight(Element element) {
+        return getMeasuredSize(element, nullSize).getInnerHeight();
+    }
+
+    public final int getInnerWidth(Element element) {
+        return getMeasuredSize(element, nullSize).getInnerWidth();
+    }
+
+    public final int getBorderHeight(Element element) {
+        return getMeasuredSize(element, nullSize).getBorderHeight();
+    }
+
+    public int getPaddingHeight(Element element) {
+        return getMeasuredSize(element, nullSize).getPaddingHeight();
+    }
+
+    public int getBorderWidth(Element element) {
+        return getMeasuredSize(element, nullSize).getBorderWidth();
+    }
+
+    public int getPaddingWidth(Element element) {
+        return getMeasuredSize(element, nullSize).getPaddingWidth();
+    }
+
+    public int getPaddingTop(Element element) {
+        return getMeasuredSize(element, nullSize).getPaddingTop();
+    }
+
+    public int getPaddingLeft(Element element) {
+        return getMeasuredSize(element, nullSize).getPaddingLeft();
+    }
+}
diff --git a/src/com/vaadin/terminal/gwt/client/MeasureManager.java b/src/com/vaadin/terminal/gwt/client/MeasureManager.java
deleted file mode 100644 (file)
index f661ce6..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-/* 
-@VaadinApache2LicenseForJavaFiles@
- */
-package com.vaadin.terminal.gwt.client;
-
-import com.google.gwt.core.client.Duration;
-import com.google.gwt.core.client.JsArrayString;
-import com.vaadin.terminal.gwt.client.ui.LayoutPhaseListener;
-import com.vaadin.terminal.gwt.client.ui.ResizeRequired;
-
-public class MeasureManager {
-
-    public void doLayout(ApplicationConnection client) {
-        VPaintableMap paintableMap = client.getPaintableMap();
-        VPaintableWidget[] paintableWidgets = paintableMap
-                .getRegisteredPaintableWidgets();
-
-        for (VPaintableWidget vPaintableWidget : paintableWidgets) {
-            if (vPaintableWidget instanceof LayoutPhaseListener) {
-                ((LayoutPhaseListener) vPaintableWidget).beforeLayout();
-            }
-        }
-
-        int passes = 0;
-        Duration totalDuration = new Duration();
-
-        while (true) {
-            Duration passDuration = new Duration();
-            passes++;
-            measureWidgets(paintableWidgets);
-
-            FastStringSet needsHeightUpdate = FastStringSet.create();
-            FastStringSet needsWidthUpdate = FastStringSet.create();
-
-            for (VPaintableWidget paintable : paintableWidgets) {
-                MeasuredSize measuredSize = paintable.getMeasuredSize();
-                boolean notifiableType = isNotifiableType(paintable);
-
-                VPaintableWidgetContainer parent = paintable.getParent();
-                boolean parentNotifiable = parent != null
-                        && isNotifiableType(parent);
-
-                if (measuredSize.isHeightNeedsUpdate()) {
-                    if (notifiableType) {
-                        needsHeightUpdate.add(paintable.getId());
-                    }
-                    if (!paintable.isRelativeHeight() && parentNotifiable) {
-                        needsHeightUpdate.add(parent.getId());
-                    }
-                }
-                if (measuredSize.isWidthNeedsUpdate()) {
-                    if (notifiableType) {
-                        needsWidthUpdate.add(paintable.getId());
-                    }
-                    if (!paintable.isRelativeWidth() && parentNotifiable) {
-                        needsWidthUpdate.add(parent.getId());
-                    }
-                }
-                measuredSize.clearDirtyState();
-            }
-
-            int measureTime = passDuration.elapsedMillis();
-            VConsole.log("Measure in " + measureTime + " ms");
-
-            FastStringSet updatedSet = FastStringSet.create();
-
-            JsArrayString needsWidthUpdateArray = needsWidthUpdate.dump();
-
-            for (int i = 0; i < needsWidthUpdateArray.length(); i++) {
-                String pid = needsWidthUpdateArray.get(i);
-
-                VPaintable paintable = paintableMap.getPaintable(pid);
-                if (paintable instanceof CalculatingLayout) {
-                    CalculatingLayout cl = (CalculatingLayout) paintable;
-                    cl.updateHorizontalSizes();
-                } else if (paintable instanceof ResizeRequired) {
-                    ResizeRequired rr = (ResizeRequired) paintable;
-                    rr.onResize();
-                    needsHeightUpdate.remove(pid);
-                }
-                updatedSet.add(pid);
-            }
-
-            JsArrayString needsHeightUpdateArray = needsHeightUpdate.dump();
-            for (int i = 0; i < needsHeightUpdateArray.length(); i++) {
-                String pid = needsHeightUpdateArray.get(i);
-
-                VPaintableWidget paintable = (VPaintableWidget) paintableMap
-                        .getPaintable(pid);
-                if (paintable instanceof CalculatingLayout) {
-                    CalculatingLayout cl = (CalculatingLayout) paintable;
-                    cl.updateVerticalSizes();
-                } else if (paintable instanceof ResizeRequired) {
-                    ResizeRequired rr = (ResizeRequired) paintable;
-                    rr.onResize();
-                }
-                updatedSet.add(pid);
-            }
-
-            JsArrayString changed = updatedSet.dump();
-            VConsole.log(changed.length() + " requestLayout invocations in "
-                    + (passDuration.elapsedMillis() - measureTime) + "ms");
-
-            StringBuilder b = new StringBuilder();
-            b.append(changed.length());
-            b.append(" changed widgets in pass ");
-            b.append(passes);
-            b.append(" in ");
-            b.append(passDuration.elapsedMillis());
-            b.append(" ms: ");
-            if (changed.length() < 10) {
-                for (int i = 0; i < changed.length(); i++) {
-                    if (i != 0) {
-                        b.append(", ");
-                    }
-                    b.append(changed.get(i));
-                }
-            }
-            VConsole.log(b.toString());
-
-            if (changed.length() == 0) {
-                VConsole.log("No more changes in pass " + passes);
-                break;
-            }
-
-            if (passes > 100) {
-                VConsole.log("Aborting layout");
-                break;
-            }
-        }
-
-        for (VPaintableWidget vPaintableWidget : paintableWidgets) {
-            if (vPaintableWidget instanceof LayoutPhaseListener) {
-                ((LayoutPhaseListener) vPaintableWidget).afterLayout();
-            }
-        }
-
-        VConsole.log("Total layout time: " + totalDuration.elapsedMillis()
-                + "ms");
-    }
-
-    private void measureWidgets(VPaintableWidget[] paintableWidgets) {
-
-        for (VPaintableWidget paintableWidget : paintableWidgets) {
-            MeasuredSize measuredSize = paintableWidget.getMeasuredSize();
-            measuredSize.measure();
-        }
-    }
-
-    private static boolean isNotifiableType(VPaintableWidget paintable) {
-        return paintable instanceof ResizeRequired
-                || paintable instanceof CalculatingLayout;
-    }
-}
index d45c5381c943239f5285130b47043e9c0d776f04..9a70ff06d3a926d122b7c0c81239b8a7ddc925af 100644 (file)
@@ -3,14 +3,10 @@
  */
 package com.vaadin.terminal.gwt.client;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
+import com.google.gwt.core.client.JsArrayString;
 import com.google.gwt.dom.client.Element;
-import com.google.gwt.user.client.ui.Widget;
 
-public final class MeasuredSize {
+public class MeasuredSize {
     private int width = -1;
     private int height = -1;
 
@@ -18,16 +14,10 @@ public final class MeasuredSize {
     private int[] borders = new int[4];
     private int[] margins = new int[4];
 
-    private final VPaintableWidget paintable;
-
     private boolean heightChanged = true;
     private boolean widthChanged = true;
 
-    private final Map<Element, int[]> dependencySizes = new HashMap<Element, int[]>();
-
-    public MeasuredSize(VPaintableWidget paintable) {
-        this.paintable = paintable;
-    }
+    private FastStringSet dependents = FastStringSet.create();
 
     public int getOuterHeight() {
         return height;
@@ -37,6 +27,22 @@ public final class MeasuredSize {
         return width;
     }
 
+    public void addDependent(String pid) {
+        dependents.add(pid);
+    }
+
+    public void removeDependent(String pid) {
+        dependents.remove(pid);
+    }
+
+    public boolean hasDependents() {
+        return !dependents.isEmpty();
+    }
+
+    public JsArrayString getDependents() {
+        return dependents.dump();
+    }
+
     private static int sumWidths(int[] sizes) {
         return sizes[1] + sizes[3];
     }
@@ -69,33 +75,6 @@ public final class MeasuredSize {
         }
     }
 
-    public void registerDependency(Element element) {
-        if (!dependencySizes.containsKey(element)) {
-            dependencySizes.put(element, new int[] { -1, -1 });
-        }
-    }
-
-    public void unregisterDependency(Element element) {
-        dependencySizes.remove(element);
-    }
-
-    public int getDependencyOuterWidth(Element e) {
-        return getDependencySize(e, 0);
-    }
-
-    public int getDependencyOuterHeight(Element e) {
-        return getDependencySize(e, 1);
-    }
-
-    private int getDependencySize(Element e, int index) {
-        int[] sizes = dependencySizes.get(e);
-        if (sizes == null) {
-            return -1;
-        } else {
-            return sizes[index];
-        }
-    }
-
     public int getBorderHeight() {
         return sumHeights(borders);
     }
@@ -168,9 +147,11 @@ public final class MeasuredSize {
         return paddings[3];
     }
 
-    void measure() {
-        Widget widget = paintable.getWidgetForPaintable();
-        ComputedStyle computedStyle = new ComputedStyle(widget.getElement());
+    boolean measure(Element element) {
+        boolean wasHeightChanged = heightChanged;
+        boolean wasWidthChanged = widthChanged;
+
+        ComputedStyle computedStyle = new ComputedStyle(element);
 
         int[] paddings = computedStyle.getPadding();
         if (!heightChanged && hasHeightChanged(this.paddings, paddings)) {
@@ -199,43 +180,16 @@ public final class MeasuredSize {
         }
         this.borders = borders;
 
-        int requiredHeight = Util.getRequiredHeight(widget);
+        int requiredHeight = Util.getRequiredHeight(element);
         int marginHeight = sumHeights(margins);
         setOuterHeight(requiredHeight + marginHeight);
 
-        int requiredWidth = Util.getRequiredWidth(widget);
+        int requiredWidth = Util.getRequiredWidth(element);
         int marginWidth = sumWidths(margins);
         setOuterWidth(requiredWidth + marginWidth);
 
-        // int i = 0;
-        for (Entry<Element, int[]> entry : dependencySizes.entrySet()) {
-            Element element = entry.getKey();
-            // int[] elementMargin = new ComputedStyle(element).getMargin();
-            int[] sizes = entry.getValue();
-
-            int elementWidth = element.getOffsetWidth();
-            // elementWidth += elementMargin[1] + elementMargin[3];
-            if (elementWidth != sizes[0]) {
-                // System.out.println(paintable.getId() + " dependency " + i
-                // + " width changed from " + sizes[0] + " to "
-                // + elementWidth);
-                sizes[0] = elementWidth;
-                widthChanged = true;
-            }
-
-            int elementHeight = element.getOffsetHeight();
-            // Causes infinite loops as a negative margin based on the
-            // measured height is currently used for captions
-            // elementHeight += elementMargin[0] + elementMargin[1];
-            if (elementHeight != sizes[1]) {
-                // System.out.println(paintable.getId() + " dependency " + i
-                // + " height changed from " + sizes[1] + " to "
-                // + elementHeight);
-                sizes[1] = elementHeight;
-                heightChanged = true;
-            }
-            // i++;
-        }
+        return wasHeightChanged != heightChanged
+                || wasWidthChanged != widthChanged;
     }
 
     void clearDirtyState() {
index 03fb599fe9aaf5518c1afc33c56859069e5ab9ea..c196fa095334f15ee83fb49f7584bf683659d3cd 100644 (file)
@@ -13,7 +13,7 @@ import java.util.Map;
 import java.util.Set;
 
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.user.client.Element;
+import com.google.gwt.dom.client.Element;
 import com.google.gwt.user.client.ui.HasWidgets;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.Paintable;
index 39bd2d21b8579fbda83e36749d3b0c06d286cb65..c42248e8354d6b89b36a2a2b838a1617764a044b 100644 (file)
@@ -29,7 +29,7 @@ public interface VPaintableWidget extends VPaintable {
     // FIXME: Rename to getParent()
     public VPaintableWidgetContainer getParent();
 
-    public MeasuredSize getMeasuredSize();
+    public LayoutManager getLayoutManager();
 
     /**
      * Returns <code>true</code> if the width of this paintable is currently
diff --git a/src/com/vaadin/terminal/gwt/client/ui/LayoutPhaseListener.java b/src/com/vaadin/terminal/gwt/client/ui/LayoutPhaseListener.java
deleted file mode 100644 (file)
index 495b923..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/* 
-@VaadinApache2LicenseForJavaFiles@
- */
-package com.vaadin.terminal.gwt.client.ui;
-
-public interface LayoutPhaseListener {
-    public void beforeLayout();
-
-    public void afterLayout();
-}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/ManagedLayout.java b/src/com/vaadin/terminal/gwt/client/ui/ManagedLayout.java
new file mode 100644 (file)
index 0000000..3c6c246
--- /dev/null
@@ -0,0 +1,7 @@
+package com.vaadin.terminal.gwt.client.ui;
+
+import com.vaadin.terminal.gwt.client.VPaintableWidget;
+
+public interface ManagedLayout extends VPaintableWidget {
+
+}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/PostLayoutListener.java b/src/com/vaadin/terminal/gwt/client/ui/PostLayoutListener.java
new file mode 100644 (file)
index 0000000..feb7494
--- /dev/null
@@ -0,0 +1,8 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+package com.vaadin.terminal.gwt.client.ui;
+
+public interface PostLayoutListener {
+    public void postLayout();
+}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/ResizeRequired.java b/src/com/vaadin/terminal/gwt/client/ui/ResizeRequired.java
deleted file mode 100644 (file)
index ac14982..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/* 
-@VaadinApache2LicenseForJavaFiles@
- */
-package com.vaadin.terminal.gwt.client.ui;
-
-import com.vaadin.terminal.gwt.client.VPaintableWidget;
-
-public interface ResizeRequired extends VPaintableWidget {
-    public void onResize();
-}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/SimpleManagedLayout.java b/src/com/vaadin/terminal/gwt/client/ui/SimpleManagedLayout.java
new file mode 100644 (file)
index 0000000..e8ab688
--- /dev/null
@@ -0,0 +1,9 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+package com.vaadin.terminal.gwt.client.ui;
+
+
+public interface SimpleManagedLayout extends ManagedLayout {
+    public void layout();
+}
index 6ae01c5c232233223c49d6303ed20bd31bdc6c2d..2677ea0f75f5bf30548903d831904106ee74f2bb 100644 (file)
@@ -15,14 +15,14 @@ import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
-import com.vaadin.terminal.gwt.client.CalculatingLayout;
+import com.vaadin.terminal.gwt.client.DirectionalManagedLayout;
 import com.vaadin.terminal.gwt.client.EventId;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VPaintableWidget;
 import com.vaadin.terminal.gwt.client.ui.VAbsoluteLayout.AbsoluteWrapper;
 
 public class VAbsoluteLayoutPaintable extends VAbstractPaintableWidgetContainer
-        implements CalculatingLayout {
+        implements DirectionalManagedLayout {
 
     private LayoutClickEventHandler clickEventHandler = new LayoutClickEventHandler(
             this, EventId.LAYOUT_CLICK) {
@@ -88,7 +88,7 @@ public class VAbsoluteLayoutPaintable extends VAbstractPaintableWidgetContainer
         return (VAbsoluteLayout) super.getWidgetForPaintable();
     }
 
-    public void updateVerticalSizes() {
+    public void layoutVertically() {
         VAbsoluteLayout layout = getWidgetForPaintable();
         for (VPaintableWidget paintable : getChildren()) {
             Widget widget = paintable.getWidgetForPaintable();
@@ -119,7 +119,7 @@ public class VAbsoluteLayoutPaintable extends VAbstractPaintableWidgetContainer
         }
     }
 
-    public void updateHorizontalSizes() {
+    public void layoutHorizontally() {
         VAbsoluteLayout layout = getWidgetForPaintable();
         for (VPaintableWidget paintable : getChildren()) {
             Widget widget = paintable.getWidgetForPaintable();
index ab09b5d60b936267d65d57125b8440bff57c8472..1fc995f584774b34ca9aba545964efad121418bb 100644 (file)
@@ -8,7 +8,7 @@ import com.google.gwt.user.client.ui.FocusWidget;
 import com.google.gwt.user.client.ui.Focusable;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
-import com.vaadin.terminal.gwt.client.MeasuredSize;
+import com.vaadin.terminal.gwt.client.LayoutManager;
 import com.vaadin.terminal.gwt.client.TooltipInfo;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VPaintableMap;
@@ -24,8 +24,6 @@ public abstract class VAbstractPaintableWidget implements VPaintableWidget {
     private ApplicationConnection connection;
     private String id;
 
-    private final MeasuredSize measuredSize = new MeasuredSize(this);
-
     /* State variables */
     private boolean enabled = true;
     private boolean visible = true;
@@ -200,15 +198,15 @@ public abstract class VAbstractPaintableWidget implements VPaintableWidget {
         // and non-relative
         if (w.endsWith("%") != declaredWidth.endsWith("%")) {
             VPaintableWidgetContainer parent = getParent();
-            if (parent != null) {
-                parent.getMeasuredSize().setWidthNeedsUpdate();
+            if (parent instanceof ManagedLayout) {
+                getLayoutManager().setWidthNeedsUpdate((ManagedLayout) parent);
             }
         }
 
         if (h.endsWith("%") != declaredHeight.endsWith("%")) {
             VPaintableWidgetContainer parent = getParent();
-            if (parent != null) {
-                parent.getMeasuredSize().setHeightNeedsUpdate();
+            if (parent instanceof ManagedLayout) {
+                getLayoutManager().setHeightNeedsUpdate((ManagedLayout) parent);
             }
         }
 
@@ -377,7 +375,7 @@ public abstract class VAbstractPaintableWidget implements VPaintableWidget {
         return styleBuf.toString();
     }
 
-    public MeasuredSize getMeasuredSize() {
-        return measuredSize;
+    public LayoutManager getLayoutManager() {
+        return LayoutManager.get(connection);
     }
 }
index 229dfae5c291260056d0a8725a7a4a081cdaa786..6242090f58bd3542cdc19dbbb7f2cf9d084f1fb5 100644 (file)
@@ -16,7 +16,7 @@ import com.vaadin.terminal.gwt.client.VPaintableMap;
 import com.vaadin.terminal.gwt.client.VPaintableWidget;
 
 public abstract class VAbstractSplitPanelPaintable extends
-        VAbstractPaintableWidgetContainer implements ResizeRequired {
+        VAbstractPaintableWidgetContainer implements SimpleManagedLayout {
 
     public static final String SPLITTER_CLICK_EVENT_IDENTIFIER = "sp_click";
 
@@ -123,11 +123,10 @@ public abstract class VAbstractSplitPanelPaintable extends
         // appearing/disappearing scrollbars into account.
         client.runDescendentsLayout(getWidgetForPaintable());
 
-        getMeasuredSize().setHeightNeedsUpdate();
-        getMeasuredSize().setWidthNeedsUpdate();
+        getLayoutManager().setNeedsUpdate(this);
     }
 
-    public void onResize() {
+    public void layout() {
         VAbstractSplitPanel splitPanel = getWidgetForPaintable();
         splitPanel.setSplitPosition(splitPanel.position);
         splitPanel.updateSizes();
index 86ef5d1c965f05389e1d52a8e6ba4a170b58e261..809eb1167b088d1e32dce2d41638e608ec68fab9 100644 (file)
@@ -13,7 +13,7 @@ import com.vaadin.terminal.gwt.client.VPaintableWidget;
 import com.vaadin.terminal.gwt.client.ui.VAccordion.StackItem;
 
 public class VAccordionPaintable extends VTabsheetBasePaintable implements
-        ResizeRequired {
+        SimpleManagedLayout {
 
     @Override
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
@@ -66,7 +66,7 @@ public class VAccordionPaintable extends VTabsheetBasePaintable implements
         /* Accordion does not render its children's captions */
     }
 
-    public void onResize() {
+    public void layout() {
         VAccordion accordion = getWidgetForPaintable();
 
         accordion.updateOpenTabSize();
index f914d157d3d399d88d97231c10b4c56b6417812c..e5cc917aeae6e441614abfdc19a32dd072a088c9 100644 (file)
@@ -15,7 +15,7 @@ import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VPaintableWidget;
 
 public class VCustomLayoutPaintable extends VAbstractPaintableWidgetContainer
-        implements ResizeRequired {
+        implements SimpleManagedLayout {
 
     /** Update the layout from UIDL */
     @Override
@@ -90,7 +90,7 @@ public class VCustomLayoutPaintable extends VAbstractPaintableWidgetContainer
 
     }
 
-    public void onResize() {
+    public void layout() {
         getWidgetForPaintable().iLayoutJS(
                 DOM.getFirstChild(getWidgetForPaintable().getElement()));
     }
index 374b43914e1d47eb8747d1b72891a7a843474abe..ae93b7c58355472d55962fa7c974f2af5c34f8d8 100644 (file)
@@ -13,7 +13,7 @@ import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.ui.VFilterSelect.FilterSelectSuggestion;
 
 public class VFilterSelectPaintable extends VAbstractPaintableWidget implements
-        ResizeRequired {
+        SimpleManagedLayout {
 
     /*
      * (non-Javadoc)
@@ -246,7 +246,7 @@ public class VFilterSelectPaintable extends VAbstractPaintableWidget implements
         return (VFilterSelect) super.getWidgetForPaintable();
     }
 
-    public void onResize() {
+    public void layout() {
         VFilterSelect widget = getWidgetForPaintable();
         if (widget.initDone) {
             widget.updateRootWidth();
index a350983e6c832d6dcf640c3ca4343a96311c92e5..2cd7eaa539b3a7e3e4b04f6c668273bcdff6d8cb 100644 (file)
@@ -8,18 +8,17 @@ import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.event.dom.client.KeyDownEvent;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
-import com.vaadin.terminal.gwt.client.MeasuredSize;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VPaintableMap;
 import com.vaadin.terminal.gwt.client.VPaintableWidget;
 
 public class VFormPaintable extends VAbstractPaintableWidgetContainer implements
-        ResizeRequired {
+        SimpleManagedLayout {
 
-    public VFormPaintable() {
+    @Override
+    public void init() {
         VForm form = getWidgetForPaintable();
-        MeasuredSize measuredSize = getMeasuredSize();
-        measuredSize.registerDependency(form.footerContainer);
+        getLayoutManager().registerDependency(this, form.footerContainer);
     }
 
     @Override
@@ -178,12 +177,12 @@ public class VFormPaintable extends VAbstractPaintableWidgetContainer implements
         return GWT.create(VForm.class);
     }
 
-    public void onResize() {
-        MeasuredSize measuredSize = getMeasuredSize();
+    public void layout() {
         VForm form = getWidgetForPaintable();
 
-        int footerHeight = measuredSize
-                .getDependencyOuterHeight(form.footerContainer);
+        int footerHeight = getLayoutManager().getOuterHeight(
+                form.footerContainer);
+
         form.fieldContainer.getStyle().setPaddingBottom(footerHeight, Unit.PX);
         form.footerContainer.getStyle().setMarginTop(-footerHeight, Unit.PX);
     }
index 8168141ece4bcdaa2b681889466efaa2a8e1dec7..8ad4cd0496c86fc1a5095de68159c691d20d6b51 100644 (file)
@@ -17,7 +17,7 @@ import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.ui.ComplexPanel;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
-import com.vaadin.terminal.gwt.client.MeasuredSize;
+import com.vaadin.terminal.gwt.client.LayoutManager;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.VCaption;
@@ -59,10 +59,6 @@ public class VGridLayout extends ComplexPanel {
         setStyleName(CLASSNAME);
     }
 
-    private MeasuredSize getMeasuredSize() {
-        return getPaintable().getMeasuredSize();
-    }
-
     private VPaintableWidget getPaintable() {
         return VPaintableMap.get(client).getPaintable(this);
     }
@@ -91,7 +87,7 @@ public class VGridLayout extends ComplexPanel {
      * @return
      */
     protected int getHorizontalSpacing() {
-        return getMeasuredSize().getDependencyOuterWidth(spacingMeasureElement);
+        return LayoutManager.get(client).getOuterWidth(spacingMeasureElement);
     }
 
     /**
@@ -100,8 +96,7 @@ public class VGridLayout extends ComplexPanel {
      * @return
      */
     protected int getVerticalSpacing() {
-        return getMeasuredSize()
-                .getDependencyOuterHeight(spacingMeasureElement);
+        return LayoutManager.get(client).getOuterHeight(spacingMeasureElement);
     }
 
     static int[] cloneArray(int[] toBeCloned) {
@@ -119,7 +114,8 @@ public class VGridLayout extends ComplexPanel {
             for (int i = 1; i < minRowHeights.length; i++) {
                 usedSpace += verticalSpacing + minRowHeights[i];
             }
-            int availableSpace = getMeasuredSize().getInnerHeight();
+            int availableSpace = LayoutManager.get(client).getInnerHeight(
+                    getElement());
             int excessSpace = availableSpace - usedSpace;
             int distributed = 0;
             if (excessSpace > 0) {
@@ -168,7 +164,8 @@ public class VGridLayout extends ComplexPanel {
                 usedSpace += horizontalSpacing + minColumnWidths[i];
             }
 
-            int availableSpace = getMeasuredSize().getInnerWidth();
+            int availableSpace = LayoutManager.get(client).getInnerWidth(
+                    getElement());
             int excessSpace = availableSpace - usedSpace;
             int distributed = 0;
             if (excessSpace > 0) {
index beb72d45b4efd4f097022c6f07706536223f26f4..2c896825ec08a1570cc6488bbebad68be7a31823 100644 (file)
@@ -13,7 +13,7 @@ import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
-import com.vaadin.terminal.gwt.client.CalculatingLayout;
+import com.vaadin.terminal.gwt.client.DirectionalManagedLayout;
 import com.vaadin.terminal.gwt.client.EventId;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VCaption;
@@ -23,7 +23,7 @@ import com.vaadin.terminal.gwt.client.ui.VGridLayout.Cell;
 import com.vaadin.terminal.gwt.client.ui.layout.VLayoutSlot;
 
 public class VGridLayoutPaintable extends VAbstractPaintableWidgetContainer
-        implements CalculatingLayout {
+        implements DirectionalManagedLayout {
     private LayoutClickEventHandler clickEventHandler = new LayoutClickEventHandler(
             this, EventId.LAYOUT_CLICK) {
 
@@ -39,8 +39,9 @@ public class VGridLayoutPaintable extends VAbstractPaintableWidgetContainer
         }
     };
 
-    public VGridLayoutPaintable() {
-        getMeasuredSize().registerDependency(
+    @Override
+    public void init() {
+        getLayoutManager().registerDependency(this,
                 getWidgetForPaintable().spacingMeasureElement);
     }
 
@@ -120,8 +121,7 @@ public class VGridLayoutPaintable extends VAbstractPaintableWidgetContainer
 
         layout.updateSpacingStyleName(uidl.getBooleanAttribute("spacing"));
 
-        getMeasuredSize().setHeightNeedsUpdate();
-        getMeasuredSize().setWidthNeedsUpdate();
+        getLayoutManager().setNeedsUpdate(this);
     }
 
     public void updateCaption(VPaintableWidget component, UIDL uidl) {
@@ -154,11 +154,11 @@ public class VGridLayoutPaintable extends VAbstractPaintableWidgetContainer
         return GWT.create(VGridLayout.class);
     }
 
-    public void updateVerticalSizes() {
+    public void layoutVertically() {
         getWidgetForPaintable().updateHeight();
     }
 
-    public void updateHorizontalSizes() {
+    public void layoutHorizontally() {
         getWidgetForPaintable().updateWidth();
     }
 }
index 72cc55065111a90e39c6af1a5ef04337cba05ce3..5f35815cd8de7d236451ba69e0ac8da3cc2d090c 100644 (file)
@@ -8,10 +8,11 @@ import java.util.Iterator;
 
 import com.google.gwt.dom.client.Node;
 import com.google.gwt.dom.client.Style;
+import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
-import com.vaadin.terminal.gwt.client.CalculatingLayout;
-import com.vaadin.terminal.gwt.client.MeasuredSize;
+import com.vaadin.terminal.gwt.client.DirectionalManagedLayout;
+import com.vaadin.terminal.gwt.client.LayoutManager;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VCaption;
 import com.vaadin.terminal.gwt.client.VPaintableMap;
@@ -21,10 +22,11 @@ import com.vaadin.terminal.gwt.client.ui.layout.VLayoutSlot;
 import com.vaadin.terminal.gwt.client.ui.layout.VPaintableLayoutSlot;
 
 public abstract class VMeasuringOrderedLayoutPaintable extends
-        VAbstractPaintableWidgetContainer implements CalculatingLayout {
+        VAbstractPaintableWidgetContainer implements DirectionalManagedLayout {
 
-    public VMeasuringOrderedLayoutPaintable() {
-        getMeasuredSize().registerDependency(
+    @Override
+    public void init() {
+        getLayoutManager().registerDependency(this,
                 getWidgetForPaintable().spacingMeasureElement);
     }
 
@@ -145,18 +147,18 @@ public abstract class VMeasuringOrderedLayoutPaintable extends
 
         layout.updateSpacingStyleName(uidl.getBooleanAttribute("spacing"));
 
-        getMeasuredSize().setHeightNeedsUpdate();
-        getMeasuredSize().setWidthNeedsUpdate();
+        getLayoutManager().setNeedsUpdate(this);
     }
 
     private int getSizeForInnerSize(int size, boolean isVertical) {
-        MeasuredSize measuredSize = getMeasuredSize();
+        LayoutManager layoutManager = getLayoutManager();
+        Element element = getWidgetForPaintable().getElement();
         if (isVertical) {
-            return size + measuredSize.getBorderHeight()
-                    + measuredSize.getPaddingHeight();
+            return size + layoutManager.getBorderHeight(element)
+                    + layoutManager.getPaddingHeight(element);
         } else {
-            return size + measuredSize.getBorderWidth()
-                    + measuredSize.getPaddingWidth();
+            return size + layoutManager.getBorderWidth(element)
+                    + layoutManager.getPaddingWidth(element);
         }
     }
 
@@ -174,9 +176,11 @@ public abstract class VMeasuringOrderedLayoutPaintable extends
 
     private int getInnerSizeInDirection(boolean isVertical) {
         if (isVertical) {
-            return getMeasuredSize().getInnerHeight();
+            return getLayoutManager().getInnerHeight(
+                    getWidgetForPaintable().getElement());
         } else {
-            return getMeasuredSize().getInnerWidth();
+            return getLayoutManager().getInnerWidth(
+                    getWidgetForPaintable().getElement());
         }
     }
 
@@ -210,10 +214,10 @@ public abstract class VMeasuringOrderedLayoutPaintable extends
 
     private int getSpacingInDirection(boolean isVertical) {
         if (isVertical) {
-            return getMeasuredSize().getDependencyOuterHeight(
+            return getLayoutManager().getOuterHeight(
                     getWidgetForPaintable().spacingMeasureElement);
         } else {
-            return getMeasuredSize().getDependencyOuterWidth(
+            return getLayoutManager().getOuterWidth(
                     getWidgetForPaintable().spacingMeasureElement);
         }
     }
@@ -259,13 +263,15 @@ public abstract class VMeasuringOrderedLayoutPaintable extends
 
     private int getStartPadding(boolean isVertical) {
         if (isVertical) {
-            return getMeasuredSize().getPaddingTop();
+            return getLayoutManager().getPaddingTop(
+                    getWidgetForPaintable().getElement());
         } else {
-            return getMeasuredSize().getPaddingLeft();
+            return getLayoutManager().getPaddingLeft(
+                    getWidgetForPaintable().getElement());
         }
     }
 
-    public void updateHorizontalSizes() {
+    public void layoutHorizontally() {
         if (getWidgetForPaintable().isVertical) {
             layoutSecondaryDirection();
         } else {
@@ -273,7 +279,7 @@ public abstract class VMeasuringOrderedLayoutPaintable extends
         }
     }
 
-    public void updateVerticalSizes() {
+    public void layoutVertically() {
         if (getWidgetForPaintable().isVertical) {
             layoutPrimaryDirection();
         } else {
index 87c7a6c145ee382e94b6f178a7abc29b6bb8b91d..36e210971ce15a3dd2eb29da3ea652ffaf7c2e81 100644 (file)
@@ -15,7 +15,7 @@ import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.ui.VMenuBar.CustomMenuItem;
 
 public class VMenuBarPaintable extends VAbstractPaintableWidget implements
-        ResizeRequired {
+        SimpleManagedLayout {
     /**
      * This method must be implemented to update the client-side component from
      * UIDL data received from server.
@@ -161,7 +161,7 @@ public class VMenuBarPaintable extends VAbstractPaintableWidget implements
         return (VMenuBar) super.getWidgetForPaintable();
     }
 
-    public void onResize() {
+    public void layout() {
         getWidgetForPaintable().iLayout();
     }
 }
index eade1d7d0e095bbb4c2b15a66a0a109f9ed31a26..e88bae53d254527efc8804cdf5bb7b9fe82c8405 100644 (file)
@@ -11,12 +11,12 @@ import com.google.gwt.event.shared.EventHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
-import com.vaadin.terminal.gwt.client.MeasuredSize;
+import com.vaadin.terminal.gwt.client.LayoutManager;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VPaintableWidget;
 
 public class VPanelPaintable extends VAbstractPaintableWidgetContainer
-        implements ResizeRequired, LayoutPhaseListener {
+        implements SimpleManagedLayout, PostLayoutListener {
 
     public static final String CLICK_EVENT_IDENTIFIER = "click";
 
@@ -34,13 +34,14 @@ public class VPanelPaintable extends VAbstractPaintableWidgetContainer
 
     private Integer uidlScrollLeft;
 
-    public VPanelPaintable() {
+    @Override
+    public void init() {
         VPanel panel = getWidgetForPaintable();
-        MeasuredSize measuredSize = getMeasuredSize();
+        LayoutManager layoutManager = getLayoutManager();
 
-        measuredSize.registerDependency(panel.captionNode);
-        measuredSize.registerDependency(panel.bottomDecoration);
-        measuredSize.registerDependency(panel.contentNode);
+        layoutManager.registerDependency(this, panel.captionNode);
+        layoutManager.registerDependency(this, panel.bottomDecoration);
+        layoutManager.registerDependency(this, panel.contentNode);
     }
 
     @Override
@@ -178,12 +179,11 @@ public class VPanelPaintable extends VAbstractPaintableWidgetContainer
         return GWT.create(VPanel.class);
     }
 
-    public void onResize() {
+    public void layout() {
         updateSizes();
     }
 
     void updateSizes() {
-        MeasuredSize measuredSize = getMeasuredSize();
         VPanel panel = getWidgetForPaintable();
 
         Style contentStyle = panel.contentNode.getStyle();
@@ -199,9 +199,9 @@ public class VPanelPaintable extends VAbstractPaintableWidgetContainer
             contentStyle.setWidth(100, Unit.PCT);
         }
 
-        int top = measuredSize.getDependencyOuterHeight(panel.captionNode);
-        int bottom = measuredSize
-                .getDependencyOuterHeight(panel.bottomDecoration);
+        LayoutManager layoutManager = getLayoutManager();
+        int top = layoutManager.getOuterHeight(panel.captionNode);
+        int bottom = layoutManager.getOuterHeight(panel.bottomDecoration);
 
         Style style = panel.getElement().getStyle();
         panel.captionNode.getStyle().setMarginTop(-top, Unit.PX);
@@ -217,11 +217,7 @@ public class VPanelPaintable extends VAbstractPaintableWidgetContainer
         panel.scrollLeft = panel.contentNode.getScrollLeft();
     }
 
-    public void beforeLayout() {
-        // Nothing to do
-    }
-
-    public void afterLayout() {
+    public void postLayout() {
         VPanel panel = getWidgetForPaintable();
         if (uidlScrollTop != null) {
             panel.contentNode.setScrollTop(uidlScrollTop.intValue());
index 38fb07763751bf69cc608ead6deb1465ddaed517..46eb22e01d9234eb4ed61ef9ff24b1303d96eea8 100644 (file)
@@ -10,13 +10,13 @@ import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
-import com.vaadin.terminal.gwt.client.CalculatingLayout;
+import com.vaadin.terminal.gwt.client.DirectionalManagedLayout;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.VPaintableWidget;
 
 public class VScrollTablePaintable extends VAbstractPaintableWidgetContainer
-        implements CalculatingLayout {
+        implements DirectionalManagedLayout {
 
     /*
      * (non-Javadoc)
@@ -261,11 +261,11 @@ public class VScrollTablePaintable extends VAbstractPaintableWidgetContainer
         // NOP, not rendered
     }
 
-    public void updateVerticalSizes() {
+    public void layoutVertically() {
         getWidgetForPaintable().updateHeight();
     }
 
-    public void updateHorizontalSizes() {
+    public void layoutHorizontally() {
         getWidgetForPaintable().updateWidth();
     }
 }
index 7379362b3f417a27e8bf0179548f408a60174178..fe10db66041c6ec8face3d8f17eaf4c212c196f5 100644 (file)
@@ -11,7 +11,7 @@ import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VPaintableWidget;
 
 public class VTabsheetPaintable extends VTabsheetBasePaintable implements
-        ResizeRequired {
+        SimpleManagedLayout {
 
     @Override
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
@@ -77,7 +77,7 @@ public class VTabsheetPaintable extends VTabsheetBasePaintable implements
         /* Tabsheet does not render its children's captions */
     }
 
-    public void onResize() {
+    public void layout() {
         VTabsheet tabsheet = getWidgetForPaintable();
 
         tabsheet.updateContentNodeHeight();
index a79379746c929120567df41ff47ec1c06e38669a..a6235d769db491f352bb649f4793eb1ae39a1dc1 100644 (file)
@@ -19,8 +19,8 @@ import com.vaadin.terminal.gwt.client.VPaintableWidget;
 import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.BeforeShortcutActionListener;
 
 public class VWindowPaintable extends VAbstractPaintableWidgetContainer
-        implements BeforeShortcutActionListener, ResizeRequired,
-        LayoutPhaseListener {
+        implements BeforeShortcutActionListener, SimpleManagedLayout,
+        PostLayoutListener {
 
     private static final String CLICK_EVENT_IDENTIFIER = VPanelPaintable.CLICK_EVENT_IDENTIFIER;
 
@@ -304,15 +304,11 @@ public class VWindowPaintable extends VAbstractPaintableWidgetContainer
         return GWT.create(VWindow.class);
     }
 
-    public void onResize() {
+    public void layout() {
         getWidgetForPaintable().requestLayout();
     }
 
-    public void beforeLayout() {
-
-    }
-
-    public void afterLayout() {
+    public void postLayout() {
         VWindow window = getWidgetForPaintable();
         if (window.centered) {
             window.center();
index b2786ad0a0b2bd898dbc1ff30c28c7fc6cf3c2c2..13bfcaf5e2f6922089a73444579e67e54e3c6ba5 100644 (file)
@@ -3,17 +3,20 @@
  */
 package com.vaadin.terminal.gwt.client.ui.layout;
 
-import com.vaadin.terminal.gwt.client.MeasuredSize;
+import com.vaadin.terminal.gwt.client.LayoutManager;
 import com.vaadin.terminal.gwt.client.VCaption;
 import com.vaadin.terminal.gwt.client.VPaintableWidget;
+import com.vaadin.terminal.gwt.client.ui.ManagedLayout;
 
 public class VPaintableLayoutSlot extends VLayoutSlot {
 
     final VPaintableWidget paintable;
+    private LayoutManager layoutManager;
 
     public VPaintableLayoutSlot(String baseClassName, VPaintableWidget paintable) {
         super(baseClassName, paintable.getWidgetForPaintable());
         this.paintable = paintable;
+        layoutManager = paintable.getLayoutManager();
     }
 
     public VPaintableWidget getPaintable() {
@@ -23,41 +26,43 @@ public class VPaintableLayoutSlot extends VLayoutSlot {
     @Override
     protected int getCaptionHeight() {
         VCaption caption = getCaption();
-        return caption != null ? getParentSize().getDependencyOuterHeight(
-                caption.getElement()) : 0;
-    }
-
-    private MeasuredSize getParentSize() {
-        return paintable.getParent().getMeasuredSize();
+        return caption != null ? layoutManager.getOuterHeight(caption
+                .getElement()) : 0;
     }
 
     @Override
     protected int getCaptionWidth() {
         VCaption caption = getCaption();
-        return caption != null ? getParentSize().getDependencyOuterWidth(
-                caption.getElement()) : 0;
+        return caption != null ? layoutManager.getOuterWidth(caption
+                .getElement()) : 0;
     }
 
     @Override
     public void setCaption(VCaption caption) {
         VCaption oldCaption = getCaption();
         if (oldCaption != null) {
-            getParentSize().unregisterDependency(oldCaption.getElement());
+            layoutManager.unregisterDependency(
+                    (ManagedLayout) paintable.getParent(),
+                    oldCaption.getElement());
         }
         super.setCaption(caption);
         if (caption != null) {
-            getParentSize().registerDependency(caption.getElement());
+            layoutManager
+                    .registerDependency((ManagedLayout) paintable.getParent(),
+                            caption.getElement());
         }
     }
 
     @Override
     public int getWidgetHeight() {
-        return paintable.getMeasuredSize().getOuterHeight();
+        return layoutManager.getOuterHeight(paintable.getWidgetForPaintable()
+                .getElement());
     }
 
     @Override
     public int getWidgetWidth() {
-        return paintable.getMeasuredSize().getOuterWidth();
+        return layoutManager.getOuterWidth(paintable.getWidgetForPaintable()
+                .getElement());
     }
 
     @Override
diff --git a/tests/testbench/com/vaadin/tests/components/root/RootInitException.java b/tests/testbench/com/vaadin/tests/components/root/RootInitException.java
new file mode 100644 (file)
index 0000000..b4cfa2a
--- /dev/null
@@ -0,0 +1,23 @@
+package com.vaadin.tests.components.root;
+
+import com.vaadin.terminal.WrappedRequest;
+import com.vaadin.tests.components.AbstractTestRoot;
+
+public class RootInitException extends AbstractTestRoot {
+
+    @Override
+    protected void setup(WrappedRequest request) {
+        throw new RuntimeException("Catch me if you can");
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Throwing an exception in application code during a browser details request should show a sensible message in the client";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return Integer.valueOf(8243);
+    }
+
+}