svn changeset:20823/svn branch:6.7tags/6.7.0.rc1
@@ -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) { |
@@ -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(); |
@@ -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<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; | |||
} | |||
} | |||
} |