On Wed, 24 Jun 2026 15:19:41 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/model/StyledTextModel.java
>  line 794:
> 
>> 792:                 break;
>> 793:             case TEXT:
>> 794:             case INLINE_NODE:
> 
> I realize that this has only been included in order to handle embedded 
> images, and that maybe you're going to  make it more specific in another PR - 
> if so then that's great. Otherwise, I suggest adding the missing protected 
> method `insertNodeSegment` and invoking it here for INLINE_NODE. The 
> _StyledTextModel_ implementation of the method can just forward it to 
> `insertTextSegment` as being done here. These changes will then also allow 
> custom models to override `insertNodeSegment` and make copy paste as well as 
> import operations possible with inline nodes.

That's right, we have a separate ticket
https://bugs.openjdk.org/browse/JDK-8365948

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

PR Review Comment: https://git.openjdk.org/jfx/pull/2196#discussion_r3469589693

Reply via email to