aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatti Tahvonen <matti.tahvonen@itmill.com>2008-11-12 09:53:07 +0000
committerMatti Tahvonen <matti.tahvonen@itmill.com>2008-11-12 09:53:07 +0000
commitf2cfca38f8784c5a04bb70f667921f20bcfbe327 (patch)
tree654c9c2df668f58377e10c82f09cada20c15c359
parentaaafd7e4d4853ba2a22f5d6d5568a36a427abe12 (diff)
downloadvaadin-framework-f2cfca38f8784c5a04bb70f667921f20bcfbe327.tar.gz
vaadin-framework-f2cfca38f8784c5a04bb70f667921f20bcfbe327.zip
implemented scroll listening and updating from UIDL, fixes #2197
svn changeset:5873/svn branch:trunk
-rw-r--r--src/com/itmill/toolkit/terminal/gwt/client/ui/IView.java51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IView.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IView.java
index 96c8fafa01..9ceeb78e19 100644
--- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IView.java
+++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IView.java
@@ -64,11 +64,19 @@ public class IView extends SimplePanel implements Container,
*/
private Timer resizeTimer;
+ private int scrollTop;
+
+ private int scrollLeft;
+
+ private boolean rendering;
+
+ private boolean scrollable;
+
public IView(String elementId) {
super();
setStyleName(CLASSNAME);
- DOM.sinkEvents(getElement(), Event.ONKEYDOWN);
+ DOM.sinkEvents(getElement(), Event.ONKEYDOWN | Event.ONSCROLL);
// iview is focused when created so element needs tabIndex
// 1 due 0 is at the end of natural tabbing order
@@ -121,6 +129,7 @@ public class IView extends SimplePanel implements Container,
}-*/;
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
+ rendering = true;
id = uidl.getId();
boolean firstPaint = connection == null;
@@ -169,6 +178,7 @@ public class IView extends SimplePanel implements Container,
}
if (isClosed) {
// don't render the content
+ rendering = false;
return;
}
@@ -284,21 +294,52 @@ public class IView extends SimplePanel implements Container,
}
onWindowResized(Window.getClientWidth(), Window.getClientHeight());
- // IE somehow fails some layout on first run, force layout
- // functions
- // client.runDescendentsLayout(this);
if (BrowserInfo.get().isSafari()) {
Util.runWebkitOverflowAutoFix(getElement());
}
+
+ // finally set scroll position from UIDL
+ if (uidl.hasVariable("scrollTop")) {
+ scrollable = true;
+ scrollTop = uidl.getIntVariable("scrollTop");
+ DOM.setElementPropertyInt(getElement(), "scrollTop", scrollTop);
+ scrollLeft = uidl.getIntVariable("scrollLeft");
+ DOM.setElementPropertyInt(getElement(), "scrollLeft", scrollLeft);
+ } else {
+ scrollable = false;
+ }
+
+ rendering = false;
}
@Override
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
- if (DOM.eventGetType(event) == Event.ONKEYDOWN && actionHandler != null) {
+ int type = DOM.eventGetType(event);
+ if (type == Event.ONKEYDOWN && actionHandler != null) {
actionHandler.handleKeyboardEvent(event);
return;
+ } else if (scrollable && type == Event.ONSCROLL) {
+ updateScrollPosition();
+ }
+ }
+
+ /**
+ * Updates scroll position from DOM and saves variables to server.
+ */
+ private void updateScrollPosition() {
+ int oldTop = scrollTop;
+ int oldLeft = scrollLeft;
+ scrollTop = DOM.getElementPropertyInt(getElement(), "scrollTop");
+ scrollLeft = DOM.getElementPropertyInt(getElement(), "scrollLeft");
+ if (connection != null && !rendering) {
+ if (oldTop != scrollTop) {
+ connection.updateVariable(id, "scrollTop", scrollTop, false);
+ }
+ if (oldLeft != scrollLeft) {
+ connection.updateVariable(id, "scrollLeft", scrollLeft, false);
+ }
}
}