> ### Summary > > This PR adds support for controlling tab stops: the `TAB_STOPS` paragraph > attribute and the `defaultTabStops` property in the `RichTextModel`. > > While adding the paragraph attribute is a trivial process, adding a > model-wide property requires adding of a mechanism to support document > properties (something that was originally omitted in the first incubating > release). Using the document properties, we can now persist not only the > default tab stops, but also provide the version umber for the storage format > provided by the `RichTextFormatHandler`, which will enable support the format > evolution in the future [0]. > > To showcase the feature, the `RichEditorDemoApp` gains a visual ruler and > additional dialogs and menus. > > <img width="822" height="381" alt="Screenshot 2026-03-04 at 14 00 30" > src="https://github.com/user-attachments/assets/32251846-f11a-4e87-b74a-44c21d629550" > /> > > > ### Paragraph Attribute > > Paragraph-specific tab stops are enabled by: > > - `StyleAttributeMap.TAB_STOPS` constant > - `StyleAttributeMap.Builder.setTabStops(double ... positions)` > > The tab stops are represented by the `TabStops` class which is basically an > immutable list (we can't use List<TabStops> because it makes it impossible to > offer compile-time type safety of `StyleAttribute`). > > ### Default Tab Stops > > After the last paragraph tab stop, or when no paragraph tab stops is set, the > document provides a way to set default tab stops via the model's > `defaultTabStops` property: > > These changes support the new property and other document properties: > > - document-wide properties support in the `StyledTextModel` base class > - `defaultTabStops` property in the `RichTextModel` and > `RichTextFormatHandler` > - document properties `VERSION` and `DEFAULT_TAB_STOPS` > - `StyledSegment`: `ofDocumentProperties()` factory, `getDocumentProperties()` > > ### Other Improvements > > A number of other improvements were made along with the tab stop related > changes: > > - `character()`, `paragraph()`, and `document()` factory methods in the > `StyleAttribute` class > - `isCharacterAttribute()`, `isParagraphAttribute()`, and > `isDocumentAttribute()` methods in the `StyleAttribute` class > - `RichTextArea`: `documentArea` read-only property > > > ### Testing > > In addition to the `RichEditorDemoApp`, the standalone Monkey Tester [1] > provides additional options via context menu in the `CodeArea` and > `RichTextArea` pages. > > > ### Questions to the Reviewers > > - should the informational note [0] be added to the repo, and where? maybe > unde...
Andy Goryachev has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 194 commits: - test standard attributes - Merge branch 'master' into 8356042.ruler - ws - test doc props - cleanup - tab stops - Merge branch 'master' into 8356042.ruler - renamed doc - docs - Merge branch 'master' into 8356042.ruler - ... and 184 more: https://git.openjdk.org/jfx/compare/738be0f1...87241d12 ------------- Changes: https://git.openjdk.org/jfx/pull/1800/files Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1800&range=23 Stats: 2634 lines in 38 files changed: 2423 ins; 82 del; 129 mod Patch: https://git.openjdk.org/jfx/pull/1800.diff Fetch: git fetch https://git.openjdk.org/jfx.git pull/1800/head:pull/1800 PR: https://git.openjdk.org/jfx/pull/1800
