RFR: 8293119: Additional constrained resize policies for Tree/TableView [v31]

Kevin Rushforth kcr at openjdk.org
Sat Jan 7 00:33:04 UTC 2023


On Thu, 5 Jan 2023 21:53:56 GMT, Andy Goryachev <angorya at openjdk.org> wrote:

>> The current CONSTRAINED_RESIZE_POLICY has a number of issues as explained in [JDK-8292810](https://bugs.openjdk.org/browse/JDK-8292810).
>> 
>> We propose to address all these issues by replacing the old column resize algorithm with a different one, which not only honors all the constraints when resizing, but also provides 4 different resize modes similar to JTable's. The new implementation brings changes to the public API for Tree/TableView and ResizeFeaturesBase classes. Specifically:
>> 
>> - create a public abstract javafx.scene.control.ConstrainedColumnResizeBase class
>> - provide an out-of-the box implementation via javafx.scene.control.ConstrainedColumnResize class, offeting 4 resize modes: AUTO_RESIZE_NEXT_COLUMN, AUTO_RESIZE_SUBSEQUENT_COLUMNS, AUTO_RESIZE_LAST_COLUMN, AUTO_RESIZE_ALL_COLUMNS
>> - add corresponding public static constants to Tree/TableView
>> - make Tree/TableView.CONSTRAINED_RESIZE_POLICY an alias to AUTO_RESIZE_SUBSEQUENT_COLUMNS (a slight behavioral change - discuss)
>> - add getContentWidth() and setColumnWidth(TableColumnBase<S,?> col, double width) methods to ResizeFeatureBase
>> - suppress the horizontal scroll bar when resize policy is instanceof ConstrainedColumnResizeBase
>> - update javadoc
>> 
>> 
>> Notes
>> 
>> 1. The current resize policies' toString() methods return "unconstrained-resize" and "constrained-resize", used by the skin base to set a pseudostate. All constrained policies that extend ConstrainedColumnResizeBase will return "constrained-resize" value.
>> 2. The reason an abstract class ( ConstrainedColumnResizeBase) was chosen instead of a marker interface is exactly for its toString() method which supplies "constrained-resize" value. The implementors might choose to use a different value, however they must ensure the stylesheet contains the same adjustments for the new policy as those made in modena.css for "constrained-resize" value.
>
> Andy Goryachev has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 101 commits:
> 
>  - Merge remote-tracking branch 'origin/master' into 8293119.constrained
>  - 8293119: removed debug printouts
>  - Merge remote-tracking branch 'origin/master' into 8293119.constrained
>  - width indicator in tester
>  - 2023
>  - 2023
>  - small delta
>  - whitespace
>  - whitespace
>  - Merge remote-tracking branch 'origin/master' into 8293119.constrained
>  - ... and 91 more: https://git.openjdk.org/jfx/compare/ca29cc61...795d196e

I did some additional testing, and other than the minor issues already identified with fractional screen scales (and tracked by follow-up bugs), everything looks good.

I left a few mostly minor comments inline. The only thing I'd definitely like to see is at least some testing of `TreeTableView`.

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ResizeHelper.java line 36:

> 34:  * Helper class for constrained column resize policies.
> 35:  *
> 36:  * https://bugs.openjdk.org/browse/JDK-8293119

Minor: I don't see the need to put a pointer to the JBS bug here.

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ResizeHelper.java line 146:

> 144:                 }
> 145:             }
> 146:         } while (needsAnotherPass);

I presume this won't get stuck in an infinite loop? I think it's fine, since the only time it will set `needsAnotherPass` is when it removes a column from consideration, and eventually, if all columns get removed, it will return anyway because `total` will be zero. So I think this is fine.

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ResizeHelper.java line 310:

> 308:     protected boolean distributeDelta(int ix, double delta) {
> 309:         int ct = count - skip.cardinality();
> 310:         switch(ct) {

Minor: add space after `switch`

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ResizeHelper.java line 322:

> 320:             double adj;
> 321: 
> 322:             switch(mode) {

Minor: add space after `switch`

modules/javafx.controls/src/test/java/test/javafx/scene/control/ResizeHelperTest.java line 49:

> 47:  *
> 48:  * TODO rename
> 49:  * TODO parallel class with TreeTableView, or as part of each test?

What is your plan to test `TreeTableView`?

modules/javafx.controls/src/test/java/test/javafx/scene/control/ResizeHelperTest.java line 214:

> 212:      */
> 213:     //@Test // this test takes too much time!
> 214:     public void testWidthChange() {

Do you think testing a pseudo-random subset of the combinations would be interesting?

Loosely related to this, it might be useful follow-up test enhancement to add a generic `long.running.test` system property (or similar) that could be set when a `LONG_RUNNING_TEST` gradle property is set (similar to what we do for `unstable.test`). That way this, and other similarly exhaustive tests, could be run explicitly when desired.

tests/manual/tester/src/com/oracle/javafx/tester/ATableViewResizeTester.java line 63:

> 61:  * Tests TableView/JTable constrained column resize modes.
> 62:  */
> 63: public class ATableViewResizeTester extends Application {

Minor: Maybe drop the initial `A` and just call it `ATableViewResizeTester`? The "A" seems odd.

Suggestion: it would be useful to have a `TreeTableView` tester. I presume you have done at least some testing with `TreeTableView`?

-------------

PR: https://git.openjdk.org/jfx/pull/897


More information about the openjfx-dev mailing list