diff --git a/modules/controls/src/main/java/javafx/scene/control/MultipleSelectionModelBase.java b/modules/controls/src/main/java/javafx/scene/control/MultipleSelectionModelBase.java --- a/modules/controls/src/main/java/javafx/scene/control/MultipleSelectionModelBase.java +++ b/modules/controls/src/main/java/javafx/scene/control/MultipleSelectionModelBase.java @@ -221,6 +221,7 @@ int[] perm = new int[selectedIndicesSize]; int idx = 0; + boolean hasPermutated = false; if (shift > 0) { for (int i = selectedIndicesSize - 1; i >= position && i >= 0; i--) { @@ -235,6 +236,7 @@ if (selected) { perm[idx++] = i + 1; + hasPermutated = true; } } selectedIndices.clear(position); @@ -253,6 +255,7 @@ if (selected) { perm[idx++] = i; + hasPermutated = true; } } } @@ -268,13 +271,15 @@ // removed due to RT-27185 // focus(newFocus); } - - selectedIndicesSeq.callObservers( + + if (hasPermutated) { + selectedIndicesSeq.callObservers( new NonIterableChange.SimplePermutationChange( 0, selectedIndicesCardinality, perm, selectedIndicesSeq)); + } } @Override public void clearAndSelect(int row) { diff --git a/modules/controls/src/test/java/javafx/scene/control/ListViewMouseInputTest.java b/modules/controls/src/test/java/javafx/scene/control/ListViewMouseInputTest.java --- a/modules/controls/src/test/java/javafx/scene/control/ListViewMouseInputTest.java +++ b/modules/controls/src/test/java/javafx/scene/control/ListViewMouseInputTest.java @@ -285,7 +285,6 @@ listView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener() { @Override public void onChanged(Change c) { while (c.next()) { - System.out.println(c); rt_30626_count++; } } diff --git a/modules/controls/src/test/java/javafx/scene/control/TableViewMouseInputTest.java b/modules/controls/src/test/java/javafx/scene/control/TableViewMouseInputTest.java --- a/modules/controls/src/test/java/javafx/scene/control/TableViewMouseInputTest.java +++ b/modules/controls/src/test/java/javafx/scene/control/TableViewMouseInputTest.java @@ -399,7 +399,6 @@ tableView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener() { @Override public void onChanged(Change c) { while (c.next()) { - System.out.println(c); rt_30626_count++; } } diff --git a/modules/controls/src/test/java/javafx/scene/control/TreeTableViewKeyInputTest.java b/modules/controls/src/test/java/javafx/scene/control/TreeTableViewKeyInputTest.java --- a/modules/controls/src/test/java/javafx/scene/control/TreeTableViewKeyInputTest.java +++ b/modules/controls/src/test/java/javafx/scene/control/TreeTableViewKeyInputTest.java @@ -29,6 +29,7 @@ import javafx.beans.Observable; import javafx.beans.property.ReadOnlyStringWrapper; import javafx.beans.value.ObservableValue; +import javafx.collections.ListChangeListener; import javafx.event.EventHandler; import javafx.scene.input.KeyCode; import javafx.util.Callback; @@ -2918,4 +2919,30 @@ assertEquals(1, sm.getSelectedItems().size()); assertTrue(fm.isFocused(0)); } + + private int rt_33559_count = 0; + @Test public void test_rt33559() { + final int items = 4; + root.getChildren().clear(); + root.setExpanded(false); + for (int i = 0; i < items; i++) { + root.getChildren().add(new TreeItem<>("Row " + i)); + } + + final MultipleSelectionModel sm = tableView.getSelectionModel(); + sm.setSelectionMode(SelectionMode.SINGLE); + sm.clearAndSelect(0); + + tableView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener() { + @Override public void onChanged(Change c) { + while (c.next()) { + rt_33559_count++; + } + } + }); + + assertEquals(0, rt_33559_count); + keyboard.doKeyPress(KeyCode.RIGHT); // expand root + assertEquals(0, rt_33559_count); + } } diff --git a/modules/controls/src/test/java/javafx/scene/control/TreeTableViewMouseInputTest.java b/modules/controls/src/test/java/javafx/scene/control/TreeTableViewMouseInputTest.java --- a/modules/controls/src/test/java/javafx/scene/control/TreeTableViewMouseInputTest.java +++ b/modules/controls/src/test/java/javafx/scene/control/TreeTableViewMouseInputTest.java @@ -538,7 +538,6 @@ tableView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener() { @Override public void onChanged(Change c) { while (c.next()) { - System.out.println(c); rt_30626_count++; } } diff --git a/modules/controls/src/test/java/javafx/scene/control/TreeViewKeyInputTest.java b/modules/controls/src/test/java/javafx/scene/control/TreeViewKeyInputTest.java --- a/modules/controls/src/test/java/javafx/scene/control/TreeViewKeyInputTest.java +++ b/modules/controls/src/test/java/javafx/scene/control/TreeViewKeyInputTest.java @@ -27,6 +27,7 @@ import javafx.beans.InvalidationListener; import javafx.beans.Observable; +import javafx.collections.ListChangeListener; import javafx.event.Event; import javafx.event.EventHandler; import javafx.scene.input.KeyCode; @@ -1849,4 +1850,30 @@ assertEquals(1, sm.getSelectedItems().size()); assertTrue(fm.isFocused(0)); } + + private int rt_33559_count = 0; + @Test public void test_rt33559() { + final int items = 4; + root.getChildren().clear(); + root.setExpanded(false); + for (int i = 0; i < items; i++) { + root.getChildren().add(new TreeItem<>("Row " + i)); + } + + final MultipleSelectionModel sm = treeView.getSelectionModel(); + sm.setSelectionMode(SelectionMode.SINGLE); + sm.clearAndSelect(0); + + treeView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener() { + @Override public void onChanged(Change c) { + while (c.next()) { + rt_33559_count++; + } + } + }); + + assertEquals(0, rt_33559_count); + keyboard.doKeyPress(KeyCode.RIGHT); // expand root + assertEquals(0, rt_33559_count); + } } diff --git a/modules/controls/src/test/java/javafx/scene/control/TreeViewMouseInputTest.java b/modules/controls/src/test/java/javafx/scene/control/TreeViewMouseInputTest.java --- a/modules/controls/src/test/java/javafx/scene/control/TreeViewMouseInputTest.java +++ b/modules/controls/src/test/java/javafx/scene/control/TreeViewMouseInputTest.java @@ -386,7 +386,6 @@ treeView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener() { @Override public void onChanged(Change c) { while (c.next()) { - System.out.println(c); rt_30626_count++; } } diff --git a/modules/controls/src/test/java/javafx/scene/control/TreeViewTest.java b/modules/controls/src/test/java/javafx/scene/control/TreeViewTest.java --- a/modules/controls/src/test/java/javafx/scene/control/TreeViewTest.java +++ b/modules/controls/src/test/java/javafx/scene/control/TreeViewTest.java @@ -45,6 +45,8 @@ import javafx.beans.Observable; import static com.sun.javafx.scene.control.infrastructure.ControlTestUtils.assertStyleClassContains; import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; + import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyBooleanWrapper; import javafx.beans.property.SimpleObjectProperty; @@ -52,6 +54,7 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; +import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.event.Event; import javafx.event.EventHandler; @@ -1193,4 +1196,27 @@ assertEquals(1, rt_29650_commit_count); assertEquals(0, rt_29650_cancel_count); } + + private int rt_33559_count = 0; + @Test public void test_rt_33559() { + installChildren(); + + treeView.setShowRoot(true); + final MultipleSelectionModel sm = treeView.getSelectionModel(); + sm.setSelectionMode(SelectionMode.MULTIPLE); + sm.clearAndSelect(0); + + treeView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener() { + @Override public void onChanged(Change c) { + while (c.next()) { + System.out.println(c); + rt_33559_count++; + } + } + }); + + assertEquals(0, rt_33559_count); + root.setExpanded(true); + assertEquals(0, rt_33559_count); + } }