return;
}
- // we may have pending cache row fetch, cancel it. See #2136
- rowRequestHandler.cancel();
-
enabled = !uidl.hasAttribute("disabled");
if (BrowserInfo.get().isIE8() && !enabled) {
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"));
multiselectPending = false;
if (focusedRow != null) {
- if (!focusedRow.isAttached()) {
+ if (!focusedRow.isAttached() && !rowRequestHandler.isRunning()) {
// focused row has been orphaned, can't focus
focusRowFromBody();
}
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);
selectedRowKeys);
}
}
+ isRunning = false;
}
public int getReqFirstRow() {
* 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) {
--- /dev/null
+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<MyItem> items = new ArrayList<MyItem>();
+ for (int i = 0; i < 110; i++) {
+ items.add(new MyItem("item" + i, i, null));
+ }
+ BeanItemContainer<MyItem> c = new BeanItemContainer<MyItem>(
+ 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>("", 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<MyItem> children = new ArrayList<MyItem>();
+ private MyItem parent;
+
+ public MyItem(String nome, Integer index, List<MyItem> 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<MyItem> getChildren() {
+ return children;
+ }
+
+ /**
+ * @param children
+ * the children to set
+ */
+ public void setChildren(List<MyItem> 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;
+ }
+ }
+}