Handle deferred layout updates gracefully in SplitLayoutPanel resize logic. Resubmitting with fixes for the CellViewSuite test breakage. Review at http://gwt-code-reviews.appspot.com/1295804 Review by: jlabanca@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9606 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java index f98809b..0a2422f 100644 --- a/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java +++ b/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
@@ -100,6 +100,8 @@ private final boolean reverse; private int minSize; + private double centerSize, syncedCenterSize; + public Splitter(Widget target, boolean reverse) { this.target = target; this.reverse = reverse; @@ -176,7 +178,26 @@ protected abstract int getTargetSize(); + private double getMaxSize() { + // To avoid seeing stale center size values due to deferred layout + // updates, maintain our own copy up to date and resync when the + // DockLayoutPanel value changes. + double newCenterSize = getCenterSize(); + if (syncedCenterSize != newCenterSize) { + syncedCenterSize = newCenterSize; + centerSize = newCenterSize; + } + + return Math.max(((LayoutData) target.getLayoutData()).size + centerSize, + 0); + } + private void setAssociatedWidgetSize(double size) { + double maxSize = getMaxSize(); + if (size > maxSize) { + size = maxSize; + } + if (size < minSize) { size = minSize; } @@ -186,12 +207,8 @@ return; } - // Don't grow beyond remaining space - double centerSize = getCenterSize(); - if (size - layout.size > centerSize) { - size = layout.size + centerSize; - } - + // Adjust our view until the deferred layout gets scheduled. + centerSize += layout.size - size; layout.size = size; // Defer actually updating the layout, so that if we receive many