]> source.dussan.org Git - vaadin-framework.git/commitdiff
#6698 Scrolling with the mouse is aborted when data is received from the server
authorLeif Åstrand <leif@vaadin.com>
Thu, 29 Sep 2011 09:43:45 +0000 (09:43 +0000)
committerLeif Åstrand <leif@vaadin.com>
Thu, 29 Sep 2011 09:43:45 +0000 (09:43 +0000)
svn changeset:21434/svn branch:6.6

src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java

index e2d776649b045578758f9c34dae5db30c7ead432..04a59889af78d06d19e98dfe89f4b70f0d22228d 100644 (file)
@@ -419,6 +419,8 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
     private int tabIndex;
     private TouchScrollDelegate touchScrollDelegate;
 
+    private int lastRenderedHeight;
+
     public VScrollTable() {
         scrollBodyPanel.setStyleName(CLASSNAME + "-body-wrapper");
         scrollBodyPanel.addFocusHandler(this);
@@ -820,7 +822,8 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
         paintableId = uidl.getStringAttribute("id");
         immediate = uidl.getBooleanAttribute("immediate");
         final int newTotalRows = uidl.getIntAttribute("totalrows");
-        if (newTotalRows != totalRows) {
+        boolean totalRowsChanged = newTotalRows != totalRows;
+        if (totalRowsChanged) {
             if (scrollBody != null) {
                 if (totalRows == 0) {
                     tHead.clear();
@@ -996,10 +999,15 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
                     uidl.getIntAttribute("rows"));
             if (headerChangedDuringUpdate) {
                 lazyAdjustColumnWidths.schedule(1);
-            } else {
+            } else if (!isScrollPositionVisible() || totalRowsChanged
+                    || lastRenderedHeight != scrollBody.getOffsetHeight()) {
                 // webkits may still bug with their disturbing scrollbar bug,
                 // See #3457
                 // run overflow fix for scrollable area
+                // #6698 - If there's a scroll going on, don't abort it by
+                // changing overflows as the length of the contents *shouldn't*
+                // have changed (unless the number of rows or the height of the
+                // widget has also changed)
                 Scheduler.get().scheduleDeferred(new Command() {
                     public void execute() {
                         Util.runWebkitOverflowAutoFix(scrollBodyPanel
@@ -1083,6 +1091,10 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
             tHead.resizeCaptionContainer(oldSortedHeader);
         }
 
+        // Remember this to detect situations where overflow hack might be
+        // needed during scrolling
+        lastRenderedHeight = scrollBody.getOffsetHeight();
+
         rendering = false;
         headerChangedDuringUpdate = false;
 
@@ -1844,6 +1856,12 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
         }
     }
 
+    private boolean isScrollPositionVisible() {
+        return scrollPositionElement != null
+                && !scrollPositionElement.getStyle().getDisplay()
+                        .equals(Display.NONE.toString());
+    }
+
     private class RowRequestHandler extends Timer {
 
         private int reqFirstRow = 0;