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();
}