diff --git a/modules/javafx.base/src/main/java/com/sun/javafx/collections/VetoableListDecorator.java b/modules/javafx.base/src/main/java/com/sun/javafx/collections/VetoableListDecorator.java index 375a7492145..e51dd6b9d72 100644 --- a/modules/javafx.base/src/main/java/com/sun/javafx/collections/VetoableListDecorator.java +++ b/modules/javafx.base/src/main/java/com/sun/javafx/collections/VetoableListDecorator.java @@ -25,21 +25,22 @@ package com.sun.javafx.collections; +import com.sun.javafx.UnmodifiableArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Objects; - import javafx.beans.InvalidationListener; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; -public abstract class VetoableListDecorator implements ObservableList { +public abstract class VetoableListDecorator implements ObservableList, SortableList { private final ObservableList list; private int modCount; @@ -100,6 +101,13 @@ public void removeListener(InvalidationListener listener) { helper = ListListenerHelper.removeListener(helper, listener); } + @Override + public final void doSort(Comparator comparator) { + var sortedList = new ArrayList<>(list); + sortedList.sort(comparator); + setAllImpl(Collections.unmodifiableList(sortedList)); + } + @Override public boolean addAll(E... elements) { return addAll(Arrays.asList(elements)); @@ -107,16 +115,20 @@ public boolean addAll(E... elements) { @Override public boolean setAll(E... elements) { - return setAll(Arrays.asList(elements)); + return setAllImpl(new UnmodifiableArrayList<>(elements, elements.length)); } @Override public boolean setAll(Collection col) { - List elements = unmodifiableList(col); - onProposedChange(elements, 0, size()); + return setAllImpl(unmodifiableList(col)); + } + + private boolean setAllImpl(List unmodifiableList) { + onProposedChange(unmodifiableList, 0, size()); + try { modCount++; - return list.setAll(elements); + return list.setAll(unmodifiableList); } catch(Exception e) { modCount--; throw e; diff --git a/modules/javafx.base/src/test/java/test/javafx/collections/VetoableObservableListTest.java b/modules/javafx.base/src/test/java/test/javafx/collections/VetoableObservableListTest.java index fb44792e209..a2c93ddd1c2 100644 --- a/modules/javafx.base/src/test/java/test/javafx/collections/VetoableObservableListTest.java +++ b/modules/javafx.base/src/test/java/test/javafx/collections/VetoableObservableListTest.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; @@ -660,7 +661,14 @@ public void testSubListCreatedOnChangeValid() { assertEquals(1, subLists.size()); subLists.get(0).size(); // Assert not throwing Exception subLists.clear(); - } + @Test + public void testSort() { + list.setAll("d", "b", "a", "c"); + calls.clear(); + list.sort(Comparator.naturalOrder()); + assertEquals(List.of("a", "b", "c", "d"), list); + assertSingleCall(new String[] {"a", "b", "c", "d"}, new int[] {0, 4}); + } } diff --git a/modules/javafx.graphics/src/test/java/test/javafx/scene/ParentTest.java b/modules/javafx.graphics/src/test/java/test/javafx/scene/ParentTest.java index 20b157d46bd..1ca39d3b038 100644 --- a/modules/javafx.graphics/src/test/java/test/javafx/scene/ParentTest.java +++ b/modules/javafx.graphics/src/test/java/test/javafx/scene/ParentTest.java @@ -33,6 +33,8 @@ import com.sun.javafx.scene.input.PickResultChooser; import java.util.Collection; +import java.util.Comparator; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import javafx.scene.Group; import javafx.scene.GroupShim; @@ -277,6 +279,22 @@ public void testRemoveAddDiferentChild() { assertEquals(5, ((NGGroup)NodeHelper.getPeer(g)).getChildren().size()); } + @Test + public void testSortChildren() { + Rectangle rect1 = new Rectangle(); + rect1.setId("1"); + Rectangle rect2 = new Rectangle(); + rect2.setId("2"); + Rectangle rect3 = new Rectangle(); + rect3.setId("3"); + + Group g = new Group(); + g.getChildren().addAll(rect3, rect1, rect2); + g.getChildren().sort(Comparator.comparing(node -> node.getId())); + + assertEquals(List.of(rect1, rect2, rect3), g.getChildren()); + } + @Test public void testGetChildrenUnmodifiable() { Rectangle rect1 = new Rectangle(); diff --git a/modules/javafx.graphics/src/test/java/test/javafx/scene/Parent_structuralPseudoClasses_Test.java b/modules/javafx.graphics/src/test/java/test/javafx/scene/Parent_structuralPseudoClasses_Test.java index 897068e118d..ff324296546 100644 --- a/modules/javafx.graphics/src/test/java/test/javafx/scene/Parent_structuralPseudoClasses_Test.java +++ b/modules/javafx.graphics/src/test/java/test/javafx/scene/Parent_structuralPseudoClasses_Test.java @@ -30,7 +30,6 @@ import javafx.css.PseudoClass; import javafx.scene.Group; import javafx.scene.Node; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -212,7 +211,6 @@ void multipleNodes_removeInteriorRange() { } @Test - @Disabled("JDK-8233179") void multipleNodes_permutation() { var group = new Group(); var child1 = new Group();