On Thu, 8 Feb 2024 18:55:54 GMT, Marius Hanl <mh...@openjdk.org> wrote:
> `TreeTableRow` does not check the item with `isItemChanged(..)`, unlike all > other implementations of the cell. > > This also means that the `TreeTableRow` always updates the item, although it > should not, resulting in a performance loss as a `TreeTableRow` will always > call `updateItem(..)`. > > It looks like that this was forgotten in > [JDK-8092593](https://bugs.openjdk.org/browse/JDK-8092593). > > Checking the whole history, it looks like the following was happening: > 1. There was a check if the item is the same in all cell implementations > (with `.equals(..)`) > 2. Check was removed as it caused bugs > 3. Check was readded, but instead we first check the index (same index) and > then if we also have the same item (this time with `.isItemChanged(..)`, to > allow developers to subclass it) > 4. Forgotten for `TreeTableRow` inbetween this chaos. > > Added many tests for the case where an item should be changed and where it > should not. > Improved existing tests as well. Using `stageLoader`, as before the tests > only created a stage when doing the assert. > > NOTE: The update logic is now the same as for all other 5 cell > implementations. Especially `TreeCell` (since it is for a tree structure as > well). Tried the path with the TreeTableView page in the MonkeyTester on macOS 14.3, see no ill effects - though the page is somewhat limited to what it can exercise. The SCCE generates the following output: updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem updateItem isItemChanged <clicked to expand> isItemChanged isItemChanged updateItem isItemChanged isItemChanged <clicked to collapse> isItemChanged updateItem isItemChanged is this expected output? modules/javafx.controls/src/main/java/javafx/scene/control/TreeTableRow.java line 421: > 419: if (oldIndex == newIndex) { > 420: if (!isItemChanged(oldValue, newValue)) { > 421: // RT-37054: we break out of the if/else code here > and could we also add (or replace?) the new reference for RT-37054: JDK-8096969 modules/javafx.controls/src/main/java/javafx/scene/control/TreeTableRow.java line 424: > 422: // proceed with the code following this, so that we > may > 423: // still update references, listeners, etc as > required. > 424: break outer; I understand neither the comment nor this `break outer;`: there is no code that follows `outer: if`, so we might as well `return`, right? modules/javafx.controls/src/test/java/test/javafx/scene/control/ListCellTest.java line 1150: > 1148: super.updateItem(item, empty); > 1149: > 1150: counter.incrementAndGet(); very, very minor, and probably not important: shouldn't 'incrementAndGet()` be called before `super.updateItem()`? modules/javafx.controls/src/test/java/test/javafx/scene/control/TableCellTest.java line 943: > 941: super.updateItem(item, empty); > 942: > 943: counter.incrementAndGet(); same here: move before super.updateItem? modules/javafx.controls/src/test/java/test/javafx/scene/control/TableCellTest.java line 961: > 959: * is called when the index is 'changed' to the same number as the > old one, to evaluate if we need to call > 960: * updateItem(..). > 961: */ thank you so much for providing clear explanations of what all these tests are trying to accomplish! modules/javafx.controls/src/test/java/test/javafx/scene/control/TableViewRowTest.java line 176: > 174: super.updateItem(item, empty); > 175: > 176: counter.incrementAndGet(); and here. the reason is that if super.updateItem() throws an exception which gets eaten (it shouldn't but we should not be assuming that) we still get the counter incremented. modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeCellTest.java line 1078: > 1076: super.updateItem(item, empty); > 1077: > 1078: counter.incrementAndGet(); ... modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeTableCellTest.java line 1255: > 1253: super.updateItem(item, empty); > 1254: > 1255: counter.incrementAndGet(); ... modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeTableRowTest.java line 960: > 958: super.updateItem(item, empty); > 959: > 960: counter.incrementAndGet(); ... modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeTableViewTest.java line 1777: > 1775: } > 1776: > 1777: @Test public void testSetChildrenShouldUpdateTheCells() { we probably should have `@Test` on its own line modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeTableViewTest.java line 2639: > 2637: StageLoader sl = new StageLoader(treeTableView); > 2638: > 2639: assertEquals(18, rt_31200_count); magic number... should we explain why exactly 18 ? ------------- PR Review: https://git.openjdk.org/jfx/pull/1360#pullrequestreview-1881075752 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489954389 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489958225 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489961310 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489965524 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489966660 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489968231 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489968818 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489969213 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489969686 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489970617 PR Review Comment: https://git.openjdk.org/jfx/pull/1360#discussion_r1489972931