Cherry picking r9305 from trunk into release branch for issue 5500 git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/2.1@9308 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/editor/client/adapters/ListEditorWrapper.java b/user/src/com/google/gwt/editor/client/adapters/ListEditorWrapper.java index 18820db..b028a79 100644 --- a/user/src/com/google/gwt/editor/client/adapters/ListEditorWrapper.java +++ b/user/src/com/google/gwt/editor/client/adapters/ListEditorWrapper.java
@@ -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); } /**
diff --git a/user/test/com/google/gwt/editor/client/adapters/ListEditorWrapperTest.java b/user/test/com/google/gwt/editor/client/adapters/ListEditorWrapperTest.java index b787449..8c8c2a1 100644 --- a/user/test/com/google/gwt/editor/client/adapters/ListEditorWrapperTest.java +++ b/user/test/com/google/gwt/editor/client/adapters/ListEditorWrapperTest.java
@@ -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());