Limit SplitLayoutPanel dragging by available container space.
Review at http://gwt-code-reviews.appspot.com/1256801


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9496 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/DockLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/DockLayoutPanel.java
index fa780f5..a07d933 100644
--- a/user/src/com/google/gwt/user/client/ui/DockLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DockLayoutPanel.java
@@ -124,6 +124,7 @@
   private Widget center;
   private final Layout layout;
   private final LayoutCommand layoutCmd;
+  private double filledWidth, filledHeight;
 
   /**
    * Creates an empty dock panel.
@@ -380,6 +381,16 @@
     return center;
   }
 
+  protected double getCenterHeight() {
+    return getElement().getClientHeight() / layout.getUnitSize(unit, true) -
+              filledHeight;
+  }
+
+  protected double getCenterWidth() {
+    return getElement().getClientWidth() / layout.getUnitSize(unit, false) -
+              filledWidth;
+  }
+
   /**
    * Resolve the specified direction based on the current locale. If the
    * direction is {@link Direction#LINE_START} or {@link Direction#LINE_END},
@@ -510,5 +521,8 @@
           break;
       }
     }
+
+    filledWidth = left + right;
+    filledHeight = top + bottom;
   }
 }
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 4d40b80..f98809b 100644
--- a/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
@@ -70,6 +70,11 @@
     }
 
     @Override
+    protected double getCenterSize() {
+      return getCenterWidth();
+    }
+
+    @Override
     protected int getEventPosition(Event event) {
       return event.getClientX();
     }
@@ -163,13 +168,15 @@
 
     protected abstract int getAbsolutePosition();
 
+    protected abstract double getCenterSize();
+
     protected abstract int getEventPosition(Event event);
 
     protected abstract int getTargetPosition();
 
     protected abstract int getTargetSize();
 
-    private void setAssociatedWidgetSize(int size) {
+    private void setAssociatedWidgetSize(double size) {
       if (size < minSize) {
         size = minSize;
       }
@@ -179,6 +186,12 @@
         return;
       }
 
+      // Don't grow beyond remaining space
+      double centerSize = getCenterSize();
+      if (size - layout.size > centerSize) {
+        size = layout.size + centerSize;
+      }
+
       layout.size = size;
 
       // Defer actually updating the layout, so that if we receive many
@@ -208,6 +221,11 @@
     }
 
     @Override
+    protected double getCenterSize() {
+      return getCenterHeight();
+    }
+
+    @Override
     protected int getEventPosition(Event event) {
       return event.getClientY();
     }