summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorTapio Aali <tapio@vaadin.com>2013-11-05 12:17:06 +0200
committerVaadin Code Review <review@vaadin.com>2013-11-06 11:58:36 +0000
commit533ddcda271b7226b38c035adf3073062c562653 (patch)
tree1f23b07a5dfdaef7f178db27055e23a11aa0fec4 /client
parent0d3c35b4f17814a3c146134621374a8a915f10a0 (diff)
downloadvaadin-framework-533ddcda271b7226b38c035adf3073062c562653.tar.gz
vaadin-framework-533ddcda271b7226b38c035adf3073062c562653.zip
Fixed lost scrollLeft when row count changed in Table (#12652).
Change-Id: I868f56c1e7003c6619859ba46619f4c53ef9744e
Diffstat (limited to 'client')
-rw-r--r--client/src/com/vaadin/client/Util.java37
-rw-r--r--client/src/com/vaadin/client/ui/VScrollTable.java47
2 files changed, 83 insertions, 1 deletions
diff --git a/client/src/com/vaadin/client/Util.java b/client/src/com/vaadin/client/Util.java
index 9cdfa954c6..fd7a354569 100644
--- a/client/src/com/vaadin/client/Util.java
+++ b/client/src/com/vaadin/client/Util.java
@@ -449,6 +449,35 @@ public class Util {
}
/**
+ * Calculates maximum horizontal scrolling value for the given element.
+ *
+ * @since 7.1.9
+ * @param element
+ * which scrollLeft should be calculated
+ * @return maximum value for scrollLeft of the given element
+ */
+ public static int getMaxScrollLeft(final Element element) {
+ int scrollWidth = element.getScrollWidth();
+ int clientWidth = element.getClientWidth();
+ return scrollWidth - clientWidth;
+ }
+
+ /**
+ * Checks if scrollLeft of the element is at its maximum value. Returns
+ * false if the element can't be scrolled horizontally.
+ *
+ * @since 7.1.9
+ * @param element
+ * which scrollLeft should be checked
+ * @return true, if scrollLeft is at maximum (false if element can't be
+ * scrolled horizontally)
+ */
+ public static boolean isScrollLeftAtMax(final Element element) {
+ int scrollLeft = element.getScrollLeft();
+ return scrollLeft != 0 && scrollLeft == getMaxScrollLeft(element);
+ }
+
+ /**
* Run workaround for webkits overflow auto issue.
*
* See: our bug #2138 and https://bugs.webkit.org/show_bug.cgi?id=21462
@@ -469,6 +498,8 @@ public class Util {
// check the scrolltop value before hiding the element
final int scrolltop = elem.getScrollTop();
final int scrollleft = elem.getScrollLeft();
+ final boolean scrollLeftAtMax = isScrollLeftAtMax(elem);
+
elem.getStyle().setProperty("overflow", "hidden");
Scheduler.get().scheduleDeferred(new Command() {
@@ -492,6 +523,12 @@ public class Util {
elem.setScrollTop(scrollvalue);
}
+ // keep horizontal scroll at max if it was before vertical
+ // scroll bar was added/removed
+ if (scrollLeftAtMax) {
+ elem.setScrollLeft(getMaxScrollLeft(elem));
+ }
+
// fix for #6940 : Table horizontal scroll sometimes not
// updated when collapsing/expanding columns
// Also appeared in Safari 5.1 with webkit 534 (#7667)
diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java
index 0304acd590..48fd85144f 100644
--- a/client/src/com/vaadin/client/ui/VScrollTable.java
+++ b/client/src/com/vaadin/client/ui/VScrollTable.java
@@ -276,6 +276,10 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
*/
private int detachedScrollPosition = 0;
+ // fields used in fixing erroneously lost scrollLeft
+ int lastScrollBodyHeight = 0;
+ boolean lastScrollLeftWasAtMax = false;
+
/**
* Represents a select range of rows
*/
@@ -1005,6 +1009,15 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
initialContentReceived = true;
sizeNeedsInit = true;
scrollBody.restoreRowVisibility();
+
+ // At least FireFox requires that scrollLeft is restored deferred after
+ // scrollBody is recreated
+ Scheduler.get().scheduleFinally(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ restoreScrollLeft();
+ }
+ });
}
/** For internal use only. May be removed or replaced in the future. */
@@ -6865,12 +6878,44 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
}
/**
+ * Tries to restore horizontal scroll position if it was lost due to change
+ * in the height of scrollBody (#12652).
+ */
+ private void restoreScrollLeft() {
+ int upcomingScrollLeft = scrollLeft;
+
+ if (lastScrollLeftWasAtMax) {
+ upcomingScrollLeft = Util.getMaxScrollLeft(scrollBodyPanel
+ .getElement());
+ }
+ scrollBodyPanel.getElement().setScrollLeft(upcomingScrollLeft);
+ }
+
+ /**
+ * Checks if restore of scrollLeft is needed by checking if height of the
+ * scrollBody has changed.
+ *
+ * @return true, if restore is required
+ */
+ private boolean isScrollLeftRestoreRequired() {
+ return (scrollBody.getElement().getClientHeight() != lastScrollBodyHeight);
+ }
+
+ /**
* This method has logic which rows needs to be requested from server when
* user scrolls
*/
-
@Override
public void onScroll(ScrollEvent event) {
+ // restore in initializeRows() doesn't work right with Chrome
+ if (isScrollLeftRestoreRequired()) {
+ restoreScrollLeft();
+ }
+
+ lastScrollBodyHeight = scrollBody.getElement().getClientHeight();
+ lastScrollLeftWasAtMax = Util.isScrollLeftAtMax(scrollBodyPanel
+ .getElement());
+
scrollLeft = scrollBodyPanel.getElement().getScrollLeft();
scrollTop = scrollBodyPanel.getScrollPosition();
/*