SoftwareQuality/jabref/docs/decisions/0036-use-textarea-for-chat-content.md
2025-01-11 12:30:11 +01:00

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.