diff --git a/ijs.tree b/ijs.tree index 1f3aafc94..073d9092d 100644 --- a/ijs.tree +++ b/ijs.tree @@ -84,6 +84,7 @@ + diff --git a/topics/intro/content_updates.md b/topics/intro/content_updates.md index a92591f90..512dc486f 100644 --- a/topics/intro/content_updates.md +++ b/topics/intro/content_updates.md @@ -18,6 +18,9 @@ See [GitHub Changelog](https://github.com/JetBrains/intellij-sdk-docs/commits/ma JCEF : Revamp [JCEF (Java Chromium Embedded Framework)](jcef.md) page. +User Interface FAQ +: Added [](ui_faq.md). + ### November {#november-23} diff --git a/topics/user_interface_components/ui_faq.md b/topics/user_interface_components/ui_faq.md new file mode 100644 index 000000000..9fc269c10 --- /dev/null +++ b/topics/user_interface_components/ui_faq.md @@ -0,0 +1,65 @@ + + +# User Interface FAQ + +UI-related FAQs and utilities. + + + +## Useful classes + +- Package [`com.intellij.ui`](%gh-ic%/platform/util/ui/src/com/intellij/ui/) +- Package [`com.intellij.util.ui`](%gh-ic%/platform/util/ui/src/com/intellij/util/ui/) + +## Colors + +Always use [`JBColor`](%gh-ic%/platform/util/ui/src/com/intellij/ui/JBColor.java) instead of plain `java.awt.Color` +(highlighted via inspection Plugin DevKit | Code | Use Darcula aware JBColor). +Custom colors must be retrieved via `JBColor.namedColor()` set by the current [Theme](themes_getting_started.md). +See [](themes_metadata.md) on how to expose corresponding metadata. + +If it's needed to retrieve a color from one place and use it in another, do not just retrieve once and use the retrieved value. +Instead, use `JBColor.lazy()` and pass in a lambda expression to retrieve the color. +This lambda expression needs to be fast and safe enough, as it will be called every time the color is retrieved, for example, for painting. +Following this approach ensures that the color will be properly updated if it's changed at the source, for example, due to a theme or scheme change. + +Generic UI colors (e.g., for drawing borders) can be accessed via [`UIUtil`](%gh-ic%/platform/util/ui/src/com/intellij/util/ui/UIUtil.java) +and [`JBUI`](%gh-ic%/platform/util/ui/src/com/intellij/util/ui/JBUI.java). +A number of hardcoded colors is defined in `JBColor`, [`Gray`](%gh-ic%/platform/util/ui/src/com/intellij/ui/Gray.java), and [`LightColors`](%gh-ic%/platform/util/ui/src/com/intellij/ui/LightColors.java) + +[`ColorUtil`](%gh-ic%/platform/util/ui/src/com/intellij/ui/ColorUtil.java) allows tuning existing colors. + +## Text + +Use [`NaturalComparator`](%gh-ic%/platform/util/base/src/com/intellij/openapi/util/text/NaturalComparator.java) for "natural" sorting of items. + +[`StringUtil`](%gh-ic%/platform/util/src/com/intellij/openapi/util/text/StringUtil.java) contains a number of useful methods for manipulating text for UI usage: + +- `unpluralize()/pluralize()` using English rules +- `formatDuration()` to format duration: _2 m 3 s 456 ms_ +- `formatFileSize()` to format filesize: _1.23 KB_ +- `escapeLineBreak()` and related methods to escape special characters +- `shortenTextWithEllipsis()` and `shortenPathWithEllipsis()` to produce abbreviated UI texts ending with '…' +- `quote()` and `unquoteString()` to wrap values: _Usages of "$value$": 218 found_ + +See [`NlsMessages`](%gh-ic%/platform/ide-core-impl/src/com/intellij/ide/nls/NlsMessages.java) to produce localized messages. + +## "Recently Used" entries + +To store and retrieve values for *Recently Used* entries (e.g., filter values), use +[`RecentsManager`](%gh-ic%/platform/platform-impl/src/com/intellij/ui/RecentsManager.java). + +## Current Theme: Dark or Bright? + +To determine the current [Theme](themes_getting_started.md)'s style, use [`JBColor.isBright()`](%gh-ic%/platform/util/ui/src/com/intellij/ui/JBColor.java). + +## Borders and Insets + +Always create borders and insets via factory methods from [`JBUI.Borders`](%gh-ic%/platform/util/ui/src/com/intellij/util/ui/JBUI.java) and [`JBUI.Insets`](%gh-ic%/platform/util/ui/src/com/intellij/util/ui/JBUI.java), which create DPI-aware instances. +Using standard DPI-agnostic instances (reported by inspection Plugin DevKit | Code | Use DPI-aware borders and Plugin DevKit | Code | Use DPI-aware insets) +can result in UI layout problems. + +If you use DPI-aware insets in an empty border (`JBUI.Borders.empty()`), then the insets will be updated automatically, for example, if scaling is changed because the IDE Zoom action was performed or for any other reason. +If you use the insets elsewhere, you need to manually call `JBInsets.update()` in your component's `updateUI()` method to update the insets accordingly. + + diff --git a/topics/user_interface_components/user_interface_components.md b/topics/user_interface_components/user_interface_components.md index 27bbc1030..75b42262f 100644 --- a/topics/user_interface_components/user_interface_components.md +++ b/topics/user_interface_components/user_interface_components.md @@ -46,4 +46,6 @@ The following components are particularly noteworthy: * Drag & Drop Helpers (TBD) * [](misc_swing_components.md) +See also [](ui_faq.md). +