From d192085619bcb20a79cedab6f874525bdab68b90 Mon Sep 17 00:00:00 2001 From: Anna Koskinen Date: Thu, 3 Jan 2013 17:42:02 +0200 Subject: [PATCH] Preserve scroll position of ListSelect after server round-trip if the contents haven't changed (#10416) Change-Id: I7effba1a4551c9c42996d9ca677afb43f16b51a4 --- .../src/com/vaadin/client/ui/VListSelect.java | 8 +++ .../components/listselect/ListSelectJump.html | 64 +++++++++++++++++++ .../components/listselect/ListSelectJump.java | 52 +++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 uitest/src/com/vaadin/tests/components/listselect/ListSelectJump.html create mode 100644 uitest/src/com/vaadin/tests/components/listselect/ListSelectJump.java diff --git a/client/src/com/vaadin/client/ui/VListSelect.java b/client/src/com/vaadin/client/ui/VListSelect.java index 2215906af6..5fab520883 100644 --- a/client/src/com/vaadin/client/ui/VListSelect.java +++ b/client/src/com/vaadin/client/ui/VListSelect.java @@ -67,6 +67,8 @@ public class VListSelect extends VOptionGroupBase { @Override public void buildOptions(UIDL uidl) { + int scrollTop = select.getElement().getScrollTop(); + int rowCount = getRows(); select.setMultipleSelect(isMultiselect()); select.clear(); if (!isMultiselect() && isNullSelectionAllowed() @@ -87,6 +89,12 @@ public class VListSelect extends VOptionGroupBase { if (getRows() > 0) { select.setVisibleItemCount(getRows()); } + // FIXME: temporary hack for preserving the scroll state when the + // contents haven't been changed obviously. This should be dealt with in + // the rewrite. + if (rowCount == getRows()) { + select.getElement().setScrollTop(scrollTop); + } } @Override diff --git a/uitest/src/com/vaadin/tests/components/listselect/ListSelectJump.html b/uitest/src/com/vaadin/tests/components/listselect/ListSelectJump.html new file mode 100644 index 0000000000..f066d488e6 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/listselect/ListSelectJump.html @@ -0,0 +1,64 @@ + + + + + + +ListSelectJump + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ListSelectJump
open/run/com.vaadin.tests.components.listselect.ListSelectJump?restartApplication
addSelectionvaadin=runcomvaadintestscomponentslistselectListSelectJump::PID_Slistselect/domChild[0]label=Option #1
scrollvaadin=runcomvaadintestscomponentslistselectListSelectJump::PID_Slistselect/domChild[0]135
pause300
addSelectionvaadin=runcomvaadintestscomponentslistselectListSelectJump::PID_Slistselect/domChild[0]label=Option #10
scrollvaadin=runcomvaadintestscomponentslistselectListSelectJump::PID_Slistselect/domChild[0]135
pause300
clickvaadin=runcomvaadintestscomponentslistselectListSelectJump::PID_Sbutton/domChild[0]/domChild[0]
screenCapture
+ + diff --git a/uitest/src/com/vaadin/tests/components/listselect/ListSelectJump.java b/uitest/src/com/vaadin/tests/components/listselect/ListSelectJump.java new file mode 100644 index 0000000000..47f6f339ff --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/listselect/ListSelectJump.java @@ -0,0 +1,52 @@ +package com.vaadin.tests.components.listselect; + +import java.util.ArrayList; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.shared.ui.label.ContentMode; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.AbstractSelect; +import com.vaadin.ui.Button; +import com.vaadin.ui.Label; +import com.vaadin.ui.ListSelect; + +public class ListSelectJump extends AbstractTestUI { + + @Override + public void setup(VaadinRequest request) { + getLayout().setMargin(new MarginInfo(true, false, false, false)); + + addComponent(new Label( + "Instructions:
  1. Select Option #1
  2. Also select Option #10 (use meta-click)
  3. " + + "
  4. Leave the Option #10 visible in the scroll window
  5. Press the button
" + + "You will see the ListSelect scroll window jump back to the top.", + ContentMode.HTML)); + ArrayList list = new ArrayList(); + for (int i = 1; i <= 25; i++) { + list.add("Option #" + i); + } + ListSelect listSelect = new ListSelect(null, list); + listSelect.setNullSelectionAllowed(false); + listSelect.setMultiSelect(true); + listSelect.setImmediate(false); + listSelect.setRows(5); + listSelect.setItemCaptionMode(AbstractSelect.ItemCaptionMode.ID); + listSelect.setId("listselect"); + addComponent(listSelect); + Button button = new Button("Press Me"); + button.setId("button"); + addComponent(button); + } + + @Override + protected String getTestDescription() { + return "ListSelect jumps to top row after each client -> server contact"; + } + + @Override + protected Integer getTicketNumber() { + return 10416; + } + +} -- 2.39.5