Browse Source

Fixed the weird focus behavior described in #7446

svn changeset:20823/svn branch:6.7
tags/6.7.0.rc1
Jonatan Kronqvist 12 years ago
parent
commit
2a91733640

+ 15
- 4
src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java View File

@@ -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) {

+ 2
- 1
src/com/vaadin/ui/Table.java View File

@@ -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();

+ 137
- 0
tests/src/com/vaadin/tests/components/table/KeyboardNavigationDatasourceChange.java View File

@@ -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;
}
}
}

Loading…
Cancel
Save