On Wed, 24 Jun 2026 16:30:43 GMT, Jurgen <[email protected]> wrote:
>> # Support for Embedded Images, Text Highlights, Wavy Underlines
>>
>> ## Summary
>>
>> This PR adds new attributes to support embedded images, text highlights, and
>> wavy underlines.
>>
>> The `RichEditorDemoApp` gains new context menus and enables drag and drop to
>> showcase the new functionality.
>>
>> <img width="768" height="703" alt="Screenshot 2026-06-18 at 12 40 28"
>> src="https://github.com/user-attachments/assets/678bdbac-6582-46ee-bd41-ea938df930bb"
>> />
>>
>>
>>
>> ## Problem
>>
>> Among the feedback received after publishing the RichTextArea incubating
>> module, a number of users complained about the need to support embedded
>> images. Other users complained about difficulty to get the text highlighted
>> or wavy underlined, and having these decorations controlled via CSS.
>>
>>
>> ## Solution
>>
>> Support for images was intentionally missing in the initial release; this PR
>> adds the feature.
>>
>> Adding highlights and underlines is a bit more complicated, for several
>> reasons. One reason is that the existing highlighting mechanism supports
>> mixing of arbitrary number of translucent colors - something that is pretty
>> much impossible to do with CSS alone.
>>
>> A useful compromise is to offer a limited number of standard attributes that
>> can be controlled via CSS: 5 highlights and 3 wavy underlines.
>>
>>
>> ## Specification
>>
>>
>> ### StyleAttributeMap Attributes
>>
>> New attributes:
>> - EMBEDDED_IMAGE
>> - TEXT_HIGHLIGHT_1 ... TEXT_HIGHLIGHT_5
>> - UNDERLINE_WAVY_1 ... UNDERLINE_WAVY_3
>>
>> ### CSS Styling
>>
>> The styling of highlights and wavy underlines is determined by the
>> stylesheet and can be changed by the user.
>>
>> The style selectors are:
>>
>> `.rich-text-area .text-highlight-1` ... `.rich-text-area .text-highlight-5`
>> `.rich-text-area .underline-wavy-1` ... `.rich-text-area .underline-wavy-3`
>>
>>
>> ### New Public APIs
>>
>> `EmbeddedImage`
>> `FileListFormatHandler`
>> `StyleAttribute.inlineNode()`
>> `StyleAttribute.isInlineNode()`
>> `StyledSegment.ofInlineNode()`
>> `CellContext.RunDecor`
>> `CellContext.decorateRun()`
>> `RichTextArea.dropTargetProperty`
>> `RichTextArea.clearDropTarget()`
>> `RichTextArea.getStyleAttributeMap()`
>>
>>
>> ### File Format Changes
>>
>> The data transfer format (also used by the demo app to save the .rich files)
>> version string is changed, making the old files unreadable.
>>
>> Perhaps it should remain unchanged for the duration of the incubation
>> period. See also [2]
>>
>>
>> ### Breaking API Changes
>>
>> `DataFormatHandler.createStyl...
>
> modules/jfx.incubator.richtext/src/main/java/jfx/incubator/scene/control/richtext/RichTextArea.java
> line 2529:
>
>> 2527: if (v) {
>> 2528: cx.decorateRun(StyleAttributeMap.TEXT_HIGHLIGHT_1,
>> CellContext.RunDecor.HIGHLIGHT, Params.TEXT_HIGHLIGHT_1);
>> 2529: }
>
> Since a developer could define their own highlight or wavy underline
> attribute like:
>> INFO_HIGHLIGHT = new StyleAttribute<>( "INFO_HIGHLIGHT", Color.class, false
>> );
>
> and want to add it to the _StyleHandlerRegistry_, it would be helpful if
> `decorateRun` was overloaded with a Color parameter:
>> cx.decorateRun( INFO_HIGHLIGHT, CellContext.RunDecor.HIGHLIGHT, v );
+1
> modules/jfx.incubator.richtext/src/main/java/jfx/incubator/scene/control/richtext/model/StyleAttributeMap.java
> line 131:
>
>> 129: * @since 27
>> 130: */
>> 131: public static final StyleAttribute<Boolean> TEXT_HIGHLIGHT_5 =
>> StyleAttribute.character("TEXT_HIGHLIGHT_5", Boolean.class);
>
> The JavaDoc comments here should mention that the color is specified via CSS
> and what the default color is.
> Something like: "Text highlight attribute. The color is specified via CSS
> text-highlight-1 which has a default color of xxxx."
this is a good idea, thanks!
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/2196#discussion_r3468702837
PR Review Comment: https://git.openjdk.org/jfx/pull/2196#discussion_r3468692744