]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed the weird focus behavior described in #7446
authorJonatan Kronqvist <jonatan.kronqvist@itmill.com>
Fri, 2 Sep 2011 11:32:51 +0000 (11:32 +0000)
committerJonatan Kronqvist <jonatan.kronqvist@itmill.com>
Fri, 2 Sep 2011 11:32:51 +0000 (11:32 +0000)
svn changeset:20823/svn branch:6.7

src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
src/com/vaadin/ui/Table.java
tests/src/com/vaadin/tests/components/table/KeyboardNavigationDatasourceChange.java [new file with mode: 0644]

index b009307ff6e68c03d5fe58f7fad355107aa864ca..0089723f16aa7f68235647f4fc2cae2404d279d1 100644 (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) {
index 65340eaf919079bbef9529fd45ebc012ee10c864..4cf086bd632070ddce99b9ea11c7da86cad63da9 100644 (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();
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 (file)
index 0000000..b389727
--- /dev/null
@@ -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;
+        }
+    }
+}