From 2a917336409577b9bf7cb22d4729da3146a8288c Mon Sep 17 00:00:00 2001 From: Jonatan Kronqvist Date: Fri, 2 Sep 2011 11:32:51 +0000 Subject: [PATCH] Fixed the weird focus behavior described in #7446 svn changeset:20823/svn branch:6.7 --- .../terminal/gwt/client/ui/VScrollTable.java | 19 ++- src/com/vaadin/ui/Table.java | 3 +- .../KeyboardNavigationDatasourceChange.java | 137 ++++++++++++++++++ 3 files changed, 154 insertions(+), 5 deletions(-) create mode 100644 tests/src/com/vaadin/tests/components/table/KeyboardNavigationDatasourceChange.java diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index b009307ff6..0089723f16 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -801,9 +801,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, return; } - // we may have pending cache row fetch, cancel it. See #2136 - rowRequestHandler.cancel(); - enabled = !uidl.hasAttribute("disabled"); if (BrowserInfo.get().isIE8() && !enabled) { @@ -875,11 +872,17 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, UIDL partialRowAdditions = uidl.getChildByTagName("prows"); UIDL partialRowUpdates = uidl.getChildByTagName("urows"); if (partialRowUpdates != null || partialRowAdditions != null) { + // we may have pending cache row fetch, cancel it. See #2136 + rowRequestHandler.cancel(); + updateRowsInBody(partialRowUpdates); addAndRemoveRows(partialRowAdditions); } else { UIDL rowData = uidl.getChildByTagName("rows"); if (rowData != null) { + // we may have pending cache row fetch, cancel it. See #2136 + rowRequestHandler.cancel(); + if (!recalcWidths && initializedAndAttached) { updateBody(rowData, uidl.getIntAttribute("firstrow"), uidl.getIntAttribute("rows")); @@ -939,7 +942,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, multiselectPending = false; if (focusedRow != null) { - if (!focusedRow.isAttached()) { + if (!focusedRow.isAttached() && !rowRequestHandler.isRunning()) { // focused row has been orphaned, can't focus focusRowFromBody(); } @@ -2007,12 +2010,18 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, private int reqFirstRow = 0; private int reqRows = 0; + private boolean isRunning = false; public void deferRowFetch() { deferRowFetch(250); } + public boolean isRunning() { + return isRunning; + } + public void deferRowFetch(int msec) { + isRunning = true; if (reqRows > 0 && reqFirstRow < totalRows) { schedule(msec); @@ -2098,6 +2107,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, selectedRowKeys); } } + isRunning = false; } public int getReqFirstRow() { @@ -2108,6 +2118,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, * Sends request to refresh content at this position. */ public void refreshContent() { + isRunning = true; int first = (int) (firstRowInViewPort - pageLength * cache_rate); int reqRows = (int) (2 * pageLength * cache_rate + pageLength); if (first < 0) { diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index 65340eaf91..4cf086bd63 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -3151,7 +3151,8 @@ public class Table extends AbstractSelect implements Action.Container, */ @Override public void valueChange(Property.ValueChangeEvent event) { - if (event.getProperty() == this) { + if (event.getProperty() == this + || event.getProperty() == getPropertyDataSource()) { super.valueChange(event); } else { resetPageBuffer(); diff --git a/tests/src/com/vaadin/tests/components/table/KeyboardNavigationDatasourceChange.java b/tests/src/com/vaadin/tests/components/table/KeyboardNavigationDatasourceChange.java new file mode 100644 index 0000000000..b389727fd3 --- /dev/null +++ b/tests/src/com/vaadin/tests/components/table/KeyboardNavigationDatasourceChange.java @@ -0,0 +1,137 @@ +package com.vaadin.tests.components.table; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Form; +import com.vaadin.ui.Table; +import com.vaadin.ui.TextField; + +public class KeyboardNavigationDatasourceChange extends TestBase { + + @Override + protected void setup() { + List items = new ArrayList(); + for (int i = 0; i < 110; i++) { + items.add(new MyItem("item" + i, i, null)); + } + BeanItemContainer c = new BeanItemContainer( + MyItem.class, items); + Table t = new Table("Test", c); + t.setVisibleColumns(new String[] { "nome", "index", "parent" }); + t.setSelectable(true); + t.setSizeFull(); + t.setImmediate(true); + TextField f = new TextField("Name"); + final Form form = new Form(); + // Property p = new ObjectProperty("", String.class); + // t.setPropertyDataSource(p); // UNCOMMENT THIS LINE TO SEE BUG + // HAPPENING + // f.setPropertyDataSource(p); + // f.setImmediate(true); + t.setPropertyDataSource(f); + form.addField("table", t); + form.addField("name", f); + addComponent(form); + + } + + @Override + protected String getDescription() { + return "When calling setPropertyDataSource on a regular table the keyboard navigation becomes unstable"; + } + + @Override + protected Integer getTicketNumber() { + return 7446; + } + + public class MyItem implements Serializable { + + private String nome; + private Integer index; + protected List children = new ArrayList(); + private MyItem parent; + + public MyItem(String nome, Integer index, List children) { + this.nome = nome; + this.index = index; + if (children != null) { + this.children = children; + if (children != null) { + for (MyItem child : children) { + child.setParent(this); + } + } + } + } + + /** + * @return the nome + */ + public String getNome() { + return nome; + } + + /** + * @param nome + * the nome to set + */ + public void setNome(String nome) { + this.nome = nome; + } + + /** + * @return the idade + */ + public Integer getIndex() { + return index; + } + + /** + * @param idade + * the idade to set + */ + public void setIndex(Integer idade) { + index = idade; + } + + /** + * @return the children + */ + public List getChildren() { + return children; + } + + /** + * @param children + * the children to set + */ + public void setChildren(List children) { + this.children = children; + } + + /** + * @return the parent + */ + public MyItem getParent() { + return parent; + } + + /** + * @param parent + * the parent to set + */ + public void setParent(MyItem parent) { + this.parent = parent; + } + + @Override + public String toString() { + return nome; + } + } +} -- 2.39.5