Revision: 9305
Author: [email protected]
Date: Tue Nov 30 06:52:25 2010
Log: Make ListEditorWrapper update its backing on flush().
Fixes Issue 5500.

Review at http://gwt-code-reviews.appspot.com/1159801

http://code.google.com/p/google-web-toolkit/source/detail?r=9305

Modified:
/trunk/user/src/com/google/gwt/editor/client/adapters/ListEditorWrapper.java /trunk/user/test/com/google/gwt/editor/client/adapters/ListEditorWrapperTest.java

=======================================
--- /trunk/user/src/com/google/gwt/editor/client/adapters/ListEditorWrapper.java Thu Sep 9 11:46:06 2010 +++ /trunk/user/src/com/google/gwt/editor/client/adapters/ListEditorWrapper.java Tue Nov 30 06:52:25 2010
@@ -33,6 +33,7 @@
   private final CompositeEditor.EditorChain<T, E> chain;
   private final List<E> editors;
   private final EditorSource<E> editorSource;
+  private final List<T> workingCopy;

   public ListEditorWrapper(List<T> backing,
CompositeEditor.EditorChain<T, E> chain, EditorSource<E> editorSource) {
@@ -40,11 +41,12 @@
     this.chain = chain;
     this.editorSource = editorSource;
     editors = new ArrayList<E>(backing.size());
+    workingCopy = new ArrayList<T>(backing);
   }

   @Override
   public void add(int index, T element) {
-    backing.add(index, element);
+    workingCopy.add(index, element);
     E subEditor = editorSource.create(index);
     editors.add(index, subEditor);
     for (int i = index + 1, j = editors.size(); i < j; i++) {
@@ -55,13 +57,12 @@

   @Override
   public T get(int index) {
-    return backing.get(index);
+    return workingCopy.get(index);
   }

   @Override
   public T remove(int index) {
-    // Try to mutate the list first, in case it is immutable
-    T toReturn = backing.remove(index);
+    T toReturn = workingCopy.remove(index);
     E subEditor = editors.remove(index);
     editorSource.dispose(subEditor);
     for (int i = index, j = editors.size(); i < j; i++) {
@@ -73,15 +74,14 @@

   @Override
   public T set(int index, T element) {
-    // Try to mutate the list first, in case it is immutable
-    T toReturn = backing.set(index, element);
+    T toReturn = workingCopy.set(index, element);
     chain.attach(element, editors.get(index));
     return toReturn;
   }

   @Override
   public int size() {
-    return backing.size();
+    return workingCopy.size();
   }

   /**
@@ -90,9 +90,9 @@
    * {...@link ListEditor#getList()}
    */
   void attach() {
-    editors.addAll(editorSource.create(backing.size(), 0));
-    for (int i = 0, j = backing.size(); i < j; i++) {
-      chain.attach(backing.get(i), editors.get(i));
+    editors.addAll(editorSource.create(workingCopy.size(), 0));
+    for (int i = 0, j = workingCopy.size(); i < j; i++) {
+      chain.attach(workingCopy.get(i), editors.get(i));
     }
   }

@@ -104,14 +104,16 @@
   }

   void flush() {
-    for (int i = 0, j = backing.size(); i < j; i++) {
+    for (int i = 0, j = workingCopy.size(); i < j; i++) {
       E subEditor = editors.get(i);
       T value = chain.getValue(subEditor);
       // Use of object-identity intentional
-      if (backing.get(i) != value) {
-        backing.set(i, value);
+      if (workingCopy.get(i) != value) {
+        workingCopy.set(i, value);
       }
     }
+    backing.clear();
+    backing.addAll(workingCopy);
   }

   /**
=======================================
--- /trunk/user/test/com/google/gwt/editor/client/adapters/ListEditorWrapperTest.java Thu Sep 9 11:46:06 2010 +++ /trunk/user/test/com/google/gwt/editor/client/adapters/ListEditorWrapperTest.java Tue Nov 30 06:52:25 2010
@@ -44,6 +44,9 @@

     Object o1 = new Object();
     wrapper.add(o1);
+    assertEquals(0, backing.size());
+    wrapper.flush();
+    assertEquals(1, backing.size());
     assertSame(o1, backing.get(0));
     FakeLeafValueEditor<Object> editor1 = wrapper.getEditors().get(0);
     assertSame(o1, editor1.getValue());
@@ -52,6 +55,9 @@

     Object o0 = new Object();
     wrapper.add(0, o0);
+    assertEquals(1, backing.size());
+    wrapper.flush();
+    assertEquals(2, backing.size());
     assertSame(o0, backing.get(0));
     assertSame(o1, backing.get(1));
     FakeLeafValueEditor<Object> editor0 = wrapper.getEditors().get(0);
@@ -112,6 +118,9 @@
     assertSame(o2, e2.getValue());

     wrapper.remove(1);
+    assertEquals(Arrays.asList(o0, o1, o2), backing);
+    assertEquals(Arrays.asList(e0, e2), wrapper.getEditors());
+    wrapper.flush();
     assertEquals(Arrays.asList(o0, o2), backing);
     assertEquals(Arrays.asList(e0, e2), wrapper.getEditors());
     assertFalse(chain.isAttached(e1));
@@ -119,6 +128,8 @@
     assertEquals(1, source.getLastKnownPosition(e2));

     wrapper.set(1, o1);
+    assertEquals(Arrays.asList(o0, o2), backing);
+    wrapper.flush();
     assertEquals(Arrays.asList(o0, o1), backing);
     // Re-use existing editor
     assertEquals(Arrays.asList(e0, e2), wrapper.getEditors());

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to