> ### 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 incrementally with one additional 
commit since the last revision:

  cleanup

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

Changes:
  - all: https://git.openjdk.org/jfx/pull/1800/files
  - new: https://git.openjdk.org/jfx/pull/1800/files/f2798f2a..1bda8cab

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jfx&pr=1800&range=20
 - incr: https://webrevs.openjdk.org/?repo=jfx&pr=1800&range=19-20

  Stats: 63 lines in 8 files changed: 35 ins; 15 del; 13 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

Reply via email to