85 lines
3.2 KiB
Markdown
85 lines
3.2 KiB
Markdown
---
|
|
nav_order: 0036
|
|
parent: Decision Records
|
|
---
|
|
|
|
# Use TextArea for Chat Message Content
|
|
|
|
## Context and Problem Statement
|
|
|
|
This decision record concerns the UI component that is used for rendering the content of chat messages.
|
|
|
|
## Decision Drivers
|
|
|
|
* Looks good (renders Markdown)
|
|
* User can select and copy text
|
|
* Has good performance
|
|
|
|
## Considered Options
|
|
|
|
* Use `TextArea`
|
|
* Use a [third-party package](https://github.com/JPro-one/jpro-platform)
|
|
* Use a Markdown parser and convert AST nodes to JavaFX TextFlow elements
|
|
* Use a Markdown parser to convert content into HTML and use a WebView for one message
|
|
* Use a Markdown parser and WebView for the whole chat history
|
|
|
|
## Decision Outcome
|
|
|
|
Chosen option: "Use TextArea".
|
|
All other options require more time to implement.
|
|
Some of the options do not support text selection and copying,
|
|
which for now we value more than Markdown rendering.
|
|
|
|
## Pros and Cons of the Options
|
|
|
|
### Use TextArea
|
|
|
|
* Good, because it is easy to implement
|
|
* Good, because it supports text selection and copying
|
|
* Bad, because it does not offer rich text. Thus, Markdown can only be displayed in a plain text form.
|
|
* Bad, because default JavaFX's `TextArea` shrinks
|
|
|
|
### Use a third-party package
|
|
|
|
There seems to be only one package for JavaFX that provides a ready-to-use UI node for Markdown rendering.
|
|
|
|
* Good, because it is easy to implement
|
|
* Good, because it renders Markdown
|
|
* Good, because it renders Markdown to JavaFX nodes (does not use a `WebView`)
|
|
* Good, because complex elements from Markdown are supported (tables, code blocks, etc.)
|
|
* Bad, because it has very strange issues and architectural flaws with styling
|
|
* Bad, because it does not support text selection and copying (because of underlying JavaFX `Text` nodes)
|
|
|
|
### Use a Markdown parser and convert AST nodes to JavaFX TextFlow elements
|
|
|
|
* Good, because we will support Markdown
|
|
* Good, because no need to write a Markdown parser from scratch
|
|
* Good, because does not use a WebView
|
|
* Good, because easy styling
|
|
* Bad, because we need some time to implement Markdown AST -> JavaFX nodes converter
|
|
* Bad, because rendering tables and code blocks may be hard
|
|
* Bad, because it will not support text selection and copying
|
|
|
|
### Use a Markdown parser to convert content into HTML and use a WebView for one message
|
|
|
|
* Good, because there are libraries to convert Markdown to HTML
|
|
* Good, because may be easier to implement than other choices (except `TextArea`)
|
|
* Good, because it supports text selection and copying
|
|
* Bad, because it may be a problem to connect JavaFX CSS to `WebView`
|
|
* Bad, because one `WebView` for one message is resourceful
|
|
|
|
### Use a Markdown parser and WebView for the whole chat history
|
|
|
|
* Good, because there are libraries to convert Markdown to HTML
|
|
* Good, because it supports text selection and copying
|
|
* Bad, because it may be a problem to connect JavaFX CSS to `WebView`
|
|
* Bad, because it may be a problem to correctly communicate with Java code and `WebView` to add new messages
|
|
|
|
## More Information
|
|
|
|
Actually we used an `ExpandingTextArea` from `GemsFX` package so the content can occupy
|
|
as much space as it needs in the `ScrollPane`.
|
|
|
|
About the selection and copying, this goes down to fundamental issue from JavaFX.
|
|
`Text` and `Label` cannot be selected by any means.
|