On Wed, 17 Jun 2026 19:07:59 GMT, Andy Goryachev <[email protected]> wrote:
>> ### 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. >> >> >> >> ### References >> ... > > Andy Goryachev has updated the pull request incrementally with one additional > commit since the last revision: > > doc Two more quick API doc issues I spotted. modules/jfx.incubator.richtext/src/main/java/jfx/incubator/scene/control/richtext/model/StyleAttributeMap.java line 360: > 358: /** > 359: * This convenience method returns the value of {@link #TAB_STOPS} > attribute, or null. > 360: * @return the paragraph alignment attribute value This looks like a copy/paste error. That should be something like: `@return the tab stops attribute value`. modules/jfx.incubator.richtext/src/main/java/jfx/incubator/scene/control/richtext/model/StyleAttributeMap.java line 668: > 666: * @since 27 > 667: */ > 668: public Builder setTabStops(double ... positions) { Minor: there is still an unneeded space before the `...` ------------- PR Review: https://git.openjdk.org/jfx/pull/1800#pullrequestreview-4519724068 PR Review Comment: https://git.openjdk.org/jfx/pull/1800#discussion_r3431544098 PR Review Comment: https://git.openjdk.org/jfx/pull/1800#discussion_r3431549581
