Compare commits

...

157 Commits

Author SHA1 Message Date
Karl Tauber
140ebfdb92 release 1.0-rc3 2021-02-06 23:31:53 +01:00
Karl Tauber
37d0179de1 GitHub Actions: upload demo (was removed in previous commit) 2021-02-06 23:27:39 +01:00
Karl Tauber
823d4b0fe2 dropped usage of bintray, jcenter and jfrog artifactory
deploy to Sonatype OSSRH

snapshots are now here:
https://oss.sonatype.org/content/repositories/snapshots/com/formdev/
2021-02-06 19:02:32 +01:00
Karl Tauber
dd1eacf4f0 update to Gradle 6.8.2
./gradlew wrapper --gradle-version=6.8.2
2021-02-06 11:35:35 +01:00
Karl Tauber
86c33dd686 fixed javadoc syntax error 2021-02-06 11:26:57 +01:00
Karl Tauber
c6757cc61b UI defaults inspector: filter by colors with alpha and derived colors 2021-02-06 01:32:32 +01:00
Karl Tauber
a38cf284dd UI defaults inspector: show color functions in value tooltips 2021-02-06 01:31:34 +01:00
Karl Tauber
575b8e3f7f UI defaults inspector: for derived colors, no longer change Item.value from Color to Color[] because this could cause problems if there is a UI value of type Color[] 2021-02-06 01:01:48 +01:00
Karl Tauber
bc443f47f1 Theme Editor: fixed NPE (caused by no longer implemented base files support) 2021-02-05 23:33:26 +01:00
Karl Tauber
b631bcc0db UIDefaultsLoader: check for endless recursion in parsing color functions (e.g. abc = darken($abc,10%)) 2021-02-05 23:30:48 +01:00
Karl Tauber
5ccd92ece6 CheckBox: fixed background of check boxes in JIDE CheckBoxTree (broken since commit dd8ab242fb) 2021-02-04 19:41:14 +01:00
Karl Tauber
2f3c8868a7 IntelliJ Themes: fixed table header background when dragging column in "Dark Flat" and "Light Flat" themes 2021-02-04 19:18:06 +01:00
Karl Tauber
6f7b5e8005 README.md: removed JCenter and replaced download links to bintray with Maven Central 2021-02-04 16:48:53 +01:00
Karl Tauber
10d1e4b798 UIDefaultsDump: dump color value in same format as used in FlatLaf properties files; also dump alpha as percentage 2021-02-04 15:24:50 +01:00
Karl Tauber
9d5934df14 Extras: FlatInspector: use HTML in tooltip 2021-02-04 15:19:33 +01:00
Karl Tauber
be507de6c1 Label and ToolTip: made inserting BASE_SIZE rule into HTML text more reliable 2021-02-04 15:10:27 +01:00
Karl Tauber
e5d3c08821 Fixed color of <address> tag in HTML text 2021-02-04 12:58:14 +01:00
Karl Tauber
027b4ab7da Label and ToolTip: fixed font sizes for <code>, <kbd>, <big>, <small> and <samp> tags in HTML text
ToolTip: update font size if `tiptext` property changes
2021-02-04 12:56:18 +01:00
Karl Tauber
fefea0d7ec IntelliJ Themes: updated themes to newest versions (used IJThemesUpdater) 2021-02-02 18:00:17 +01:00
Karl Tauber
33f30bfd19 README.md: new applications using FlatLaf:
- DbVisualizer
- MagicPlot
- Thermo-Calc
- Burp Suite
- BurpCustomizer
- IGMAS+
2021-02-01 21:58:18 +01:00
Karl Tauber
e9d4b9961a README.md: made "commercial" bold 2021-02-01 15:14:07 +01:00
Karl Tauber
b94248fe79 README.md: removed "new" badge from projects using FlatLaf 2021-02-01 14:58:44 +01:00
Karl Tauber
225975e0dd FlatTestFrame: added 5x and 6x scale factors 2021-02-01 13:57:36 +01:00
Karl Tauber
eac7492143 FlatAnimatedIconTest: made animation of switch smooth on high scale factors 2021-02-01 12:55:14 +01:00
Karl Tauber
b3c40bf448 release 1.0-rc2 2021-02-01 01:39:52 +01:00
Karl Tauber
02f7cd77f4 FlatBorder: fixed wrong round edge of focused components in themes without outer focus border (Flat Light/Dark) 2021-02-01 01:30:52 +01:00
Karl Tauber
7f8f3aa99b Button: undone most style changes done in previous commit related to focused and default buttons:
- default button: white background and wide border
- focused button: light blue background and thin border

(the light blue default button did not look beautiful IMHO)
2021-02-01 01:08:20 +01:00
Karl Tauber
0bcdc14909 - Button:
- In "Flat Light" theme, changed styles of focused and default buttons to
    avoid confusion with all other themes. Focused buttons now have a white
    background (was light blue) and a slightly wider border. The default button
    now has a light blue background (was white) and a thin border. In all other
    themes the default button also has colored background.
  - In "Flat Dark" theme, use slightly wider border for focused buttons.
- CheckBox and RadioButton: In "Flat Dark" theme, use blueish background for
  focused components.
2021-01-31 20:02:24 +01:00
Karl Tauber
526c25a02b FlatComponentStateTest: fixed insets 2021-01-31 18:51:28 +01:00
Karl Tauber
f48da9dab1 FlatComponentStateTest: added text field and combobox (for comparison) 2021-01-31 16:17:47 +01:00
Karl Tauber
2e8dfda12e FlatComponentStateTest: added help buttons 2021-01-31 00:55:29 +01:00
Karl Tauber
63da576d85 FlatComponentStateTest: added selected checkboxes and radiobuttons 2021-01-30 20:53:07 +01:00
Karl Tauber
0ab4206540 FlatComponentStateTest added 2021-01-30 18:43:11 +01:00
Karl Tauber
212ae90401 client property "JComponent.focusOwner" added to allow customizing detection of focused state (issue #185) 2021-01-30 17:54:47 +01:00
Karl Tauber
d4e5d0be45 javadoc fixes 2021-01-30 17:46:53 +01:00
Karl Tauber
3520a0f1fb TextComponents: border of focused non-editable text components had wrong color 2021-01-30 01:06:03 +01:00
Karl Tauber
036090a947 Button: fixed behavior of Enter key on focused button on Windows and Linux, which now clicks the focused button (instead of the default button) 2021-01-30 00:37:36 +01:00
Karl Tauber
dc570c683a UI defaults: added Java 8 and 9+ InputMap dumps of NimbusLookAndFeel, which are different on Linux (and macOS) than on Windows because they use GTK key bindings (see GTKKeybindings.installKeybindings(), invoked from NimbusLookAndFeel.getDefaults()) 2021-01-29 23:00:06 +01:00
Karl Tauber
9f85d34c91 JIDE: updated UI defaults dumps for commit 7d0f7e1c8e (support JidePopupMenu) 2021-01-29 22:06:01 +01:00
Karl Tauber
16bf1fb6c3 README.md: screenshots updated 2021-01-28 23:26:30 +01:00
Karl Tauber
47c4d508e0 Demo: updated screenshot mode 2021-01-28 23:26:16 +01:00
Karl Tauber
e5d9060623 UI defaults: added links to docs and note to properties files 2021-01-23 18:49:35 +01:00
Karl Tauber
fdf28fc385 javadoc and comment updates/fixes 2021-01-23 18:05:46 +01:00
Karl Tauber
9015a4d56b Window decorations: fixed top window border in dark themes when running in JetBrains Runtime (issue #244)
fixed/improved calculation of active border color
2021-01-23 16:59:53 +01:00
Karl Tauber
38301454a6 CHANGELOG.md: added recently merged PRs #245 2021-01-22 11:10:04 +01:00
Karl Tauber
9b3a22c4ca FlatComponents2Test: simplified layout and reduced frame size 2021-01-21 23:58:22 +01:00
Karl Tauber
548dbc3649 Merge pull request #245 from ingokegel/tree_wide_selection
Added a per-tree wide selection setting
2021-01-21 23:19:33 +01:00
Karl Tauber
3474129812 Tree:
- paint non-wide selection in FlatTreeUI.paintRow() instead of using reflection to change private field in DefaultTreeCellRenderer
- use DefaultTreeCellRenderer.getBackgroundSelectionColor() as selection color (if possible)
- added boolean client property JTree.paintSelection to disable selection painting in FlatTreeUI.paintRow()
- FlatComponents2Test:
  - added checkboxes for wideSelection and paintSelection client properties
  - added possibility to test various kinds of tree cell renderers
  - added JXTree, JIDE CheckBoxTree

(PR #245)
2021-01-21 17:38:20 +01:00
Karl Tauber
63193feebe JIDE: JidePopupMenu:
- added test to FlatJideOssTest
- updated README.md and CHANGELOG.md

(PR #246)
2021-01-21 00:14:42 +01:00
Karl Tauber
51f22bfe75 Merge pull request #246 from ingokegel/jide_popup_menu_ui
Added UI for JidePopupMenu
2021-01-21 00:05:32 +01:00
Ingo Kegel
7d0f7e1c8e Added UI for JidePopupMenu 2021-01-20 16:18:48 +01:00
Karl Tauber
dd8ab242fb CheckBox and RadioButton: fill component background as soon as background color is different to default background color, even if component is not opaque (which is the default). This paints selection if using the component as cell renderer a Table, Tree or List (better fix for #77) 2021-01-19 19:13:20 +01:00
Ingo Kegel
60f3428da7 Added a per-tree wide selection setting 2021-01-19 17:46:41 +01:00
Karl Tauber
c6fec0a131 release 1.0-rc1 2021-01-18 23:34:37 +01:00
Karl Tauber
fdc43fc0d3 Slider: improved thumb hover and pressed colors
Also changed auto-inverse threshold from 50% to 65% for increase and 35% for decrease, because this gives much better results for slider hover and pressed colors. This does not change other colors in core themes, but few colors in some IntelliJ themes (usually checkbox hover/pressed).
2021-01-18 23:20:25 +01:00
Karl Tauber
0b880aa335 TabbedPane: fixed scrolling tabs with touchpads and high-resolution mouse wheels 2021-01-18 18:34:21 +01:00
Karl Tauber
74f50ec992 IntelliJ Themes: fixed menu accelerator colors in Monocai theme (issue #243) 2021-01-18 12:15:12 +01:00
Karl Tauber
1bdf4532db UI defaults inspector: support wildcard matching in filter 2021-01-16 12:56:25 +01:00
Karl Tauber
f97783ddef Window decorations: RootPane.activeBorderColor and RootPane.inactiveBorderColor fixes:
- FlatDarkLaf.properties: changed darken() to lighten(), which does not change real colors due to autoInverse mechanism
- FlatLightLaf.properties: use also derived colors (to be consistent with FlatDarkLaf.properties and fix warning in UIDefaultsDump)
2021-01-16 01:01:36 +01:00
Karl Tauber
1024d6fc07 UIDefaultsDump: use DerivedColorKeys.properties to compute and dump derived colors and verify them 2021-01-16 00:39:36 +01:00
Karl Tauber
3ec59d0c58 UI defaults inspector:
- no longer show color values as decimal rgb
- use black for color value text if color is translucent
- fix derived color tooltip
- improved filter performance
2021-01-15 19:44:45 +01:00
Karl Tauber
c43249316c UI defaults inspector:
- show computed derived colors
- also show base colors and default colors
- indicate derived colors with magenta bar on right side in value column
2021-01-15 19:07:44 +01:00
Karl Tauber
ed5180ffd6 Theme Editor:
- save/restore selection when reloading file (if changed outside)
- select all text in find field when pressing Ctrl+F
- use lighter color for operators (e.g. '=')
2021-01-15 16:15:05 +01:00
Karl Tauber
e9ec769340 CHANGELOG.md: added recently merged PRs #237, #239 and #241 2021-01-15 16:00:11 +01:00
Karl T
5e16ff8dff Merge pull request #241 from ingokegel/macos_text_aa
The fix for text anti-aliasing in 50d36fe9 should only apply on macOS
2021-01-15 14:39:00 +01:00
Ingo Kegel
364b6631ea The fix for text anti-aliasing in 50d36fe9 should only apply on macOS 2021-01-15 14:31:58 +01:00
Karl T
48a18e53e3 Merge pull request #240 from ingokegel/table_header_column_borders
Made paintColumnBorders protected to help with implementing derived table header UIs
2021-01-15 14:15:27 +01:00
Karl T
bcc8282d73 Merge pull request #239 from ingokegel/macos_text_aa
Switched from sub-pixel to greyscale text anti-aliasing on macOS when running with a JetBrains JRE
2021-01-15 14:04:40 +01:00
Ingo Kegel
15017ed49c Made paintColumnBorders protected to help with implementing derived table header UIs
To implement FlatLaf UIs for CellStyleTableHeaderUI and SortableTableHeaderUI from the Jide Grids library, access to the paintColumnBorders method is required
2021-01-15 13:09:10 +01:00
Ingo Kegel
50d36fe91b Switched from sub-pixel to greyscale text anti-aliasing on macOS when running with a JetBrains JRE.
Sub-pixel anti-aliasing (VALUE_TEXT_ANTIALIAS_LCD_HRGB) causes font rendering with too much weight with a JetBrains JREs (both 8 and 11). This can be seen when comparing the text rendering of UI elements between IntelliJ IDEA and FlatLaf.

This commits aligns FlatLaf's behavior with IntelliJ IDEA which disables sub-pixel anti-aliasing on macOS for its IDE anti-aliasing setting and uses greyscale anti-aliasing by default (see com.intellij.ide.ui.AntialiasingType.canUseSubpixelAAForIDE).
2021-01-14 18:59:54 +01:00
Karl Tauber
23e67a2908 Slider: support per component custom thumb and track colors 2021-01-14 13:50:42 +01:00
Karl Tauber
0dab1b73cc JIDE: RangeSlider: fixed slider focused colors in IntelliJ themes (see commit 1fb0783808) 2021-01-14 13:36:01 +01:00
Karl T
3c086a92e2 Merge pull request #237 from ingokegel/macos_font
JetBrains Runtime 11 has support for displaying the .AppleSystemUIFont font.
2021-01-14 13:22:16 +01:00
Ingo Kegel
647d72514b JetBrains Runtime 11 has support for displaying the .AppleSystemUIFont font.
This font should be used for UI elements since macOS 10.15.
See https://youtrack.jetbrains.com/issue/JBR-1915 for more information.

Other JREs, including JetBrains Runtime 8 do not handle kerning for that font correctly.
2021-01-14 10:18:39 +01:00
Karl Tauber
15328b4fd7 ToggleButton: tab style buttons now respect explicitly set background color 2021-01-13 17:52:05 +01:00
Karl Tauber
b49a498f9c Button and ToggleButton: ToolBar buttons now respect explicitly set background color. If no background color is set, then the button background is not painted anymore (issue #191) 2021-01-13 17:22:09 +01:00
Karl Tauber
8d14d5f87c Button: disabled Button.defaultButtonFollowsFocus on Windows (as on other platforms, IntelliJ IDEA and other Lafs) 2021-01-13 10:32:15 +01:00
Karl Tauber
a6db352ecd IntelliJ Themes:
- fixed menu item check colors
- fixed MenuItem.underlineSelectionColor
- fixed List, Tree and Table selectionInactiveForeground in light Arc themes
- fixed List and Table background colors in Material UI Lite themes
2021-01-13 10:11:29 +01:00
Karl Tauber
ccbb26c176 IntelliJ Themes: added hover and pressed feedback to Button, CheckBox, RadioButton and ToggleButton (issue #176) 2021-01-12 14:15:44 +01:00
Karl Tauber
8f6af73541 CheckBox and RadioButton:
- use `CheckBox.icon.selectedBackground` as base color for derived "selected" colors
- use derived colors for `CheckBox.icon[filled].selectedHoverBackground` and `CheckBox.icon[filled].selectedPressedBackground`
- removed unnecessary `CheckBox.icon.selectedFocusedBorderColor`from FlatDarkLaf.properties
- added missing keys to FlatLafUIKeys.txt

(preparation for #176)
2021-01-12 10:43:57 +01:00
Karl Tauber
a59f17fdb2 UIDefaultsKeysDump: extend existing keys file (instead of replacing it) to allow manual adding of optional keys, which are not defined in UI defaults 2021-01-11 14:00:14 +01:00
Karl Tauber
14222e40ad TabbedPane: fixed IndexOutOfBoundsException when using tooltip text on close buttons and closing last/rightmost tab (issue #235) 2021-01-10 18:28:30 +01:00
Karl Tauber
7d48bf06fe Button and ToggleButton: Threat Unicode surrogate character pair as single character and make button square (issue #234) 2021-01-09 23:46:56 +01:00
Karl Tauber
1d06a2c2e8 IntelliJ Themes: updated "Material Theme UI Lite" themes; added "Material Theme UI Lite / Moonlight" theme 2021-01-09 17:55:09 +01:00
Karl Tauber
cf141f0e55 IntelliJ Themes: updated "Dracula" and "Gradianto" themes 2021-01-09 17:35:13 +01:00
Karl Tauber
9113c31612 UI defaults inspector: support copy key/value to clipboard 2021-01-09 11:13:17 +01:00
Karl Tauber
00b4e0a6fd UI defaults inspector: support embedding into any window 2021-01-09 00:38:46 +01:00
Karl Tauber
e3cac95d37 UI defaults:
- moved some common properties from FlatLightLaf.properties and FlatDarkLaf.properties to FlatLaf.properties
- use color functions for more properties
2021-01-08 18:24:39 +01:00
Karl Tauber
64d850c583 build.gradle.kts: added more information to pom 2021-01-08 11:47:48 +01:00
Karl Tauber
2fe1b9e726 ScrollPane: smooth scrolling:
- scroll at least one pixel to avoid "hanging"
- limit scroll increment to visible width/height
- no longer use block increment because had width/height of view (IOW was too large and had no effect)

(issue #27)
2021-01-08 11:20:55 +01:00
Karl Tauber
1315d847b9 removed dummy pom.xml for GitHub dependency graph 2021-01-07 14:09:55 +01:00
Karl Tauber
b5954102b6 README.md: added maven-central badge 2021-01-05 15:09:52 +01:00
Karl Tauber
1c8ba0c538 added dummy root pom.xml for GitHub dependency graph 2021-01-05 11:58:02 +01:00
Karl Tauber
be18317a6d moved flatlaf-extras/pom.xml (for GitHub dependency graph) to another folder to check whether GitHub recognizes it there 2021-01-05 11:48:50 +01:00
Karl Tauber
88d2b8266e README.md: reordered chapters 2021-01-03 11:59:44 +01:00
Karl Tauber
949ca5ddff JIDE: auto-initialize JIDE extensions (issue #230) 2021-01-03 11:55:09 +01:00
Karl Tauber
3eb53b9648 Theme Editor: save/restore window size (basic implementation; ignoring maximized state and screen number) 2021-01-02 15:44:37 +01:00
Karl Tauber
e4a03ede1f added dummy pom.xml for GitHub dependency graph for flatlaf-extras 2021-01-02 14:05:10 +01:00
Karl Tauber
cb65dc0e9d added dummy pom.xml for GitHub dependency graph 2021-01-02 13:09:31 +01:00
Karl Tauber
8ec907050e Theme Editor:
- "Open Directory" action added
- remember recently opened directories
- remember recently selected file
2021-01-01 17:43:05 +01:00
Karl Tauber
15ba00a902 Theme Editor: use selected text in editor for searching when pressing Ctrl+F 2021-01-01 12:56:29 +01:00
Karl Tauber
89d0c301c2 Theme Editor: "replace" and "replace all" added; focus editor with F12 key 2020-12-31 23:22:45 +01:00
Karl Tauber
2f47466f3b Theme Editor:
- fixed broken (mouse-wheel) scrolling caused by the additional JPanel
- fixed broken slide-in animation of "find bar"
2020-12-31 22:29:09 +01:00
Karl Tauber
d70eca9774 Theme Editor: added "error strip" to right side; removed scroll pane border 2020-12-31 18:15:20 +01:00
Karl Tauber
95ce92fa18 Theme Editor: find previous/next with UP/DOWN keys 2020-12-31 17:34:16 +01:00
Karl Tauber
b3db52b2ed Theme Editor: mark occurrence while typing; disable previous/next occurrence buttons if searchFor is empty 2020-12-31 16:23:04 +01:00
Karl Tauber
c40912013d Theme Editor: use markAll() (instead of find()) to avoid that selection jumps to next occurrence when showing find bar or when changing options 2020-12-31 16:11:22 +01:00
Karl Tauber
1c08e98c1c Theme Editor: show/hide highlighted matches when showing/hiding "find bar" 2020-12-31 15:55:22 +01:00
Karl Tauber
3f202a7cdc Theme Editor: transfer focus to editor when hiding "find bar" 2020-12-31 15:24:32 +01:00
Karl Tauber
6f3aea8fc1 Theme Editor: basic "find bar" added 2020-12-31 15:08:14 +01:00
Karl Tauber
0896143838 Theme Editor: support navigating to next/previous editor with Ctrl+Tab/Ctrl+Shift+Tab 2020-12-30 14:03:41 +01:00
Karl Tauber
ea94899a28 Extras: added missing export of package com.formdev.flatlaf.extras.components to Java 9 module descriptor (issue #117) 2020-12-30 11:23:51 +01:00
Karl Tauber
d2109cef86 Theme Editor: update open tabs when .properties files were added or removed to directory (on window activation) 2020-12-29 23:12:23 +01:00
Karl Tauber
cda146366c Theme Editor: auto-reload .properties files on window activation, if modified outside 2020-12-29 18:30:52 +01:00
Karl Tauber
678b879a01 Theme Editor:
- open all .properties files in passed directory in tabs
- basic menu bar added (Save, Exit)
- auto-save files on window deactivation and app exit
2020-12-28 20:38:48 +01:00
Karl Tauber
4c885c5e7b CHANGELOG.md: added PR #229 2020-12-23 12:31:16 +01:00
Karl Tauber
d5002b1c33 Merge pull request #229
TextField Placeholder now honors the right inset
2020-12-23 12:18:33 +01:00
Karl Tauber
4f8b6d6b28 UIDefaultsLoader:
- changed "globals" to "wildcard replacements"
- strict checking for background/foreground keys
2020-12-23 11:14:26 +01:00
Karl Tauber
66dab41539 properties: added spaces around '=' for easier reading 2020-12-23 10:52:42 +01:00
Niklas
9e4940228d TextField now honours right component inset
If the placeholder can't be drawn fully, we clip it by adding an
ellipse.
2020-12-23 09:26:30 +01:00
Karl Tauber
cbb11ebb03 ComboBox, Spinner and SplitPaneDivider: support "pressed" feedback on arrow buttons 2020-12-23 00:02:58 +01:00
Karl Tauber
073a25f381 release 0.46 2020-12-20 18:42:23 +01:00
Karl Tauber
40592ab876 FlatUIUtils: fixed javadoc warnings 2020-12-20 18:34:13 +01:00
Karl Tauber
bbfe624b51 Merge pull request #222 into master
AnimatedIcon
2020-12-20 18:26:09 +01:00
Karl Tauber
a2af9e4c65 JIDE: RangeSlider: clicking on track now immediately moves the thumb to mouse location and starts dragging the thumb 2020-12-20 18:24:40 +01:00
Karl Tauber
0123a8895f JIDE: updated UI defaults dumps for commit ef065d31a0 (support TristateCheckBox) 2020-12-20 17:33:42 +01:00
Karl Tauber
53854a4d13 Slider: snap to ticks is now done while dragging the thumb 2020-12-20 17:32:01 +01:00
Karl Tauber
4fdd44858f Slider: clicking on track now immediately moves the thumb to mouse location and starts dragging the thumb 2020-12-20 13:32:10 +01:00
Karl Tauber
3c58879ce5 Slider: fixed painting of colored track if JSlider.inverted is true 2020-12-19 17:01:34 +01:00
Karl Tauber
a7c6a881b3 Extras: FlatTriStateCheckBox reworked 2020-12-19 16:13:12 +01:00
Karl Tauber
ef065d31a0 JIDE: support TristateCheckBox 2020-12-19 13:34:53 +01:00
Karl Tauber
d059d6b448 README.md: new projects using FlatLaf:
- jEnTunnel
- JPass
- Linotte
- MEKA
- Shutter Encoder
- ThunderFocus
- lectureStudio
2020-12-18 16:05:56 +01:00
Karl Tauber
2d0a6f1bec README.md: new projects using FlatLaf:
- JOSM
- Novel-Grabber
- Android Tool
2020-12-18 16:04:43 +01:00
Karl Tauber
a3cc5a1938 README.md: added descriptions to projects using FlatLaf 2020-12-18 14:34:40 +01:00
Karl Tauber
435068515a always reset our graphics rendering hints
(this is usually not necessary because each component gets its own instance of Graphics when painting, but resetting may avoid side effects if our paint methods are invoked directly)
2020-12-18 13:35:17 +01:00
Karl Tauber
956001dbd7 avoid painting text with our rendering hints enabled to avoid antialiased text in some components if text antialiasing is disabled in system (issue #227) 2020-12-18 12:22:27 +01:00
Karl Tauber
460f0d9dee UIScale: fixed NPE in getSystemScaleFactor(Graphics2D) when using Batik SVGGraphics2D (issue #226) 2020-12-15 11:25:00 +01:00
Karl Tauber
5155ec93c9 ToolTip: fixed drop shadow for wide tooltips (issue #224; regression since fixed issue #142) 2020-12-15 11:19:30 +01:00
Karl Tauber
8bb8883e22 IntelliJ Themes: added flag whether a theme is dark to FlatAllIJThemes.INFOS. (issue #221) 2020-12-12 18:54:42 +01:00
Karl Tauber
ffb7a6dfbb README.md:
- added demo download section
- added link to javadoc of extras components
2020-12-12 14:45:08 +01:00
Karl Tauber
176de6f245 README.md: simplified download sections of subprojects 2020-12-12 14:21:07 +01:00
Karl Tauber
11f9740dbf Extras: added support for JComponent.outline client property (issue #117) 2020-12-12 13:59:58 +01:00
Karl Tauber
42a91ba26c Extras: renamed SVG utility class from com.formdev.flatlaf.extras.SVGUtils to com.formdev.flatlaf.extras.FlatSVGUtils 2020-12-12 12:21:48 +01:00
Karl Tauber
234003e2b1 Extras: Renamed tri-state check box class from
`com.formdev.flatlaf.extras.TriStateCheckBox` to
`com.formdev.flatlaf.extras.components.FlatTriStateCheckBox`
2020-12-12 00:33:51 +01:00
Karl Tauber
534384438b Extras: added extension class for JTabbedPane (issue #117) 2020-12-11 23:44:52 +01:00
Karl Tauber
ab51f35d5d Extras: added extension classes for JEditorPane, JSpinner, JTextArea and JTextPane; added minimumWidth and roundRect properties (issue #117) 2020-12-11 18:05:58 +01:00
Karl Tauber
511a4044d7 Extras: added extension classes for JButton and JToggleButton (issue #117) 2020-12-11 17:18:35 +01:00
Karl Tauber
821efaff40 Extras: removed duplicate enums in text components (issue #117) 2020-12-11 14:01:42 +01:00
Karl Tauber
91bc994532 Extras: made enums in text components public (issue #117) 2020-12-11 13:39:51 +01:00
Karl Tauber
1323b46ac7 Extras: added extension class for JProgressBar (issue #117) 2020-12-11 13:28:55 +01:00
Karl Tauber
3a8b30ca8e Extras: removed extension interfaces and moved methods to components classes because:
- Javadoc for components that implement extension interfaces are useless because they do not include default methods from the extension interface
- GUI builders do not recognize default methods from the extension interface and it is not possible to edit extension properties in GUI builder
- the idea of adding the extension interface to own components can be also achieved by changing superclass of own component

(issue #117)
2020-12-11 13:24:14 +01:00
Karl Tauber
923d58519f Extras: added extension interfaces and classes for JComboBox, JFormattedTextField, JPasswordField, JScrollBar, JScrollPane and JTextField (issue #117) 2020-12-10 20:30:27 +01:00
Karl Tauber
eabb1f84f6 Table and TableHeader: fixed missing right vertical grid line if using table as row header in scroll pane (issues #152 and #46) 2020-12-09 23:04:04 +01:00
Karl Tauber
cfbe44b946 TableHeader: fixed position of column separators in right-to-left component orientation; do not paint anything if column count is zero 2020-12-09 00:33:01 +01:00
Karl Tauber
81c35eab46 SwingX: fixed striping background highlighting color (e.g. alternating table rows) in dark themes
Table: made grid lines slightly darker/lighter
2020-12-07 12:28:31 +01:00
Karl Tauber
a1c7c29113 FlatComponents2Test: added SwingX JXTable and JXTreeTable to test extended/customized tables 2020-12-07 12:21:34 +01:00
Karl Tauber
1293e2a074 AnimatedIcon added (for future animations) (issue #66) 2020-12-05 17:57:06 +01:00
226 changed files with 21930 additions and 5422 deletions

View File

@@ -99,11 +99,11 @@ jobs:
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }}
restore-keys: ${{ runner.os }}-gradle
- name: Publish snapshot to oss.jfrog.org
run: ./gradlew artifactoryPublish
- name: Publish snapshot to oss.sonatype.org
run: ./gradlew publish -Dorg.gradle.internal.publish.checksums.insecure=true
env:
BINTRAY_USER: ${{ secrets.BINTRAY_USER }}
BINTRAY_KEY: ${{ secrets.BINTRAY_KEY }}
OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}
OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
release:
@@ -135,8 +135,21 @@ jobs:
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }}
restore-keys: ${{ runner.os }}-gradle
- name: Release a new stable version to bintray
run: ./gradlew bintrayUpload -Drelease=true
- name: Release a new stable version to Maven Central
run: ./gradlew publish :flatlaf-demo:build -Drelease=true
env:
BINTRAY_USER: ${{ secrets.BINTRAY_USER }}
BINTRAY_KEY: ${{ secrets.BINTRAY_KEY }}
OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}
OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}
- name: Upload demo
uses: sebastianpopp/ftp-action@releases/v2
with:
host: ${{ secrets.FTP_SERVER }}
user: ${{ secrets.FTP_USERNAME }}
password: ${{ secrets.FTP_PASSWORD }}
forceSsl: true
localDir: "flatlaf-demo/build/libs"
remoteDir: "."
options: "--only-newer --no-recursion --verbose=1"

View File

@@ -1,6 +1,161 @@
FlatLaf Change Log
==================
## 1.0-rc3
#### New features and improvements
- Extras:
- UI Inspector: Use HTML in tooltip. Display color value in same format as
used in FlatLaf properties files. Added color preview.
#### Fixed bugs
- Label and ToolTip: Fixed font sizes for `<code>`, `<kbd>`, `<big>`, `<small>`
and `<samp>` tags in HTML text.
- Fixed color of `<address>` tag in HTML text.
- IntelliJ Themes: Fixed table header background when dragging column in "Dark
Flat" and "Light Flat" themes.
- CheckBox: Fixed background of check boxes in JIDE `CheckBoxTree`. (regression
in 1.0-rc2)
## 1.0-rc2
#### New features and improvements
- Button:
- In "Flat Light" theme, use a slightly thinner border for focused buttons
(because they already have light blue background).
- In "Flat Dark" theme, use slightly wider border for focused buttons.
- CheckBox and RadioButton: In "Flat Dark" theme, use blueish background for
focused components.
- Tree: Support disabling wide selection per component. (set client property
`JTree.wideSelection` to `false`). (PR #245)
- Tree: Support disabling selection painting per component. Then the tree cell
renderer is responsible for selection painting. (set client property
`JTree.paintSelection` to `false`).
- JIDE Common Layer: Support `JidePopupMenu`.
#### Fixed bugs
- Button: Fixed behavior of <kbd>Enter</kbd> key on focused button on Windows
and Linux, which now clicks the focused button (instead of the default
button).
- On Windows, this is a regression in 1.0-rc1.
- On macOS, the <kbd>Enter</kbd> key always clicks the default button, which
is the platform behavior.
- On all platforms, the default button can be always clicked with
<kbd>Ctrl+Enter</kbd> keys, even if another button is focused.
- CheckBox and RadioButton: Fill component background as soon as background
color is different to default background color, even if component is not
opaque (which is the default). This paints selection if using the component as
cell renderer a Table, Tree or List.
- TextComponents: Border of focused non-editable text components had wrong
color.
- Custom window decorations: Fixed top window border in dark themes when running
in JetBrains Runtime.
## 1.0-rc1
#### New features and improvements
- Button: Disabled `Button.defaultButtonFollowsFocus` on Windows (as on other
platforms). If you like to keep the old behavior in your application, use:
`if(SystemInfo.isWindows)
UIManager.put("Button.defaultButtonFollowsFocus",true);`.
- ComboBox, Spinner and SplitPaneDivider: Added pressed feedback to arrow
buttons.
- Slider: Support per component custom thumb and track colors via
`JSlider.setForeground(Color)` and `JSlider.setBackground(Color)`.
- Slider: Improved thumb hover and pressed colors.
- TextComponent: Clip placeholder text if it does not fit into visible area. (PR
#229)
- macOS: Improved font rendering on macOS when using JetBrains Runtime. (PRs
#237, #239 and #241)
- Extras: UI defaults inspector:
- Support embedding UI defaults inspector panel into any window. See
`FlatUIDefaultsInspector.createInspectorPanel()`.
- Copy selected keys and values into clipboard via context menu.
- Support wildcard matching in filter (`*` matches any number of characters,
`?` matches a single character, `^` beginning of line, `$` end of line).
- IntelliJ Themes:
- Added hover and pressed feedback to Button, CheckBox, RadioButton and
ToggleButton. (issue #176)
- Added "Material Theme UI Lite / Moonlight" theme.
- Updated "Dracula", "Gradianto" and "Material Theme UI Lite" themes.
#### Fixed bugs
- Button and ToggleButton: Threat Unicode surrogate character pair as single
character and make button square. (issue #234)
- Button and ToggleButton: ToolBar buttons now respect explicitly set background
color. If no background color is set, then the button background is not
painted anymore. (issue #191)
- ToggleButton: Tab style buttons (client property `JButton.buttonType` is
`tab`) now respect explicitly set background color.
- TabbedPane: Fixed `IndexOutOfBoundsException` when using tooltip text on close
buttons and closing last/rightmost tab. (issue #235)
- TabbedPane: Fixed scrolling tabs with touchpads and high-resolution mouse
wheels.
- Extras: Added missing export of package
`com.formdev.flatlaf.extras.components` to Java 9 module descriptor.
- JIDE Common Layer:
- Invoke `LookAndFeelFactory.installJideExtension()` when using FlatLaf UI
delegates. (issue #230)
- RangeSlider: Fixed slider focused colors in IntelliJ themes.
- IntelliJ Themes:
- Fixed menu item check colors.
- Fixed `MenuItem.underlineSelectionColor`.
- Fixed List, Tree and Table `selectionInactiveForeground` in light Arc
themes.
- Fixed List and Table background colors in Material UI Lite themes.
- Fixed menu accelerator colors in Monocai theme. (issue #243)
## 0.46
#### New features and improvements
- Slider and JIDE RangeSlider: Clicking on track now immediately moves the thumb
to mouse location and starts dragging the thumb. Use `UIManager.put(
"Slider.scrollOnTrackClick", true )` to enable old behavior that scrolls the
thumb when clicking on track.
- Slider: Snap to ticks is now done while dragging the thumb. Use
`UIManager.put( "Slider.snapToTicksOnReleased", true )` to enable old behavior
that snaps to ticks on mouse released.
- Extras: Added standard component extension classes that provides easy access
to FlatLaf specific client properties (see package
`com.formdev.flatlaf.extras.components`).
- Extras: Renamed tri-state check box class from
`com.formdev.flatlaf.extras.TriStateCheckBox` to
`com.formdev.flatlaf.extras.components.FlatTriStateCheckBox`. Also
changed/improved API and added javadoc.
- Extras: Renamed SVG utility class from `com.formdev.flatlaf.extras.SVGUtils`
to `com.formdev.flatlaf.extras.FlatSVGUtils`.
- IntelliJ Themes: Added flag whether a theme is dark to
`FlatAllIJThemes.INFOS`. (issue #221)
- JIDE Common Layer: Support `TristateCheckBox`.
#### Fixed bugs
- Slider: Fixed painting of colored track if `JSlider.inverted` is `true`.
- Table and TableHeader: Fixed missing right vertical grid line if using table
as row header in scroll pane. (issues #152 and #46)
- TableHeader: Fixed position of column separators in right-to-left component
orientation.
- ToolTip: Fixed drop shadow for wide tooltips on Windows and Java 9+. (issue
#224)
- SwingX: Fixed striping background highlighting color (e.g. alternating table
rows) in dark themes.
- Fixed: If text antialiasing is disabled (in OS system settings or via
`-Dawt.useSystemAAFontSettings=off`), then some components still did use
antialiasing to render text (not-editable ComboBox, ProgressBar, Slider,
TabbedPane and multiline ToolTip). (issue #227)
## 0.45
#### New features and improvements

138
README.md
View File

@@ -37,7 +37,7 @@ Requires Java 8 or newer.
Download
--------
FlatLaf binaries are available on **JCenter** and **Maven Central**.
FlatLaf binaries are available on **Maven Central**.
If you use Maven or Gradle, add a dependency with following coordinates to your
build script:
@@ -48,16 +48,16 @@ build script:
Otherwise download `flatlaf-<version>.jar` here:
[![Download](https://api.bintray.com/packages/jformdesigner/flatlaf/flatlaf/images/download.svg)](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.formdev/flatlaf/badge.svg?style=flat-square&color=007ec6)](https://maven-badges.herokuapp.com/maven-central/com.formdev/flatlaf)
### Snapshots
FlatLaf snapshot binaries are available in
[JFrog Artifactory](https://oss.jfrog.org/artifactory/oss-snapshot-local/com/formdev/).
To access the latest snapshot, change the FlatLaf version(s) in the dependencies
FlatLaf snapshot binaries are available on
[Sonatype OSSRH](https://oss.sonatype.org/content/repositories/snapshots/com/formdev/flatlaf/).
To access the latest snapshot, change the FlatLaf version in your dependencies
to `<version>-SNAPSHOT` (e.g. `0.27-SNAPSHOT`) and add the repository
`https://oss.jfrog.org/artifactory/oss-snapshot-local` to your build (see
`https://oss.sonatype.org/content/repositories/snapshots/` to your build (see
[Maven](https://maven.apache.org/guides/mini/guide-multiple-repositories.html)
and
[Gradle](https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:declaring_custom_repository)
@@ -73,40 +73,11 @@ Addons
- [JIDE Common Layer](flatlaf-jide-oss)
Projects using FlatLaf
----------------------
Documentation
-------------
- [NetBeans](https://netbeans.apache.org/) 11.3
- [jclasslib bytecode viewer](https://github.com/ingokegel/jclasslib) 5.5
- [KeyStore Explorer](https://keystore-explorer.org/) 5.4.3
- [OWASP Zed Attack Proxy (ZAP)](https://www.zaproxy.org/) (in weekly releases)
- ![New](images/new.svg) [jAlbum](https://jalbum.net/) 21 (commercial)
- [XMLmind XML Editor](https://www.xmlmind.com/xmleditor/) 9.3 (commercial)
- [Total Validator](https://www.totalvalidator.com/) 15 (commercial)
- [j-lawyer](https://github.com/jlawyerorg/j-lawyer-org)
- [MegaMek](https://github.com/MegaMek/megamek) v0.47.4 and
[MekHQ](https://github.com/MegaMek/mekhq) v0.47.5
- [GUIslice Builder](https://github.com/ImpulseAdventure/GUIslice-Builder)
0.13.b024
- [Rest Suite](https://github.com/supanadit/restsuite)
- [ControllerBuddy](https://github.com/bwRavencl/ControllerBuddy)
- [SpringRemote](https://github.com/HaleyWang/SpringRemote)
- [mendelson AS2](https://sourceforge.net/projects/mec-as2/),
[AS4](https://sourceforge.net/projects/mendelson-as4/) and
[OFTP2](https://sourceforge.net/projects/mendelson-oftp2/) (open-source) and
[mendelson AS2](https://mendelson-e-c.com/as2/),
[AS4](https://mendelson-e-c.com/as4/) and
[OFTP2](https://mendelson-e-c.com/oftp2) (commercial)
- [MeteoInfo](https://github.com/meteoinfo/MeteoInfo) 2.2
- [lsfusion platform](https://github.com/lsfusion/platform)
- [Jes - Die Java-EÜR](https://www.jes-eur.de)
- [Mapton](https://mapton.org/) 2.0
([source code](https://github.com/trixon/mapton)) based on NetBeans platform
- [Pseudo Assembler IDE](https://github.com/tomasz-herman/PseudoAssemblerIDE)
- [Sound Analysis](https://github.com/tomasz-herman/SoundAnalysis)
- [RemoteLight](https://github.com/Drumber/RemoteLight) - Multifunctional LED
Control Software
- and more...
For more information and documentation visit
[FlatLaf Home](https://www.formdev.com/flatlaf/)
Buzz
@@ -116,8 +87,89 @@ Buzz
- [FlatLaf announcement on Reddit](https://www.reddit.com/r/java/comments/dl0hu3/flatlaf_flat_look_and_feel/)
Documentation
-------------
Applications using FlatLaf
--------------------------
For more information and documentation visit
[FlatLaf Home](https://www.formdev.com/flatlaf/)
- [Apache NetBeans](https://netbeans.apache.org/) 11.3 - IDE for Java, PHP, HTML
and much more
- [jclasslib bytecode viewer](https://github.com/ingokegel/jclasslib) 5.5
- [KeyStore Explorer](https://keystore-explorer.org/) 5.4.3
- ![New](images/new.svg) [DbVisualizer](https://www.dbvis.com/) 12.0
(**commercial**) - the universal database tool for developers, analysts and
DBAs
- ![New](images/new.svg) [MagicPlot](https://magicplot.com/) 3.0
(**commercial**) - Software for nonlinear fitting, plotting and data analysis
- ![New](images/new.svg)
[Thermo-Calc](https://thermocalc.com/products/thermo-calc/) 2021a
(**commercial**) - Thermodynamics and Properties Software
- [OWASP ZAP](https://www.zaproxy.org/) 2.10 - the worlds most widely used web
app scanner
- ![New](images/new.svg)
[Burp Suite Professional and Community Edition](https://portswigger.net/burp/pro)
2020.11.2 (**commercial**) - the leading software for web security testing
- ![New](images/new.svg)
[BurpCustomizer](https://github.com/CoreyD97/BurpCustomizer) - adds more
FlatLaf themes to Burp Suite
- [JOSM](https://josm.openstreetmap.de/) - an extensible editor for
[OpenStreetMap](https://www.openstreetmap.org/) (requires FlatLaf JOSM plugin)
- [jAlbum](https://jalbum.net/) 21 (**commercial**) - creates photo album
websites
- [XMLmind XML Editor](https://www.xmlmind.com/xmleditor/) 9.3 (**commercial**)
- [Total Validator](https://www.totalvalidator.com/) 15 (**commercial**) -
checks your website
- [j-lawyer](https://github.com/jlawyerorg/j-lawyer-org) - Kanzleisoftware
- [MegaMek](https://github.com/MegaMek/megamek) v0.47.4 and
[MekHQ](https://github.com/MegaMek/mekhq) v0.47.5 - a turn-based sci-fi board
game
- [GUIslice Builder](https://github.com/ImpulseAdventure/GUIslice-Builder)
0.13.b024 - GUI builder for
[GUIslice](https://github.com/ImpulseAdventure/GUIslice), a lightweight GUI
framework for embedded displays
- [Rest Suite](https://github.com/supanadit/restsuite) - Rest API testing
- [ControllerBuddy](https://github.com/bwRavencl/ControllerBuddy) - advanced
gamepad mapping software
- [SpringRemote](https://github.com/HaleyWang/SpringRemote) - remote Linux SSH
connections manager
- [jEnTunnel](https://github.com/ggrandes/jentunnel) - manage SSH Tunnels made
easy
- [mendelson AS2](https://sourceforge.net/projects/mec-as2/),
[AS4](https://sourceforge.net/projects/mendelson-as4/) and
[OFTP2](https://sourceforge.net/projects/mendelson-oftp2/) (open-source) and
[mendelson AS2](https://mendelson-e-c.com/as2/),
[AS4](https://mendelson-e-c.com/as4/) and
[OFTP2](https://mendelson-e-c.com/oftp2) (**commercial**)
- ![New](images/new.svg) [IGMAS+](https://www.gfz-potsdam.de/igmas) -
Interactive Gravity and Magnetic Application System
- [MeteoInfo](https://github.com/meteoinfo/MeteoInfo) 2.2 - GIS and scientific
computation environment for meteorological community
- [lsfusion platform](https://github.com/lsfusion/platform) 4 - information
systems development platform
- [JPass](https://github.com/gaborbata/jpass) - password manager with strong
encryption
- [Jes - Die Java-EÜR](https://www.jes-eur.de)
- [Mapton](https://mapton.org/) 2.0
([source code](https://github.com/trixon/mapton)) - some kind of map
application (based on NetBeans platform)
- [Pseudo Assembler IDE](https://github.com/tomasz-herman/PseudoAssemblerIDE) -
IDE for Pseudo-Assembler
- [Linotte](https://github.com/cpc6128/LangageLinotte) 3.1 - French programming
language created to learn programming
- [MEKA](https://github.com/Waikato/meka) 1.9.3 - multi-label classifiers and
evaluation procedures using the Weka machine learning framework
- [Shutter Encoder](https://www.shutterencoder.com/) 14.2
([source code](https://github.com/paulpacifico/shutter-encoder)) -
professional video converter and compression tool (screenshots show **old**
look)
- [Sound Analysis](https://github.com/tomasz-herman/SoundAnalysis) - analyze
sound files in time or frequency domain
- [RemoteLight](https://github.com/Drumber/RemoteLight) - multifunctional LED
control software
- [ThunderFocus](https://github.com/marcocipriani01/ThunderFocus) -
Arduino-based telescope focuser
- [Novel-Grabber](https://github.com/Flameish/Novel-Grabber) - download novels
from any webnovel and lightnovel site
- [lectureStudio](https://www.lecturestudio.org/) 4.3.1060 - digitize your
lectures with ease
- [Android Tool](https://github.com/fast-geek/Android-Tool) - makes popular adb
and fastboot commands easier to use
- and more...

View File

@@ -14,8 +14,8 @@
* limitations under the License.
*/
val releaseVersion = "0.45"
val developmentVersion = "0.46-SNAPSHOT"
val releaseVersion = "1.0-rc3"
val developmentVersion = "1.0-rc4-SNAPSHOT"
version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion
@@ -23,7 +23,7 @@ allprojects {
version = rootProject.version
repositories {
jcenter()
mavenCentral()
}
}
@@ -40,17 +40,6 @@ println( "Java ${System.getProperty( "java.version" )}" )
println()
extra["bintray.user"] = System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" )
extra["bintray.key"] = System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" )
// if true, do not upload to bintray
extra["bintray.dryRun"] = false
// if true, uploaded artifacts are visible to all
// if false, only visible to owner when logged into bintray
extra["bintray.publish"] = false
allprojects {
tasks {
withType<JavaCompile>().configureEach {
@@ -64,7 +53,7 @@ allprojects {
// manifest for all created JARs
manifest.attributes(mapOf(
"Implementation-Vendor" to "FormDev Software GmbH",
"Implementation-Copyright" to "Copyright (C) ${java.time.LocalDate.now().year} FormDev Software GmbH. All rights reserved.",
"Implementation-Copyright" to "Copyright (C) 2019-${java.time.LocalDate.now().year} FormDev Software GmbH. All rights reserved.",
"Implementation-Version" to project.version))
// add META-INF/LICENSE to all created JARs

View File

@@ -20,15 +20,5 @@ plugins {
// required for kotlin-dsl or embedded-kotlin plugins
repositories {
jcenter()
}
dependencies {
// NOTE: keep plugin versions in sync with settings.gradle.kts
// "com.jfrog.bintray" plugin
implementation( "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4" )
// "com.jfrog.artifactory" plugin
implementation( "org.jfrog.buildinfo:build-info-extractor-gradle:4.13.0" )
mavenCentral()
}

View File

@@ -26,8 +26,7 @@ val extension = project.extensions.create<PublishExtension>( "flatlafPublish" )
plugins {
`maven-publish`
id( "com.jfrog.bintray" )
id( "com.jfrog.artifactory" )
signing
}
publishing {
@@ -63,54 +62,51 @@ publishing {
}
scm {
connection.set( "scm:git:git://github.com/JFormDesigner/FlatLaf.git" )
url.set( "https://github.com/JFormDesigner/FlatLaf" )
}
issueManagement {
system.set( "GitHub" )
url.set( "https://github.com/JFormDesigner/FlatLaf/issues" )
}
}
}
}
repositories {
maven {
name = "OSSRH"
val releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
val snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots/"
url = uri( if( java.lang.Boolean.getBoolean( "release" ) ) releasesRepoUrl else snapshotsRepoUrl )
credentials {
// get from gradle.properties
val ossrhUsername: String? by project
val ossrhPassword: String? by project
username = System.getenv( "OSSRH_USERNAME" ) ?: ossrhUsername
password = System.getenv( "OSSRH_PASSWORD" ) ?: ossrhPassword
}
}
}
}
bintray {
user = rootProject.extra["bintray.user"] as String?
key = rootProject.extra["bintray.key"] as String?
signing {
// get from gradle.properties
val signingKey: String? by project
val signingPassword: String? by project
setPublications( "maven" )
val key = System.getenv( "SIGNING_KEY" ) ?: signingKey
val password = System.getenv( "SIGNING_PASSWORD" ) ?: signingPassword
with( pkg ) {
repo = "flatlaf"
afterEvaluate {
this@with.name = extension.artifactId
}
setLicenses( "Apache-2.0" )
vcsUrl = "https://github.com/JFormDesigner/FlatLaf"
with( version ) {
name = project.version.toString()
}
publish = rootProject.extra["bintray.publish"] as Boolean
dryRun = rootProject.extra["bintray.dryRun"] as Boolean
}
useInMemoryPgpKeys( key, password )
sign( publishing.publications["maven"] )
}
artifactory {
setContextUrl( "https://oss.jfrog.org" )
publish( closureOf<org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig> {
repository( delegateClosureOf<groovy.lang.GroovyObject> {
setProperty( "repoKey", "oss-snapshot-local" )
setProperty( "username", rootProject.extra["bintray.user"] as String? )
setProperty( "password", rootProject.extra["bintray.key"] as String? )
} )
defaults( delegateClosureOf<groovy.lang.GroovyObject> {
invokeMethod( "publications", "maven" )
setProperty( "publishArtifacts", true )
setProperty( "publishPom", true )
} )
} )
resolve( delegateClosureOf<org.jfrog.gradle.plugin.artifactory.dsl.ResolverConfig> {
setProperty( "repoKey", "jcenter" )
} )
// disable signing of snapshots
tasks.withType<Sign>().configureEach {
onlyIf { java.lang.Boolean.getBoolean( "release" ) }
}

View File

@@ -22,6 +22,8 @@ import javax.swing.JComponent;
import javax.swing.SwingConstants;
/**
* Defines/documents own client properties used in FlatLaf.
*
* @author Karl Tauber
*/
public interface FlatClientProperties
@@ -130,6 +132,15 @@ public interface FlatClientProperties
*/
String MINIMUM_HEIGHT = "JComponent.minimumHeight";
/**
* Paint the component with round edges.
* <p>
* <strong>Components</strong> {@link javax.swing.JComboBox}, {@link javax.swing.JSpinner},
* {@link javax.swing.JTextField}, {@link javax.swing.JFormattedTextField} and {@link javax.swing.JPasswordField}<br>
* <strong>Value type</strong> {@link java.lang.Boolean}
*/
String COMPONENT_ROUND_RECT = "JComponent.roundRect";
/**
* Specifies the outline color of the component border.
* <p>
@@ -162,13 +173,23 @@ public interface FlatClientProperties
String OUTLINE_WARNING = "warning";
/**
* Paint the component with round edges.
* Specifies a callback that is invoked to check whether a component is permanent focus owner.
* Used to paint focus indicators.
* <p>
* <strong>Components</strong> {@link javax.swing.JComboBox}, {@link javax.swing.JSpinner},
* {@link javax.swing.JTextField}, {@link javax.swing.JFormattedTextField} and {@link javax.swing.JPasswordField}<br>
* <strong>Value type</strong> {@link java.lang.Boolean}
* May be useful in special cases for custom components.
* <p>
* Use a {@link java.util.function.Predicate} that receives the component as parameter:
* <pre>{@code
* myComponent.putClientProperty( "JComponent.focusOwner",
* (Predicate<JComponent>) c -> {
* return ...; // check here
* } );
* }</pre>
* <p>
* <strong>Component</strong> {@link javax.swing.JComponent}<br>
* <strong>Value type</strong> {@link java.util.function.Predicate}&lt;javax.swing.JComponent&gt;
*/
String COMPONENT_ROUND_RECT = "JComponent.roundRect";
String COMPONENT_FOCUS_OWNER = "JComponent.focusOwner";
//---- Popup --------------------------------------------------------------
@@ -232,7 +253,7 @@ public interface FlatClientProperties
/**
* Specifies whether the scroll pane uses smooth scrolling.
* <p>
* <strong>Component</strong> {{@link javax.swing.JScrollPane}<br>
* <strong>Component</strong> {@link javax.swing.JScrollPane}<br>
* <strong>Value type</strong> {@link java.lang.Boolean}
*/
String SCROLL_PANE_SMOOTH_SCROLLING = "JScrollPane.smoothScrolling";
@@ -264,7 +285,7 @@ public interface FlatClientProperties
String TABBED_PANE_HAS_FULL_BORDER = "JTabbedPane.hasFullBorder";
/**
* Specifies whether the tab area should be hidded if it contains only one tab.
* Specifies whether the tab area should be hidden if it contains only one tab.
* <p>
* <strong>Component</strong> {@link javax.swing.JTabbedPane}<br>
* <strong>Value type</strong> {@link java.lang.Boolean}
@@ -293,10 +314,12 @@ public interface FlatClientProperties
String TABBED_PANE_MAXIMUM_TAB_WIDTH = "JTabbedPane.maximumTabWidth";
/**
* Specifies the height of a tab.
* Specifies the minimum height of a tab.
* <p>
* <strong>Component</strong> {@link javax.swing.JTabbedPane}<br>
* <strong>Value type</strong> {@link java.lang.Integer}
*
* @see #TABBED_PANE_TAB_INSETS
*/
String TABBED_PANE_TAB_HEIGHT = "JTabbedPane.tabHeight";
@@ -306,6 +329,8 @@ public interface FlatClientProperties
* <strong>Component</strong> {@link javax.swing.JTabbedPane}
* or tab content components (see {@link javax.swing.JTabbedPane#setComponentAt(int, java.awt.Component)})<br>
* <strong>Value type</strong> {@link java.awt.Insets}
*
* @see #TABBED_PANE_TAB_HEIGHT
*/
String TABBED_PANE_TAB_INSETS = "JTabbedPane.tabInsets";
@@ -349,7 +374,7 @@ public interface FlatClientProperties
* Specifies the callback that is invoked when a tab close button is clicked.
* The callback is responsible for closing the tab.
* <p>
* Either use a {@link java.util.function.IntConsumer} that received the tab index as parameter:
* Either use a {@link java.util.function.IntConsumer} that receives the tab index as parameter:
* <pre>{@code
* myTabbedPane.putClientProperty( "JTabbedPane.tabCloseCallback",
* (IntConsumer) tabIndex -> {
@@ -357,7 +382,7 @@ public interface FlatClientProperties
* } );
* }</pre>
* Or use a {@link java.util.function.BiConsumer}&lt;javax.swing.JTabbedPane, Integer&gt;
* that received the tabbed pane and the tab index as parameters:
* that receives the tabbed pane and the tab index as parameters:
* <pre>{@code
* myTabbedPane.putClientProperty( "JTabbedPane.tabCloseCallback",
* (BiConsumer<JTabbedPane, Integer>) (tabbedPane, tabIndex) -> {
@@ -670,6 +695,25 @@ public interface FlatClientProperties
*/
String TAB_BUTTON_SELECTED_BACKGROUND = "JToggleButton.tab.selectedBackground";
//---- JTree --------------------------------------------------------------
/**
* Override if a tree shows a wide selection. Default is {@code true}.
* <p>
* <strong>Component</strong> {@link javax.swing.JTree}<br>
* <strong>Value type</strong> {@link java.lang.Boolean}
*/
String TREE_WIDE_SELECTION = "JTree.wideSelection";
/**
* Specifies whether tree item selection is painted. Default is {@code true}.
* If set to {@code false}, then the tree cell renderer is responsible for painting selection.
* <p>
* <strong>Component</strong> {@link javax.swing.JTree}<br>
* <strong>Value type</strong> {@link java.lang.Boolean}
*/
String TREE_PAINT_SELECTION = "JTree.paintSelection";
//---- helper methods -----------------------------------------------------
/**

View File

@@ -42,10 +42,12 @@ class FlatInputMaps
}
private static void initBasicInputMaps( UIDefaults defaults ) {
defaults.put( "Button.focusInputMap", new UIDefaults.LazyInputMap( new Object[] {
"SPACE", "pressed",
"released SPACE", "released"
} ) );
if( SystemInfo.isMacOS ) {
defaults.put( "Button.focusInputMap", new UIDefaults.LazyInputMap( new Object[] {
"SPACE", "pressed",
"released SPACE", "released"
} ) );
}
modifyInputMap( defaults, "ComboBox.ancestorInputMap",
"SPACE", "spacePopup",

View File

@@ -262,7 +262,7 @@ public abstract class FlatLaf
Color linkColor = defaults.getColor( "Component.linkColor" );
if( linkColor != null ) {
new HTMLEditorKit().getStyleSheet().addRule(
String.format( "a { color: #%06x; }", linkColor.getRGB() & 0xffffff ) );
String.format( "a, address { color: #%06x; }", linkColor.getRGB() & 0xffffff ) );
}
};
@@ -304,7 +304,7 @@ public abstract class FlatLaf
}
// restore default link color
new HTMLEditorKit().getStyleSheet().addRule( "a { color: blue; }" );
new HTMLEditorKit().getStyleSheet().addRule( "a, address { color: blue; }" );
postInitialization = null;
// restore enable/disable window decorations
@@ -467,8 +467,13 @@ public abstract class FlatLaf
} else if( SystemInfo.isMacOS ) {
String fontName;
if( SystemInfo.isMacOS_10_15_Catalina_orLater ) {
// use Helvetica Neue font
fontName = "Helvetica Neue";
if (SystemInfo.isJetBrainsJVM_11_orLater) {
// See https://youtrack.jetbrains.com/issue/JBR-1915
fontName = ".AppleSystemUIFont";
} else {
// use Helvetica Neue font
fontName = "Helvetica Neue";
}
} else if( SystemInfo.isMacOS_10_11_ElCapitan_orLater ) {
// use San Francisco Text font
fontName = ".SF NS Text";
@@ -541,7 +546,12 @@ public abstract class FlatLaf
}
private void putAATextInfo( UIDefaults defaults ) {
if( SystemInfo.isJava_9_orLater ) {
if ( SystemInfo.isMacOS && SystemInfo.isJetBrainsJVM ) {
// The awt.font.desktophints property suggests sub-pixel anti-aliasing
// which renders text with too much weight on macOS in the JetBrains JRE.
// Use greyscale anti-aliasing instead.
defaults.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );
} else if( SystemInfo.isJava_9_orLater ) {
Object desktopHints = Toolkit.getDefaultToolkit().getDesktopProperty( DESKTOPFONTHINTS );
if( desktopHints instanceof Map ) {
@SuppressWarnings( "unchecked" )

View File

@@ -64,6 +64,8 @@ public interface FlatSystemProperties
* If this system property is set, FlatLaf invokes {@link JFrame#setDefaultLookAndFeelDecorated(boolean)}
* and {@link JDialog#setDefaultLookAndFeelDecorated(boolean)} on LaF initialization.
* <p>
* (requires Window 10)
* <p>
* <strong>Allowed Values</strong> {@code false} and {@code true}<br>
* <strong>Default</strong> none
*/
@@ -79,6 +81,8 @@ public interface FlatSystemProperties
* Setting this to {@code true} forces using JetBrains Runtime custom window decorations
* even if they are not enabled by the application.
* <p>
* (requires Window 10)
* <p>
* <strong>Allowed Values</strong> {@code false} and {@code true}<br>
* <strong>Default</strong> {@code true}
*/
@@ -87,6 +91,8 @@ public interface FlatSystemProperties
/**
* Specifies whether menubar is embedded into custom window decorations.
* <p>
* (requires Window 10)
* <p>
* <strong>Allowed Values</strong> {@code false} and {@code true}<br>
* <strong>Default</strong> {@code true}
*/

View File

@@ -16,6 +16,7 @@
package com.formdev.flatlaf;
import java.awt.Color;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -56,6 +57,8 @@ public class IntelliJTheme
public final boolean dark;
public final String author;
private final boolean isMaterialUILite;
private final Map<String, String> colors;
private final Map<String, Object> ui;
private final Map<String, Object> icons;
@@ -119,6 +122,8 @@ public class IntelliJTheme
dark = Boolean.parseBoolean( (String) json.get( "dark" ) );
author = (String) json.get( "author" );
isMaterialUILite = author.equals( "Mallowigi" );
colors = (Map<String, String>) json.get( "colors" );
ui = (Map<String, Object>) json.get( "ui" );
icons = (Map<String, Object>) json.get( "icons" );
@@ -156,6 +161,11 @@ public class IntelliJTheme
defaults.put( "Button.disabledBackground", panelBackground );
defaults.put( "ToggleButton.disabledBackground", panelBackground );
// fix Button borders
copyIfNotSet( defaults, "Button.focusedBorderColor", "Component.focusedBorderColor", uiKeys );
defaults.put( "Button.hoverBorderColor", defaults.get( "Button.focusedBorderColor" ) );
defaults.put( "HelpButton.hoverBorderColor", defaults.get( "Button.focusedBorderColor" ) );
// IDEA uses a SVG icon for the help button, but paints the background with Button.startBackground and Button.endBackground
Object helpButtonBackground = defaults.get( "Button.startBackground" );
Object helpButtonBorderColor = defaults.get( "Button.startBorderColor" );
@@ -205,6 +215,12 @@ public class IntelliJTheme
if( !uiKeys.contains( "ToggleButton.foreground" ) && uiKeys.contains( "Button.foreground" ) )
defaults.put( "ToggleButton.foreground", defaults.get( "Button.foreground" ) );
// fix List and Table background colors in Material UI Lite themes
if( isMaterialUILite ) {
defaults.put( "List.background", defaults.get( "Tree.background" ) );
defaults.put( "Table.background", defaults.get( "Tree.background" ) );
}
// limit tree row height
int rowHeight = defaults.getInt( "Tree.rowHeight" );
if( rowHeight > 22 )
@@ -225,10 +241,17 @@ public class IntelliJTheme
// remove theme specific UI defaults and remember only those for current theme
Map<Object, Object> themeSpecificDefaults = new HashMap<>();
String currentThemePrefix = '[' + name.replace( ' ', '_' ) + ']';
String currentAuthorPrefix = "[author-" + author.replace( ' ', '_' ) + ']';
String allThemesPrefix = "[*]";
String[] prefixes = { currentThemePrefix, currentAuthorPrefix, allThemesPrefix };
for( String key : themeSpecificKeys ) {
Object value = defaults.remove( key );
if( key.startsWith( currentThemePrefix ) )
themeSpecificDefaults.put( key.substring( currentThemePrefix.length() ), value );
for( String prefix : prefixes ) {
if( key.startsWith( prefix ) ) {
themeSpecificDefaults.put( key.substring( prefix.length() ), value );
break;
}
}
}
return themeSpecificDefaults;
@@ -269,7 +292,6 @@ public class IntelliJTheme
uiKeys.add( key );
// fix ComboBox size and Spinner border in all Material UI Lite themes
boolean isMaterialUILite = author.equals( "Mallowigi" );
if( isMaterialUILite && (key.equals( "ComboBox.padding" ) || key.equals( "Spinner.border" )) )
return; // ignore
@@ -381,7 +403,7 @@ public class IntelliJTheme
}
/**
* Because IDEA uses SVGs for check boxes and radio buttons the colors for
* Because IDEA uses SVGs for check boxes and radio buttons, the colors for
* this two components are specified in "icons > ColorPalette".
* FlatLaf uses vector icons and expects colors for the two components in UI defaults.
*/
@@ -453,28 +475,44 @@ public class IntelliJTheme
}
}
// remove hover and pressed colors
// update hover, pressed and focused colors
if( checkboxModified ) {
// for non-filled checkbox/radiobutton used in dark themes
defaults.remove( "CheckBox.icon.focusWidth" );
defaults.remove( "CheckBox.icon.hoverBorderColor" );
defaults.remove( "CheckBox.icon.focusedBackground" );
defaults.remove( "CheckBox.icon.hoverBackground" );
defaults.remove( "CheckBox.icon.pressedBackground" );
defaults.remove( "CheckBox.icon.selectedFocusedBackground" );
defaults.remove( "CheckBox.icon.selectedHoverBackground" );
defaults.remove( "CheckBox.icon.selectedPressedBackground" );
defaults.put( "CheckBox.icon.hoverBorderColor", defaults.get( "CheckBox.icon.focusedBorderColor" ) );
// for filled checkbox/radiobutton used in light themes
defaults.remove( "CheckBox.icon[filled].focusWidth" );
defaults.remove( "CheckBox.icon[filled].hoverBorderColor" );
defaults.remove( "CheckBox.icon[filled].focusedBackground" );
defaults.remove( "CheckBox.icon[filled].hoverBackground" );
defaults.remove( "CheckBox.icon[filled].pressedBackground" );
defaults.remove( "CheckBox.icon[filled].selectedFocusedBackground" );
defaults.remove( "CheckBox.icon[filled].selectedHoverBackground" );
defaults.remove( "CheckBox.icon[filled].selectedPressedBackground" );
defaults.put( "CheckBox.icon[filled].hoverBorderColor", defaults.get( "CheckBox.icon[filled].focusedBorderColor" ) );
defaults.put( "CheckBox.icon[filled].selectedFocusedBackground", defaults.get( "CheckBox.icon[filled].selectedBackground" ) );
if( dark ) {
// IDEA Darcula checkBoxFocused.svg, checkBoxSelectedFocused.svg,
// radioFocused.svg and radioSelectedFocused.svg
// use opacity=".65" for the border
// --> add alpha to focused border colors
String[] focusedBorderColorKeys = new String[] {
"CheckBox.icon.focusedBorderColor",
"CheckBox.icon.selectedFocusedBorderColor",
"CheckBox.icon[filled].focusedBorderColor",
"CheckBox.icon[filled].selectedFocusedBorderColor",
};
for( String key : focusedBorderColorKeys ) {
Color color = defaults.getColor( key );
if( color != null ) {
defaults.put( key, new ColorUIResource( new Color(
(color.getRGB() & 0xffffff) | 0xa6000000, true ) ) );
}
}
}
}
}
private void copyIfNotSet( UIDefaults defaults, String destKey, String srcKey, Set<String> uiKeys ) {
if( !uiKeys.contains( destKey ) )
defaults.put( destKey, defaults.get( srcKey ) );
}
/** Rename UI default keys (key --> value). */
private static Map<String, String> uiKeyMapping = new HashMap<>();
/** Copy UI default keys (value --> key). */
@@ -507,6 +545,7 @@ public class IntelliJTheme
uiKeyCopying.put( "CheckBoxMenuItem.margin", "MenuItem.margin" );
uiKeyCopying.put( "RadioButtonMenuItem.margin", "MenuItem.margin" );
uiKeyMapping.put( "PopupMenu.border", "PopupMenu.borderInsets" );
uiKeyCopying.put( "MenuItem.underlineSelectionColor", "TabbedPane.underlineColor" );
// IDEA uses List.selectionBackground also for menu selection
uiKeyCopying.put( "Menu.selectionBackground", "List.selectionBackground" );

View File

@@ -70,7 +70,9 @@ class UIDefaultsLoader
private static final String VARIABLE_PREFIX = "@";
private static final String PROPERTY_PREFIX = "$";
private static final String OPTIONAL_PREFIX = "?";
private static final String GLOBAL_PREFIX = "*.";
private static final String WILDCARD_PREFIX = "*.";
private static int parseColorDepth;
static void loadDefaultsFromProperties( Class<?> lookAndFeelClass, List<FlatDefaultsAddon> addons,
Properties additionalDefaults, boolean dark, UIDefaults defaults )
@@ -119,7 +121,7 @@ class UIDefaultsLoader
addonClassLoaders.add( addonClassLoader );
}
// load custom properties files (usually provides by applications)
// load custom properties files (usually provided by applications)
List<Object> customDefaultsSources = FlatLaf.getCustomDefaultsSources();
int size = (customDefaultsSources != null) ? customDefaultsSources.size() : 0;
for( int i = 0; i < size; i++ ) {
@@ -198,19 +200,19 @@ class UIDefaultsLoader
}
}
// get (and remove) globals, which override all other defaults that end with same suffix
HashMap<String, String> globals = new HashMap<>();
// get (and remove) wildcard replacements, which override all other defaults that end with same suffix
HashMap<String, String> wildcards = new HashMap<>();
Iterator<Entry<Object, Object>> it = properties.entrySet().iterator();
while( it.hasNext() ) {
Entry<Object, Object> e = it.next();
String key = (String) e.getKey();
if( key.startsWith( GLOBAL_PREFIX ) ) {
globals.put( key.substring( GLOBAL_PREFIX.length() ), (String) e.getValue() );
if( key.startsWith( WILDCARD_PREFIX ) ) {
wildcards.put( key.substring( WILDCARD_PREFIX.length() ), (String) e.getValue() );
it.remove();
}
}
// override UI defaults with globals
// override UI defaults with wildcard replacements
for( Object key : defaults.keySet() ) {
int dot;
if( !(key instanceof String) ||
@@ -218,10 +220,10 @@ class UIDefaultsLoader
(dot = ((String)key).lastIndexOf( '.' )) < 0 )
continue;
String globalKey = ((String)key).substring( dot + 1 );
String globalValue = globals.get( globalKey );
if( globalValue != null )
properties.put( key, globalValue );
String wildcardKey = ((String)key).substring( dot + 1 );
String wildcardValue = wildcards.get( wildcardKey );
if( wildcardValue != null )
properties.put( key, wildcardValue );
}
Function<String, String> propertiesGetter = key -> {
@@ -341,7 +343,12 @@ class UIDefaultsLoader
// determine value type from key
if( valueType == ValueType.UNKNOWN ) {
if( key.endsWith( "ground" ) || key.endsWith( "Color" ) )
if( key.endsWith( "UI" ) )
valueType = ValueType.STRING;
else if( key.endsWith( "Color" ) ||
(key.endsWith( "ground" ) &&
(key.endsWith( ".background" ) || key.endsWith( "Background" ) ||
key.endsWith( ".foreground" ) || key.endsWith( "Foreground" ))) )
valueType = ValueType.COLOR;
else if( key.endsWith( ".border" ) || key.endsWith( "Border" ) )
valueType = ValueType.BORDER;
@@ -356,8 +363,6 @@ class UIDefaultsLoader
valueType = ValueType.INTEGER;
else if( key.endsWith( "Char" ) )
valueType = ValueType.CHARACTER;
else if( key.endsWith( "UI" ) )
valueType = ValueType.STRING;
else if( key.endsWith( "grayFilter" ) )
valueType = ValueType.GRAYFILTER;
}
@@ -577,19 +582,27 @@ class UIDefaultsLoader
if( params.isEmpty() )
throw new IllegalArgumentException( "missing parameters in function '" + value + "'" );
switch( function ) {
case "rgb": return parseColorRgbOrRgba( false, params, resolver, reportError );
case "rgba": return parseColorRgbOrRgba( true, params, resolver, reportError );
case "hsl": return parseColorHslOrHsla( false, params );
case "hsla": return parseColorHslOrHsla( true, params );
case "lighten": return parseColorHSLIncreaseDecrease( 2, true, params, resolver, reportError );
case "darken": return parseColorHSLIncreaseDecrease( 2, false, params, resolver, reportError );
case "saturate": return parseColorHSLIncreaseDecrease( 1, true, params, resolver, reportError );
case "desaturate": return parseColorHSLIncreaseDecrease( 1, false, params, resolver, reportError );
case "fadein": return parseColorHSLIncreaseDecrease( 3, true, params, resolver, reportError );
case "fadeout": return parseColorHSLIncreaseDecrease( 3, false, params, resolver, reportError );
case "fade": return parseColorFade( params, resolver, reportError );
case "spin": return parseColorSpin( params, resolver, reportError );
if( parseColorDepth > 100 )
throw new IllegalArgumentException( "endless recursion in color function '" + value + "'" );
parseColorDepth++;
try {
switch( function ) {
case "rgb": return parseColorRgbOrRgba( false, params, resolver, reportError );
case "rgba": return parseColorRgbOrRgba( true, params, resolver, reportError );
case "hsl": return parseColorHslOrHsla( false, params );
case "hsla": return parseColorHslOrHsla( true, params );
case "lighten": return parseColorHSLIncreaseDecrease( 2, true, params, resolver, reportError );
case "darken": return parseColorHSLIncreaseDecrease( 2, false, params, resolver, reportError );
case "saturate": return parseColorHSLIncreaseDecrease( 1, true, params, resolver, reportError );
case "desaturate": return parseColorHSLIncreaseDecrease( 1, false, params, resolver, reportError );
case "fadein": return parseColorHSLIncreaseDecrease( 3, true, params, resolver, reportError );
case "fadeout": return parseColorHSLIncreaseDecrease( 3, false, params, resolver, reportError );
case "fade": return parseColorFade( params, resolver, reportError );
case "spin": return parseColorSpin( params, resolver, reportError );
}
} finally {
parseColorDepth--;
}
throw new IllegalArgumentException( "unknown color function '" + value + "'" );

View File

@@ -0,0 +1,55 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.icons;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import com.formdev.flatlaf.util.AnimatedIcon;
/**
* Base class for animated icons that scales width and height, creates and initializes
* a scaled graphics context for icon painting.
* <p>
* Subclasses do not need to scale icon painting.
* <p>
* This class does not store any state information (needed for animation) in its instance.
* Instead a client property is set on the painted component.
* This makes it possible to use a share icon instance for multiple components.
*
* @author Karl Tauber
*/
public abstract class FlatAnimatedIcon
extends FlatAbstractIcon
implements AnimatedIcon
{
public FlatAnimatedIcon( int width, int height, Color color ) {
super( width, height, color );
}
@Override
public void paintIcon( Component c, Graphics g, int x, int y ) {
super.paintIcon( c, g, x, y );
AnimatedIcon.AnimationSupport.saveIconLocation( this, c, x, y );
}
@Override
protected void paintIcon( Component c, Graphics2D g ) {
AnimatedIcon.AnimationSupport.paintIcon( this, c, g, 0, 0 );
}
}

View File

@@ -49,15 +49,16 @@ import com.formdev.flatlaf.ui.FlatUIUtils;
* @uiDefault CheckBox.icon.disabledBorderColor Color
* @uiDefault CheckBox.icon.disabledBackground Color
* @uiDefault CheckBox.icon.disabledCheckmarkColor Color
* @uiDefault CheckBox.icon.focusedBorderColor Color
* @uiDefault CheckBox.icon.focusedBorderColor Color optional
* @uiDefault CheckBox.icon.focusedBackground Color optional
* @uiDefault CheckBox.icon.selectedFocusedBorderColor Color optional
* @uiDefault CheckBox.icon.selectedFocusedBackground Color optional
* @uiDefault CheckBox.icon.selectedFocusedBorderColor Color optional; CheckBox.icon.focusedBorderColor is used if not specified
* @uiDefault CheckBox.icon.selectedFocusedBackground Color optional; CheckBox.icon.focusedBackground is used if not specified
* @uiDefault CheckBox.icon.selectedFocusedCheckmarkColor Color optional; CheckBox.icon.checkmarkColor is used if not specified
* @uiDefault CheckBox.icon.hoverBorderColor Color optional
* @uiDefault CheckBox.icon.hoverBackground Color optional
* @uiDefault CheckBox.icon.selectedHoverBackground Color optional
* @uiDefault CheckBox.icon.selectedHoverBackground Color optional; CheckBox.icon.hoverBackground is used if not specified
* @uiDefault CheckBox.icon.pressedBackground Color optional
* @uiDefault CheckBox.icon.selectedPressedBackground Color optional
* @uiDefault CheckBox.icon.selectedPressedBackground Color optional; CheckBox.icon.pressedBackground is used if not specified
* @uiDefault CheckBox.arc int
*
* @author Karl Tauber
@@ -145,7 +146,14 @@ public class FlatCheckBoxIcon
paintBorder( c, g );
// paint background
g.setColor( FlatUIUtils.deriveColor( getBackground( c, selected ), background ) );
Color bg = FlatUIUtils.deriveColor( getBackground( c, selected ),
selected ? selectedBackground : background );
if( bg.getAlpha() < 255 ) {
// fill background with default color before filling with non-opaque background
g.setColor( selected ? selectedBackground : background );
paintBackground( c, g );
}
g.setColor( bg );
paintBackground( c, g );
// paint checkmark

View File

@@ -31,6 +31,8 @@ import com.formdev.flatlaf.ui.FlatUIUtils;
*
* @uiDefault Component.focusWidth int
* @uiDefault Component.focusColor Color
* @uiDefault HelpButton.innerFocusWidth int or float optional; defaults to Component.innerFocusWidth
* @uiDefault HelpButton.borderWidth int optional; default is 1
* @uiDefault HelpButton.borderColor Color
* @uiDefault HelpButton.disabledBorderColor Color
* @uiDefault HelpButton.focusedBorderColor Color
@@ -50,6 +52,8 @@ public class FlatHelpButtonIcon
{
protected final int focusWidth = UIManager.getInt( "Component.focusWidth" );
protected final Color focusColor = UIManager.getColor( "Component.focusColor" );
protected final float innerFocusWidth = FlatUIUtils.getUIFloat( "HelpButton.innerFocusWidth", FlatUIUtils.getUIFloat( "Component.innerFocusWidth", 0 ) );
protected final int borderWidth = FlatUIUtils.getUIInt( "HelpButton.borderWidth", 1 );
protected final Color borderColor = UIManager.getColor( "HelpButton.borderColor" );
protected final Color disabledBorderColor = UIManager.getColor( "HelpButton.disabledBorderColor" );
@@ -84,12 +88,18 @@ public class FlatHelpButtonIcon
boolean enabled = c.isEnabled();
boolean focused = FlatUIUtils.isPermanentFocusOwner( c );
// paint focused border
float xy = 0.5f;
float wh = iconSize - 1;
// paint outer focus border
if( focused && FlatButtonUI.isFocusPainted( c ) ) {
g2.setColor( focusColor );
g2.fill( new Ellipse2D.Float( 0.5f, 0.5f, iconSize - 1, iconSize - 1 ) );
g2.fill( new Ellipse2D.Float( xy, xy, wh, wh ) );
}
xy += focusWidth;
wh -= (focusWidth * 2);
// paint border
g2.setColor( FlatButtonUI.buttonStateColor( c,
borderColor,
@@ -97,7 +107,19 @@ public class FlatHelpButtonIcon
focusedBorderColor,
hoverBorderColor,
null ) );
g2.fill( new Ellipse2D.Float( focusWidth + 0.5f, focusWidth + 0.5f, 21, 21 ) );
g2.fill( new Ellipse2D.Float( xy, xy, wh, wh ) );
xy += borderWidth;
wh -= (borderWidth * 2);
// paint inner focus border
if( innerFocusWidth > 0 && focused && FlatButtonUI.isFocusPainted( c ) ) {
g2.setColor( focusColor );
g2.fill( new Ellipse2D.Float( xy, xy, wh, wh ) );
xy += innerFocusWidth;
wh -= (innerFocusWidth * 2);
}
// paint background
g2.setColor( FlatUIUtils.deriveColor( FlatButtonUI.buttonStateColor( c,
@@ -106,7 +128,7 @@ public class FlatHelpButtonIcon
focusedBackground,
hoverBackground,
pressedBackground ), background ) );
g2.fill( new Ellipse2D.Float( focusWidth + 1.5f, focusWidth + 1.5f, 19, 19 ) );
g2.fill( new Ellipse2D.Float( xy, xy, wh, wh ) );
// paint question mark
Path2D q = new Path2D.Float();

View File

@@ -57,18 +57,6 @@ public class FlatArrowButton
private boolean hover;
private boolean pressed;
public FlatArrowButton( int direction, String type, Color foreground, Color disabledForeground,
Color hoverForeground, Color hoverBackground )
{
this( direction, type, foreground, disabledForeground, hoverForeground, hoverBackground, null );
}
public FlatArrowButton( int direction, String type, Color foreground, Color disabledForeground,
Color hoverForeground, Color hoverBackground, Color pressedBackground )
{
this( direction, type, foreground, disabledForeground, hoverForeground, hoverBackground, null, pressedBackground );
}
public FlatArrowButton( int direction, String type, Color foreground, Color disabledForeground,
Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground )
{
@@ -85,7 +73,9 @@ public class FlatArrowButton
setOpaque( false );
setBorder( null );
if( hoverForeground != null || hoverBackground != null || pressedBackground != null ) {
if( hoverForeground != null || hoverBackground != null ||
pressedForeground != null || pressedBackground != null )
{
addMouseListener( new MouseAdapter() {
@Override
public void mouseEntered( MouseEvent e ) {
@@ -151,7 +141,7 @@ public class FlatArrowButton
}
protected Color deriveForeground( Color foreground ) {
return foreground;
return FlatUIUtils.deriveColor( foreground, this.foreground );
}
@Override
@@ -166,8 +156,7 @@ public class FlatArrowButton
@Override
public void paint( Graphics g ) {
Graphics2D g2 = (Graphics2D)g;
FlatUIUtils.setRenderingHints( g2 );
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g );
// paint hover or pressed background
if( isEnabled() ) {
@@ -179,7 +168,7 @@ public class FlatArrowButton
if( background != null ) {
g.setColor( deriveBackground( background ) );
paintBackground( g2 );
paintBackground( (Graphics2D) g );
}
}
@@ -191,7 +180,9 @@ public class FlatArrowButton
? hoverForeground
: foreground))
: disabledForeground ) );
paintArrow( g2 );
paintArrow( (Graphics2D) g );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
}
protected void paintBackground( Graphics2D g ) {

View File

@@ -35,7 +35,6 @@ import javax.swing.JViewport;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicBorders;
import javax.swing.text.JTextComponent;
import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.util.DerivedColor;
@@ -95,12 +94,14 @@ public class FlatBorder
// paint outer border
if( outlineColor != null || isFocused( c ) ) {
float innerWidth = !isCellEditor( c ) && !(c instanceof JScrollPane)
? (outlineColor != null ? innerOutlineWidth : innerFocusWidth)
? (outlineColor != null ? innerOutlineWidth : getInnerFocusWidth( c ))
: 0;
g2.setColor( (outlineColor != null) ? outlineColor : getFocusColor( c ) );
FlatUIUtils.paintComponentOuterBorder( g2, x, y, width, height,
focusWidth, borderWidth + scale( innerWidth ), arc );
if( focusWidth > 0 || innerWidth > 0 ) {
g2.setColor( (outlineColor != null) ? outlineColor : getFocusColor( c ) );
FlatUIUtils.paintComponentOuterBorder( g2, x, y, width, height,
focusWidth, borderWidth + scale( innerWidth ), arc );
}
}
// paint border
@@ -159,7 +160,7 @@ public class FlatBorder
return false;
}
return c.isEnabled() && (!(c instanceof JTextComponent) || ((JTextComponent)c).isEditable());
return c.isEnabled();
}
protected boolean isFocused( Component c ) {
@@ -236,6 +237,13 @@ public class FlatBorder
return focusWidth;
}
/**
* Returns the (unscaled) thickness of the inner focus border.
*/
protected float getInnerFocusWidth( Component c ) {
return innerFocusWidth;
}
/**
* Returns the (unscaled) line thickness used to compute the border insets.
* This may be different to {@link #getBorderWidth}.

View File

@@ -44,6 +44,7 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault Button.default.focusColor Color
* @uiDefault Button.borderWidth int
* @uiDefault Button.default.borderWidth int
* @uiDefault Button.innerFocusWidth int or float optional; defaults to Component.innerFocusWidth
* @uiDefault Button.toolbar.margin Insets
* @uiDefault Button.toolbar.spacingInsets Insets
* @uiDefault Button.arc int
@@ -65,6 +66,7 @@ public class FlatButtonBorder
protected final Color defaultFocusColor = UIManager.getColor( "Button.default.focusColor" );
protected final int borderWidth = UIManager.getInt( "Button.borderWidth" );
protected final int defaultBorderWidth = UIManager.getInt( "Button.default.borderWidth" );
protected final float buttonInnerFocusWidth = FlatUIUtils.getUIFloat( "Button.innerFocusWidth", innerFocusWidth );
protected final Insets toolbarMargin = UIManager.getInsets( "Button.toolbar.margin" );
protected final Insets toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
protected final int arc = UIManager.getInt( "Button.arc" );
@@ -134,6 +136,11 @@ public class FlatButtonBorder
return FlatToggleButtonUI.isTabButton( c ) ? 0 : super.getFocusWidth( c );
}
@Override
protected float getInnerFocusWidth( Component c ) {
return buttonInnerFocusWidth;
}
@Override
protected int getBorderWidth( Component c ) {
return FlatButtonUI.isDefaultButton( c ) ? defaultBorderWidth : borderWidth;

View File

@@ -251,7 +251,10 @@ public class FlatButtonUI
Icon icon = ((AbstractButton)c).getIcon();
String text = ((AbstractButton)c).getText();
return (icon != null && (text == null || text.isEmpty())) ||
(icon == null && text != null && ("...".equals( text ) || text.length() == 1));
(icon == null && text != null &&
("...".equals( text ) ||
text.length() == 1 ||
(text.length() == 2 && Character.isSurrogatePair( text.charAt( 0 ), text.charAt( 1 ) ))));
}
static final int TYPE_OTHER = -1;
@@ -407,8 +410,13 @@ public class FlatButtonUI
if( model.isRollover() )
return toolbarHoverBackground;
// use background of toolbar
return c.getParent().getBackground();
// use component background if explicitly set
Color bg = c.getBackground();
if( isCustomBackground( bg ) )
return bg;
// do not paint background
return null;
}
boolean def = isDefaultButton( c );

View File

@@ -34,6 +34,8 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Rectangle2D;
import java.beans.PropertyChangeEvent;
@@ -97,6 +99,7 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault ComboBox.buttonArrowColor Color
* @uiDefault ComboBox.buttonDisabledArrowColor Color
* @uiDefault ComboBox.buttonHoverArrowColor Color
* @uiDefault ComboBox.buttonPressedArrowColor Color
*
* @author Karl Tauber
*/
@@ -120,9 +123,11 @@ public class FlatComboBoxUI
protected Color buttonArrowColor;
protected Color buttonDisabledArrowColor;
protected Color buttonHoverArrowColor;
protected Color buttonPressedArrowColor;
private MouseListener hoverListener;
protected boolean hover;
protected boolean pressed;
private WeakReference<Component> lastRendererComponent;
@@ -134,13 +139,36 @@ public class FlatComboBoxUI
protected void installListeners() {
super.installListeners();
hoverListener = new FlatUIUtils.HoverListener( null, h -> {
if( !comboBox.isEditable() ) {
hover = h;
if( arrowButton != null )
hoverListener = new MouseAdapter() {
@Override
public void mouseEntered( MouseEvent e ) {
hover = true;
repaintArrowButton();
}
@Override
public void mouseExited( MouseEvent e ) {
hover = false;
repaintArrowButton();
}
@Override
public void mousePressed( MouseEvent e ) {
pressed = true;
repaintArrowButton();
}
@Override
public void mouseReleased( MouseEvent e ) {
pressed = false;
repaintArrowButton();
}
private void repaintArrowButton() {
if( arrowButton != null && !comboBox.isEditable() )
arrowButton.repaint();
}
} );
};
comboBox.addMouseListener( hoverListener );
}
@@ -175,6 +203,7 @@ public class FlatComboBoxUI
buttonArrowColor = UIManager.getColor( "ComboBox.buttonArrowColor" );
buttonDisabledArrowColor = UIManager.getColor( "ComboBox.buttonDisabledArrowColor" );
buttonHoverArrowColor = UIManager.getColor( "ComboBox.buttonHoverArrowColor" );
buttonPressedArrowColor = UIManager.getColor( "ComboBox.buttonPressedArrowColor" );
// set maximumRowCount
int maximumRowCount = UIManager.getInt( "ComboBox.maximumRowCount" );
@@ -203,6 +232,7 @@ public class FlatComboBoxUI
buttonArrowColor = null;
buttonDisabledArrowColor = null;
buttonHoverArrowColor = null;
buttonPressedArrowColor = null;
MigLayoutVisualPadding.uninstall( comboBox );
}
@@ -352,7 +382,7 @@ public class FlatComboBoxUI
FlatUIUtils.paintParentBackground( g, c );
Graphics2D g2 = (Graphics2D) g;
FlatUIUtils.setRenderingHints( g2 );
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g2 );
int width = c.getWidth();
int height = c.getHeight();
@@ -386,6 +416,9 @@ public class FlatComboBoxUI
g2.fill( new Rectangle2D.Float( lx, focusWidth, lw, height - 1 - (focusWidth * 2)) );
}
// avoid that the "current value" renderer is invoked with enabled antialiasing
FlatUIUtils.resetRenderingHints( g2, oldRenderingHints );
paint( g, c );
}
@@ -513,19 +546,26 @@ public class FlatComboBoxUI
extends FlatArrowButton
{
protected FlatComboBoxButton() {
this( SwingConstants.SOUTH, arrowType, buttonArrowColor, buttonDisabledArrowColor, buttonHoverArrowColor, null, null );
this( SwingConstants.SOUTH, arrowType, buttonArrowColor, buttonDisabledArrowColor,
buttonHoverArrowColor, null, buttonPressedArrowColor, null );
}
protected FlatComboBoxButton( int direction, String type, Color foreground, Color disabledForeground,
Color hoverForeground, Color hoverBackground, Color pressedBackground )
Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground )
{
super( direction, type, foreground, disabledForeground, hoverForeground, hoverBackground, pressedBackground );
super( direction, type, foreground, disabledForeground,
hoverForeground, hoverBackground, pressedForeground, pressedBackground );
}
@Override
protected boolean isHover() {
return super.isHover() || (!comboBox.isEditable() ? hover : false);
}
@Override
protected boolean isPressed() {
return super.isPressed() || (!comboBox.isEditable() ? pressed : false);
}
}
//---- class FlatComboPopup -----------------------------------------------

View File

@@ -22,6 +22,9 @@ import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.beans.PropertyChangeEvent;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JLabel;
@@ -96,23 +99,37 @@ public class FlatLabelUI
}
/**
* Checks whether text contains HTML headings and adds a special CSS rule to
* re-calculate heading font sizes based on current component font size.
* Checks whether text contains HTML tags that use "absolute-size" keywords
* (e.g. "x-large") for font-size in default style sheet
* (see javax/swing/text/html/default.css).
* If yes, adds a special CSS rule (BASE_SIZE) to the HTML text, which
* re-calculates font sizes based on current component font size.
*/
static void updateHTMLRenderer( JComponent c, String text, boolean always ) {
if( BasicHTML.isHTMLString( text ) &&
c.getClientProperty( "html.disable" ) != Boolean.TRUE &&
text.contains( "<h" ) &&
(text.contains( "<h1" ) || text.contains( "<h2" ) || text.contains( "<h3" ) ||
text.contains( "<h4" ) || text.contains( "<h5" ) || text.contains( "<h6" )) )
needsFontBaseSize( text ) )
{
int headIndex = text.indexOf( "<head>" );
// BASE_SIZE rule is parsed in javax.swing.text.html.StyleSheet.addRule()
String style = "<style>BASE_SIZE " + c.getFont().getSize() + "</style>";
if( headIndex < 0 )
style = "<head>" + style + "</head>";
int insertIndex = headIndex >= 0 ? (headIndex + "<head>".length()) : "<html>".length();
String lowerText = text.toLowerCase();
int headIndex;
int styleIndex;
int insertIndex;
if( (headIndex = lowerText.indexOf( "<head>" )) >= 0 ) {
// there is a <head> tag --> insert after <head> tag
insertIndex = headIndex + "<head>".length();
} else if( (styleIndex = lowerText.indexOf( "<style>" )) >= 0 ) {
// there is a <style> tag --> insert before <style> tag
insertIndex = styleIndex;
} else {
// no <head> or <style> tag --> insert <head> tag after <html> tag
style = "<head>" + style + "</head>";
insertIndex = "<html>".length();
}
text = text.substring( 0, insertIndex )
+ style
+ text.substring( insertIndex );
@@ -122,6 +139,44 @@ public class FlatLabelUI
BasicHTML.updateRenderer( c, text );
}
private static Set<String> tagsUseFontSizeSet;
private static boolean needsFontBaseSize( String text ) {
if( tagsUseFontSizeSet == null ) {
// tags that use font-size in javax/swing/text/html/default.css
tagsUseFontSizeSet = new HashSet<>( Arrays.asList(
"h1", "h2", "h3", "h4", "h5", "h6", "code", "kbd", "big", "small", "samp" ) );
}
// search for tags in HTML text
int textLength = text.length();
for( int i = 6; i < textLength - 1; i++ ) {
if( text.charAt( i ) == '<' ) {
switch( text.charAt( i + 1 ) ) {
// first letters of tags in tagsUseFontSizeSet
case 'b': case 'B':
case 'c': case 'C':
case 'h': case 'H':
case 'k': case 'K':
case 's': case 'S':
int tagBegin = i + 1;
for( i += 2; i < textLength; i++ ) {
if( !Character.isLetterOrDigit( text.charAt( i ) ) ) {
String tag = text.substring( tagBegin, i ).toLowerCase();
if( tagsUseFontSizeSet.contains( tag ) )
return true;
break;
}
}
break;
}
}
}
return false;
}
static Graphics createGraphicsHTMLTextYCorrection( Graphics g, JComponent c ) {
return (c.getClientProperty( BasicHTML.propertyKey ) != null)
? HiDPIUtils.createGraphicsTextYCorrection( (Graphics2D) g )

View File

@@ -57,6 +57,7 @@ import com.formdev.flatlaf.util.SystemInfo;
* @uiDefault MenuItem.underlineSelectionCheckBackground Color
* @uiDefault MenuItem.underlineSelectionColor Color
* @uiDefault MenuItem.underlineSelectionHeight int
* @uiDefault MenuItem.selectionBackground Color
*
* @author Karl Tauber
*/
@@ -82,6 +83,8 @@ public class FlatMenuItemRenderer
protected final Color underlineSelectionColor = UIManager.getColor( "MenuItem.underlineSelectionColor" );
protected final int underlineSelectionHeight = UIManager.getInt( "MenuItem.underlineSelectionHeight" );
protected final Color selectionBackground = UIManager.getColor( "MenuItem.selectionBackground" );
protected FlatMenuItemRenderer( JMenuItem menuItem, Icon checkIcon, Icon arrowIcon,
Font acceleratorFont, String acceleratorDelimiter )
{
@@ -303,7 +306,7 @@ debug*/
// then use filled icon background to indicate selection (instead of using checkIcon)
if( menuItem.isSelected() && checkIcon != null && icon != checkIcon ) {
Rectangle r = FlatUIUtils.addInsets( iconRect, scale( checkMargins ) );
g.setColor( deriveBackground( checkBackground ) );
g.setColor( FlatUIUtils.deriveColor( checkBackground, selectionBackground ) );
g.fillRect( r.x, r.y, r.width, r.height );
}

View File

@@ -271,16 +271,17 @@ public class FlatPopupFactory
// increase tooltip size if necessary because it may be too small on HiDPI screens
// https://bugs.openjdk.java.net/browse/JDK-8213535
if( contents instanceof JToolTip ) {
if( contents instanceof JToolTip && popupWindow == null ) {
Container parent = contents.getParent();
if( parent instanceof JPanel ) {
Dimension prefSize = parent.getPreferredSize();
if( !prefSize.equals( parent.getSize() ) ) {
Container panel = SwingUtilities.getAncestorOfClass( Panel.class, parent );
if( panel != null )
panel.setSize( prefSize ); // for medium weight popup
else
parent.setSize( prefSize ); // for light weight popup
Container mediumWeightPanel = SwingUtilities.getAncestorOfClass( Panel.class, parent );
Container c = (mediumWeightPanel != null)
? mediumWeightPanel // medium weight popup
: parent; // light weight popup
c.setSize( prefSize );
c.validate();
}
}
}

View File

@@ -155,7 +155,7 @@ public class FlatProgressBarUI
? 0
: Math.min( UIScale.scale( this.arc ), horizontal ? height : width );
FlatUIUtils.setRenderingHints( (Graphics2D) g );
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g );
// paint track
RoundRectangle2D.Float trackShape = new RoundRectangle2D.Float( x, y, width, height, arc, arc );
@@ -163,6 +163,7 @@ public class FlatProgressBarUI
((Graphics2D)g).fill( trackShape );
// paint progress
int amountFull = 0;
if( progressBar.isIndeterminate() ) {
boxRect = getBox( boxRect );
if( boxRect != null ) {
@@ -170,11 +171,8 @@ public class FlatProgressBarUI
((Graphics2D)g).fill( new RoundRectangle2D.Float( boxRect.x, boxRect.y,
boxRect.width, boxRect.height, arc, arc ) );
}
if( progressBar.isStringPainted() )
paintString( g, x, y, width, height, 0, insets );
} else {
int amountFull = getAmountFull( insets, width, height );
amountFull = getAmountFull( insets, width, height );
RoundRectangle2D.Float progressShape = horizontal
? new RoundRectangle2D.Float( c.getComponentOrientation().isLeftToRight() ? x : x + (width - amountFull),
@@ -189,10 +187,12 @@ public class FlatProgressBarUI
((Graphics2D)g).fill( area );
} else
((Graphics2D)g).fill( progressShape );
if( progressBar.isStringPainted() )
paintString( g, x, y, width, height, amountFull, insets );
}
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
if( progressBar.isStringPainted() )
paintString( g, x, y, width, height, amountFull, insets );
}
@Override

View File

@@ -27,7 +27,6 @@ import javax.swing.JComponent;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicRadioButtonUI;
import com.formdev.flatlaf.icons.FlatCheckBoxIcon;
import com.formdev.flatlaf.util.UIScale;
@@ -58,6 +57,8 @@ public class FlatRadioButtonUI
protected int iconTextGap;
protected Color disabledText;
private Color defaultBackground;
private boolean defaults_initialized = false;
public static ComponentUI createUI( JComponent c ) {
@@ -74,6 +75,8 @@ public class FlatRadioButtonUI
iconTextGap = FlatUIUtils.getUIInt( prefix + "iconTextGap", 4 );
disabledText = UIManager.getColor( prefix + "disabledText" );
defaultBackground = UIManager.getColor( prefix + "background" );
defaults_initialized = true;
}
@@ -120,7 +123,7 @@ public class FlatRadioButtonUI
// - if background was explicitly set to a non-UIResource color
if( !c.isOpaque() &&
((AbstractButton)c).isContentAreaFilled() &&
!(c.getBackground() instanceof UIResource) )
!defaultBackground.equals( c.getBackground() ) )
{
g.setColor( c.getBackground() );
g.fillRect( 0, 0, c.getWidth(), c.getHeight() );

View File

@@ -19,7 +19,6 @@ package com.formdev.flatlaf.ui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
@@ -221,8 +220,9 @@ public class FlatScrollBarUI
@Override
public void paint( Graphics g, JComponent c ) {
FlatUIUtils.setRenderingHints( (Graphics2D) g );
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g );
super.paint( g, c );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
}
@Override
@@ -357,13 +357,14 @@ public class FlatScrollBarUI
{
protected FlatScrollBarButton( int direction ) {
this( direction, arrowType, buttonArrowColor, buttonDisabledArrowColor,
null, hoverButtonBackground, pressedButtonBackground );
null, hoverButtonBackground, null, pressedButtonBackground );
}
protected FlatScrollBarButton( int direction, String type, Color foreground, Color disabledForeground,
Color hoverForeground, Color hoverBackground, Color pressedBackground )
Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground )
{
super( direction, type, foreground, disabledForeground, hoverForeground, hoverBackground, pressedBackground );
super( direction, type, foreground, disabledForeground,
hoverForeground, hoverBackground, pressedForeground, pressedBackground );
setArrowWidth( FlatArrowButton.DEFAULT_ARROW_WIDTH - 2 );
setFocusable( false );

View File

@@ -14,12 +14,6 @@
* limitations under the License.
*/
/*
* Smooth scrolling code partly based on code from IntelliJ IDEA Community Edition,
* which is licensed under the Apache 2.0 license. Copyright 2000-2016 JetBrains s.r.o.
* See: https://github.com/JetBrains/intellij-community/blob/31e1b5a8e43219b9571951bab6457cfb3012e3ef/platform/platform-api/src/com/intellij/ui/components/SmoothScrollPane.java#L141-L185
*
*/
package com.formdev.flatlaf.ui;
import java.awt.Component;
@@ -138,8 +132,6 @@ public class FlatScrollPaneUI
return UIManager.getBoolean( "ScrollPane.smoothScrolling" );
}
private static final double EPSILON = 1e-5d;
private void mouseWheelMovedSmooth( MouseWheelEvent e ) {
// return if there is no viewport
JViewport viewport = scrollpane.getViewport();
@@ -160,24 +152,22 @@ public class FlatScrollPaneUI
// get precise wheel rotation
double rotation = e.getPreciseWheelRotation();
// get unit and block increment
// get unit increment
int unitIncrement;
int blockIncrement;
int orientation = scrollbar.getOrientation();
Component view = viewport.getView();
if( view instanceof Scrollable ) {
Scrollable scrollable = (Scrollable) view;
// Use (0, 0) view position to obtain constant unit increment of first item
// (which might otherwise be variable on smaller-than-unit scrolling).
// Use (0, 0) view position to obtain a constant unit increment of first item.
// Unit increment may be different for each item.
Rectangle visibleRect = new Rectangle( viewport.getViewSize() );
unitIncrement = scrollable.getScrollableUnitIncrement( visibleRect, orientation, 1 );
blockIncrement = scrollable.getScrollableBlockIncrement( visibleRect, orientation, 1 );
if( unitIncrement > 0 ) {
// For the case that the first item (e.g. in a list) is larger
// than the other items, get the unit increment of the second item
// and use the smaller one.
// than the other items (e.g. themes list in FlatLaf Demo),
// get the unit increment of the second item and use the smaller one.
if( orientation == SwingConstants.VERTICAL ) {
visibleRect.y += unitIncrement;
visibleRect.height -= unitIncrement;
@@ -192,52 +182,58 @@ public class FlatScrollPaneUI
} else {
int direction = rotation < 0 ? -1 : 1;
unitIncrement = scrollbar.getUnitIncrement( direction );
blockIncrement = scrollbar.getBlockIncrement( direction );
}
// limit scroll amount (number of units to scroll) for small viewports
// (e.g. vertical scrolling in file chooser)
int scrollAmount = e.getScrollAmount();
// get viewport width/height (the visible width/height)
int viewportWH = (orientation == SwingConstants.VERTICAL)
? viewport.getHeight()
: viewport.getWidth();
if( unitIncrement * scrollAmount > viewportWH )
scrollAmount = Math.max( viewportWH / unitIncrement, 1 );
// limit scroll increment to viewport width/height
// - if scroll amount is set to a large value in OS settings
// - for large unit increments in small viewports (e.g. horizontal scrolling in file chooser)
int scrollIncrement = Math.min( unitIncrement * e.getScrollAmount(), viewportWH );
// compute relative delta
double delta = rotation * scrollAmount * unitIncrement;
boolean adjustDelta = Math.abs( rotation ) < (1.0 + EPSILON);
double adjustedDelta = adjustDelta
? Math.max( -blockIncrement, Math.min( delta, blockIncrement ) )
: delta;
double delta = rotation * scrollIncrement;
int idelta = (int) Math.round( delta );
// scroll at least one pixel to avoid "hanging"
// - for "super-low-speed" scrolling (move fingers very slowly on trackpad)
// - if unit increment is very small (e.g. 1 if scroll view does not implement
// javax.swing.Scrollable interface)
if( idelta == 0 ) {
if( rotation > 0 )
idelta = 1;
else if( rotation < 0 )
idelta = -1;
}
// compute new value
int value = scrollbar.getValue();
double minDelta = scrollbar.getMinimum() - value;
double maxDelta = scrollbar.getMaximum() - scrollbar.getModel().getExtent() - value;
double boundedDelta = Math.max( minDelta, Math.min( adjustedDelta, maxDelta ) );
int newValue = value + (int) Math.round( boundedDelta );
int minValue = scrollbar.getMinimum();
int maxValue = scrollbar.getMaximum() - scrollbar.getModel().getExtent();
int newValue = Math.max( minValue, Math.min( value + idelta, maxValue ) );
// set new value
if( newValue != value )
scrollbar.setValue( newValue );
/*debug
System.out.println( String.format( "%4d %9f / %4d %4d / %12f %5s %12f / %4d %4d %4d / %12f %12f %12f / %4d",
System.out.println( String.format( "%s %4d %9f / %3d * %d = %3d [%3d] / %8.2f %5d / %4d --> %4d [%d, %d]",
(orientation == SwingConstants.VERTICAL) ? "V" : "H",
e.getWheelRotation(),
e.getPreciseWheelRotation(),
unitIncrement,
blockIncrement,
e.getScrollAmount(),
scrollIncrement,
viewportWH,
delta,
adjustDelta,
adjustedDelta,
idelta,
value,
scrollbar.getMinimum(),
scrollbar.getMaximum(),
minDelta,
maxDelta,
boundedDelta,
newValue ) );
newValue,
minValue,
maxValue ) );
*/
}

View File

@@ -91,9 +91,14 @@ public class FlatSliderUI
protected Color disabledThumbColor;
protected Color disabledThumbBorderColor;
private Color defaultBackground;
private Color defaultForeground;
protected boolean thumbHover;
protected boolean thumbPressed;
private Object[] oldRenderingHints;
public static ComponentUI createUI( JComponent c ) {
return new FlatSliderUI();
}
@@ -129,6 +134,9 @@ public class FlatSliderUI
disabledTrackColor = UIManager.getColor( "Slider.disabledTrackColor" );
disabledThumbColor = UIManager.getColor( "Slider.disabledThumbColor" );
disabledThumbBorderColor = FlatUIUtils.getUIColor( "Slider.disabledThumbBorderColor", "Component.disabledBorderColor" );
defaultBackground = UIManager.getColor( "Slider.background" );
defaultForeground = UIManager.getColor( "Slider.foreground" );
}
@Override
@@ -147,6 +155,9 @@ public class FlatSliderUI
disabledTrackColor = null;
disabledThumbColor = null;
disabledThumbBorderColor = null;
defaultBackground = null;
defaultForeground = null;
}
@Override
@@ -211,7 +222,7 @@ public class FlatSliderUI
@Override
public void paint( Graphics g, JComponent c ) {
FlatUIUtils.setRenderingHints( (Graphics2D) g );
oldRenderingHints = FlatUIUtils.setRenderingHints( g );
/*debug
g.setColor( Color.gray );
@@ -224,9 +235,23 @@ public class FlatSliderUI
g.drawRect( trackRect.x, trackRect.y, trackRect.width - 1, trackRect.height - 1 );
g.setColor( Color.red );
g.drawRect( thumbRect.x, thumbRect.y, thumbRect.width - 1, thumbRect.height - 1 );
g.setColor( Color.green );
g.drawRect( tickRect.x, tickRect.y, tickRect.width - 1, tickRect.height - 1 );
g.setColor( Color.red );
g.drawRect( labelRect.x, labelRect.y, labelRect.width - 1, labelRect.height - 1 );
debug*/
super.paint( g, c );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
oldRenderingHints = null;
}
@Override
public void paintLabels( Graphics g ) {
FlatUIUtils.runWithoutRenderingHints( g, oldRenderingHints, () -> {
super.paintLabels( g );
} );
}
@Override
@@ -267,25 +292,34 @@ debug*/
}
if( coloredTrack != null ) {
g.setColor( trackValueColor );
if( slider.getInverted() ) {
RoundRectangle2D temp = track;
track = coloredTrack;
coloredTrack = temp;
}
g.setColor( getTrackValueColor() );
((Graphics2D)g).fill( coloredTrack );
}
g.setColor( enabled ? trackColor : disabledTrackColor );
g.setColor( enabled ? getTrackColor() : disabledTrackColor );
((Graphics2D)g).fill( track );
}
@Override
public void paintThumb( Graphics g ) {
Color thumbColor = getThumbColor();
Color color = stateColor( slider, thumbHover, thumbPressed,
thumbColor, disabledThumbColor, null, hoverThumbColor, pressedThumbColor );
color = FlatUIUtils.deriveColor( color, thumbColor );
Color borderColor = (thumbBorderColor != null)
Color foreground = slider.getForeground();
Color borderColor = (thumbBorderColor != null && foreground == defaultForeground)
? stateColor( slider, false, false, thumbBorderColor, disabledThumbBorderColor, focusedThumbBorderColor, null, null )
: null;
Color focusedColor = FlatUIUtils.deriveColor( this.focusedColor, focusBaseColor );
Color focusedColor = FlatUIUtils.deriveColor( this.focusedColor,
(foreground != defaultForeground) ? foreground : focusBaseColor );
paintThumb( g, slider, thumbRect, isRoundThumb(), color, borderColor, focusedColor, focusWidth );
}
@@ -414,6 +448,21 @@ debug*/
return path;
}
protected Color getTrackValueColor() {
Color foreground = slider.getForeground();
return (foreground != defaultForeground) ? foreground : trackValueColor;
}
protected Color getTrackColor() {
Color backround = slider.getBackground();
return (backround != defaultBackground) ? backround : trackColor;
}
protected Color getThumbColor() {
Color foreground = slider.getForeground();
return (foreground != defaultForeground) ? foreground : thumbColor;
}
public static Color stateColor( JSlider slider, boolean hover, boolean pressed,
Color enabledColor, Color disabledColor, Color focusedColor, Color hoverColor, Color pressedColor )
{
@@ -484,7 +533,47 @@ debug*/
@Override
public void mousePressed( MouseEvent e ) {
setThumbPressed( isOverThumb( e ) );
if( !slider.isEnabled() )
return;
// use "old" behavior when clicking on track
if( UIManager.getBoolean( "Slider.scrollOnTrackClick" ) ) {
super.mousePressed( e );
return;
}
// "new" behavior set thumb to mouse location when clicking on track
int x = e.getX();
int y = e.getY();
// clicked on thumb --> let super class do the work
calculateGeometry();
if( thumbRect.contains( x, y ) ) {
super.mousePressed( e );
return;
}
if( UIManager.getBoolean( "Slider.onlyLeftMouseButtonDrag" ) &&
!SwingUtilities.isLeftMouseButton( e ) )
return;
// move the mouse event coordinates to the center of the thumb
int tx = thumbRect.x + (thumbRect.width / 2) - x;
int ty = thumbRect.y + (thumbRect.height / 2) - y;
e.translatePoint( tx, ty );
// invoke super mousePressed() to start dragging thumb
super.mousePressed( e );
// move the mouse event coordinates back to current mouse location
e.translatePoint( -tx, -ty );
// invoke mouseDragged() to update thumb location
mouseDragged( e );
setThumbPressed( true );
}
@Override
@@ -493,6 +582,20 @@ debug*/
super.mouseReleased( e );
}
@Override
public void mouseDragged( MouseEvent e ) {
super.mouseDragged( e );
if( isDragging() &&
slider.getSnapToTicks() &&
slider.isEnabled() &&
!UIManager.getBoolean( "Slider.snapToTicksOnReleased" ) )
{
calculateThumbLocation();
slider.repaint();
}
}
protected void setThumbHover( boolean hover ) {
if( hover != thumbHover ) {
thumbHover = hover;

View File

@@ -69,6 +69,7 @@ import com.formdev.flatlaf.FlatClientProperties;
* @uiDefault Spinner.buttonArrowColor Color
* @uiDefault Spinner.buttonDisabledArrowColor Color
* @uiDefault Spinner.buttonHoverArrowColor Color
* @uiDefault Spinner.buttonPressedArrowColor Color
* @uiDefault Spinner.padding Insets
*
* @author Karl Tauber
@@ -90,6 +91,7 @@ public class FlatSpinnerUI
protected Color buttonArrowColor;
protected Color buttonDisabledArrowColor;
protected Color buttonHoverArrowColor;
protected Color buttonPressedArrowColor;
protected Insets padding;
public static ComponentUI createUI( JComponent c ) {
@@ -114,6 +116,7 @@ public class FlatSpinnerUI
buttonArrowColor = UIManager.getColor( "Spinner.buttonArrowColor" );
buttonDisabledArrowColor = UIManager.getColor( "Spinner.buttonDisabledArrowColor" );
buttonHoverArrowColor = UIManager.getColor( "Spinner.buttonHoverArrowColor" );
buttonPressedArrowColor = UIManager.getColor( "Spinner.buttonPressedArrowColor" );
padding = UIManager.getInsets( "Spinner.padding" );
// scale
@@ -134,6 +137,7 @@ public class FlatSpinnerUI
buttonArrowColor = null;
buttonDisabledArrowColor = null;
buttonHoverArrowColor = null;
buttonPressedArrowColor = null;
padding = null;
MigLayoutVisualPadding.uninstall( spinner );
@@ -244,7 +248,7 @@ public class FlatSpinnerUI
private Component createArrowButton( int direction, String name ) {
FlatArrowButton button = new FlatArrowButton( direction, arrowType, buttonArrowColor,
buttonDisabledArrowColor, buttonHoverArrowColor, null );
buttonDisabledArrowColor, buttonHoverArrowColor, null, buttonPressedArrowColor, null );
button.setName( name );
button.setYOffset( (direction == SwingConstants.NORTH) ? 1 : -1 );
if( direction == SwingConstants.NORTH )
@@ -264,7 +268,7 @@ public class FlatSpinnerUI
FlatUIUtils.paintParentBackground( g, c );
Graphics2D g2 = (Graphics2D) g;
FlatUIUtils.setRenderingHints( g2 );
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g2 );
int width = c.getWidth();
int height = c.getHeight();
@@ -303,6 +307,8 @@ public class FlatSpinnerUI
}
paint( g, c );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
}
//---- class Handler ------------------------------------------------------

View File

@@ -20,7 +20,6 @@ import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
@@ -53,6 +52,7 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault SplitPane.continuousLayout boolean
* @uiDefault SplitPaneDivider.oneTouchArrowColor Color
* @uiDefault SplitPaneDivider.oneTouchHoverArrowColor Color
* @uiDefault SplitPaneDivider.oneTouchPressedArrowColor Color
* @uiDefault SplitPaneDivider.style String grip (default) or plain
* @uiDefault SplitPaneDivider.gripColor Color
* @uiDefault SplitPaneDivider.gripDotCount int
@@ -68,6 +68,7 @@ public class FlatSplitPaneUI
private Boolean continuousLayout;
protected Color oneTouchArrowColor;
protected Color oneTouchHoverArrowColor;
protected Color oneTouchPressedArrowColor;
public static ComponentUI createUI( JComponent c ) {
return new FlatSplitPaneUI();
@@ -81,12 +82,22 @@ public class FlatSplitPaneUI
// used in there on LaF switching
oneTouchArrowColor = UIManager.getColor( "SplitPaneDivider.oneTouchArrowColor" );
oneTouchHoverArrowColor = UIManager.getColor( "SplitPaneDivider.oneTouchHoverArrowColor" );
oneTouchPressedArrowColor = UIManager.getColor( "SplitPaneDivider.oneTouchPressedArrowColor" );
super.installDefaults();
continuousLayout = (Boolean) UIManager.get( "SplitPane.continuousLayout" );
}
@Override
protected void uninstallDefaults() {
super.uninstallDefaults();
oneTouchArrowColor = null;
oneTouchHoverArrowColor = null;
oneTouchPressedArrowColor = null;
}
@Override
public boolean isContinuousLayout() {
return super.isContinuousLayout() || (continuousLayout != null && Boolean.TRUE.equals( continuousLayout ));
@@ -148,10 +159,12 @@ public class FlatSplitPaneUI
if( "plain".equals( style ) )
return;
FlatUIUtils.setRenderingHints( (Graphics2D) g );
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g );
g.setColor( gripColor );
paintGrip( g, 0, 0, getWidth(), getHeight() );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
}
protected void paintGrip( Graphics g, int x, int y, int width, int height ) {
@@ -184,7 +197,8 @@ public class FlatSplitPaneUI
protected final boolean left;
protected FlatOneTouchButton( boolean left ) {
super( SwingConstants.NORTH, arrowType, oneTouchArrowColor, null, oneTouchHoverArrowColor, null );
super( SwingConstants.NORTH, arrowType, oneTouchArrowColor, null,
oneTouchHoverArrowColor, null, oneTouchPressedArrowColor, null );
setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ) );
ToolTipManager.sharedInstance().registerComponent( this );

View File

@@ -221,11 +221,15 @@ public class FlatTabbedPaneUI
private Container leadingComponent;
private Container trailingComponent;
private Dimension scrollBackwardButtonPrefSize;
private Handler handler;
private boolean blockRollover;
private boolean rolloverTabClose;
private boolean pressedTabClose;
private Object[] oldRenderingHints;
public static ComponentUI createUI( JComponent c ) {
return new FlatTabbedPaneUI();
}
@@ -791,9 +795,12 @@ public class FlatTabbedPaneUI
@Override
public void update( Graphics g, JComponent c ) {
FlatUIUtils.setRenderingHints( (Graphics2D) g );
oldRenderingHints = FlatUIUtils.setRenderingHints( g );
super.update( g, c );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
oldRenderingHints = null;
}
@Override
@@ -874,27 +881,29 @@ public class FlatTabbedPaneUI
{
g.setFont( font );
// html
View view = getTextViewForTab( tabIndex );
if( view != null ) {
view.paint( g, textRect );
return;
}
FlatUIUtils.runWithoutRenderingHints( g, oldRenderingHints, () -> {
// html
View view = getTextViewForTab( tabIndex );
if( view != null ) {
view.paint( g, textRect );
return;
}
// plain text
Color color;
if( tabPane.isEnabled() && tabPane.isEnabledAt( tabIndex ) ) {
color = tabPane.getForegroundAt( tabIndex );
if( isSelected && (color instanceof UIResource) && selectedForeground != null )
color = selectedForeground;
} else
color = disabledForeground;
// plain text
Color color;
if( tabPane.isEnabled() && tabPane.isEnabledAt( tabIndex ) ) {
color = tabPane.getForegroundAt( tabIndex );
if( isSelected && (color instanceof UIResource) && selectedForeground != null )
color = selectedForeground;
} else
color = disabledForeground;
int mnemIndex = FlatLaf.isShowMnemonics() ? tabPane.getDisplayedMnemonicIndexAt( tabIndex ) : -1;
int mnemIndex = FlatLaf.isShowMnemonics() ? tabPane.getDisplayedMnemonicIndexAt( tabIndex ) : -1;
g.setColor( color );
FlatUIUtils.drawStringUnderlineCharAt( tabPane, g, title, mnemIndex,
textRect.x, textRect.y + metrics.getAscent() );
g.setColor( color );
FlatUIUtils.drawStringUnderlineCharAt( tabPane, g, title, mnemIndex,
textRect.x, textRect.y + metrics.getAscent() );
} );
}
@Override
@@ -1863,33 +1872,78 @@ public class FlatTabbedPaneUI
lastMouseY = e.getY();
double preciseWheelRotation = e.getPreciseWheelRotation();
boolean isPreciseWheel = (preciseWheelRotation != 0 && preciseWheelRotation != e.getWheelRotation());
int amount = (int) (maxTabHeight * preciseWheelRotation);
// scroll at least one pixel to avoid "hanging"
if( amount == 0 ) {
if( preciseWheelRotation > 0 )
amount = 1;
else if( preciseWheelRotation < 0 )
amount = -1;
}
// compute new view position
Point viewPosition = (targetViewPosition != null)
? targetViewPosition
: tabViewport.getViewPosition();
Dimension viewSize = tabViewport.getViewSize();
boolean horizontal = isHorizontalTabPlacement();
int x = viewPosition.x;
int y = viewPosition.y;
int tabPlacement = tabPane.getTabPlacement();
if( tabPlacement == TOP || tabPlacement == BOTTOM ) {
if( horizontal )
x += isLeftToRight() ? amount : -amount;
x = Math.min( Math.max( x, 0 ), viewSize.width - tabViewport.getWidth() );
} else {
else
y += amount;
y = Math.min( Math.max( y, 0 ), viewSize.height - tabViewport.getHeight() );
// In case of having scroll buttons on both sides and hiding disabled buttons,
// the viewport is moved when the scroll backward button becomes visible
// or is hidden. For non-precise wheel scrolling (e.g. mouse wheel on Windows),
// this is no problem because the scroll amount is at least a tab-height.
// For precise wheel scrolling (e.g. touchpad on Mac), this is a problem
// because it is possible to scroll by a fraction of a tab-height.
if( isPreciseWheel &&
getScrollButtonsPlacement() == BOTH &&
getScrollButtonsPolicy() == AS_NEEDED_SINGLE &&
(isLeftToRight() || !horizontal) || // scroll buttons are hidden in right-to-left
scrollBackwardButtonPrefSize != null )
{
// special cases for scrolling with touchpad or high-resolution wheel:
// 1. if view is at 0/0 and scrolling right/down, then the scroll backward button
// becomes visible, which moves the viewport right/down by the width/height of
// the button --> add button width/height to new view position so that
// tabs seems to stay in place at screen
// 2. if scrolling left/up to the beginning, then the scroll backward button
// becomes hidden, which moves the viewport left/up by the width/height of
// the button --> set new view position to 0/0 so that
// tabs seems to stay in place at screen
if( horizontal ) {
//
if( viewPosition.x == 0 && x > 0 )
x += scrollBackwardButtonPrefSize.width;
else if( amount < 0 && x <= scrollBackwardButtonPrefSize.width )
x = 0;
} else {
if( viewPosition.y == 0 && y > 0 )
y += scrollBackwardButtonPrefSize.height;
else if( amount < 0 && y <= scrollBackwardButtonPrefSize.height )
y = 0;
}
}
// limit new view position
if( horizontal )
x = Math.min( Math.max( x, 0 ), viewSize.width - tabViewport.getWidth() );
else
y = Math.min( Math.max( y, 0 ), viewSize.height - tabViewport.getHeight() );
// check whether view position has changed
Point newViewPosition = new Point( x, y );
if( newViewPosition.equals( viewPosition ) )
return;
// update view position
if( preciseWheelRotation != 0 &&
preciseWheelRotation != e.getWheelRotation() )
{
if( isPreciseWheel ) {
// do not use animation for precise scrolling (e.g. with trackpad)
// stop running animation (if any)
@@ -2102,8 +2156,10 @@ public class FlatTabbedPaneUI
public void mouseReleased( MouseEvent e ) {
if( isPressedTabClose() ) {
updateRollover( e );
if( pressedTabIndex >= 0 && pressedTabIndex == getRolloverTab() )
if( pressedTabIndex >= 0 && pressedTabIndex == getRolloverTab() ) {
restoreTabToolTip();
closeTab( pressedTabIndex );
}
} else
mouseDelegate.mouseReleased( e );
@@ -2181,7 +2237,8 @@ public class FlatTabbedPaneUI
if( lastTipTabIndex < 0 )
return;
tabPane.setToolTipTextAt( lastTipTabIndex, lastTip );
if( lastTipTabIndex < tabPane.getTabCount() )
tabPane.setToolTipTextAt( lastTipTabIndex, lastTip );
lastTip = null;
lastTipTabIndex = -1;
}
@@ -2886,6 +2943,8 @@ public class FlatTabbedPaneUI
moreTabsButton.setVisible( moreTabsButtonVisible );
backwardButton.setVisible( backwardButtonVisible );
forwardButton.setVisible( forwardButtonVisible );
scrollBackwardButtonPrefSize = backwardButton.getPreferredSize();
}
}
}

View File

@@ -31,6 +31,7 @@ import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
@@ -98,10 +99,13 @@ public class FlatTableHeaderUI
@Override
public void paint( Graphics g, JComponent c ) {
if( header.getColumnModel().getColumnCount() <= 0 )
return;
// do not paint borders if JTableHeader.setDefaultRenderer() was used
TableCellRenderer defaultRenderer = header.getDefaultRenderer();
boolean paintBorders = isSystemDefaultRenderer( defaultRenderer );
if( !paintBorders && header.getColumnModel().getColumnCount() > 0 ) {
if( !paintBorders ) {
// check whether the renderer delegates to the system default renderer
Component rendererComponent = defaultRenderer.getTableCellRendererComponent(
header.getTable(), "", false, false, -1, 0 );
@@ -137,7 +141,7 @@ public class FlatTableHeaderUI
rendererClassName.equals( "sun.swing.FilePane$AlignableTableHeaderRenderer" );
}
private void paintColumnBorders( Graphics g, JComponent c ) {
protected void paintColumnBorders( Graphics g, JComponent c ) {
int width = c.getWidth();
int height = c.getHeight();
float lineWidth = UIScale.scale( 1f );
@@ -145,6 +149,9 @@ public class FlatTableHeaderUI
float bottomLineIndent = lineWidth * 3;
TableColumnModel columnModel = header.getColumnModel();
int columnCount = columnModel.getColumnCount();
int sepCount = columnCount;
if( hideLastVerticalLine() )
sepCount--;
Graphics2D g2 = (Graphics2D) g.create();
try {
@@ -157,23 +164,30 @@ public class FlatTableHeaderUI
// paint column separator lines
g2.setColor( separatorColor );
int sepCount = columnCount;
if( header.getTable() != null && header.getTable().getAutoResizeMode() != JTable.AUTO_RESIZE_OFF && !isVerticalScrollBarVisible() )
sepCount--;
float y = topLineIndent;
float h = height - bottomLineIndent;
if( header.getComponentOrientation().isLeftToRight() ) {
int x = 0;
for( int i = 0; i < sepCount; i++ ) {
x += columnModel.getColumn( i ).getWidth();
g2.fill( new Rectangle2D.Float( x - lineWidth, topLineIndent, lineWidth, height - bottomLineIndent ) );
g2.fill( new Rectangle2D.Float( x - lineWidth, y, lineWidth, h ) );
}
// paint trailing separator (on right side)
if( !hideTrailingVerticalLine() )
g2.fill( new Rectangle2D.Float( header.getWidth() - lineWidth, y, lineWidth, h ) );
} else {
int x = width;
Rectangle cellRect = header.getHeaderRect( 0 );
int x = cellRect.x + cellRect.width;
for( int i = 0; i < sepCount; i++ ) {
x -= columnModel.getColumn( i ).getWidth();
g2.fill( new Rectangle2D.Float( x - (i < sepCount - 1 ? lineWidth : 0),
topLineIndent, lineWidth, height - bottomLineIndent ) );
g2.fill( new Rectangle2D.Float( x - (i < sepCount - 1 ? lineWidth : 0), y, lineWidth, h ) );
}
// paint trailing separator (on left side)
if( !hideTrailingVerticalLine() )
g2.fill( new Rectangle2D.Float( 0, y, lineWidth, h ) );
}
} finally {
g2.dispose();
@@ -230,20 +244,30 @@ public class FlatTableHeaderUI
return size;
}
private boolean isVerticalScrollBarVisible() {
JScrollPane scrollPane = getScrollPane();
return (scrollPane != null && scrollPane.getVerticalScrollBar() != null)
? scrollPane.getVerticalScrollBar().isVisible()
: false;
protected boolean hideLastVerticalLine() {
Container viewport = header.getParent();
Container viewportParent = (viewport != null) ? viewport.getParent() : null;
if( !(viewportParent instanceof JScrollPane) )
return false;
Rectangle cellRect = header.getHeaderRect( header.getColumnModel().getColumnCount() - 1 );
// using component orientation of scroll pane here because it is also used in FlatTableUI
JScrollPane scrollPane = (JScrollPane) viewportParent;
return scrollPane.getComponentOrientation().isLeftToRight()
? cellRect.x + cellRect.width >= viewport.getWidth()
: cellRect.x <= 0;
}
private JScrollPane getScrollPane() {
Container parent = header.getParent();
if( parent == null )
return null;
protected boolean hideTrailingVerticalLine() {
Container viewport = header.getParent();
Container viewportParent = (viewport != null) ? viewport.getParent() : null;
if( !(viewportParent instanceof JScrollPane) )
return false;
parent = parent.getParent();
return (parent instanceof JScrollPane) ? (JScrollPane) parent : null;
JScrollPane scrollPane = (JScrollPane) viewportParent;
return viewport == scrollPane.getColumnHeader() &&
scrollPane.getCorner( ScrollPaneConstants.UPPER_TRAILING_CORNER ) == null;
}
//---- class FlatTableCellHeaderRenderer ----------------------------------

View File

@@ -17,6 +17,7 @@
package com.formdev.flatlaf.ui;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
@@ -24,14 +25,14 @@ import java.awt.Graphics2D;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.geom.Rectangle2D;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicTableUI;
import javax.swing.table.TableCellRenderer;
import com.formdev.flatlaf.util.Graphics2DProxy;
import com.formdev.flatlaf.util.UIScale;
@@ -134,12 +135,6 @@ public class FlatTableUI
oldIntercellSpacing = table.getIntercellSpacing();
table.setIntercellSpacing( intercellSpacing );
}
// checkbox is non-opaque in FlatLaf and therefore would not paint selection
// --> make checkbox renderer opaque (but opaque in Metal or Windows LaF)
TableCellRenderer booleanRenderer = table.getDefaultRenderer( Boolean.class );
if( booleanRenderer instanceof JCheckBox )
((JCheckBox)booleanRenderer).setOpaque( true );
}
@Override
@@ -215,16 +210,11 @@ public class FlatTableUI
boolean verticalLines = table.getShowVerticalLines();
if( horizontalLines || verticalLines ) {
// fix grid painting issues in BasicTableUI
// - do not paint last vertical grid line if auto-resize mode is not off
// - in right-to-left component orientation, do not paint last vertical grid line
// in any auto-resize mode; can not paint on left side of table because
// cells are painted over left line
// - do not paint last vertical grid line if line is on right edge of scroll pane
// - fix unstable grid line thickness when scaled at 125%, 150%, 175%, 225%, ...
// which paints either 1px or 2px lines depending on location
boolean hideLastVerticalLine =
table.getAutoResizeMode() != JTable.AUTO_RESIZE_OFF ||
!table.getComponentOrientation().isLeftToRight();
boolean hideLastVerticalLine = hideLastVerticalLine();
int tableWidth = table.getWidth();
double systemScaleFactor = UIScale.getSystemScaleFactor( (Graphics2D) g );
@@ -281,4 +271,26 @@ public class FlatTableUI
super.paint( g, c );
}
protected boolean hideLastVerticalLine() {
Container viewport = SwingUtilities.getUnwrappedParent( table );
Container viewportParent = (viewport != null) ? viewport.getParent() : null;
if( !(viewportParent instanceof JScrollPane) )
return false;
// do not hide last vertical line if table is smaller than viewport
if( table.getX() + table.getWidth() < viewport.getWidth() )
return false;
// in left-to-right:
// - do not hide last vertical line if table used as row header in scroll pane
// in right-to-left:
// - hide last vertical line if table used as row header in scroll pane
// - do not hide last vertical line if table is in center and scroll pane has row header
JScrollPane scrollPane = (JScrollPane) viewportParent;
JViewport rowHeader = scrollPane.getRowHeader();
return scrollPane.getComponentOrientation().isLeftToRight()
? (viewport != rowHeader)
: (viewport == rowHeader || rowHeader == null);
}
}

View File

@@ -39,6 +39,7 @@ import javax.swing.text.Caret;
import javax.swing.text.JTextComponent;
import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.util.HiDPIUtils;
import com.formdev.flatlaf.util.JavaCompatibility;
/**
* Provides the Flat LaF UI delegate for {@link javax.swing.JTextField}.
@@ -213,7 +214,9 @@ public class FlatTextFieldUI
// paint placeholder
g.setColor( placeholderForeground );
FlatUIUtils.drawString( c, g, (String) placeholder, x, y );
String clippedPlaceholder = JavaCompatibility.getClippedString( jc, fm,
(String) placeholder, c.getWidth() - insets.left - insets.right );
FlatUIUtils.drawString( c, g, clippedPlaceholder, x, y );
}
@Override

View File

@@ -146,10 +146,17 @@ public class FlatToggleButtonUI
int height = c.getHeight();
int width = c.getWidth();
boolean selected = ((AbstractButton)c).isSelected();
Color enabledColor = selected ? clientPropertyColor( c, TAB_BUTTON_SELECTED_BACKGROUND, tabSelectedBackground ) : null;
// use component background if explicitly set
if( enabledColor == null ) {
Color bg = c.getBackground();
if( isCustomBackground( bg ) )
enabledColor = bg;
}
// paint background
Color background = buttonStateColor( c,
selected ? clientPropertyColor( c, TAB_BUTTON_SELECTED_BACKGROUND, tabSelectedBackground ) : null,
Color background = buttonStateColor( c, enabledColor,
null, tabFocusBackground, tabHoverBackground, null );
if( background != null ) {
g.setColor( background );

View File

@@ -106,13 +106,15 @@ public class FlatToolBarSeparatorUI
float lineWidth = scale( 1f );
float offset = scale( 2f );
FlatUIUtils.setRenderingHints( (Graphics2D) g );
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g );
g.setColor( separatorColor );
if( isVertical( c ) )
((Graphics2D)g).fill( new Rectangle2D.Float( Math.round( (width - lineWidth) / 2f ), offset, lineWidth, height - (offset * 2) ) );
else
((Graphics2D)g).fill( new Rectangle2D.Float( offset, Math.round( (height - lineWidth) / 2f ), width - (offset * 2), lineWidth ) );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
}
private boolean isVertical( JComponent c ) {

View File

@@ -71,7 +71,7 @@ public class FlatToolTipUI
if( sharedPropertyChangedListener == null ) {
sharedPropertyChangedListener = e -> {
String name = e.getPropertyName();
if( name == "text" || name == "font" || name == "foreground" ) {
if( name == "tiptext" || name == "font" || name == "foreground" ) {
JToolTip toolTip = (JToolTip) e.getSource();
FlatLabelUI.updateHTMLRenderer( toolTip, toolTip.getTipText(), false );
}
@@ -116,7 +116,6 @@ public class FlatToolTipUI
FontMetrics fm = c.getFontMetrics( c.getFont() );
Insets insets = c.getInsets();
FlatUIUtils.setRenderingHints( (Graphics2D) g );
g.setColor( c.getForeground() );
List<String> lines = StringUtils.split( ((JToolTip)c).getTipText(), '\n' );

View File

@@ -16,6 +16,8 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
@@ -26,7 +28,9 @@ import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.CellRendererPane;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
@@ -145,9 +149,6 @@ public class FlatTreeUI
@Override
protected MouseListener createMouseListener() {
if( !wideSelection )
return super.createMouseListener();
return new BasicTreeUI.MouseHandler() {
@Override
public void mousePressed( MouseEvent e ) {
@@ -165,7 +166,7 @@ public class FlatTreeUI
}
private MouseEvent handleWideMouseEvent( MouseEvent e ) {
if( !tree.isEnabled() || !SwingUtilities.isLeftMouseButton( e ) || e.isConsumed() )
if( !isWideSelection() || !tree.isEnabled() || !SwingUtilities.isLeftMouseButton( e ) || e.isConsumed() )
return e;
int x = e.getX();
@@ -192,18 +193,26 @@ public class FlatTreeUI
@Override
protected PropertyChangeListener createPropertyChangeListener() {
if( !wideSelection )
return super.createPropertyChangeListener();
return new BasicTreeUI.PropertyChangeHandler() {
@Override
public void propertyChange( PropertyChangeEvent e ) {
super.propertyChange( e );
if( e.getSource() == tree && e.getPropertyName() == "dropLocation" ) {
JTree.DropLocation oldValue = (JTree.DropLocation) e.getOldValue();
repaintWideDropLocation( oldValue );
repaintWideDropLocation( tree.getDropLocation() );
if( e.getSource() == tree ) {
switch( e.getPropertyName() ) {
case TREE_WIDE_SELECTION:
case TREE_PAINT_SELECTION:
tree.repaint();
break;
case "dropLocation":
if( isWideSelection() ) {
JTree.DropLocation oldValue = (JTree.DropLocation) e.getOldValue();
repaintWideDropLocation( oldValue );
repaintWideDropLocation( tree.getDropLocation() );
}
break;
}
}
}
@@ -227,34 +236,22 @@ public class FlatTreeUI
TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf )
{
boolean isEditing = (editingComponent != null && editingRow == row);
boolean hasFocus = FlatUIUtils.isPermanentFocusOwner( tree );
boolean cellHasFocus = hasFocus && (row == getLeadSelectionRow());
boolean isSelected = tree.isRowSelected( row );
boolean isDropRow = isDropRow( row );
boolean needsSelectionPainting = (isSelected || isDropRow) && isPaintSelection();
// do not paint row if editing, except if selection needs painted
if( isEditing && !needsSelectionPainting )
return;
boolean hasFocus = FlatUIUtils.isPermanentFocusOwner( tree );
boolean cellHasFocus = hasFocus && (row == getLeadSelectionRow());
// if tree is used as cell renderer in another component (e.g. in Rhino JavaScript debugger),
// check whether that component is focused to get correct selection colors
if( !hasFocus && isSelected && tree.getParent() instanceof CellRendererPane )
hasFocus = FlatUIUtils.isPermanentFocusOwner( tree.getParent().getParent() );
// wide selection background
if( wideSelection && (isSelected || isDropRow) ) {
// fill background
g.setColor( isDropRow
? UIManager.getColor( "Tree.dropCellBackground" )
: (hasFocus ? selectionBackground : selectionInactiveBackground) );
g.fillRect( 0, bounds.y, tree.getWidth(), bounds.height );
// paint expand/collapse icon
if( shouldPaintExpandControl( path, row, isExpanded, hasBeenExpanded, isLeaf ) ) {
paintExpandControl( g, clipBounds, insets, bounds,
path, row, isExpanded, hasBeenExpanded, isLeaf );
}
}
if( isEditing )
return;
// get renderer component
Component rendererComponent = currentCellRenderer.getTreeCellRendererComponent( tree,
path.getLastPathComponent(), isSelected, isExpanded, isLeaf, row, cellHasFocus );
@@ -290,8 +287,51 @@ public class FlatTreeUI
}
}
// paint selection background
if( needsSelectionPainting ) {
// set selection color
Color oldColor = g.getColor();
g.setColor( isDropRow
? UIManager.getColor( "Tree.dropCellBackground" )
: (rendererComponent instanceof DefaultTreeCellRenderer
? ((DefaultTreeCellRenderer)rendererComponent).getBackgroundSelectionColor()
: (hasFocus ? selectionBackground : selectionInactiveBackground)) );
if( isWideSelection() ) {
// wide selection
g.fillRect( 0, bounds.y, tree.getWidth(), bounds.height );
// paint expand/collapse icon
// (was already painted before, but painted over with wide selection)
if( shouldPaintExpandControl( path, row, isExpanded, hasBeenExpanded, isLeaf ) ) {
paintExpandControl( g, clipBounds, insets, bounds,
path, row, isExpanded, hasBeenExpanded, isLeaf );
}
} else {
// non-wide selection
int xOffset = 0;
int imageOffset = 0;
if( rendererComponent instanceof JLabel ) {
JLabel label = (JLabel) rendererComponent;
Icon icon = label.getIcon();
imageOffset = (icon != null && label.getText() != null)
? icon.getIconWidth() + Math.max( label.getIconTextGap() - 1, 0 )
: 0;
xOffset = label.getComponentOrientation().isLeftToRight() ? imageOffset : 0;
}
g.fillRect( bounds.x + xOffset, bounds.y, bounds.width - imageOffset, bounds.height );
}
// this is actually not necessary because renderer should always set color
// before painting, but doing anyway to avoid any side effect (in bad renderers)
g.setColor( oldColor );
}
// paint renderer
rendererPane.paintComponent( g, rendererComponent, tree, bounds.x, bounds.y, bounds.width, bounds.height, true );
if( !isEditing )
rendererPane.paintComponent( g, rendererComponent, tree, bounds.x, bounds.y, bounds.width, bounds.height, true );
// restore background selection color and border selection color
if( oldBackgroundSelectionColor != null )
@@ -314,6 +354,14 @@ public class FlatTreeUI
@Override
protected Rectangle getDropLineRect( DropLocation loc ) {
Rectangle r = super.getDropLineRect( loc );
return wideSelection ? new Rectangle( 0, r.y, tree.getWidth(), r.height ) : r;
return isWideSelection() ? new Rectangle( 0, r.y, tree.getWidth(), r.height ) : r;
}
protected boolean isWideSelection() {
return clientPropertyBoolean( tree, TREE_WIDE_SELECTION, wideSelection );
}
protected boolean isPaintSelection() {
return clientPropertyBoolean( tree, TREE_PAINT_SELECTION, true );
}
}

View File

@@ -33,15 +33,13 @@ import java.awt.Shape;
import java.awt.Window;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.util.IdentityHashMap;
import java.util.WeakHashMap;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
import javax.swing.JComponent;
import javax.swing.JTable;
@@ -178,8 +176,18 @@ public class FlatUIUtils
* Returns whether the given component is the permanent focus owner and
* is in the active window. Used to paint focus indicators.
*/
@SuppressWarnings( "unchecked" )
public static boolean isPermanentFocusOwner( Component c ) {
KeyboardFocusManager keyboardFocusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
if( c instanceof JComponent ) {
Object value = ((JComponent)c).getClientProperty( FlatClientProperties.COMPONENT_FOCUS_OWNER );
if( value instanceof Predicate ) {
return ((Predicate<JComponent>)value).test( (JComponent) c ) &&
keyboardFocusManager.getActiveWindow() == SwingUtilities.windowForComponent( c );
}
}
return keyboardFocusManager.getPermanentFocusOwner() == c &&
keyboardFocusManager.getActiveWindow() == SwingUtilities.windowForComponent( c );
}
@@ -240,10 +248,57 @@ public class FlatUIUtils
/**
* Sets rendering hints used for painting.
*/
public static void setRenderingHints( Graphics2D g ) {
g.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL,
public static Object[] setRenderingHints( Graphics g ) {
Graphics2D g2 = (Graphics2D) g;
Object[] oldRenderingHints = new Object[] {
g2.getRenderingHint( RenderingHints.KEY_ANTIALIASING ),
g2.getRenderingHint( RenderingHints.KEY_STROKE_CONTROL ),
};
g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
g2.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL,
MAC_USE_QUARTZ ? RenderingHints.VALUE_STROKE_PURE : RenderingHints.VALUE_STROKE_NORMALIZE );
return oldRenderingHints;
}
/**
* Resets rendering hints previously set with {@link #setRenderingHints}.
*/
public static void resetRenderingHints( Graphics g, Object[] oldRenderingHints ) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING, oldRenderingHints[0] );
g2.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, oldRenderingHints[1] );
}
/**
* Temporary resets rendering hints set with {@link #setRenderingHints}
* and runs the given runnable.
* <p>
* This is intended for painting text while rendering hints are set.
* <p>
* If text antialiasing is disabled (in OS system settings or via
* {@code -Dawt.useSystemAAFontSettings=off}), but general antialiasing is enabled,
* then text is still painted using some kind of "grayscale" antialiasing,
* which may make the text look bold (depends on font and font size).
* To avoid this, temporary disable general antialiasing.
* This does not affect text rendering if text antialiasing is enabled (usually the default).
*/
public static void runWithoutRenderingHints( Graphics g, Object[] oldRenderingHints, Runnable runnable ) {
if( oldRenderingHints == null ) {
runnable.run();
return;
}
Graphics2D g2 = (Graphics2D) g;
Object[] oldRenderingHints2 = new Object[] {
g2.getRenderingHint( RenderingHints.KEY_ANTIALIASING ),
g2.getRenderingHint( RenderingHints.KEY_STROKE_CONTROL ),
};
resetRenderingHints( g2, oldRenderingHints );
runnable.run();
resetRenderingHints( g2, oldRenderingHints2 );
}
public static Color deriveColor( Color color, Color baseColor ) {
@@ -290,7 +345,7 @@ public class FlatUIUtils
float innerArc = arc - (lineWidth * 2);
// reduce outer arc slightly for small arcs to make the curve slightly wider
if( arc > 0 && arc < UIScale.scale( 10 ) )
if( focusWidth > 0 && arc > 0 && arc < UIScale.scale( 10 ) )
outerArc -= UIScale.scale( 2f );
Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
@@ -633,37 +688,6 @@ public class FlatUIUtils
.computeIfAbsent( key, k -> newInstanceSupplier.get() );
}
//---- class HoverListener ------------------------------------------------
public static class HoverListener
extends MouseAdapter
{
private final Component repaintComponent;
private final Consumer<Boolean> hoverChanged;
public HoverListener( Component repaintComponent, Consumer<Boolean> hoverChanged ) {
this.repaintComponent = repaintComponent;
this.hoverChanged = hoverChanged;
}
@Override
public void mouseEntered( MouseEvent e ) {
hoverChanged.accept( true );
repaint();
}
@Override
public void mouseExited( MouseEvent e ) {
hoverChanged.accept( false );
repaint();
}
private void repaint() {
if( repaintComponent != null && repaintComponent.isEnabled() )
repaintComponent.repaint();
}
}
//---- class RepaintFocusListener -----------------------------------------
public static class RepaintFocusListener

View File

@@ -227,7 +227,6 @@ public class JBRCustomDecorations
private final Color defaultActiveBorder = new Color( 0x707070 );
private final Color inactiveLightColor = new Color( 0xaaaaaa );
private final Color inactiveDarkColor = new Color( 0x3f3f3f );
private boolean colorizationAffectsBorders;
private Color activeColor = defaultActiveBorder;
@@ -273,7 +272,7 @@ public class JBRCustomDecorations
Object colorizationColorBalanceObj = toolkit.getDesktopProperty( "win.dwm.colorizationColorBalance" );
if( colorizationColorBalanceObj instanceof Integer ) {
int colorizationColorBalance = (Integer) colorizationColorBalanceObj;
if( colorizationColorBalance < 0 )
if( colorizationColorBalance < 0 || colorizationColorBalance > 100 )
colorizationColorBalance = 100;
if( colorizationColorBalance == 0 )
@@ -283,9 +282,15 @@ public class JBRCustomDecorations
float alpha = colorizationColorBalance / 100.0f;
float remainder = 1 - alpha;
int r = Math.round( (colorizationColor.getRed() * alpha + 0xD9 * remainder) );
int g = Math.round( (colorizationColor.getGreen() * alpha + 0xD9 * remainder) );
int b = Math.round( (colorizationColor.getBlue() * alpha + 0xD9 * remainder) );
int r = Math.round( colorizationColor.getRed() * alpha + 0xD9 * remainder );
int g = Math.round( colorizationColor.getGreen() * alpha + 0xD9 * remainder );
int b = Math.round( colorizationColor.getBlue() * alpha + 0xD9 * remainder );
// avoid potential IllegalArgumentException in Color constructor
r = Math.min( Math.max( r, 0 ), 255 );
g = Math.min( Math.max( g, 0 ), 255 );
b = Math.min( Math.max( b, 0 ), 255 );
return new Color( r, g, b );
}
return colorizationColor;
@@ -300,7 +305,14 @@ public class JBRCustomDecorations
Window window = SwingUtilities.windowForComponent( c );
boolean active = (window != null) ? window.isActive() : false;
g.setColor( active ? activeColor : (FlatLaf.isLafDark() ? inactiveDarkColor : inactiveLightColor) );
// paint top border
// - in light themes
// - in dark themes only for active windows if colorization affects borders
boolean paintTopBorder = !FlatLaf.isLafDark() || (active && colorizationAffectsBorders);
if( !paintTopBorder )
return;
g.setColor( active ? activeColor : inactiveLightColor );
HiDPIUtils.paintAtScale1x( (Graphics2D) g, x, y, width, height, this::paintImpl );
}

View File

@@ -0,0 +1,249 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.util;
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.Icon;
import javax.swing.JComponent;
import com.formdev.flatlaf.util.Animator.Interpolator;
/**
* Icon that automatically animates painting on component value changes.
* <p>
* {@link #getValue(Component)} returns the value of the component.
* If the value changes, then {@link #paintIconAnimated(Component, Graphics, int, int, float)}
* is invoked multiple times with animated value (from old value to new value).
* <p>
* Example for an animated icon:
* <pre>
* private class AnimatedMinimalTestIcon
* implements AnimatedIcon
* {
* &#64;Override public int getIconWidth() { return 100; }
* &#64;Override public int getIconHeight() { return 20; }
*
* &#64;Override
* public void paintIconAnimated( Component c, Graphics g, int x, int y, float animatedValue ) {
* int w = getIconWidth();
* int h = getIconHeight();
*
* g.setColor( Color.red );
* g.drawRect( x, y, w - 1, h - 1 );
* g.fillRect( x, y, Math.round( w * animatedValue ), h );
* }
*
* &#64;Override
* public float getValue( Component c ) {
* return ((AbstractButton)c).isSelected() ? 1 : 0;
* }
* }
*
* // sample usage
* JCheckBox checkBox = new JCheckBox( "test" );
* checkBox.setIcon( new AnimatedMinimalTestIcon() );
* </pre>
*
* Animation works only if the component passed to {@link #paintIcon(Component, Graphics, int, int)}
* is a instance of {@link JComponent}.
* A client property is set on the component to store the animation state.
*
* @author Karl Tauber
*/
public interface AnimatedIcon
extends Icon
{
@Override
public default void paintIcon( Component c, Graphics g, int x, int y ) {
AnimationSupport.paintIcon( this, c, g, x, y );
}
/**
* Paints the icon for the given animated value.
*
* @param c the component that this icon belongs to
* @param g the graphics context
* @param x the x coordinate of the icon
* @param y the y coordinate of the icon
* @param animatedValue the animated value, which is either equal to what {@link #getValue(Component)}
* returned, or somewhere between the previous value and the latest value
* that {@link #getValue(Component)} returned
*/
void paintIconAnimated( Component c, Graphics g, int x, int y, float animatedValue );
/**
* Gets the value of the component.
* <p>
* This can be any value and depends on the component.
* If the value changes, then this class animates from the old value to the new one.
* <p>
* For a toggle button this could be {@code 0} for off and {@code 1} for on.
*/
float getValue( Component c );
/**
* Returns whether animation is enabled for this icon (default is {@code true}).
*/
default boolean isAnimationEnabled() {
return true;
}
/**
* Returns the duration of the animation in milliseconds (default is 150).
*/
default int getAnimationDuration() {
return 150;
}
/**
* Returns the resolution of the animation in milliseconds (default is 10).
* Resolution is the amount of time between timing events.
*/
default int getAnimationResolution() {
return 10;
}
/**
* Returns the interpolator for the animation.
* Default is {@link CubicBezierEasing#STANDARD_EASING}.
*/
default Interpolator getAnimationInterpolator() {
return CubicBezierEasing.STANDARD_EASING;
}
/**
* Returns the client property key used to store the animation support.
*/
default Object getClientPropertyKey() {
return getClass();
}
//---- class AnimationSupport ---------------------------------------------
/**
* Animation support class that stores the animation state and implements the animation.
*/
class AnimationSupport
{
private float startValue;
private float targetValue;
private float animatedValue;
private float fraction;
private Animator animator;
// last x,y coordinates of the icon needed to repaint while animating
private int x;
private int y;
public static void paintIcon( AnimatedIcon icon, Component c, Graphics g, int x, int y ) {
if( !isAnimationEnabled( icon, c ) ) {
// paint without animation if animation is disabled or
// component is not a JComponent and therefore does not support
// client properties, which are required to keep animation state
paintIconImpl( icon, c, g, x, y, null );
return;
}
JComponent jc = (JComponent) c;
Object key = icon.getClientPropertyKey();
AnimationSupport as = (AnimationSupport) jc.getClientProperty( key );
if( as == null ) {
// painted first time --> do not animate, but remember current component value
as = new AnimationSupport();
as.startValue = as.targetValue = as.animatedValue = icon.getValue( c );
as.x = x;
as.y = y;
jc.putClientProperty( key, as );
} else {
// get component value
float value = icon.getValue( c );
if( value != as.targetValue ) {
// value changed --> (re)start animation
if( as.animator == null ) {
// create animator
AnimationSupport as2 = as;
as.animator = new Animator( icon.getAnimationDuration(), fraction -> {
// check whether component was removed while animation is running
if( !c.isDisplayable() ) {
as2.animator.stop();
return;
}
// compute animated value
as2.animatedValue = as2.startValue + ((as2.targetValue - as2.startValue) * fraction);
as2.fraction = fraction;
// repaint icon
c.repaint( as2.x, as2.y, icon.getIconWidth(), icon.getIconHeight() );
}, () -> {
as2.startValue = as2.animatedValue = as2.targetValue;
as2.animator = null;
} );
}
if( as.animator.isRunning() ) {
// if animation is still running, restart it from the current
// animated value to the new target value with reduced duration
as.animator.cancel();
int duration2 = (int) (icon.getAnimationDuration() * as.fraction);
if( duration2 > 0 )
as.animator.setDuration( duration2 );
as.startValue = as.animatedValue;
} else {
// new animation
as.animator.setDuration( icon.getAnimationDuration() );
as.animator.setResolution( icon.getAnimationResolution() );
as.animator.setInterpolator( icon.getAnimationInterpolator() );
as.animatedValue = as.startValue;
}
as.targetValue = value;
as.animator.start();
}
as.x = x;
as.y = y;
}
paintIconImpl( icon, c, g, x, y, as );
}
private static void paintIconImpl( AnimatedIcon icon, Component c, Graphics g, int x, int y, AnimationSupport as ) {
float value = (as != null) ? as.animatedValue : icon.getValue( c );
icon.paintIconAnimated( c, g, x, y, value );
}
private static boolean isAnimationEnabled( AnimatedIcon icon, Component c ) {
return Animator.useAnimation() && icon.isAnimationEnabled() && c instanceof JComponent;
}
public static void saveIconLocation( AnimatedIcon icon, Component c, int x, int y ) {
if( !isAnimationEnabled( icon, c ) )
return;
AnimationSupport as = (AnimationSupport) ((JComponent)c).getClientProperty( icon.getClientPropertyKey() );
if( as != null ) {
as.x = x;
as.y = y;
}
}
}
}

View File

@@ -44,6 +44,38 @@ public class ColorFunctions
: value);
}
/**
* Returns a color that is a mixture of two colors.
*
* @param color1 first color
* @param color2 second color
* @param weight the weight (in range 0-1) to mix the two colors.
* Larger weight uses more of first color, smaller weight more of second color.
* @return mixture of colors
*/
public static Color mix( Color color1, Color color2, float weight ) {
if( weight >= 1 )
return color1;
if( weight <= 0 )
return color2;
int r1 = color1.getRed();
int g1 = color1.getGreen();
int b1 = color1.getBlue();
int a1 = color1.getAlpha();
int r2 = color2.getRed();
int g2 = color2.getGreen();
int b2 = color2.getBlue();
int a2 = color2.getAlpha();
return new Color(
Math.round( r2 + ((r1 - r2) * weight) ),
Math.round( g2 + ((g1 - g2) * weight) ),
Math.round( b2 + ((b1 - b2) * weight) ),
Math.round( a2 + ((a1 - a2) * weight) ) );
}
//---- interface ColorFunction --------------------------------------------
public interface ColorFunction {
@@ -93,8 +125,23 @@ public class ColorFunctions
protected boolean shouldInverse( float[] hsla ) {
return increase
? hsla[hslIndex] >= 50
: hsla[hslIndex] < 50;
? hsla[hslIndex] > 65
: hsla[hslIndex] < 35;
}
@Override
public String toString() {
String name;
switch( hslIndex ) {
case 0: name = "spin"; break;
case 1: name = increase ? "saturate" : "desaturate"; break;
case 2: name = increase ? "lighten" : "darken"; break;
case 3: name = increase ? "fadein" : "fadeout"; break;
default: throw new IllegalArgumentException();
}
return String.format( "%s(%.0f%%%s%s)", name, amount,
(relative ? " relative" : ""),
(autoInverse ? " autoInverse" : "") );
}
}
@@ -116,5 +163,10 @@ public class ColorFunctions
public void apply( float[] hsla ) {
hsla[3] = clamp( amount );
}
@Override
public String toString() {
return String.format( "fade(%.0f%%)", amount );
}
}
}

View File

@@ -24,6 +24,13 @@ package com.formdev.flatlaf.util;
public class CubicBezierEasing
implements Animator.Interpolator
{
/**
* Standard easing as specified in Material design (0.4, 0, 0.2, 1).
*
* @see <a href="https://material.io/design/motion/speed.html#easing">https://material.io/design/motion/speed.html#easing</a>
*/
public static final CubicBezierEasing STANDARD_EASING = new CubicBezierEasing( 0.4f, 0f, 0.2f, 1f );
// common cubic-bezier easing functions (same as in CSS)
// https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function
public static final CubicBezierEasing EASE = new CubicBezierEasing( 0.25f, 0.1f, 0.25f, 1f );

View File

@@ -59,4 +59,17 @@ public class DerivedColor
public ColorFunction[] getFunctions() {
return functions;
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
buf.append( super.toString() );
for( ColorFunction function : functions ) {
buf.append( '\n' );
buf.append( function.toString() );
}
return buf.toString();
}
}

View File

@@ -134,7 +134,7 @@ public class HiDPIUtils
// - fractional scale factors result in fractional component Y device coordinates
// - fractional text Y device coordinates are rounded for horizontal lines of characters
// - maybe different rounding methods for drawing primitives (e.g. rectangle) and text
// - Java adds 0.5 to X/Y positions in before drawing string in BufferedTextPipe.enqueueGlyphList()
// - Java adds 0.5 to X/Y positions before drawing string in BufferedTextPipe.enqueueGlyphList()
// this is not the optimal solution, but works very good in most cases
// (tested with class FlatPaintingStringTest on Windows 10 with font "Segoe UI")

View File

@@ -36,9 +36,14 @@ import javax.swing.plaf.UIResource;
import com.formdev.flatlaf.FlatSystemProperties;
/**
* Two scaling modes are supported for HiDPI displays:
* This class handles scaling in Swing UIs.
* It computes user scaling factor based on font size and
* provides methods to scale integer, float, {@link Dimension} and {@link Insets}.
* This class is look and feel independent.
* <p>
* Two scaling modes are supported by FlatLaf for HiDPI displays:
*
* 1) system scaling mode
* <h3>1) system scaling mode</h3>
*
* This mode is supported since Java 9 on all platforms and in some Java 8 VMs
* (e.g. Apple and JetBrains). The JRE determines the scale factor per-display and
@@ -49,7 +54,7 @@ import com.formdev.flatlaf.FlatSystemProperties;
* The scale factor may be different for each connected display.
* The scale factor may change for a window when moving the window from one display to another one.
*
* 2) user scaling mode
* <h3>2) user scaling mode</h3>
*
* This mode is mainly for Java 8 compatibility, but is also used on Linux
* or if the default font is changed.
@@ -85,6 +90,9 @@ public class UIScale
private static Boolean jreHiDPI;
/**
* Returns whether system scaling is enabled.
*/
public static boolean isSystemScalingEnabled() {
if( jreHiDPI != null )
return jreHiDPI;
@@ -112,10 +120,16 @@ public class UIScale
return jreHiDPI;
}
/**
* Returns the system scale factor for the given graphics context.
*/
public static double getSystemScaleFactor( Graphics2D g ) {
return isSystemScalingEnabled() ? g.getDeviceConfiguration().getDefaultTransform().getScaleX() : 1;
return isSystemScalingEnabled() ? getSystemScaleFactor( g.getDeviceConfiguration() ) : 1;
}
/**
* Returns the system scale factor for the given graphics configuration.
*/
public static double getSystemScaleFactor( GraphicsConfiguration gc ) {
return (isSystemScalingEnabled() && gc != null) ? gc.getDefaultTransform().getScaleX() : 1;
}
@@ -297,11 +311,17 @@ public class UIScale
}
}
/**
* Returns the user scale factor.
*/
public static float getUserScaleFactor() {
initialize();
return scaleFactor;
}
/**
* Sets the user scale factor.
*/
private static void setUserScaleFactor( float scaleFactor ) {
if( scaleFactor <= 1f )
scaleFactor = 1f;
@@ -318,40 +338,65 @@ public class UIScale
changeSupport.firePropertyChange( "userScaleFactor", oldScaleFactor, scaleFactor );
}
/**
* Multiplies the given value by the user scale factor.
*/
public static float scale( float value ) {
initialize();
return (scaleFactor == 1) ? value : (value * scaleFactor);
}
/**
* Multiplies the given value by the user scale factor and rounds the result.
*/
public static int scale( int value ) {
initialize();
return (scaleFactor == 1) ? value : Math.round( value * scaleFactor );
}
/**
* Similar as scale(int) but always "rounds down".
* Similar as {@link #scale(int)} but always "rounds down".
* <p>
* For use in special cases. {@link #scale(int)} is the preferred method.
*/
public static int scale2( int value ) {
initialize();
return (scaleFactor == 1) ? value : (int) (value * scaleFactor);
}
/**
* Divides the given value by the user scale factor.
*/
public static float unscale( float value ) {
initialize();
return (scaleFactor == 1f) ? value : (value / scaleFactor);
}
/**
* Divides the given value by the user scale factor and rounds the result.
*/
public static int unscale( int value ) {
initialize();
return (scaleFactor == 1f) ? value : Math.round( value / scaleFactor );
}
/**
* If user scale factor is not 1, scale the given graphics context by invoking
* {@link Graphics2D#scale(double, double)} with user scale factor.
*/
public static void scaleGraphics( Graphics2D g ) {
initialize();
if( scaleFactor != 1f )
g.scale( scaleFactor, scaleFactor );
}
/**
* Scales the given dimension with the user scale factor.
* <p>
* If user scale factor is 1, then the given dimension is simply returned.
* Otherwise a new instance of {@link Dimension} or {@link DimensionUIResource}
* is returned, depending on whether the passed dimension implements {@link UIResource}.
*/
public static Dimension scale( Dimension dimension ) {
initialize();
return (dimension == null || scaleFactor == 1f)
@@ -361,6 +406,13 @@ public class UIScale
: new Dimension ( scale( dimension.width ), scale( dimension.height ) ));
}
/**
* Scales the given insets with the user scale factor.
* <p>
* If user scale factor is 1, then the given insets is simply returned.
* Otherwise a new instance of {@link Insets} or {@link InsetsUIResource}
* is returned, depending on whether the passed dimension implements {@link UIResource}.
*/
public static Insets scale( Insets insets ) {
initialize();
return (insets == null || scaleFactor == 1f)

View File

@@ -14,29 +14,49 @@
# limitations under the License.
#
#
# This file is loaded for "FlatLaf Darcula" theme (that extend class FlatDarculaLaf)
# and for all dark IntelliJ Platform themes.
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
# NOTE: Avoid copying the whole content of this file to own properties files.
# This will make upgrading to newer FlatLaf versions complex and error-prone.
# Instead copy and modify only those properties that you need to alter.
#
# Colors and style mostly based on Darcula theme from IntelliJ IDEA Community Edition,
# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
# See: https://github.com/JetBrains/intellij-community/
#---- Button ----
Button.default.boldText=true
Button.innerFocusWidth = 0
Button.default.boldText = true
#---- CheckBox ----
CheckBox.icon.focusedBackground = null
#---- Component ----
Component.focusWidth=2
Component.innerFocusWidth=0
Component.innerOutlineWidth=0
Component.arrowType=triangle
Component.focusWidth = 2
Component.innerFocusWidth = 0
Component.innerOutlineWidth = 0
Component.arrowType = triangle
#---- ProgressBar ----
ProgressBar.foreground=#a0a0a0
ProgressBar.selectionForeground=@background
ProgressBar.foreground = #a0a0a0
ProgressBar.selectionForeground = @background
#---- RadioButton ----
RadioButton.icon.centerDiameter=5
RadioButton.icon.centerDiameter = 5

View File

@@ -14,297 +14,314 @@
# limitations under the License.
#
#
# This file is loaded for all dark themes (that extend class FlatDarkLaf).
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
# NOTE: Avoid copying the whole content of this file to own properties files.
# This will make upgrading to newer FlatLaf versions complex and error-prone.
# Instead copy and modify only those properties that you need to alter.
#
# Colors and style mostly based on Darcula theme from IntelliJ IDEA Community Edition,
# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
# See: https://github.com/JetBrains/intellij-community/
#---- variables ----
@background=#3c3f41
@foreground=#bbb
@selectionBackground=#4B6EAF
@selectionForeground=@foreground
@selectionInactiveBackground=#0D293E
@selectionInactiveForeground=@foreground
@disabledText=#888
@textComponentBackground=#45494A
@menuBackground=darken(@background,5%)
@menuHoverBackground=lighten(@menuBackground,10%,derived)
@menuCheckBackground=darken(@selectionBackground,10%)
@menuAcceleratorForeground=darken(@foreground,15%)
@menuAcceleratorSelectionForeground=@selectionForeground
@cellFocusColor=#000
@icon=#adadad
@background = #3c3f41
@foreground = #bbb
@selectionBackground = #4B6EAF
@selectionForeground = @foreground
@selectionInactiveBackground = #0D293E
@selectionInactiveForeground = @foreground
@disabledText = #888
@textComponentBackground = #45494A
@menuBackground = darken(@background,5%)
@menuHoverBackground = lighten(@menuBackground,10%,derived)
@menuCheckBackground = darken(@selectionBackground,10%,derived noAutoInverse)
@menuAcceleratorForeground = darken(@foreground,15%)
@menuAcceleratorSelectionForeground = @selectionForeground
@cellFocusColor = #000
@icon = #adadad
# for buttons within components (e.g. combobox or spinner)
@buttonArrowColor = #9A9DA1
@buttonDisabledArrowColor = darken(@buttonArrowColor,25%)
@buttonHoverArrowColor = lighten(@buttonArrowColor,10%,derived noAutoInverse)
@buttonPressedArrowColor = lighten(@buttonArrowColor,20%,derived noAutoInverse)
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
@dropCellBackground=darken(List.selectionBackground,10%,lazy)
@dropCellForeground=lazy(List.selectionForeground)
@dropLineColor=lighten(List.selectionBackground,10%,lazy)
@dropLineShortColor=lighten(List.selectionBackground,30%,lazy)
@dropCellBackground = darken(List.selectionBackground,10%,lazy)
@dropCellForeground = lazy(List.selectionForeground)
@dropLineColor = lighten(List.selectionBackground,10%,lazy)
@dropLineShortColor = lighten(List.selectionBackground,30%,lazy)
#---- system colors ----
activeCaption=#434E60
inactiveCaption=#393C3D
controlHighlight=darken($controlShadow,20%)
controlLtHighlight=darken($controlShadow,25%)
controlDkShadow=lighten($controlShadow,10%)
activeCaption = #434E60
inactiveCaption = #393C3D
controlHighlight = darken($controlShadow,20%)
controlLtHighlight = darken($controlShadow,25%)
controlDkShadow = lighten($controlShadow,10%)
#---- Button ----
Button.background=#4c5052
Button.hoverBackground=lighten($Button.background,3%,derived)
Button.pressedBackground=lighten($Button.background,6%,derived)
Button.selectedBackground=lighten($Button.background,10%,derived)
Button.selectedForeground=@foreground
Button.disabledSelectedBackground=lighten($Button.background,3%,derived)
Button.background = #4c5052
Button.hoverBackground = lighten($Button.background,3%,derived)
Button.pressedBackground = lighten($Button.background,6%,derived)
Button.selectedBackground = lighten($Button.background,10%,derived)
Button.selectedForeground = @foreground
Button.disabledSelectedBackground = lighten($Button.background,3%,derived)
Button.borderColor=#5e6060
Button.disabledBorderColor=#5e6060
Button.focusedBorderColor=#466d94
Button.hoverBorderColor=$Button.focusedBorderColor
Button.borderColor = #5e6060
Button.disabledBorderColor = $Button.borderColor
Button.focusedBorderColor = $Component.focusedBorderColor
Button.hoverBorderColor = $Button.focusedBorderColor
Button.default.background=#365880
Button.default.foreground=#bbb
Button.default.hoverBackground=lighten($Button.default.background,3%,derived)
Button.default.pressedBackground=lighten($Button.default.background,6%,derived)
Button.default.borderColor=#4c708c
Button.default.hoverBorderColor=#537699
Button.default.focusedBorderColor=#537699
Button.default.focusColor=#43688c
Button.default.boldText=true
Button.innerFocusWidth = 1
Button.toolbar.hoverBackground=lighten($Button.background,1%,derived)
Button.toolbar.pressedBackground=lighten($Button.background,4%,derived)
Button.toolbar.selectedBackground=lighten($Button.background,7%,derived)
Button.default.background = #365880
Button.default.foreground = #bbb
Button.default.hoverBackground = lighten($Button.default.background,3%,derived)
Button.default.pressedBackground = lighten($Button.default.background,6%,derived)
Button.default.borderColor = #4c708c
Button.default.hoverBorderColor = #537699
Button.default.focusedBorderColor = #537699
Button.default.focusColor = #43688c
Button.default.boldText = true
Button.toolbar.hoverBackground = lighten($Button.background,1%,derived)
Button.toolbar.pressedBackground = lighten($Button.background,4%,derived)
Button.toolbar.selectedBackground = lighten($Button.background,7%,derived)
#---- CheckBox ----
# enabled
CheckBox.icon.borderColor=#6B6B6B
CheckBox.icon.background=#43494A
CheckBox.icon.selectedBorderColor=$CheckBox.icon.borderColor
CheckBox.icon.selectedBackground=$CheckBox.icon.background
CheckBox.icon.checkmarkColor=#A7A7A7
CheckBox.icon.borderColor = #6B6B6B
CheckBox.icon.background = #43494A
CheckBox.icon.selectedBorderColor = $CheckBox.icon.borderColor
CheckBox.icon.selectedBackground = $CheckBox.icon.background
CheckBox.icon.checkmarkColor = #A7A7A7
# disabled
CheckBox.icon.disabledBorderColor=#545556
CheckBox.icon.disabledBackground=@background
CheckBox.icon.disabledCheckmarkColor=#606060
CheckBox.icon.disabledBorderColor = #545556
CheckBox.icon.disabledBackground = @background
CheckBox.icon.disabledCheckmarkColor = #606060
# focused
CheckBox.icon.focusedBorderColor=#466D94
CheckBox.icon.selectedFocusedBorderColor=#466D94
CheckBox.icon.focusedBorderColor = #466D94
CheckBox.icon.focusedBackground = fade($CheckBox.icon.focusedBorderColor,30%)
# hover
CheckBox.icon.hoverBorderColor=$CheckBox.icon.focusedBorderColor
CheckBox.icon.hoverBackground=lighten($CheckBox.icon.background,3%,derived)
CheckBox.icon.hoverBorderColor = $CheckBox.icon.focusedBorderColor
CheckBox.icon.hoverBackground = lighten($CheckBox.icon.background,3%,derived)
# pressed
CheckBox.icon.pressedBackground=lighten($CheckBox.icon.background,6%,derived)
CheckBox.icon.pressedBackground = lighten($CheckBox.icon.background,6%,derived)
# used if CheckBox.icon.style=filled
# used if CheckBox.icon.style = filled
# enabled
CheckBox.icon[filled].selectedBorderColor=$CheckBox.icon.checkmarkColor
CheckBox.icon[filled].selectedBackground=$CheckBox.icon.checkmarkColor
CheckBox.icon[filled].checkmarkColor=$CheckBox.icon.background
CheckBox.icon[filled].selectedBorderColor = $CheckBox.icon.checkmarkColor
CheckBox.icon[filled].selectedBackground = $CheckBox.icon.checkmarkColor
CheckBox.icon[filled].checkmarkColor = $CheckBox.icon.background
# hover
CheckBox.icon[filled].selectedHoverBackground=darken($CheckBox.icon[filled].selectedBackground,3%)
CheckBox.icon[filled].selectedHoverBackground = darken($CheckBox.icon[filled].selectedBackground,3%,derived)
# pressed
CheckBox.icon[filled].selectedPressedBackground=darken($CheckBox.icon[filled].selectedBackground,6%)
CheckBox.icon[filled].selectedPressedBackground = darken($CheckBox.icon[filled].selectedBackground,6%,derived)
#---- ComboBox ----
ComboBox.buttonEditableBackground=#404445
ComboBox.buttonArrowColor=#9A9DA1
ComboBox.buttonDisabledArrowColor=#585858
ComboBox.buttonHoverArrowColor=#bbb
ComboBox.buttonEditableBackground = darken($ComboBox.background,2%)
#---- Component ----
Component.borderColor=#646464
Component.disabledBorderColor=#646464
Component.focusedBorderColor=#466d94
Component.focusColor=#3d6185
Component.linkColor=#589df6
Component.grayFilter=-20,-70,100
Component.borderColor = #646464
Component.disabledBorderColor = #646464
Component.focusedBorderColor = #466d94
Component.focusColor = #3d6185
Component.linkColor = #589df6
Component.grayFilter = -20,-70,100
Component.error.borderColor=desaturate($Component.error.focusedBorderColor,25%)
Component.error.focusedBorderColor=#8b3c3c
Component.warning.borderColor=darken(desaturate($Component.warning.focusedBorderColor,20%),10%)
Component.warning.focusedBorderColor=#ac7920
Component.custom.borderColor=desaturate(#f00,50%,relative derived noAutoInverse)
Component.error.borderColor = desaturate($Component.error.focusedBorderColor,25%)
Component.error.focusedBorderColor = #8b3c3c
Component.warning.borderColor = darken(desaturate($Component.warning.focusedBorderColor,20%),10%)
Component.warning.focusedBorderColor = #ac7920
Component.custom.borderColor = desaturate(#f00,50%,relative derived noAutoInverse)
#---- Desktop ----
Desktop.background=#3E434C
Desktop.background = #3E434C
#---- DesktopIcon ----
DesktopIcon.background=lighten($Desktop.background,10%)
DesktopIcon.background = lighten($Desktop.background,10%)
#---- InternalFrame ----
InternalFrame.activeTitleBackground=darken(@background,10%)
InternalFrame.activeTitleForeground=@foreground
InternalFrame.inactiveTitleBackground=darken(@background,5%)
InternalFrame.inactiveTitleForeground=@disabledText
InternalFrame.activeTitleBackground = darken(@background,10%)
InternalFrame.activeTitleForeground = @foreground
InternalFrame.inactiveTitleBackground = darken(@background,5%)
InternalFrame.inactiveTitleForeground = @disabledText
InternalFrame.activeBorderColor=darken(@background,7%)
InternalFrame.inactiveBorderColor=darken(@background,3%)
InternalFrame.activeBorderColor = darken(@background,7%)
InternalFrame.inactiveBorderColor = darken(@background,3%)
InternalFrame.buttonHoverBackground=lighten($InternalFrame.activeTitleBackground,10%,derived)
InternalFrame.buttonPressedBackground=lighten($InternalFrame.activeTitleBackground,20%,derived)
InternalFrame.closeHoverBackground=lazy(Actions.Red)
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
InternalFrame.closeHoverForeground=#fff
InternalFrame.closePressedForeground=#fff
InternalFrame.buttonHoverBackground = lighten($InternalFrame.activeTitleBackground,10%,derived)
InternalFrame.buttonPressedBackground = lighten($InternalFrame.activeTitleBackground,20%,derived)
InternalFrame.closeHoverBackground = lazy(Actions.Red)
InternalFrame.closePressedBackground = darken(Actions.Red,10%,lazy)
InternalFrame.closeHoverForeground = #fff
InternalFrame.closePressedForeground = #fff
InternalFrame.activeDropShadowOpacity=0.5
InternalFrame.inactiveDropShadowOpacity=0.75
InternalFrame.activeDropShadowOpacity = 0.5
InternalFrame.inactiveDropShadowOpacity = 0.75
#---- Menu ----
Menu.icon.arrowColor=#A7A7A7
Menu.icon.disabledArrowColor=#606060
Menu.icon.arrowColor = #A7A7A7
Menu.icon.disabledArrowColor = #606060
#---- MenuBar ----
MenuBar.borderColor=#515151
MenuBar.borderColor = #515151
#---- MenuItemCheckBox ----
MenuItemCheckBox.icon.checkmarkColor=#A7A7A7
MenuItemCheckBox.icon.disabledCheckmarkColor=#606060
MenuItemCheckBox.icon.checkmarkColor = #A7A7A7
MenuItemCheckBox.icon.disabledCheckmarkColor = #606060
#---- PasswordField ----
PasswordField.capsLockIconColor=#ffffff64
PasswordField.capsLockIconColor = #ffffff64
#---- Popup ----
Popup.dropShadowColor=#000
Popup.dropShadowOpacity=0.25
Popup.dropShadowColor = #000
Popup.dropShadowOpacity = 0.25
#---- PopupMenu ----
PopupMenu.borderColor=#5e5e5e
PopupMenu.borderColor = #5e5e5e
#---- ProgressBar ----
ProgressBar.background=#555
ProgressBar.foreground=#4A88C7
ProgressBar.selectionForeground=@foreground
ProgressBar.selectionBackground=@foreground
ProgressBar.background = #555
ProgressBar.foreground = #4A88C7
ProgressBar.selectionForeground = @foreground
ProgressBar.selectionBackground = @foreground
#---- RootPane ----
RootPane.activeBorderColor=darken(@background,7%,derived)
RootPane.inactiveBorderColor=darken(@background,5%,derived)
RootPane.activeBorderColor = lighten(@background,7%,derived)
RootPane.inactiveBorderColor = lighten(@background,5%,derived)
#---- ScrollBar ----
ScrollBar.track=lighten(@background,1%,derived noAutoInverse)
ScrollBar.thumb=lighten($ScrollBar.track,10%,derived noAutoInverse)
ScrollBar.hoverTrackColor=lighten($ScrollBar.track,4%,derived noAutoInverse)
ScrollBar.hoverThumbColor=lighten($ScrollBar.thumb,10%,derived noAutoInverse)
ScrollBar.pressedThumbColor=lighten($ScrollBar.thumb,15%,derived noAutoInverse)
ScrollBar.hoverButtonBackground=lighten(@background,5%,derived noAutoInverse)
ScrollBar.pressedButtonBackground=lighten(@background,10%,derived noAutoInverse)
ScrollBar.track = lighten(@background,1%,derived noAutoInverse)
ScrollBar.thumb = lighten($ScrollBar.track,10%,derived noAutoInverse)
ScrollBar.hoverTrackColor = lighten($ScrollBar.track,4%,derived noAutoInverse)
ScrollBar.hoverThumbColor = lighten($ScrollBar.thumb,10%,derived noAutoInverse)
ScrollBar.pressedThumbColor = lighten($ScrollBar.thumb,15%,derived noAutoInverse)
ScrollBar.hoverButtonBackground = lighten(@background,5%,derived noAutoInverse)
ScrollBar.pressedButtonBackground = lighten(@background,10%,derived noAutoInverse)
#---- Separator ----
Separator.foreground=#515151
Separator.foreground = #515151
#---- Slider ----
Slider.trackValueColor=#4A88C7
Slider.trackColor=#646464
Slider.thumbColor=$Slider.trackValueColor
Slider.tickColor=#888
Slider.focusedColor=fade($Component.focusColor,70%,derived)
Slider.hoverThumbColor=darken($Slider.thumbColor,10%,derived)
Slider.pressedThumbColor=darken($Slider.thumbColor,15%,derived)
Slider.disabledTrackColor=#4c5052
Slider.disabledThumbColor=$Slider.disabledTrackColor
Slider.trackValueColor = #4A88C7
Slider.trackColor = #646464
Slider.thumbColor = $Slider.trackValueColor
Slider.tickColor = #888
Slider.focusedColor = fade($Component.focusColor,70%,derived)
Slider.hoverThumbColor = lighten($Slider.thumbColor,5%,derived)
Slider.pressedThumbColor = lighten($Slider.thumbColor,8%,derived)
Slider.disabledTrackColor = #4c5052
Slider.disabledThumbColor = $Slider.disabledTrackColor
#---- SplitPane ----
SplitPaneDivider.draggingColor=#646464
SplitPaneDivider.oneTouchHoverArrowColor=#7A7D81
SplitPaneDivider.draggingColor = #646464
#---- TabbedPane ----
TabbedPane.underlineColor=#4A88C7
TabbedPane.disabledUnderlineColor=#7a7a7a
TabbedPane.hoverColor=darken($TabbedPane.background,5%,derived noAutoInverse)
TabbedPane.focusColor=#3d4b5c
TabbedPane.contentAreaColor=#646464
TabbedPane.underlineColor = #4A88C7
TabbedPane.disabledUnderlineColor = #7a7a7a
TabbedPane.hoverColor = darken($TabbedPane.background,5%,derived noAutoInverse)
TabbedPane.focusColor = #3d4b5c
TabbedPane.contentAreaColor = #646464
TabbedPane.buttonHoverBackground=darken($TabbedPane.background,5%,derived noAutoInverse)
TabbedPane.buttonPressedBackground=darken($TabbedPane.background,8%,derived noAutoInverse)
TabbedPane.buttonHoverBackground = darken($TabbedPane.background,5%,derived noAutoInverse)
TabbedPane.buttonPressedBackground = darken($TabbedPane.background,8%,derived noAutoInverse)
TabbedPane.closeBackground=null
TabbedPane.closeForeground=@disabledText
TabbedPane.closeHoverBackground=lighten($TabbedPane.background,5%,derived)
TabbedPane.closeHoverForeground=@foreground
TabbedPane.closePressedBackground=lighten($TabbedPane.background,10%,derived)
TabbedPane.closePressedForeground=$TabbedPane.closeHoverForeground
TabbedPane.closeBackground = null
TabbedPane.closeForeground = @disabledText
TabbedPane.closeHoverBackground = lighten($TabbedPane.background,5%,derived)
TabbedPane.closeHoverForeground = @foreground
TabbedPane.closePressedBackground = lighten($TabbedPane.background,10%,derived)
TabbedPane.closePressedForeground = $TabbedPane.closeHoverForeground
#---- Table ----
Table.gridColor=lighten($Table.background,3%)
Table.gridColor = lighten($Table.background,5%)
#---- TableHeader ----
TableHeader.separatorColor=lighten($TableHeader.background,10%)
TableHeader.bottomSeparatorColor=$TableHeader.separatorColor
TableHeader.separatorColor = lighten($TableHeader.background,10%)
TableHeader.bottomSeparatorColor = $TableHeader.separatorColor
#---- TitlePane ----
TitlePane.embeddedForeground=darken($TitlePane.foreground,15%)
TitlePane.buttonHoverBackground=lighten($TitlePane.background,10%,derived)
TitlePane.buttonPressedBackground=lighten($TitlePane.background,20%,derived)
TitlePane.embeddedForeground = darken($TitlePane.foreground,15%)
TitlePane.buttonHoverBackground = lighten($TitlePane.background,10%,derived)
TitlePane.buttonPressedBackground = lighten($TitlePane.background,20%,derived)
#---- ToggleButton ----
ToggleButton.selectedBackground=lighten($ToggleButton.background,10%,derived)
ToggleButton.disabledSelectedBackground=lighten($ToggleButton.background,3%,derived)
ToggleButton.selectedBackground = lighten($ToggleButton.background,10%,derived)
ToggleButton.disabledSelectedBackground = lighten($ToggleButton.background,3%,derived)
ToggleButton.toolbar.selectedBackground=lighten($ToggleButton.background,7%,derived)
ToggleButton.toolbar.selectedBackground = lighten($ToggleButton.background,7%,derived)
#---- ToolTip ----
ToolTip.border=4,6,4,6
ToolTip.background=#1e2123
ToolTip.border = 4,6,4,6
ToolTip.background = #1e2123
#---- Tree ----
Tree.hash=#505355
Tree.hash = lighten($Tree.background,5%)

View File

@@ -14,33 +14,46 @@
# limitations under the License.
#
#
# This file is loaded for "FlatLaf IntelliJ" theme (that extend class FlatIntelliJLaf)
# and for all light IntelliJ Platform themes.
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
# NOTE: Avoid copying the whole content of this file to own properties files.
# This will make upgrading to newer FlatLaf versions complex and error-prone.
# Instead copy and modify only those properties that you need to alter.
#
# Colors and style mostly based on IntelliJ theme from IntelliJ IDEA Community Edition,
# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
# See: https://github.com/JetBrains/intellij-community/
#---- Button ----
Button.focusedBackground=null
Button.focusedBackground = null
Button.default.background=#4D8AC9
Button.default.foreground=#fff
Button.default.focusedBackground=null
Button.default.borderColor=#3D75B2
Button.default.hoverBorderColor=#A9C9F5
Button.default.focusedBorderColor=#A9C9F5
Button.default.focusColor=#97c3f3
Button.default.boldText=true
Button.default.borderWidth=1
Button.default.background = #4D8AC9
Button.default.foreground = #fff
Button.default.focusedBackground = null
Button.default.borderColor = #3D75B2
Button.default.hoverBorderColor = #A9C9F5
Button.default.focusedBorderColor = #A9C9F5
Button.default.focusColor = #97c3f3
Button.default.boldText = true
Button.default.borderWidth = 1
#---- CheckBox ----
CheckBox.icon.style=filled
CheckBox.icon.style = filled
#---- Component ----
Component.focusWidth=2
Component.innerFocusWidth=0
Component.innerOutlineWidth=0
Component.arrowType=triangle
Component.focusWidth = 2
Component.innerFocusWidth = 0
Component.innerOutlineWidth = 0
Component.arrowType = triangle

View File

@@ -14,309 +14,325 @@
# limitations under the License.
#
#
# This file is loaded for all light themes (that extend class FlatLightLaf).
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
# NOTE: Avoid copying the whole content of this file to own properties files.
# This will make upgrading to newer FlatLaf versions complex and error-prone.
# Instead copy and modify only those properties that you need to alter.
#
# Colors and style mostly based on IntelliJ theme from IntelliJ IDEA Community Edition,
# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
# See: https://github.com/JetBrains/intellij-community/
#---- variables ----
@background=#f2f2f2
@foreground=#000
@selectionBackground=#2675BF
@selectionForeground=#fff
@selectionInactiveBackground=#d4d4d4
@selectionInactiveForeground=@foreground
@disabledText=#8C8C8C
@textComponentBackground=#fff
@menuBackground=#fff
@menuHoverBackground=darken(@menuBackground,10%,derived)
@menuCheckBackground=lighten(@selectionBackground,40%)
@menuAcceleratorForeground=lighten(@foreground,30%)
@menuAcceleratorSelectionForeground=@selectionForeground
@cellFocusColor=#000
@icon=#afafaf
@background = #f2f2f2
@foreground = #000
@selectionBackground = #2675BF
@selectionForeground = #fff
@selectionInactiveBackground = #d4d4d4
@selectionInactiveForeground = @foreground
@disabledText = #8C8C8C
@textComponentBackground = #fff
@menuBackground = #fff
@menuHoverBackground = darken(@menuBackground,10%,derived)
@menuCheckBackground = lighten(@selectionBackground,40%,derived noAutoInverse)
@menuAcceleratorForeground = lighten(@foreground,30%)
@menuAcceleratorSelectionForeground = @selectionForeground
@cellFocusColor = #000
@icon = #afafaf
# for buttons within components (e.g. combobox or spinner)
@buttonArrowColor = #666
@buttonDisabledArrowColor = lighten(@buttonArrowColor,25%)
@buttonHoverArrowColor = lighten(@buttonArrowColor,20%,derived noAutoInverse)
@buttonPressedArrowColor = lighten(@buttonArrowColor,30%,derived noAutoInverse)
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
@dropCellBackground=lighten(List.selectionBackground,10%,lazy)
@dropCellForeground=lazy(List.selectionForeground)
@dropLineColor=lighten(List.selectionBackground,20%,lazy)
@dropLineShortColor=darken(List.selectionBackground,20%,lazy)
@dropCellBackground = lighten(List.selectionBackground,10%,lazy)
@dropCellForeground = lazy(List.selectionForeground)
@dropLineColor = lighten(List.selectionBackground,20%,lazy)
@dropLineShortColor = darken(List.selectionBackground,20%,lazy)
#---- system colors ----
activeCaption=#99b4d1
inactiveCaption=#bfcddb
controlHighlight=#e3e3e3
controlLtHighlight=#fff
controlDkShadow=darken($controlShadow,15%)
activeCaption = #99b4d1
inactiveCaption = #bfcddb
controlHighlight = lighten($controlShadow,12%)
controlLtHighlight = lighten($controlShadow,25%)
controlDkShadow = darken($controlShadow,15%)
#---- Button ----
Button.background=#fff
Button.focusedBackground=#e3f1fa
Button.hoverBackground=darken($Button.background,3%,derived)
Button.pressedBackground=darken($Button.background,10%,derived)
Button.selectedBackground=darken($Button.background,20%,derived)
Button.selectedForeground=@foreground
Button.disabledSelectedBackground=darken($Button.background,13%,derived)
Button.background = #fff
Button.focusedBackground = #e3f1fa
Button.hoverBackground = darken($Button.background,3%,derived)
Button.pressedBackground = darken($Button.background,10%,derived)
Button.selectedBackground = darken($Button.background,20%,derived)
Button.selectedForeground = @foreground
Button.disabledSelectedBackground = darken($Button.background,13%,derived)
Button.borderColor=$Component.borderColor
Button.disabledBorderColor=$Component.disabledBorderColor
Button.focusedBorderColor=$Component.focusedBorderColor
Button.hoverBorderColor=$Button.focusedBorderColor
Button.borderColor = $Component.borderColor
Button.disabledBorderColor = $Component.disabledBorderColor
Button.focusedBorderColor = $Component.focusedBorderColor
Button.hoverBorderColor = $Button.focusedBorderColor
Button.default.background=$Button.background
Button.default.foreground=@foreground
Button.default.focusedBackground=$Button.focusedBackground
Button.default.hoverBackground=$Button.hoverBackground
Button.default.pressedBackground=$Button.pressedBackground
Button.default.borderColor=#4F9EE3
Button.default.hoverBorderColor=$Button.hoverBorderColor
Button.default.focusedBorderColor=$Button.focusedBorderColor
Button.default.focusColor=$Component.focusColor
Button.default.borderWidth=2
Button.innerFocusWidth = 0
Button.toolbar.hoverBackground=darken($Button.background,12%,derived)
Button.toolbar.pressedBackground=darken($Button.background,15%,derived)
Button.toolbar.selectedBackground=$Button.selectedBackground
Button.default.background = $Button.background
Button.default.foreground = @foreground
Button.default.focusedBackground = $Button.focusedBackground
Button.default.hoverBackground = darken($Button.default.background,3%,derived)
Button.default.pressedBackground = darken($Button.default.background,10%,derived)
Button.default.borderColor = #4F9EE3
Button.default.hoverBorderColor = $Button.hoverBorderColor
Button.default.focusedBorderColor = $Button.focusedBorderColor
Button.default.focusColor = $Component.focusColor
Button.default.borderWidth = 2
Button.toolbar.hoverBackground = darken($Button.background,12%,derived)
Button.toolbar.pressedBackground = darken($Button.background,15%,derived)
Button.toolbar.selectedBackground = $Button.selectedBackground
#---- CheckBox ----
# enabled
CheckBox.icon.borderColor=#b0b0b0
CheckBox.icon.background=#fff
CheckBox.icon.selectedBorderColor=$CheckBox.icon.borderColor
CheckBox.icon.selectedBackground=$CheckBox.icon.background
CheckBox.icon.checkmarkColor=#4F9EE3
CheckBox.icon.borderColor = #b0b0b0
CheckBox.icon.background = #fff
CheckBox.icon.selectedBorderColor = $CheckBox.icon.borderColor
CheckBox.icon.selectedBackground = $CheckBox.icon.background
CheckBox.icon.checkmarkColor = #4F9EE3
# disabled
CheckBox.icon.disabledBorderColor=#BDBDBD
CheckBox.icon.disabledBackground=@background
CheckBox.icon.disabledCheckmarkColor=#ABABAB
CheckBox.icon.disabledBorderColor = #BDBDBD
CheckBox.icon.disabledBackground = @background
CheckBox.icon.disabledCheckmarkColor = #ABABAB
# focused
CheckBox.icon.focusedBorderColor=#7B9FC7
CheckBox.icon.focusedBackground=$Button.focusedBackground
CheckBox.icon.focusedBorderColor = #7B9FC7
CheckBox.icon.focusedBackground = $Button.focusedBackground
# hover
CheckBox.icon.hoverBorderColor=$CheckBox.icon.focusedBorderColor
CheckBox.icon.hoverBackground=$Button.hoverBackground
CheckBox.icon.hoverBorderColor = $CheckBox.icon.focusedBorderColor
CheckBox.icon.hoverBackground = $Button.hoverBackground
# pressed
CheckBox.icon.pressedBackground=$Button.pressedBackground
CheckBox.icon.pressedBackground = $Button.pressedBackground
# used if CheckBox.icon.style=filled
# used if CheckBox.icon.style = filled
# enabled
CheckBox.icon[filled].selectedBorderColor=#4B97D9
CheckBox.icon[filled].selectedBackground=#4F9EE3
CheckBox.icon[filled].checkmarkColor=#fff
CheckBox.icon[filled].selectedBorderColor = #4B97D9
CheckBox.icon[filled].selectedBackground = #4F9EE3
CheckBox.icon[filled].checkmarkColor = #fff
# focused
CheckBox.icon[filled].selectedFocusedBorderColor=#ACCFF7
CheckBox.icon[filled].selectedFocusedBackground=$CheckBox.icon[filled].selectedBackground
CheckBox.icon[filled].selectedFocusedCheckmarkColor=$CheckBox.icon.focusedBackground
CheckBox.icon[filled].selectedFocusedBorderColor = #ACCFF7
CheckBox.icon[filled].selectedFocusedBackground = $CheckBox.icon[filled].selectedBackground
CheckBox.icon[filled].selectedFocusedCheckmarkColor = $CheckBox.icon.focusedBackground
# hover
CheckBox.icon[filled].selectedHoverBackground=darken($CheckBox.icon[filled].selectedBackground,5%)
CheckBox.icon[filled].selectedHoverBackground = darken($CheckBox.icon[filled].selectedBackground,5%,derived)
# pressed
CheckBox.icon[filled].selectedPressedBackground=darken($CheckBox.icon[filled].selectedBackground,10%)
CheckBox.icon[filled].selectedPressedBackground = darken($CheckBox.icon[filled].selectedBackground,10%,derived)
#---- ComboBox ----
ComboBox.buttonEditableBackground=#fafafa
ComboBox.buttonArrowColor=#666
ComboBox.buttonDisabledArrowColor=#ABABAB
ComboBox.buttonHoverArrowColor=#999
ComboBox.buttonEditableBackground = darken($ComboBox.background,2%)
#---- Component ----
Component.borderColor=#c4c4c4
Component.disabledBorderColor=#cfcfcf
Component.focusedBorderColor=#87afda
Component.focusColor=#97c3f3
Component.linkColor=#2470B3
Component.grayFilter=25,-25,100
Component.borderColor = #c4c4c4
Component.disabledBorderColor = #cfcfcf
Component.focusedBorderColor = #87afda
Component.focusColor = #97c3f3
Component.linkColor = #2470B3
Component.grayFilter = 25,-25,100
Component.error.borderColor=lighten(desaturate($Component.error.focusedBorderColor,20%),25%)
Component.error.focusedBorderColor=#e53e4d
Component.warning.borderColor=lighten(saturate($Component.warning.focusedBorderColor,25%),20%)
Component.warning.focusedBorderColor=#e2a53a
Component.custom.borderColor=lighten(desaturate(#f00,20%,derived noAutoInverse),25%,derived noAutoInverse)
Component.error.borderColor = lighten(desaturate($Component.error.focusedBorderColor,20%),25%)
Component.error.focusedBorderColor = #e53e4d
Component.warning.borderColor = lighten(saturate($Component.warning.focusedBorderColor,25%),20%)
Component.warning.focusedBorderColor = #e2a53a
Component.custom.borderColor = lighten(desaturate(#f00,20%,derived noAutoInverse),25%,derived noAutoInverse)
#---- Desktop ----
Desktop.background=#E6EBF0
Desktop.background = #E6EBF0
#---- DesktopIcon ----
DesktopIcon.background=darken($Desktop.background,10%)
DesktopIcon.background = darken($Desktop.background,10%)
#---- HelpButton ----
HelpButton.questionMarkColor=#4F9EE3
HelpButton.questionMarkColor = #4F9EE3
#---- InternalFrame ----
InternalFrame.activeTitleBackground=#fff
InternalFrame.activeTitleForeground=@foreground
InternalFrame.inactiveTitleBackground=#fafafa
InternalFrame.inactiveTitleForeground=@disabledText
InternalFrame.activeTitleBackground = #fff
InternalFrame.activeTitleForeground = @foreground
InternalFrame.inactiveTitleBackground = #fafafa
InternalFrame.inactiveTitleForeground = @disabledText
InternalFrame.activeBorderColor=darken($Component.borderColor,20%)
InternalFrame.inactiveBorderColor=$Component.borderColor
InternalFrame.activeBorderColor = darken($Component.borderColor,20%)
InternalFrame.inactiveBorderColor = $Component.borderColor
InternalFrame.buttonHoverBackground=darken($InternalFrame.activeTitleBackground,10%,derived)
InternalFrame.buttonPressedBackground=darken($InternalFrame.activeTitleBackground,20%,derived)
InternalFrame.closeHoverBackground=lazy(Actions.Red)
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
InternalFrame.closeHoverForeground=#fff
InternalFrame.closePressedForeground=#fff
InternalFrame.buttonHoverBackground = darken($InternalFrame.activeTitleBackground,10%,derived)
InternalFrame.buttonPressedBackground = darken($InternalFrame.activeTitleBackground,20%,derived)
InternalFrame.closeHoverBackground = lazy(Actions.Red)
InternalFrame.closePressedBackground = darken(Actions.Red,10%,lazy)
InternalFrame.closeHoverForeground = #fff
InternalFrame.closePressedForeground = #fff
InternalFrame.activeDropShadowOpacity=0.25
InternalFrame.inactiveDropShadowOpacity=0.5
InternalFrame.activeDropShadowOpacity = 0.25
InternalFrame.inactiveDropShadowOpacity = 0.5
#---- Menu ----
Menu.icon.arrowColor=#666
Menu.icon.disabledArrowColor=#ABABAB
Menu.icon.arrowColor = #666
Menu.icon.disabledArrowColor = #ABABAB
#---- MenuBar ----
MenuBar.borderColor=#cdcdcd
MenuBar.borderColor = #cdcdcd
#---- MenuItemCheckBox ----
MenuItemCheckBox.icon.checkmarkColor=#4F9EE3
MenuItemCheckBox.icon.disabledCheckmarkColor=#ABABAB
MenuItemCheckBox.icon.checkmarkColor = #4F9EE3
MenuItemCheckBox.icon.disabledCheckmarkColor = #ABABAB
#---- PasswordField ----
PasswordField.capsLockIconColor=#00000064
PasswordField.capsLockIconColor = #00000064
#---- Popup ----
Popup.dropShadowColor=#000
Popup.dropShadowOpacity=0.15
Popup.dropShadowColor = #000
Popup.dropShadowOpacity = 0.15
#---- PopupMenu ----
PopupMenu.borderColor=#adadad
PopupMenu.borderColor = #adadad
#---- ProgressBar ----
ProgressBar.background=#D1D1D1
ProgressBar.foreground=#1E82E6
ProgressBar.selectionForeground=@textComponentBackground
ProgressBar.selectionBackground=@foreground
ProgressBar.background = #D1D1D1
ProgressBar.foreground = #1E82E6
ProgressBar.selectionForeground = @textComponentBackground
ProgressBar.selectionBackground = @foreground
#---- RootPane ----
RootPane.activeBorderColor=#707070
RootPane.inactiveBorderColor=lighten($RootPane.activeBorderColor,20%,derived)
RootPane.activeBorderColor = darken(@background,50%,derived)
RootPane.inactiveBorderColor = darken(@background,30%,derived)
#---- ScrollBar ----
ScrollBar.track=lighten(@background,1%,derived noAutoInverse)
ScrollBar.thumb=darken($ScrollBar.track,10%,derived noAutoInverse)
ScrollBar.hoverTrackColor=darken($ScrollBar.track,3%,derived noAutoInverse)
ScrollBar.hoverThumbColor=darken($ScrollBar.thumb,10%,derived noAutoInverse)
ScrollBar.pressedThumbColor=darken($ScrollBar.thumb,20%,derived noAutoInverse)
ScrollBar.hoverButtonBackground=darken(@background,5%,derived noAutoInverse)
ScrollBar.pressedButtonBackground=darken(@background,10%,derived noAutoInverse)
ScrollBar.track = lighten(@background,1%,derived noAutoInverse)
ScrollBar.thumb = darken($ScrollBar.track,10%,derived noAutoInverse)
ScrollBar.hoverTrackColor = darken($ScrollBar.track,3%,derived noAutoInverse)
ScrollBar.hoverThumbColor = darken($ScrollBar.thumb,10%,derived noAutoInverse)
ScrollBar.pressedThumbColor = darken($ScrollBar.thumb,20%,derived noAutoInverse)
ScrollBar.hoverButtonBackground = darken(@background,5%,derived noAutoInverse)
ScrollBar.pressedButtonBackground = darken(@background,10%,derived noAutoInverse)
#---- Separator ----
Separator.foreground=#d1d1d1
Separator.foreground = #d1d1d1
#---- Slider ----
Slider.trackValueColor=#1E82E6
Slider.trackColor=#c4c4c4
Slider.thumbColor=$Slider.trackValueColor
Slider.tickColor=#888
Slider.focusedColor=fade($Component.focusColor,50%,derived)
Slider.hoverThumbColor=lighten($Slider.thumbColor,10%,derived)
Slider.pressedThumbColor=lighten($Slider.thumbColor,15%,derived)
Slider.disabledTrackColor=#c0c0c0
Slider.disabledThumbColor=$Slider.disabledTrackColor
Slider.trackValueColor = #1E82E6
Slider.trackColor = #c4c4c4
Slider.thumbColor = $Slider.trackValueColor
Slider.tickColor = #888
Slider.focusedColor = fade($Component.focusColor,50%,derived)
Slider.hoverThumbColor = darken($Slider.thumbColor,5%,derived)
Slider.pressedThumbColor = darken($Slider.thumbColor,8%,derived)
Slider.disabledTrackColor = #c0c0c0
Slider.disabledThumbColor = $Slider.disabledTrackColor
#---- SplitPane ----
SplitPaneDivider.draggingColor=#c4c4c4
SplitPaneDivider.oneTouchHoverArrowColor=#333
SplitPaneDivider.draggingColor = #c4c4c4
#---- TabbedPane ----
TabbedPane.underlineColor=#4083C9
TabbedPane.disabledUnderlineColor=#ababab
TabbedPane.hoverColor=darken($TabbedPane.background,7%,derived)
TabbedPane.focusColor=#dae4ed
TabbedPane.contentAreaColor=#bfbfbf
TabbedPane.underlineColor = #4083C9
TabbedPane.disabledUnderlineColor = #ababab
TabbedPane.hoverColor = darken($TabbedPane.background,7%,derived)
TabbedPane.focusColor = #dae4ed
TabbedPane.contentAreaColor = #bfbfbf
TabbedPane.buttonHoverBackground=darken($TabbedPane.background,7%,derived)
TabbedPane.buttonPressedBackground=darken($TabbedPane.background,10%,derived)
TabbedPane.buttonHoverBackground = darken($TabbedPane.background,7%,derived)
TabbedPane.buttonPressedBackground = darken($TabbedPane.background,10%,derived)
TabbedPane.closeBackground=null
TabbedPane.closeForeground=@disabledText
TabbedPane.closeHoverBackground=darken($TabbedPane.background,20%,derived)
TabbedPane.closeHoverForeground=@foreground
TabbedPane.closePressedBackground=darken($TabbedPane.background,25%,derived)
TabbedPane.closePressedForeground=$TabbedPane.closeHoverForeground
TabbedPane.closeBackground = null
TabbedPane.closeForeground = @disabledText
TabbedPane.closeHoverBackground = darken($TabbedPane.background,20%,derived)
TabbedPane.closeHoverForeground = @foreground
TabbedPane.closePressedBackground = darken($TabbedPane.background,25%,derived)
TabbedPane.closePressedForeground = $TabbedPane.closeHoverForeground
#---- Table ----
Table.gridColor=darken($Table.background,3%)
Table.gridColor = darken($Table.background,5%)
#---- TableHeader ----
TableHeader.separatorColor=darken($TableHeader.background,10%)
TableHeader.bottomSeparatorColor=$TableHeader.separatorColor
TableHeader.separatorColor = darken($TableHeader.background,10%)
TableHeader.bottomSeparatorColor = $TableHeader.separatorColor
#---- TitlePane ----
TitlePane.embeddedForeground=lighten($TitlePane.foreground,35%)
TitlePane.buttonHoverBackground=darken($TitlePane.background,10%,derived)
TitlePane.buttonPressedBackground=darken($TitlePane.background,20%,derived)
TitlePane.embeddedForeground = lighten($TitlePane.foreground,35%)
TitlePane.buttonHoverBackground = darken($TitlePane.background,10%,derived)
TitlePane.buttonPressedBackground = darken($TitlePane.background,20%,derived)
#---- ToggleButton ----
ToggleButton.selectedBackground=darken($ToggleButton.background,20%,derived)
ToggleButton.disabledSelectedBackground=darken($ToggleButton.background,13%,derived)
ToggleButton.selectedBackground = darken($ToggleButton.background,20%,derived)
ToggleButton.disabledSelectedBackground = darken($ToggleButton.background,13%,derived)
ToggleButton.toolbar.selectedBackground=$ToggleButton.selectedBackground
ToggleButton.toolbar.selectedBackground = $ToggleButton.selectedBackground
#---- ToolTip ----
ToolTip.border=4,6,4,6,$InternalFrame.activeBorderColor
ToolTip.background=#fafafa
ToolTip.border = 4,6,4,6,$InternalFrame.activeBorderColor
ToolTip.background = #fafafa
#---- Tree ----
Tree.hash=#E6E6E6
Tree.hash = darken($Tree.background,10%)

View File

@@ -14,139 +14,203 @@
# limitations under the License.
#
#
# This file is loaded for all IntelliJ Platform themes.
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
#---- Button ----
Button.startBackground=$Button.background
Button.endBackground=$Button.background
Button.startBorderColor=$Button.borderColor
Button.endBorderColor=$Button.borderColor
Button.startBackground = $Button.background
Button.endBackground = $Button.background
Button.startBorderColor = $Button.borderColor
Button.endBorderColor = $Button.borderColor
Button.default.startBackground=$Button.default.background
Button.default.endBackground=$Button.default.background
Button.default.startBorderColor=$Button.default.borderColor
Button.default.endBorderColor=$Button.default.borderColor
Button.default.startBackground = $Button.default.background
Button.default.endBackground = $Button.default.background
Button.default.startBorderColor = $Button.default.borderColor
Button.default.endBorderColor = $Button.default.borderColor
Button.hoverBorderColor=null
Button.default.hoverBorderColor=null
Button.hoverBorderColor = null
Button.default.hoverBorderColor = null
#---- HelpButton ----
HelpButton.hoverBorderColor=null
HelpButton.hoverBorderColor = null
#---- MenuItemCheckBox ----
# colors from intellij/checkmark.svg and darcula/checkmark.svg
[light]MenuItemCheckBox.icon.checkmarkColor=#3E3E3C
[dark]MenuItemCheckBox.icon.checkmarkColor=#fff9
#---- Slider ----
Slider.focusedColor=fade($Component.focusColor,40%,derived)
Slider.focusedColor = fade($Component.focusColor,40%,derived)
#---- ToggleButton ----
ToggleButton.startBackground=$ToggleButton.background
ToggleButton.endBackground=$ToggleButton.background
[dark]ToggleButton.selectedBackground=lighten($ToggleButton.background,15%,derived)
[dark]ToggleButton.disabledSelectedBackground=lighten($ToggleButton.background,5%,derived)
ToggleButton.startBackground = $ToggleButton.background
ToggleButton.endBackground = $ToggleButton.background
[dark]ToggleButton.selectedBackground = lighten($ToggleButton.background,15%,derived)
[dark]ToggleButton.disabledSelectedBackground = lighten($ToggleButton.background,5%,derived)
#---- theme specific ----
[Arc_Theme]ProgressBar.selectionBackground=#000
[Arc_Theme]ProgressBar.selectionForeground=#fff
@ijMenuCheckBackgroundL10 = lighten(@selectionBackground,10%,derived noAutoInverse)
@ijMenuCheckBackgroundL20 = lighten(@selectionBackground,20%,derived noAutoInverse)
@ijMenuCheckBackgroundD10 = darken(@selectionBackground,10%,derived noAutoInverse)
[Arc_Theme_-_Orange]ProgressBar.selectionBackground=#000
[Arc_Theme_-_Orange]ProgressBar.selectionForeground=#fff
[Arc_Theme]ProgressBar.selectionBackground = #000
[Arc_Theme]ProgressBar.selectionForeground = #fff
[Arc_Theme]List.selectionInactiveForeground = #fff
[Arc_Theme]Table.selectionInactiveForeground = #fff
[Arc_Theme]Tree.selectionInactiveForeground = #fff
[Arc_Theme_Dark]ProgressBar.selectionBackground=#ddd
[Arc_Theme_Dark]ProgressBar.selectionForeground=#ddd
[Arc_Theme_-_Orange]ProgressBar.selectionBackground = #000
[Arc_Theme_-_Orange]ProgressBar.selectionForeground = #fff
[Arc_Theme_-_Orange]List.selectionInactiveForeground = #fff
[Arc_Theme_-_Orange]Table.selectionInactiveForeground = #fff
[Arc_Theme_-_Orange]Tree.selectionInactiveForeground = #fff
[Arc_Theme_Dark_-_Orange]ProgressBar.selectionBackground=#ddd
[Arc_Theme_Dark_-_Orange]ProgressBar.selectionForeground=#fff
[Arc_Theme_Dark]ProgressBar.selectionBackground = #ddd
[Arc_Theme_Dark]ProgressBar.selectionForeground = #ddd
[Cobalt_2]CheckBox.icon.background=#002946
[Cobalt_2]CheckBox.icon.checkmarkColor=#002946
[Arc_Theme_Dark_-_Orange]ProgressBar.selectionBackground = #ddd
[Arc_Theme_Dark_-_Orange]ProgressBar.selectionForeground = #fff
[Dark_purple]Slider.focusedColor=fade($Component.focusColor,70%,derived)
[Cobalt_2]CheckBox.icon.background = #002946
[Cobalt_2]CheckBox.icon.checkmarkColor = #002946
[Cobalt_2]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Cobalt_2]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[Dracula]ProgressBar.selectionBackground=#fff
[Dracula]ProgressBar.selectionForeground=#fff
[Cyan_light]MenuItem.checkBackground = @ijMenuCheckBackgroundL20
[Cyan_light]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL20
[Gruvbox_Dark_Hard]ToggleButton.selectedBackground=$ToggleButton.selectedBackground
[Gruvbox_Dark_Hard]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground
[Dark_Flat_Theme]TableHeader.background = #3B3B3B
[Gruvbox_Dark_Medium]ToggleButton.selectedBackground=$ToggleButton.selectedBackground
[Gruvbox_Dark_Medium]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground
[Dark_purple]Slider.focusedColor = fade($Component.focusColor,70%,derived)
[Gruvbox_Dark_Soft]ToggleButton.selectedBackground=$ToggleButton.selectedBackground
[Gruvbox_Dark_Soft]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground
[Dracula]ProgressBar.selectionBackground = #fff
[Dracula]ProgressBar.selectionForeground = #fff
[Hiberbee_Dark]ToggleButton.selectedBackground=$ToggleButton.selectedBackground
[Hiberbee_Dark]ToggleButton.selectedBackground=$ToggleButton.selectedBackground
[Hiberbee_Dark]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground
[Gradianto_Dark_Fuchsia]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Gradianto_Dark_Fuchsia]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[High_contrast]ToggleButton.selectedBackground=#fff
[High_contrast]ToggleButton.selectedForeground=#000
[High_contrast]ToggleButton.disabledSelectedBackground=#444
[High_contrast]ToggleButton.toolbar.selectedBackground=#fff
[Gruvbox_Dark_Hard]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Gruvbox_Dark_Hard]ToggleButton.toolbar.selectedBackground = $ToggleButton.toolbar.selectedBackground
[One_Dark]Slider.focusedColor=fade(#568af2,40%)
[Gruvbox_Dark_Medium]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Gruvbox_Dark_Medium]ToggleButton.toolbar.selectedBackground = $ToggleButton.toolbar.selectedBackground
[Solarized_Dark]Slider.focusedColor=fade($Component.focusColor,80%,derived)
[Gruvbox_Dark_Soft]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Gruvbox_Dark_Soft]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[Gruvbox_Dark_Soft]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Gruvbox_Dark_Soft]ToggleButton.toolbar.selectedBackground = $ToggleButton.toolbar.selectedBackground
[vuesion-theme]Slider.trackValueColor=#ececee
[vuesion-theme]Slider.trackColor=#303a45
[vuesion-theme]Slider.thumbColor=#ececee
[vuesion-theme]Slider.focusedColor=fade(#ececee,20%)
[Hiberbee_Dark]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Hiberbee_Dark]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Hiberbee_Dark]ToggleButton.toolbar.selectedBackground = $ToggleButton.toolbar.selectedBackground
[High_contrast]ToggleButton.selectedBackground = #fff
[High_contrast]ToggleButton.selectedForeground = #000
[High_contrast]ToggleButton.disabledSelectedBackground = #444
[High_contrast]ToggleButton.toolbar.selectedBackground = #fff
[Light_Flat]TableHeader.background = #E5E5E9
[Monocai]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Monocai]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
@Monocai.acceleratorForeground = lazy(MenuItem.disabledForeground)
@Monocai.acceleratorSelectionForeground = lighten(MenuItem.disabledForeground,10%,lazy)
[Monocai]CheckBoxMenuItem.acceleratorForeground = @Monocai.acceleratorForeground
[Monocai]CheckBoxMenuItem.acceleratorSelectionForeground = @Monocai.acceleratorSelectionForeground
[Monocai]Menu.acceleratorForeground = @Monocai.acceleratorForeground
[Monocai]Menu.acceleratorSelectionForeground = @Monocai.acceleratorSelectionForeground
[Monocai]MenuItem.acceleratorForeground = @Monocai.acceleratorForeground
[Monocai]MenuItem.acceleratorSelectionForeground = @Monocai.acceleratorSelectionForeground
[Monocai]RadioButtonMenuItem.acceleratorForeground = @Monocai.acceleratorForeground
[Monocai]RadioButtonMenuItem.acceleratorSelectionForeground = @Monocai.acceleratorSelectionForeground
[Nord]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Nord]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[One_Dark]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[One_Dark]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[One_Dark]Slider.focusedColor = fade(#568af2,40%)
[Solarized_Dark]Slider.focusedColor = fade($Component.focusColor,80%,derived)
[vuesion-theme]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[vuesion-theme]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[vuesion-theme]Slider.trackValueColor = #ececee
[vuesion-theme]Slider.trackColor = #303a45
[vuesion-theme]Slider.thumbColor = #ececee
[vuesion-theme]Slider.focusedColor = fade(#ececee,20%)
# Material Theme UI Lite
[Dracula_Contrast]ProgressBar.selectionBackground=#fff
[Dracula_Contrast]ProgressBar.selectionForeground=#fff
[light][author-Mallowigi]MenuItem.checkBackground = @ijMenuCheckBackgroundD10
[light][author-Mallowigi]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundD10
[dark][author-Mallowigi]MenuItem.checkBackground = @ijMenuCheckBackgroundL20
[dark][author-Mallowigi]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL20
[GitHub]ProgressBar.selectionBackground=#222
[GitHub]ProgressBar.selectionForeground=#222
[Dracula_Contrast]ProgressBar.selectionBackground = #fff
[Dracula_Contrast]ProgressBar.selectionForeground = #fff
[GitHub_Contrast]ProgressBar.selectionBackground=#222
[GitHub_Contrast]ProgressBar.selectionForeground=#222
[GitHub]ProgressBar.selectionBackground = #222
[GitHub]ProgressBar.selectionForeground = #222
[Light_Owl]ProgressBar.selectionBackground=#111
[Light_Owl]ProgressBar.selectionForeground=#fff
[GitHub_Contrast]ProgressBar.selectionBackground = #222
[GitHub_Contrast]ProgressBar.selectionForeground = #222
[Light_Owl_Contrast]ProgressBar.selectionBackground=#111
[Light_Owl_Contrast]ProgressBar.selectionForeground=#fff
[Light_Owl]ProgressBar.selectionBackground = #111
[Light_Owl]ProgressBar.selectionForeground = #fff
[Material_Lighter]ProgressBar.selectionBackground=#222
[Material_Lighter]ProgressBar.selectionForeground=#fff
[Light_Owl_Contrast]ProgressBar.selectionBackground = #111
[Light_Owl_Contrast]ProgressBar.selectionForeground = #fff
[Material_Lighter_Contrast]ProgressBar.selectionBackground=#222
[Material_Lighter_Contrast]ProgressBar.selectionForeground=#fff
[Material_Lighter]ProgressBar.selectionBackground = #222
[Material_Lighter]ProgressBar.selectionForeground = #fff
[Material_Oceanic]ProgressBar.selectionBackground=#ddd
[Material_Oceanic]ProgressBar.selectionForeground=#ddd
[Material_Lighter_Contrast]ProgressBar.selectionBackground = #222
[Material_Lighter_Contrast]ProgressBar.selectionForeground = #fff
[Material_Oceanic_Contrast]ProgressBar.selectionBackground=#ddd
[Material_Oceanic_Contrast]ProgressBar.selectionForeground=#ddd
[Material_Oceanic]ProgressBar.selectionBackground = #ddd
[Material_Oceanic]ProgressBar.selectionForeground = #ddd
[Material_Palenight]ProgressBar.selectionBackground=#ddd
[Material_Palenight]ProgressBar.selectionForeground=#ddd
[Material_Oceanic_Contrast]ProgressBar.selectionBackground = #ddd
[Material_Oceanic_Contrast]ProgressBar.selectionForeground = #ddd
[Material_Palenight_Contrast]ProgressBar.selectionBackground=#ddd
[Material_Palenight_Contrast]ProgressBar.selectionForeground=#ddd
[Material_Palenight]ProgressBar.selectionBackground = #ddd
[Material_Palenight]ProgressBar.selectionForeground = #ddd
[Night_Owl]ProgressBar.selectionBackground=#ddd
[Night_Owl]ProgressBar.selectionForeground=#ddd
[Material_Palenight_Contrast]ProgressBar.selectionBackground = #ddd
[Material_Palenight_Contrast]ProgressBar.selectionForeground = #ddd
[Night_Owl_Contrast]ProgressBar.selectionBackground=#ddd
[Night_Owl_Contrast]ProgressBar.selectionForeground=#ddd
[Night_Owl]ProgressBar.selectionBackground = #ddd
[Night_Owl]ProgressBar.selectionForeground = #ddd
[Solarized_Dark]ProgressBar.selectionBackground=#ccc
[Solarized_Dark]ProgressBar.selectionForeground=#ccc
[Night_Owl_Contrast]ProgressBar.selectionBackground = #ddd
[Night_Owl_Contrast]ProgressBar.selectionForeground = #ddd
[Material_Solarized_Dark_Contrast]ProgressBar.selectionBackground=#ccc
[Material_Solarized_Dark_Contrast]ProgressBar.selectionForeground=#ccc
[Solarized_Dark]ProgressBar.selectionBackground = #ccc
[Solarized_Dark]ProgressBar.selectionForeground = #ccc
[Solarized_Light]ProgressBar.selectionBackground=#222
[Solarized_Light]ProgressBar.selectionForeground=#fff
[Material_Solarized_Dark_Contrast]ProgressBar.selectionBackground = #ccc
[Material_Solarized_Dark_Contrast]ProgressBar.selectionForeground = #ccc
[Material_Solarized_Light_Contrast]ProgressBar.selectionBackground=#222
[Material_Solarized_Light_Contrast]ProgressBar.selectionForeground=#fff
[Solarized_Light]ProgressBar.selectionBackground = #222
[Solarized_Light]ProgressBar.selectionForeground = #fff
[Material_Solarized_Light_Contrast]ProgressBar.selectionBackground = #222
[Material_Solarized_Light_Contrast]ProgressBar.selectionForeground = #fff

View File

@@ -15,51 +15,51 @@
#---- FileChooser ----
#fields
FileChooser.lookInLabel.textAndMnemonic=Look &In:
FileChooser.saveInLabelText=Save In:
FileChooser.fileNameLabel.textAndMnemonic=File &Name:
FileChooser.folderNameLabel.textAndMnemonic=Folder &name:
FileChooser.filesOfTypeLabel.textAndMnemonic=Files of &Type:
FileChooser.lookInLabel.textAndMnemonic = Look &In:
FileChooser.saveInLabelText = Save In:
FileChooser.fileNameLabel.textAndMnemonic = File &Name:
FileChooser.folderNameLabel.textAndMnemonic = Folder &name:
FileChooser.filesOfTypeLabel.textAndMnemonic = Files of &Type:
# toolbar
FileChooser.upFolderToolTipText=Up One Level
FileChooser.upFolderAccessibleName=Up
FileChooser.homeFolderToolTipText=Home
FileChooser.homeFolderAccessibleName=Home
FileChooser.newFolderToolTipText=Create New Folder
FileChooser.newFolderAccessibleName=New Folder
FileChooser.listViewButtonToolTipText=List
FileChooser.listViewButtonAccessibleName=List
FileChooser.detailsViewButtonToolTipText=Details
FileChooser.detailsViewButtonAccessibleName=Details
FileChooser.upFolderToolTipText = Up One Level
FileChooser.upFolderAccessibleName = Up
FileChooser.homeFolderToolTipText = Home
FileChooser.homeFolderAccessibleName = Home
FileChooser.newFolderToolTipText = Create New Folder
FileChooser.newFolderAccessibleName = New Folder
FileChooser.listViewButtonToolTipText = List
FileChooser.listViewButtonAccessibleName = List
FileChooser.detailsViewButtonToolTipText = Details
FileChooser.detailsViewButtonAccessibleName = Details
# details table header
FileChooser.fileNameHeaderText=Name
FileChooser.fileSizeHeaderText=Size
FileChooser.fileTypeHeaderText=Type
FileChooser.fileDateHeaderText=Modified
FileChooser.fileAttrHeaderText=Attributes
FileChooser.fileNameHeaderText = Name
FileChooser.fileSizeHeaderText = Size
FileChooser.fileTypeHeaderText = Type
FileChooser.fileDateHeaderText = Modified
FileChooser.fileAttrHeaderText = Attributes
# popup menu
FileChooser.viewMenuLabelText=View
FileChooser.refreshActionLabelText=Refresh
FileChooser.newFolderActionLabelText=New Folder
FileChooser.listViewActionLabelText=List
FileChooser.detailsViewActionLabelText=Details
FileChooser.viewMenuLabelText = View
FileChooser.refreshActionLabelText = Refresh
FileChooser.newFolderActionLabelText = New Folder
FileChooser.listViewActionLabelText = List
FileChooser.detailsViewActionLabelText = Details
#---- SplitPaneDivider ----
SplitPaneDivider.collapseLeftToolTipText=Collapse Left Pane
SplitPaneDivider.collapseRightToolTipText=Collapse Right Pane
SplitPaneDivider.collapseTopToolTipText=Collapse Top Pane
SplitPaneDivider.collapseBottomToolTipText=Collapse Bottom Pane
SplitPaneDivider.expandLeftToolTipText=Expand Left Pane
SplitPaneDivider.expandRightToolTipText=Expand Right Pane
SplitPaneDivider.expandTopToolTipText=Expand Top Pane
SplitPaneDivider.expandBottomToolTipText=Expand Bottom Pane
SplitPaneDivider.collapseLeftToolTipText = Collapse Left Pane
SplitPaneDivider.collapseRightToolTipText = Collapse Right Pane
SplitPaneDivider.collapseTopToolTipText = Collapse Top Pane
SplitPaneDivider.collapseBottomToolTipText = Collapse Bottom Pane
SplitPaneDivider.expandLeftToolTipText = Expand Left Pane
SplitPaneDivider.expandRightToolTipText = Expand Right Pane
SplitPaneDivider.expandTopToolTipText = Expand Top Pane
SplitPaneDivider.expandBottomToolTipText = Expand Bottom Pane
#---- TabbedPane ----
TabbedPane.moreTabsButtonToolTipText=Show Hidden Tabs
TabbedPane.moreTabsButtonToolTipText = Show Hidden Tabs

View File

@@ -15,39 +15,39 @@
#---- FileChooser ----
#fields
FileChooser.lookInLabel.textAndMnemonic=Suchen &in:
FileChooser.saveInLabelText=Speichern in:
FileChooser.fileNameLabel.textAndMnemonic=&Dateiname:
FileChooser.folderNameLabel.textAndMnemonic=Ordner&name:
FileChooser.filesOfTypeLabel.textAndMnemonic=Datei&typ:
FileChooser.lookInLabel.textAndMnemonic = Suchen &in:
FileChooser.saveInLabelText = Speichern in:
FileChooser.fileNameLabel.textAndMnemonic = &Dateiname:
FileChooser.folderNameLabel.textAndMnemonic = Ordner&name:
FileChooser.filesOfTypeLabel.textAndMnemonic = Datei&typ:
# toolbar
FileChooser.upFolderToolTipText=Eine Ebene h\u00F6her
FileChooser.upFolderAccessibleName=Nach oben
FileChooser.homeFolderToolTipText=Home
FileChooser.homeFolderAccessibleName=Home
FileChooser.newFolderToolTipText=Neuen Ordner erstellen
FileChooser.newFolderAccessibleName=Neuer Ordner
FileChooser.listViewButtonToolTipText=Liste
FileChooser.listViewButtonAccessibleName=Liste
FileChooser.detailsViewButtonToolTipText=Details
FileChooser.detailsViewButtonAccessibleName=Details
FileChooser.upFolderToolTipText = Eine Ebene h\u00F6her
FileChooser.upFolderAccessibleName = Nach oben
FileChooser.homeFolderToolTipText = Home
FileChooser.homeFolderAccessibleName = Home
FileChooser.newFolderToolTipText = Neuen Ordner erstellen
FileChooser.newFolderAccessibleName = Neuer Ordner
FileChooser.listViewButtonToolTipText = Liste
FileChooser.listViewButtonAccessibleName = Liste
FileChooser.detailsViewButtonToolTipText = Details
FileChooser.detailsViewButtonAccessibleName = Details
# details table header
FileChooser.fileNameHeaderText=Name
FileChooser.fileSizeHeaderText=Gr\u00F6\u00DFe
FileChooser.fileTypeHeaderText=Typ
FileChooser.fileDateHeaderText=\u00C4nderungsdatum
FileChooser.fileAttrHeaderText=Attribute
FileChooser.fileNameHeaderText = Name
FileChooser.fileSizeHeaderText = Gr\u00F6\u00DFe
FileChooser.fileTypeHeaderText = Typ
FileChooser.fileDateHeaderText = \u00C4nderungsdatum
FileChooser.fileAttrHeaderText = Attribute
# popup menu
FileChooser.viewMenuLabelText=Ansicht
FileChooser.refreshActionLabelText=Aktualisieren
FileChooser.newFolderActionLabelText=Neuer Ordner
FileChooser.listViewActionLabelText=Liste
FileChooser.detailsViewActionLabelText=Details
FileChooser.viewMenuLabelText = Ansicht
FileChooser.refreshActionLabelText = Aktualisieren
FileChooser.newFolderActionLabelText = Neuer Ordner
FileChooser.listViewActionLabelText = Liste
FileChooser.detailsViewActionLabelText = Details
#---- TabbedPane ----
TabbedPane.moreTabsButtonToolTipText=Verdeckte Tabs anzeigen
TabbedPane.moreTabsButtonToolTipText = Verdeckte Tabs anzeigen

View File

@@ -15,34 +15,34 @@
#---- FileChooser ----
#fields
FileChooser.lookInLabel.textAndMnemonic=Rechercher &dans:
FileChooser.saveInLabelText=Enregistrer dans:
FileChooser.fileNameLabel.textAndMnemonic=&Nom du fichier:
FileChooser.folderNameLabel.textAndMnemonic=&Nom du dossier:
FileChooser.filesOfTypeLabel.textAndMnemonic=&Type de fichier:
FileChooser.lookInLabel.textAndMnemonic = Rechercher &dans:
FileChooser.saveInLabelText = Enregistrer dans:
FileChooser.fileNameLabel.textAndMnemonic = &Nom du fichier:
FileChooser.folderNameLabel.textAndMnemonic = &Nom du dossier:
FileChooser.filesOfTypeLabel.textAndMnemonic = &Type de fichier:
# toolbar
FileChooser.upFolderToolTipText=Remonte d'un niveau
FileChooser.upFolderAccessibleName=Monter
FileChooser.homeFolderToolTipText=R\u00E9pertoire de base
FileChooser.homeFolderAccessibleName=R\u00E9pertoire de base
FileChooser.newFolderToolTipText=Cr\u00E9e un dossier
FileChooser.newFolderAccessibleName=Nouveau dossier
FileChooser.listViewButtonToolTipText=Liste
FileChooser.listViewButtonAccessibleName=Liste
FileChooser.detailsViewButtonToolTipText=D\u00E9tails
FileChooser.detailsViewButtonAccessibleName=D\u00E9tails
FileChooser.upFolderToolTipText = Remonte d'un niveau
FileChooser.upFolderAccessibleName = Monter
FileChooser.homeFolderToolTipText = R\u00E9pertoire de base
FileChooser.homeFolderAccessibleName = R\u00E9pertoire de base
FileChooser.newFolderToolTipText = Cr\u00E9e un dossier
FileChooser.newFolderAccessibleName = Nouveau dossier
FileChooser.listViewButtonToolTipText = Liste
FileChooser.listViewButtonAccessibleName = Liste
FileChooser.detailsViewButtonToolTipText = D\u00E9tails
FileChooser.detailsViewButtonAccessibleName = D\u00E9tails
# details table header
FileChooser.fileNameHeaderText=Nom
FileChooser.fileSizeHeaderText=Taille
FileChooser.fileTypeHeaderText=Type
FileChooser.fileDateHeaderText=Modifi\u00E9
FileChooser.fileAttrHeaderText=Attributs
FileChooser.fileNameHeaderText = Nom
FileChooser.fileSizeHeaderText = Taille
FileChooser.fileTypeHeaderText = Type
FileChooser.fileDateHeaderText = Modifi\u00E9
FileChooser.fileAttrHeaderText = Attributs
# popup menu
FileChooser.viewMenuLabelText=Affichage
FileChooser.refreshActionLabelText=Actualiser
FileChooser.newFolderActionLabelText=Nouveau dossier
FileChooser.listViewActionLabelText=Liste
FileChooser.detailsViewActionLabelText=D\u00E9tails
FileChooser.viewMenuLabelText = Affichage
FileChooser.refreshActionLabelText = Actualiser
FileChooser.newFolderActionLabelText = Nouveau dossier
FileChooser.listViewActionLabelText = Liste
FileChooser.detailsViewActionLabelText = D\u00E9tails

View File

@@ -7,7 +7,7 @@
# base theme (light, dark, intellij or darcula)
@baseTheme=light
@baseTheme = light
# add you theme defaults here
@background=#ccc
@background = #ccc

View File

@@ -2,3 +2,12 @@ FlatLaf Demo
============
This sub-project contains the FlatLaf Demo source code.
Download
--------
[![Download Demo](https://download.formdev.com/flatlaf/images/download-demo.svg)](https://download.formdev.com/flatlaf/flatlaf-demo-latest.jar)
Run demo with `java -jar flatlaf-demo-<version>.jar` (or double-click it).
Requires Java 8 or newer.

View File

@@ -16,15 +16,6 @@
plugins {
`java-library`
id( "com.jfrog.bintray" )
// Although artifactory plugin is not used in this subproject, the plugin is required
// because otherwise gradle fails with following error:
// Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException:
// Cannot cast object 'task ':bintrayUpload''
// with class 'com.jfrog.bintray.gradle.tasks.BintrayUploadTask_Decorated'
// to class 'com.jfrog.bintray.gradle.tasks.BintrayUploadTask'
id( "com.jfrog.artifactory" )
}
repositories {
@@ -68,24 +59,3 @@ tasks {
} )
}
}
bintray {
user = rootProject.extra["bintray.user"] as String?
key = rootProject.extra["bintray.key"] as String?
setConfigurations( "archives" )
with( pkg ) {
repo = "flatlaf"
name = "flatlaf-demo"
setLicenses( "Apache-2.0" )
vcsUrl = "https://github.com/JFormDesigner/FlatLaf"
with( version ) {
name = project.version.toString()
}
publish = rootProject.extra["bintray.publish"] as Boolean
dryRun = rootProject.extra["bintray.dryRun"] as Boolean
}
}

View File

@@ -32,7 +32,7 @@ import com.formdev.flatlaf.demo.intellijthemes.*;
import com.formdev.flatlaf.extras.FlatAnimatedLafChange;
import com.formdev.flatlaf.extras.FlatSVGIcon;
import com.formdev.flatlaf.extras.FlatUIDefaultsInspector;
import com.formdev.flatlaf.extras.SVGUtils;
import com.formdev.flatlaf.extras.FlatSVGUtils;
import com.formdev.flatlaf.ui.JBRCustomDecorations;
import net.miginfocom.layout.ConstraintParser;
import net.miginfocom.layout.LC;
@@ -59,7 +59,7 @@ class DemoFrame
updateFontMenuItems();
controlBar.initialize( this, tabbedPane );
setIconImages( SVGUtils.createWindowIconImages( "/com/formdev/flatlaf/demo/FlatLaf.svg" ) );
setIconImages( FlatSVGUtils.createWindowIconImages( "/com/formdev/flatlaf/demo/FlatLaf.svg" ) );
if( tabIndex >= 0 && tabIndex < tabbedPane.getTabCount() && tabIndex != tabbedPane.getSelectedIndex() )
tabbedPane.setSelectedIndex( tabIndex );

View File

@@ -40,6 +40,9 @@ public class FlatLafDemo
if( SystemInfo.isMacOS && System.getProperty( "apple.laf.useScreenMenuBar" ) == null )
System.setProperty( "apple.laf.useScreenMenuBar", "true" );
if( FlatLafDemo.screenshotsMode && !SystemInfo.isJava_9_orLater && System.getProperty( "flatlaf.uiScale" ) == null )
System.setProperty( "flatlaf.uiScale", "2x" );
SwingUtilities.invokeLater( () -> {
DemoPrefs.init( PREFS_ROOT_PATH );
@@ -61,7 +64,7 @@ public class FlatLafDemo
DemoFrame frame = new DemoFrame();
if( FlatLafDemo.screenshotsMode )
frame.setPreferredSize( new Dimension( 1280, 620 ) );
frame.setPreferredSize( new Dimension( 1660, 840 ) );
// show frame
frame.pack();

View File

@@ -481,6 +481,7 @@ class MoreComponentsPanel
indeterminateCheckBox,
toolTipLabel, toolTip1, toolTip2,
toolBarLabel, toolBar1, toolBar2,
splitPaneLabel, splitPane3,
};
for( Component c : components )

View File

@@ -44,10 +44,12 @@ class NewDialog
}
private void okActionPerformed() {
System.out.println( "ok" );
dispose();
}
private void cancelActionPerformed() {
System.out.println( "cancel" );
dispose();
}

View File

@@ -25,6 +25,8 @@ import javax.swing.*;
import javax.swing.border.*;
import com.formdev.flatlaf.extras.FlatSVGIcon;
import com.formdev.flatlaf.icons.FlatTabbedPaneCloseIcon;
import net.miginfocom.layout.AC;
import net.miginfocom.layout.ConstraintParser;
import net.miginfocom.swing.*;
/**
@@ -1009,6 +1011,29 @@ class TabsPanel
tabsPopupPolicyButtonGroup.add(popupAsNeededButton);
tabsPopupPolicyButtonGroup.add(popupNeverButton);
// JFormDesigner - End of component initialization //GEN-END:initComponents
if( FlatLafDemo.screenshotsMode ) {
Component[] components = new Component[] {
tabPlacementLabel, tabPlacementToolBar, tabPlacementTabbedPane,
iconBottomTabbedPane, iconTrailingTabbedPane,
alignLeadingTabbedPane, alignTrailingTabbedPane, alignFillTabbedPane,
panel3, separator2, panel4,
};
for( Component c : components )
c.setVisible( false );
// remove gaps
MigLayout layout1 = (MigLayout) panel1.getLayout();
AC rowSpecs1 = ConstraintParser.parseRowConstraints( (String) layout1.getRowConstraints() );
rowSpecs1.gap( "0!", 0, 1 );
layout1.setRowConstraints( rowSpecs1 );
MigLayout layout2 = (MigLayout) panel2.getLayout();
AC rowSpecs2 = ConstraintParser.parseRowConstraints( (String) layout2.getRowConstraints() );
rowSpecs2.gap( "0!", 2, 4, 8 );
layout2.setRowConstraints( rowSpecs2 );
}
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables

View File

@@ -18,6 +18,7 @@ package com.formdev.flatlaf.demo.extras;
import javax.swing.*;
import com.formdev.flatlaf.extras.*;
import com.formdev.flatlaf.extras.components.FlatTriStateCheckBox;
import net.miginfocom.swing.*;
/**
@@ -63,7 +64,7 @@ public class ExtrasPanel
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
label4 = new JLabel();
label1 = new JLabel();
triStateCheckBox1 = new TriStateCheckBox();
triStateCheckBox1 = new FlatTriStateCheckBox();
triStateLabel1 = new JLabel();
label2 = new JLabel();
svgIconsPanel = new JPanel();
@@ -124,7 +125,7 @@ public class ExtrasPanel
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JLabel label4;
private JLabel label1;
private TriStateCheckBox triStateCheckBox1;
private FlatTriStateCheckBox triStateCheckBox1;
private JLabel triStateLabel1;
private JLabel label2;
private JPanel svgIconsPanel;

View File

@@ -21,7 +21,7 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.TriStateCheckBox" ) {
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatTriStateCheckBox" ) {
name: "triStateCheckBox1"
"text": "Three States"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "triStateCheckBox1Changed", false ) )

View File

@@ -108,7 +108,8 @@ public class IJThemesClassGenerator
allInfos.append( THEME_TEMPLATE
.replace( "${subPackage}", subPackage )
.replace( "${themeClass}", themeClass )
.replace( "${themeName}", themeName ) );
.replace( "${themeName}", themeName )
.replace( "${dark}", Boolean.toString( ti.dark ) ) );
markdownTable.append( String.format( "[%s](%s) | `com.formdev.flatlaf.intellijthemes%s.%s`\n",
themeName, ti.sourceCodeUrl, subPackage, themeClass ) );
@@ -189,11 +190,28 @@ public class IJThemesClassGenerator
" */\n" +
"public class FlatAllIJThemes\n" +
"{\n" +
" public static final LookAndFeelInfo[] INFOS = {\n" +
" public static final FlatIJLookAndFeelInfo[] INFOS = {\n" +
"${allInfos}\n" +
" };\n" +
"\n" +
" //---- class FlatIJLookAndFeelInfo ----------------------------------------\n" +
"\n" +
" public static class FlatIJLookAndFeelInfo\n" +
" extends LookAndFeelInfo\n" +
" {\n" +
" private final boolean dark;\n" +
"\n" +
" public FlatIJLookAndFeelInfo( String name, String className, boolean dark ) {\n" +
" super( name, className );\n" +
" this.dark = dark;\n" +
" }\n" +
"\n" +
" public boolean isDark() {\n" +
" return dark;\n" +
" }\n" +
" }\n" +
"}\n";
private static final String THEME_TEMPLATE =
" new LookAndFeelInfo( \"${themeName}\", \"com.formdev.flatlaf.intellijthemes${subPackage}.${themeClass}\" ),";
" new FlatIJLookAndFeelInfo( \"${themeName}\", \"com.formdev.flatlaf.intellijthemes${subPackage}.${themeClass}\", ${dark} ),";
}

View File

@@ -14,4 +14,4 @@
# limitations under the License.
#
HintPanel.backgroundColor=darken(#ffffe1,80%)
HintPanel.backgroundColor = darken(#ffffe1,80%)

View File

@@ -14,4 +14,4 @@
# limitations under the License.
#
HintPanel.backgroundColor=#ffffe1
HintPanel.backgroundColor = #ffffe1

View File

@@ -74,7 +74,7 @@
"license": "MIT",
"licenseFile": "Dracula.LICENSE.txt",
"sourceCodeUrl": "https://github.com/dracula/jetbrains",
"sourceCodePath": "blob/master/src/main/resources/themes/dracula.theme.json"
"sourceCodePath": "blob/master/src/main/resources/themes/Dracula.theme.json"
},
"Gradianto_dark_fuchsia.theme.json": {
"name": "Gradianto Dark Fuchsia",
@@ -410,6 +410,22 @@
"sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite",
"sourceCodePath": "blob/master/src/main/resources/themes/Monokai Pro Contrast.theme.json"
},
"material-theme-ui-lite/Moonlight.theme.json": {
"name": "Material Theme UI Lite / Moonlight",
"dark": true,
"license": "MIT",
"licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt",
"sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite",
"sourceCodePath": "blob/master/src/main/resources/themes/Moonlight.theme.json"
},
"material-theme-ui-lite/Moonlight Contrast.theme.json": {
"name": "Material Theme UI Lite / Moonlight Contrast",
"dark": true,
"license": "MIT",
"licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt",
"sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite",
"sourceCodePath": "blob/master/src/main/resources/themes/Moonlight Contrast.theme.json"
},
"material-theme-ui-lite/Night Owl.theme.json": {
"name": "Material Theme UI Lite / Night Owl",
"dark": true,

View File

@@ -7,9 +7,12 @@ This sub-project provides some additional components and classes:
An icon that displays SVG using
[svgSalamander](https://github.com/JFormDesigner/svgSalamander).\
![FlatSVGIcon.png](../images/extras-FlatSVGIcon.png)
- [TriStateCheckBox](https://www.javadoc.io/doc/com.formdev/flatlaf-extras/latest/com/formdev/flatlaf/extras/TriStateCheckBox.html):
- [FlatTriStateCheckBox](https://www.javadoc.io/doc/com.formdev/flatlaf-extras/latest/com/formdev/flatlaf/extras/components/FlatTriStateCheckBox.html):
A tri-state check box.\
![TriStateCheckBox.png](../images/extras-TriStateCheckBox.png)
- Extension classes of standard Swing components that provide easy access to
FlatLaf specific client properties (see package
[com.formdev.flatlaf.extras.components](https://www.javadoc.io/doc/com.formdev/flatlaf-extras/latest/com/formdev/flatlaf/extras/components/package-summary.html)).
- [FlatAnimatedLafChange](https://www.javadoc.io/doc/com.formdev/flatlaf-extras/latest/com/formdev/flatlaf/extras/FlatAnimatedLafChange.html):
Animated Laf (theme) changing.
- [FlatInspector](#ui-inspector): A simple UI inspector that shows information
@@ -22,7 +25,7 @@ This sub-project provides some additional components and classes:
Download
--------
FlatLaf Extras binaries are available on **JCenter** and **Maven Central**.
FlatLaf Extras binaries are available on **Maven Central**.
If you use Maven or Gradle, add a dependency with following coordinates to your
build script:
@@ -33,13 +36,11 @@ build script:
Otherwise download `flatlaf-extras-<version>.jar` here:
[![Download](https://api.bintray.com/packages/jformdesigner/flatlaf/flatlaf-extras/images/download.svg)](https://bintray.com/jformdesigner/flatlaf/flatlaf-extras/_latestVersion)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.formdev/flatlaf-extras/badge.svg?style=flat-square&color=007ec6)](https://maven-badges.herokuapp.com/maven-central/com.formdev/flatlaf-extras)
You also need `flatlaf-<version>.jar` and `svgSalamander-<version>.jar`, which
you can download here:
If SVG classes are used, `svgSalamander-<version>.jar` is also required:
[![Download](https://api.bintray.com/packages/jformdesigner/flatlaf/flatlaf/images/download.svg)](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
[![Download](https://api.bintray.com/packages/jformdesigner/svgSalamander/svgSalamander/images/download.svg)](https://bintray.com/jformdesigner/svgSalamander/svgSalamander/_latestVersion)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.formdev/svgSalamander/badge.svg?style=flat-square&color=007ec6)](https://maven-badges.herokuapp.com/maven-central/com.formdev/svgSalamander)
Tools

View File

@@ -40,6 +40,7 @@ tasks {
this as StandardJavadocDocletOptions
use( true )
tags = listOf( "uiDefault", "clientProperty" )
addStringOption( "Xdoclint:all,-missing", "-Xdoclint:all,-missing" )
}
isFailOnError = false
}

View File

@@ -24,7 +24,6 @@ import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.KeyboardFocusManager;
import java.awt.LayoutManager;
@@ -56,7 +55,6 @@ import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.plaf.UIResource;
import javax.swing.text.JTextComponent;
import com.formdev.flatlaf.ui.FlatToolTipUI;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.UIScale;
@@ -348,8 +346,9 @@ public class FlatInspector
@Override
protected void paintBorder( Graphics g ) {
FlatUIUtils.setRenderingHints( (Graphics2D) g );
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g );
super.paintBorder( g );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
}
};
c.setBackground( new Color( 255, 0, 0, 32 ) );
@@ -365,12 +364,7 @@ public class FlatInspector
}
if( tip == null ) {
tip = new JToolTip() {
@Override
public void updateUI() {
setUI( FlatToolTipUI.createUI( this ) );
}
};
tip = new JToolTip();
rootPane.getLayeredPane().add( tip, TOOLTIP_LAYER );
} else
tip.setVisible( true );
@@ -397,15 +391,18 @@ public class FlatInspector
}
private static String buildToolTipText( Component c, int parentLevel ) {
StringBuilder buf = new StringBuilder( 1500 );
buf.append( "<html><style>" );
buf.append( "td { padding: 0 10 0 0; }" );
buf.append( "</style><table>" );
String name = c.getClass().getName();
name = name.substring( name.lastIndexOf( '.' ) + 1 );
String text =
"Class: " + name + " (" + c.getClass().getPackage().getName() + ")\n" +
"Size: " + c.getWidth() + ',' + c.getHeight() + " @ " + c.getX() + ',' + c.getY() + '\n';
appendRow( buf, "Class", name + " (" + c.getClass().getPackage().getName() + ")" );
appendRow( buf, "Size", c.getWidth() + ", " + c.getHeight() + "&nbsp;&nbsp; @ " + c.getX() + ", " + c.getY() );
if( c instanceof Container )
text += "Insets: " + toString( ((Container)c).getInsets() ) + '\n';
appendRow( buf, "Insets", toString( ((Container)c).getInsets() ) );
Insets margin = null;
if( c instanceof AbstractButton )
@@ -418,28 +415,28 @@ public class FlatInspector
margin = ((JToolBar) c).getMargin();
if( margin != null )
text += "Margin: " + toString( margin ) + '\n';
appendRow( buf, "Margin", toString( margin ) );
Dimension prefSize = c.getPreferredSize();
Dimension minSize = c.getMinimumSize();
Dimension maxSize = c.getMaximumSize();
text += "Pref size: " + prefSize.width + ',' + prefSize.height + '\n' +
"Min size: " + minSize.width + ',' + minSize.height + '\n' +
"Max size: " + maxSize.width + ',' + maxSize.height + '\n';
appendRow( buf, "Pref size", prefSize.width + ", " + prefSize.height );
appendRow( buf, "Min size", minSize.width + ", " + minSize.height );
appendRow( buf, "Max size", maxSize.width + ", " + maxSize.height );
if( c instanceof JComponent )
text += "Border: " + toString( ((JComponent)c).getBorder() ) + '\n';
appendRow( buf, "Border", toString( ((JComponent)c).getBorder() ) );
text += "Background: " + toString( c.getBackground() ) + '\n' +
"Foreground: " + toString( c.getForeground() ) + '\n' +
"Font: " + toString( c.getFont() ) + '\n';
appendRow( buf, "Background", toString( c.getBackground() ) );
appendRow( buf, "Foreground", toString( c.getForeground() ) );
appendRow( buf, "Font", toString( c.getFont() ) );
if( c instanceof JComponent ) {
try {
Field f = JComponent.class.getDeclaredField( "ui" );
f.setAccessible( true );
Object ui = f.get( c );
text += "UI: " + (ui != null ? ui.getClass().getName() : "null") + '\n';
appendRow( buf, "UI", (ui != null ? ui.getClass().getName() : "null") );
} catch( NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex ) {
// ignore
}
@@ -448,34 +445,46 @@ public class FlatInspector
if( c instanceof Container ) {
LayoutManager layout = ((Container)c).getLayout();
if( layout != null )
text += "Layout: " + layout.getClass().getName() + '\n';
appendRow( buf, "Layout", layout.getClass().getName() );
}
text += "Enabled: " + c.isEnabled() + '\n';
text += "Opaque: " + c.isOpaque() + (c instanceof JComponent &&
FlatUIUtils.hasOpaqueBeenExplicitlySet( (JComponent) c ) ? " EXPLICIT" : "") + '\n';
appendRow( buf, "Enabled", String.valueOf( c.isEnabled() ) );
appendRow( buf, "Opaque", String.valueOf( c.isOpaque() )
+ (c instanceof JComponent && FlatUIUtils.hasOpaqueBeenExplicitlySet( (JComponent) c ) ? " EXPLICIT" : "") );
if( c instanceof AbstractButton )
text += "ContentAreaFilled: " + ((AbstractButton)c).isContentAreaFilled() + '\n';
text += "Focusable: " + c.isFocusable() + '\n';
text += "Left-to-right: " + c.getComponentOrientation().isLeftToRight() + '\n';
text += "Parent: " + (c.getParent() != null ? c.getParent().getClass().getName() : "null");
appendRow( buf, "ContentAreaFilled", String.valueOf( ((AbstractButton)c).isContentAreaFilled() ) );
appendRow( buf, "Focusable", String.valueOf( c.isFocusable() ) );
appendRow( buf, "Left-to-right", String.valueOf( c.getComponentOrientation().isLeftToRight() ) );
appendRow( buf, "Parent", (c.getParent() != null ? c.getParent().getClass().getName() : "null") );
buf.append( "<tr><td colspan=\"2\">" );
if( parentLevel > 0 )
buf.append( "<br>Parent level: " + parentLevel );
if( parentLevel > 0 )
text += "\n\nParent level: " + parentLevel;
if( parentLevel > 0 )
text += "\n(press Ctrl/Shift to increase/decrease level)";
buf.append( "<br>(press Ctrl/Shift to increase/decrease level)" );
else
text += "\n\n(press Ctrl key to inspect parent)";
buf.append( "<br>(press Ctrl key to inspect parent)" );
return text;
buf.append( "</td></tr>" );
buf.append( "</table></html>" );
return buf.toString();
}
private static void appendRow( StringBuilder buf, String key, String value ) {
buf.append( "<tr><td><b>" )
.append( key )
.append( ":</b></td><td>" )
.append( value )
.append( "</td></tr>" );
}
private static String toString( Insets insets ) {
if( insets == null )
return "null";
return insets.top + "," + insets.left + ',' + insets.bottom + ',' + insets.right
return insets.top + ", " + insets.left + ", " + insets.bottom + ", " + insets.right
+ (insets instanceof UIResource ? " UI" : "");
}
@@ -483,10 +492,29 @@ public class FlatInspector
if( c == null )
return "null";
String s = Long.toString( c.getRGB() & 0xffffffffl, 16 );
StringBuilder buf = new StringBuilder( 150 );
buf.append( "<tt>" ); // <tt> is similar to <code>, but uses same font size as body
buf.append( (c.getAlpha() != 255)
? String.format( "#%06x%02x", c.getRGB() & 0xffffff, (c.getRGB() >> 24) & 0xff )
: String.format( "#%06x", c.getRGB() & 0xffffff ) );
buf.append( "</tt>" );
if( c instanceof UIResource )
s += " UI";
return s;
buf.append( " UI" );
// color preview
buf.append( "&nbsp; &nbsp;" )
.append( "<span style=\"background: " )
.append( String.format( "#%06x", c.getRGB() & 0xffffff ) ) // Java CSS does not support alpha; see CSS.hexToColor()
.append( ";\">" )
.append( "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;" )
.append( "</span>" );
if( c.getAlpha() != 255 )
buf.append( " " ).append( Math.round( c.getAlpha() / 2.55f ) ).append( '%' );
return buf.toString();
}
private static String toString( Font f ) {

View File

@@ -34,7 +34,7 @@ import com.kitfox.svg.SVGException;
*
* @author Karl Tauber
*/
public class SVGUtils
public class FlatSVGUtils
{
/**
* Creates from the given SVG a list of icon images with different sizes that
@@ -131,7 +131,7 @@ public class SVGUtils
*/
private static SVGDiagram loadSVG( String svgName ) {
try {
URL url = SVGUtils.class.getResource( svgName );
URL url = FlatSVGUtils.class.getResource( svgName );
return SVGCache.getSVGUniverse().getDiagram( url.toURI() );
} catch( URISyntaxException ex ) {
throw new RuntimeException( ex );

View File

@@ -17,18 +17,23 @@
package com.formdev.flatlaf.extras;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.Properties;
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.Predicate;
import java.util.prefs.Preferences;
import java.util.regex.Pattern;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
@@ -44,6 +49,7 @@ import com.formdev.flatlaf.ui.FlatEmptyBorder;
import com.formdev.flatlaf.ui.FlatLineBorder;
import com.formdev.flatlaf.ui.FlatMarginBorder;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.DerivedColor;
import com.formdev.flatlaf.util.GrayFilter;
import com.formdev.flatlaf.util.HSLColor;
import com.formdev.flatlaf.util.ScaledEmptyBorder;
@@ -66,12 +72,12 @@ public class FlatUIDefaultsInspector
{
private static final int KEY_MODIFIERS_MASK = InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_DOWN_MASK | InputEvent.META_DOWN_MASK;
private static FlatUIDefaultsInspector inspector;
private static JFrame inspectorFrame;
private final String title;
private final PropertyChangeListener lafListener = this::lafChanged;
private final PropertyChangeListener lafDefaultsListener = this::lafDefaultsChanged;
private boolean refreshPending;
private Properties derivedColorKeys;
/**
* Installs a key listener into the application that allows enabling and disabling
@@ -92,27 +98,31 @@ public class FlatUIDefaultsInspector
}
public static void show() {
if( inspector != null ) {
inspector.ensureOnScreen();
inspector.frame.toFront();
if( inspectorFrame != null ) {
ensureOnScreen( inspectorFrame );
inspectorFrame.toFront();
return;
}
inspector = new FlatUIDefaultsInspector();
inspector.frame.setVisible( true );
inspectorFrame = new FlatUIDefaultsInspector().createFrame();
inspectorFrame.setVisible( true );
}
public static void hide() {
if( inspector != null )
inspector.frame.dispose();
if( inspectorFrame != null )
inspectorFrame.dispose();
}
/**
* Creates a UI defaults inspector panel that can be embedded into any window.
*/
public static JComponent createInspectorPanel() {
return new FlatUIDefaultsInspector().panel;
}
private FlatUIDefaultsInspector() {
initComponents();
title = frame.getTitle();
updateWindowTitle();
panel.setBorder( new ScaledEmptyBorder( 10, 10, 10, 10 ) );
filterPanel.setBorder( new ScaledEmptyBorder( 0, 0, 10, 0 ) );
@@ -143,24 +153,21 @@ public class FlatUIDefaultsInspector
table.getRowSorter().setSortKeys( Collections.singletonList(
new RowSorter.SortKey( 0, SortOrder.ASCENDING ) ) );
// restore window bounds
Preferences prefs = getPrefs();
int x = prefs.getInt( "x", -1 );
int y = prefs.getInt( "y", -1 );
int width = prefs.getInt( "width", UIScale.scale( 600 ) );
int height = prefs.getInt( "height", UIScale.scale( 800 ) );
frame.setSize( width, height );
if( x != -1 && y != -1 ) {
frame.setLocation( x, y );
ensureOnScreen();
} else
frame.setLocationRelativeTo( null );
// restore column widths
Preferences prefs = getPrefs();
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn( 0 ).setPreferredWidth( prefs.getInt( "column1width", 100 ) );
columnModel.getColumn( 1 ).setPreferredWidth( prefs.getInt( "column2width", 100 ) );
PropertyChangeListener columnWidthListener = e -> {
if( "width".equals( e.getPropertyName() ) ) {
prefs.putInt( "column1width", columnModel.getColumn( 0 ).getWidth() );
prefs.putInt( "column2width", columnModel.getColumn( 1 ).getWidth() );
}
};
columnModel.getColumn( 0 ).addPropertyChangeListener( columnWidthListener );
columnModel.getColumn( 1 ).addPropertyChangeListener( columnWidthListener );
// restore filter
String filter = prefs.get( "filter", "" );
String valueType = prefs.get( "valueType", null );
@@ -169,20 +176,66 @@ public class FlatUIDefaultsInspector
if( valueType != null )
valueTypeField.setSelectedItem( valueType );
UIManager.addPropertyChangeListener( lafListener );
UIManager.getDefaults().addPropertyChangeListener( lafDefaultsListener );
panel.addPropertyChangeListener( "ancestor", e -> {
if( e.getNewValue() != null ) {
UIManager.addPropertyChangeListener( lafListener );
UIManager.getDefaults().addPropertyChangeListener( lafDefaultsListener );
} else {
UIManager.removePropertyChangeListener( lafListener );
UIManager.getDefaults().removePropertyChangeListener( lafDefaultsListener );
}
} );
// register F5 key to refresh
((JComponent)frame.getContentPane()).registerKeyboardAction(
panel.registerKeyboardAction(
e -> refresh(),
KeyStroke.getKeyStroke( KeyEvent.VK_F5, 0, false ),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
}
private JFrame createFrame() {
JFrame frame = new JFrame();
frame.setTitle( "UI Defaults Inspector" );
frame.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE );
frame.addWindowListener( new WindowAdapter() {
@Override
public void windowClosed( WindowEvent e ) {
inspectorFrame = null;
}
@Override
public void windowClosing( WindowEvent e ) {
saveWindowBounds( frame );
}
@Override
public void windowDeactivated( WindowEvent e ) {
saveWindowBounds( frame );
}
} );
updateWindowTitle( frame );
frame.getContentPane().add( panel, BorderLayout.CENTER );
// restore window bounds
Preferences prefs = getPrefs();
int x = prefs.getInt( "x", -1 );
int y = prefs.getInt( "y", -1 );
int width = prefs.getInt( "width", UIScale.scale( 600 ) );
int height = prefs.getInt( "height", UIScale.scale( 800 ) );
frame.setSize( width, height );
if( x != -1 && y != -1 ) {
frame.setLocation( x, y );
ensureOnScreen( frame );
} else
frame.setLocationRelativeTo( null );
// register ESC key to close frame
((JComponent)frame.getContentPane()).registerKeyboardAction(
e -> frame.dispose(),
KeyStroke.getKeyStroke( KeyEvent.VK_ESCAPE, 0, false ),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
return frame;
}
private void delegateKey( int keyCode, String actionKey ) {
@@ -202,7 +255,7 @@ public class FlatUIDefaultsInspector
} );
}
private void ensureOnScreen() {
private static void ensureOnScreen( JFrame frame ) {
Rectangle frameBounds = frame.getBounds();
boolean onScreen = false;
for( GraphicsDevice screen : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices() ) {
@@ -219,12 +272,12 @@ public class FlatUIDefaultsInspector
frame.setLocationRelativeTo( null );
}
void lafChanged( PropertyChangeEvent e ) {
private void lafChanged( PropertyChangeEvent e ) {
if( "lookAndFeel".equals( e.getPropertyName() ) )
refresh();
}
void lafDefaultsChanged( PropertyChangeEvent e ) {
private void lafDefaultsChanged( PropertyChangeEvent e ) {
if( refreshPending )
return;
@@ -235,11 +288,13 @@ public class FlatUIDefaultsInspector
} );
}
void refresh() {
private void refresh() {
ItemsTableModel model = (ItemsTableModel) table.getModel();
model.setItems( getUIDefaultsItems() );
updateWindowTitle();
JFrame frame = (JFrame) SwingUtilities.getAncestorOfClass( JFrame.class, panel );
if( frame != null )
updateWindowTitle( frame );
}
private Item[] getUIDefaultsItems() {
@@ -249,6 +304,7 @@ public class FlatUIDefaultsInspector
Set<Entry<Object, Object>> defaultsSet = defaults.entrySet();
ArrayList<Item> items = new ArrayList<>( defaultsSet.size() );
HashSet<Object> keys = new HashSet<>( defaultsSet.size() );
Color[] pBaseColor = new Color[1];
for( Entry<Object,Object> e : defaultsSet ) {
Object key = e.getKey();
@@ -265,66 +321,149 @@ public class FlatUIDefaultsInspector
if( !keys.add( key ) )
continue;
// resolve derived color
Object info = null;
if( value instanceof DerivedColor ) {
Color resolvedColor = resolveDerivedColor( defaults, (String) key, (DerivedColor) value, pBaseColor );
if( resolvedColor != value )
info = new Color[] { resolvedColor, pBaseColor[0] };
}
// check whether key was overridden using UIManager.put(key,value)
Object lafValue = null;
if( defaults.containsKey( key ) )
lafValue = lafDefaults.get( key );
// add item
items.add( new Item( String.valueOf( key ), value, lafValue ) );
items.add( new Item( String.valueOf( key ), value, lafValue, info ) );
}
return items.toArray( new Item[items.size()] );
}
private void updateWindowTitle() {
frame.setTitle( title + " - " + UIManager.getLookAndFeel().getName() );
private Color resolveDerivedColor( UIDefaults defaults, String key, Color color, Color[] pBaseColor ) {
if( pBaseColor != null )
pBaseColor[0] = null;
if( !(color instanceof DerivedColor) )
return color;
if( derivedColorKeys == null )
derivedColorKeys = loadDerivedColorKeys();
Object baseKey = derivedColorKeys.get( key );
if( baseKey == null )
return color;
// this is for keys that may be defined as derived colors, but do not derive them at runtime
if( "null".equals( baseKey ) )
return color;
Color baseColor = defaults.getColor( baseKey );
if( baseColor == null )
return color;
if( baseColor instanceof DerivedColor )
baseColor = resolveDerivedColor( defaults, (String) baseKey, baseColor, null );
if( pBaseColor != null )
pBaseColor[0] = baseColor;
Color newColor = FlatUIUtils.deriveColor( color, baseColor );
// creating a new color instance to drop Color.frgbvalue from newColor
// and avoid rounding issues/differences
return new Color( newColor.getRGB(), true );
}
private void saveWindowBounds() {
private Properties loadDerivedColorKeys() {
Properties properties = new Properties();
try( InputStream in = getClass().getResourceAsStream( "/com/formdev/flatlaf/extras/resources/DerivedColorKeys.properties" ) ) {
properties.load( in );
} catch( IOException ex ) {
ex.printStackTrace();
}
return properties;
}
private static void updateWindowTitle( JFrame frame ) {
String title = frame.getTitle();
String sep = " - ";
int sepIndex = title.indexOf( sep );
if( sepIndex >= 0 )
title = title.substring( 0, sepIndex );
frame.setTitle( title + sep + UIManager.getLookAndFeel().getName() );
}
private void saveWindowBounds( JFrame frame ) {
Preferences prefs = getPrefs();
prefs.putInt( "x", frame.getX() );
prefs.putInt( "y", frame.getY() );
prefs.putInt( "width", frame.getWidth() );
prefs.putInt( "height", frame.getHeight() );
TableColumnModel columnModel = table.getColumnModel();
prefs.putInt( "column1width", columnModel.getColumn( 0 ).getWidth() );
prefs.putInt( "column2width", columnModel.getColumn( 1 ).getWidth() );
}
private Preferences getPrefs() {
return Preferences.userRoot().node( "flatlaf-uidefaults-inspector" );
}
private void windowClosed() {
UIManager.removePropertyChangeListener( lafListener );
UIManager.getDefaults().removePropertyChangeListener( lafDefaultsListener );
inspector = null;
}
private void filterChanged() {
String filter = filterField.getText().trim();
String valueType = (String) valueTypeField.getSelectedItem();
// split filter string on space characters
String[] filters = filter.split( " +" );
for( int i = 0; i < filters.length; i++ )
filters[i] = filters[i].toLowerCase( Locale.ENGLISH );
String[] filters = !filter.isEmpty() ? filter.split( " +" ) : null;
Pattern[] patterns = (filters != null) ? new Pattern[filters.length] : null;
if( filters != null ) {
for( int i = 0; i < filters.length; i++ ) {
filters[i] = filters[i].toLowerCase( Locale.ENGLISH );
// simple wildcard matching
// - '*' matches any number of characters
// - '?' matches a single character
// - '^' beginning of line
// - '$' end of line
String f = filters[i];
boolean matchBeginning = f.startsWith( "^" );
boolean matchEnd = f.endsWith( "$" );
if( f.indexOf( '*' ) >= 0 || f.indexOf( '?' ) >= 0 || matchBeginning || matchEnd ) {
if( matchBeginning )
f = f.substring( 1 );
if( matchEnd )
f = f.substring( 0, f.length() - 1 );
String regex = ("\\Q" + f + "\\E").replace( "*", "\\E.*\\Q" ).replace( "?", "\\E.\\Q" );
if( !matchBeginning )
regex = ".*" + regex;
if( !matchEnd )
regex = regex + ".*";
patterns[i] = Pattern.compile( regex );
}
}
}
ItemsTableModel model = (ItemsTableModel) table.getModel();
model.setFilter( item -> {
if( valueType != null &&
!valueType.equals( "(any)" ) &&
!valueType.equals( typeOfValue( item.value ) ) )
!typeOfValue( item.value ).startsWith( valueType ) )
return false;
if( filters == null )
return true;
String lkey = item.key.toLowerCase( Locale.ENGLISH );
String lvalue = item.getValueAsString().toLowerCase( Locale.ENGLISH );
for( String f : filters ) {
if( lkey.contains( f ) || lvalue.contains( f ) )
return true;
for( int i = 0; i < filters.length; i++ ) {
Pattern p = patterns[i];
if( p != null ) {
if( p.matcher( lkey ).matches() || p.matcher( lvalue ).matches() )
return true;
} else {
String f = filters[i];
if( lkey.contains( f ) || lvalue.contains( f ) )
return true;
}
}
return false;
} );
@@ -339,8 +478,13 @@ public class FlatUIDefaultsInspector
return "Boolean";
if( value instanceof Border )
return "Border";
if( value instanceof Color )
if( value instanceof Color ) {
if( ((Color)value).getAlpha() != 255 )
return "Color (\u03b1)";
if( value instanceof DerivedColor )
return "Color (\u0192)";
return "Color";
}
if( value instanceof Dimension )
return "Dimension";
if( value instanceof Float )
@@ -358,9 +502,51 @@ public class FlatUIDefaultsInspector
return "(other)";
}
private void tableMousePressed( MouseEvent e ) {
if( !SwingUtilities.isRightMouseButton( e ) )
return;
int row = table.rowAtPoint( e.getPoint() );
if( row >= 0 && !table.isRowSelected( row ) )
table.setRowSelectionInterval( row, row );
}
private void copyKey() {
copyToClipboard( 0 );
}
private void copyValue() {
copyToClipboard( 1 );
}
private void copyKeyAndValue() {
copyToClipboard( -1 );
}
private void copyToClipboard( int column ) {
int[] rows = table.getSelectedRows();
if( rows.length == 0 )
return;
StringBuilder buf = new StringBuilder();
for( int i = 0; i < rows.length; i++ ) {
if( i > 0 )
buf.append( '\n' );
if( column < 0 || column == 0 )
buf.append( table.getValueAt( rows[i], 0 ) );
if( column < 0 )
buf.append( " = " );
if( column < 0 || column == 1 )
buf.append( table.getValueAt( rows[i], 1 ) );
}
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection( buf.toString() ), null );
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
frame = new JFrame();
panel = new JPanel();
filterPanel = new JPanel();
flterLabel = new JLabel();
@@ -369,100 +555,108 @@ public class FlatUIDefaultsInspector
valueTypeField = new JComboBox<>();
scrollPane = new JScrollPane();
table = new JTable();
tablePopupMenu = new JPopupMenu();
copyKeyMenuItem = new JMenuItem();
copyValueMenuItem = new JMenuItem();
copyKeyAndValueMenuItem = new JMenuItem();
//======== frame ========
//======== panel ========
{
frame.setTitle("UI Defaults Inspector");
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
FlatUIDefaultsInspector.this.windowClosed();
}
@Override
public void windowClosing(WindowEvent e) {
saveWindowBounds();
}
@Override
public void windowDeactivated(WindowEvent e) {
saveWindowBounds();
}
});
Container frameContentPane = frame.getContentPane();
frameContentPane.setLayout(new BorderLayout());
panel.setLayout(new BorderLayout());
//======== panel ========
//======== filterPanel ========
{
panel.setLayout(new BorderLayout());
filterPanel.setLayout(new GridBagLayout());
((GridBagLayout)filterPanel.getLayout()).columnWidths = new int[] {0, 0, 0, 0, 0};
((GridBagLayout)filterPanel.getLayout()).rowHeights = new int[] {0, 0};
((GridBagLayout)filterPanel.getLayout()).columnWeights = new double[] {0.0, 1.0, 0.0, 0.0, 1.0E-4};
((GridBagLayout)filterPanel.getLayout()).rowWeights = new double[] {0.0, 1.0E-4};
//======== filterPanel ========
{
filterPanel.setLayout(new GridBagLayout());
((GridBagLayout)filterPanel.getLayout()).columnWidths = new int[] {0, 0, 0, 0, 0};
((GridBagLayout)filterPanel.getLayout()).rowHeights = new int[] {0, 0};
((GridBagLayout)filterPanel.getLayout()).columnWeights = new double[] {0.0, 1.0, 0.0, 0.0, 1.0E-4};
((GridBagLayout)filterPanel.getLayout()).rowWeights = new double[] {0.0, 1.0E-4};
//---- flterLabel ----
flterLabel.setText("Filter:");
flterLabel.setLabelFor(filterField);
flterLabel.setDisplayedMnemonic('F');
filterPanel.add(flterLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 10), 0, 0));
//---- flterLabel ----
flterLabel.setText("Filter:");
flterLabel.setLabelFor(filterField);
flterLabel.setDisplayedMnemonic('F');
filterPanel.add(flterLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 10), 0, 0));
//---- filterField ----
filterField.putClientProperty("JTextField.placeholderText", "enter one or more filter strings, separated by space characters");
filterPanel.add(filterField, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 10), 0, 0));
//---- filterField ----
filterField.putClientProperty("JTextField.placeholderText", "enter one or more filter strings, separated by space characters");
filterPanel.add(filterField, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 10), 0, 0));
//---- valueTypeLabel ----
valueTypeLabel.setText("Value Type:");
valueTypeLabel.setLabelFor(valueTypeField);
valueTypeLabel.setDisplayedMnemonic('T');
filterPanel.add(valueTypeLabel, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 10), 0, 0));
//---- valueTypeLabel ----
valueTypeLabel.setText("Value Type:");
valueTypeLabel.setLabelFor(valueTypeField);
valueTypeLabel.setDisplayedMnemonic('T');
filterPanel.add(valueTypeLabel, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 10), 0, 0));
//---- valueTypeField ----
valueTypeField.setModel(new DefaultComboBoxModel<>(new String[] {
"(any)",
"Boolean",
"Border",
"Color",
"Dimension",
"Float",
"Font",
"Icon",
"Insets",
"Integer",
"String",
"(other)"
}));
valueTypeField.addActionListener(e -> filterChanged());
filterPanel.add(valueTypeField, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
panel.add(filterPanel, BorderLayout.NORTH);
//======== scrollPane ========
{
//---- table ----
table.setAutoCreateRowSorter(true);
scrollPane.setViewportView(table);
}
panel.add(scrollPane, BorderLayout.CENTER);
//---- valueTypeField ----
valueTypeField.setModel(new DefaultComboBoxModel<>(new String[] {
"(any)",
"Boolean",
"Border",
"Color",
"Color (\u03b1)",
"Color (\u0192)",
"Dimension",
"Float",
"Font",
"Icon",
"Insets",
"Integer",
"String",
"(other)"
}));
valueTypeField.addActionListener(e -> filterChanged());
filterPanel.add(valueTypeField, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
frameContentPane.add(panel, BorderLayout.CENTER);
panel.add(filterPanel, BorderLayout.NORTH);
//======== scrollPane ========
{
//---- table ----
table.setAutoCreateRowSorter(true);
table.setComponentPopupMenu(tablePopupMenu);
table.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
tableMousePressed(e);
}
});
scrollPane.setViewportView(table);
}
panel.add(scrollPane, BorderLayout.CENTER);
}
//======== tablePopupMenu ========
{
//---- copyKeyMenuItem ----
copyKeyMenuItem.setText("Copy Key");
copyKeyMenuItem.addActionListener(e -> copyKey());
tablePopupMenu.add(copyKeyMenuItem);
//---- copyValueMenuItem ----
copyValueMenuItem.setText("Copy Value");
copyValueMenuItem.addActionListener(e -> copyValue());
tablePopupMenu.add(copyValueMenuItem);
//---- copyKeyAndValueMenuItem ----
copyKeyAndValueMenuItem.setText("Copy Key and Value");
copyKeyAndValueMenuItem.addActionListener(e -> copyKeyAndValue());
tablePopupMenu.add(copyKeyAndValueMenuItem);
}
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JFrame frame;
private JPanel panel;
private JPanel filterPanel;
private JLabel flterLabel;
@@ -471,6 +665,10 @@ public class FlatUIDefaultsInspector
private JComboBox<String> valueTypeField;
private JScrollPane scrollPane;
private JTable table;
private JPopupMenu tablePopupMenu;
private JMenuItem copyKeyMenuItem;
private JMenuItem copyValueMenuItem;
private JMenuItem copyKeyAndValueMenuItem;
// JFormDesigner - End of variables declaration //GEN-END:variables
//---- class Item ---------------------------------------------------------
@@ -479,35 +677,35 @@ public class FlatUIDefaultsInspector
final String key;
final Object value;
final Object lafValue;
final Object info;
private String valueStr;
Item( String key, Object value, Object lafValue ) {
Item( String key, Object value, Object lafValue, Object info ) {
this.key = key;
this.value = value;
this.lafValue = lafValue;
this.info = info;
}
String getValueAsString() {
if( valueStr == null )
valueStr = valueAsString( value );
valueStr = valueAsString( value, info );
return valueStr;
}
static String valueAsString( Object value ) {
static String valueAsString( Object value, Object info ) {
if( value instanceof Color ) {
Color color = (Color) value;
Color color = (info instanceof Color[]) ? ((Color[])info)[0] : (Color) value;
HSLColor hslColor = new HSLColor( color );
if( color.getAlpha() == 255 ) {
return String.format( "%s rgb(%d, %d, %d) hsl(%d, %d, %d)",
return String.format( "%-9s HSL %3d %3d %3d",
color2hex( color ),
color.getRed(), color.getGreen(), color.getBlue(),
(int) hslColor.getHue(), (int) hslColor.getSaturation(),
(int) hslColor.getLuminance() );
} else {
return String.format( "%s rgba(%d, %d, %d, %d) hsla(%d, %d, %d, %d)",
return String.format( "%-9s HSL %3d %3d %3d %2d",
color2hex( color ),
color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha(),
(int) hslColor.getHue(), (int) hslColor.getSaturation(),
(int) hslColor.getLuminance(), (int) (hslColor.getAlpha() * 100) );
}
@@ -532,15 +730,15 @@ public class FlatUIDefaultsInspector
Border border = (Border) value;
if( border instanceof FlatLineBorder ) {
FlatLineBorder lineBorder = (FlatLineBorder) border;
return valueAsString( lineBorder.getUnscaledBorderInsets() )
+ " " + Item.color2hex( lineBorder.getLineColor() )
return valueAsString( lineBorder.getUnscaledBorderInsets(), null )
+ " " + color2hex( lineBorder.getLineColor() )
+ " " + lineBorder.getLineThickness()
+ " " + border.getClass().getName();
} else if( border instanceof EmptyBorder ) {
Insets insets = (border instanceof FlatEmptyBorder)
? ((FlatEmptyBorder)border).getUnscaledBorderInsets()
: ((EmptyBorder)border).getBorderInsets();
return valueAsString( insets ) + " " + border.getClass().getName();
return valueAsString( insets, null ) + " " + border.getClass().getName();
} else if( border instanceof FlatBorder || border instanceof FlatMarginBorder )
return border.getClass().getName();
else
@@ -816,8 +1014,8 @@ public class FlatUIDefaultsInspector
super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
if( item.value instanceof Color ) {
Color color = (Color) item.value;
boolean isDark = new HSLColor( color ).getLuminance() < 70;
Color color = (item.info instanceof Color[]) ? ((Color[])item.info)[0] : (Color) item.value;
boolean isDark = new HSLColor( color ).getLuminance() < 70 && color.getAlpha() >= 128;
setBackground( color );
setForeground( isDark ? Color.white : Color.black );
} else if( item.value instanceof Icon ) {
@@ -826,10 +1024,12 @@ public class FlatUIDefaultsInspector
}
// set tooltip
String toolTipText = String.valueOf( item.value );
String toolTipText = (item.value instanceof Object[])
? Arrays.toString( (Object[]) item.value ).replace( ", ", ",\n" )
: String.valueOf( item.value );
if( item.lafValue != null ) {
toolTipText += " \n\nLaF UI default value was overridden with UIManager.put(key,value):\n "
+ Item.valueAsString( item.lafValue ) + "\n " + String.valueOf( item.lafValue );
+ Item.valueAsString( item.lafValue, null ) + "\n " + String.valueOf( item.lafValue );
}
setToolTipText( toolTipText );
@@ -839,9 +1039,30 @@ public class FlatUIDefaultsInspector
@Override
protected void paintComponent( Graphics g ) {
if( item.value instanceof Color ) {
// fill background
g.setColor( getBackground() );
g.fillRect( 0, 0, getWidth(), getHeight() );
int width = getWidth();
int height = getHeight();
Color background = getBackground();
// paint color
fillRect( g, background, 0, 0, width, height );
if( item.info instanceof Color[] ) {
// paint base color
int width2 = height * 2;
fillRect( g, ((Color[])item.info)[1], width - width2, 0, width2, height );
// paint default color
Color defaultColor = (Color) item.value;
if( defaultColor != null && !defaultColor.equals( background ) ) {
int width3 = height / 2;
fillRect( g, defaultColor, width - width3, 0, width3, height );
}
// paint "derived color" indicator
int width4 = height / 4;
g.setColor( Color.magenta );
g.fillRect( width - width4, 0, width4, height );
}
// layout text
FontMetrics fm = getFontMetrics( getFont() );
@@ -853,18 +1074,14 @@ public class FlatUIDefaultsInspector
g.setColor( getForeground() );
// paint rgb() and hsl() horizontally aligned
int rgbIndex = text.indexOf( "rgb" );
int hslIndex = text.indexOf( "hsl" );
if( rgbIndex > 0 && hslIndex > rgbIndex ) {
String hexText = text.substring( 0, rgbIndex );
String rgbText = text.substring( rgbIndex, hslIndex );
// paint hsl horizontally aligned
int hslIndex = text.indexOf( "HSL" );
if( hslIndex > 0 ) {
String hexText = text.substring( 0, hslIndex );
String hslText = text.substring( hslIndex );
int hexWidth = Math.max( fm.stringWidth( hexText ), fm.stringWidth( "#DDDDDD " ) );
int rgbWidth = Math.max( fm.stringWidth( rgbText ), fm.stringWidth( "rgb(444, 444, 444) " ) );
int hexWidth = Math.max( fm.stringWidth( hexText ), fm.stringWidth( "#12345678 " ) );
FlatUIUtils.drawString( this, g, hexText, x, y );
FlatUIUtils.drawString( this, g, rgbText, x + hexWidth, y );
FlatUIUtils.drawString( this, g, hslText, x + hexWidth + rgbWidth, y );
FlatUIUtils.drawString( this, g, hslText, x + hexWidth, y );
} else
FlatUIUtils.drawString( this, g, text, x, y );
} else
@@ -872,6 +1089,17 @@ public class FlatUIDefaultsInspector
paintSeparator( g );
}
private void fillRect( Graphics g, Color color, int x, int y, int width, int height ) {
// fill white if color is translucent
if( color.getAlpha() != 255 ) {
g.setColor( Color.white );
g.fillRect( x, y, width, height );
}
g.setColor( color );
g.fillRect( x, y, width, height );
}
}
//---- class SafeIcon -----------------------------------------------------

View File

@@ -1,83 +1,75 @@
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.3.1.342" Java: "15" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
root: new FormRoot {
add( new FormWindow( "javax.swing.JFrame", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "frame"
"title": "UI Defaults Inspector"
"defaultCloseOperation": 2
"$sizePolicy": 2
"$locationPolicy": 2
addEvent( new FormEvent( "java.awt.event.WindowListener", "windowClosed", "windowClosed", false ) )
addEvent( new FormEvent( "java.awt.event.WindowListener", "windowClosing", "saveWindowBounds", false ) )
addEvent( new FormEvent( "java.awt.event.WindowListener", "windowDeactivated", "saveWindowBounds", false ) )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "panel"
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.GridBagLayout ) {
"$columnSpecs": "0, 0:1.0, 0, 0"
"$rowSpecs": "0"
"$hGap": 10
"$vGap": 5
"$alignLeft": true
"$alignTop": true
} ) {
name: "filterPanel"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "flterLabel"
"text": "Filter:"
"labelFor": new FormReference( "filterField" )
"displayedMnemonic": 70
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "filterField"
"$client.JTextField.placeholderText": "enter one or more filter strings, separated by space characters"
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) {
"gridx": 1
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "valueTypeLabel"
"text": "Value Type:"
"labelFor": new FormReference( "valueTypeField" )
"displayedMnemonic": 84
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) {
"gridx": 2
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "valueTypeField"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "(any)"
addElement( "(any)" )
addElement( "Boolean" )
addElement( "Border" )
addElement( "Color" )
addElement( "Dimension" )
addElement( "Float" )
addElement( "Font" )
addElement( "Icon" )
addElement( "Insets" )
addElement( "Integer" )
addElement( "String" )
addElement( "(other)" )
}
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "filterChanged", false ) )
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) {
"gridx": 3
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "North"
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "panel"
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.GridBagLayout ) {
"$columnSpecs": "0, 0:1.0, 0, 0"
"$rowSpecs": "0"
"$hGap": 10
"$vGap": 5
"$alignLeft": true
"$alignTop": true
} ) {
name: "filterPanel"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "flterLabel"
"text": "Filter:"
"labelFor": new FormReference( "filterField" )
"displayedMnemonic": 70
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "filterField"
"$client.JTextField.placeholderText": "enter one or more filter strings, separated by space characters"
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) {
"gridx": 1
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane"
add( new FormComponent( "javax.swing.JTable" ) {
name: "table"
"autoCreateRowSorter": true
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "valueTypeLabel"
"text": "Value Type:"
"labelFor": new FormReference( "valueTypeField" )
"displayedMnemonic": 84
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) {
"gridx": 2
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "valueTypeField"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "(any)"
addElement( "(any)" )
addElement( "Boolean" )
addElement( "Border" )
addElement( "Color" )
addElement( "Color (α)" )
addElement( "Color (ƒ)" )
addElement( "Dimension" )
addElement( "Float" )
addElement( "Font" )
addElement( "Icon" )
addElement( "Insets" )
addElement( "Integer" )
addElement( "String" )
addElement( "(other)" )
}
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "filterChanged", false ) )
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) {
"gridx": 3
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "North"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane"
add( new FormComponent( "javax.swing.JTable" ) {
name: "table"
"autoCreateRowSorter": true
"componentPopupMenu": new FormReference( "tablePopupMenu" )
addEvent( new FormEvent( "java.awt.event.MouseListener", "mousePressed", "tableMousePressed", true ) )
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
@@ -86,5 +78,25 @@ new FormModel {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 400, 300 )
} )
add( new FormContainer( "javax.swing.JPopupMenu", new FormLayoutManager( class javax.swing.JPopupMenu ) ) {
name: "tablePopupMenu"
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "copyKeyMenuItem"
"text": "Copy Key"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "copyKey", false ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "copyValueMenuItem"
"text": "Copy Value"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "copyValue", false ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "copyKeyAndValueMenuItem"
"text": "Copy Key and Value"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "copyKeyAndValue", false ) )
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 370 )
} )
}
}

View File

@@ -1,141 +0,0 @@
/*
* Copyright 2019 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ItemEvent;
import javax.swing.JCheckBox;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import com.formdev.flatlaf.FlatLaf;
/**
* A tri-state check box.
* <p>
* To display the third state, this component requires an LaF that supports painting
* the indeterminate state if client property {@code "JButton.selectedState"} has the
* value {@code "indeterminate"}.
* <p>
* FlatLaf and Mac Aqua LaF support the third state.
* For other LaFs a magenta rectangle is painted around the component for the third state.
*
* @author Karl Tauber
*/
public class TriStateCheckBox
extends JCheckBox
{
public enum State { INDETERMINATE, SELECTED, UNSELECTED }
private State state;
private boolean thirdStateEnabled = true;
public TriStateCheckBox() {
this( null );
}
public TriStateCheckBox( String text ) {
this( text, State.INDETERMINATE );
}
public TriStateCheckBox( String text, State initialState ) {
super( text );
setModel( new ToggleButtonModel() {
@Override
public boolean isSelected() {
return state != State.UNSELECTED;
}
@Override
public void setSelected( boolean b ) {
switch( state ) {
case INDETERMINATE: setState( State.SELECTED ); break;
case SELECTED: setState( State.UNSELECTED ); break;
case UNSELECTED: setState( thirdStateEnabled ? State.INDETERMINATE : State.SELECTED ); break;
}
fireStateChanged();
fireItemStateChanged( new ItemEvent( this, ItemEvent.ITEM_STATE_CHANGED, this,
isSelected() ? ItemEvent.SELECTED : ItemEvent.DESELECTED ) );
}
} );
setState( initialState );
}
public State getState() {
return state;
}
public void setState( State state ) {
if( this.state == state )
return;
State oldState = this.state;
this.state = state;
putClientProperty( "JButton.selectedState", state == State.INDETERMINATE ? "indeterminate" : null );
firePropertyChange( "state", oldState, state );
repaint();
}
public Boolean getValue() {
switch( state ) {
default:
case INDETERMINATE: return null;
case SELECTED: return true;
case UNSELECTED: return false;
}
}
public void setValue( Boolean value ) {
setState( value == null ? State.INDETERMINATE : (value ? State.SELECTED : State.UNSELECTED) );
}
public boolean isThirdStateEnabled() {
return thirdStateEnabled;
}
public void setThirdStateEnabled( boolean thirdStateEnabled ) {
this.thirdStateEnabled = thirdStateEnabled;
if( state == State.INDETERMINATE )
setState( State.UNSELECTED );
}
@Override
public void setSelected( boolean b ) {
setState( b ? State.SELECTED : State.UNSELECTED );
}
@Override
protected void paintComponent( Graphics g ) {
super.paintComponent( g );
if( state == State.INDETERMINATE && !isThirdStateSupported() ) {
g.setColor( Color.magenta );
g.drawRect( 0, 0, getWidth() - 1, getHeight() - 1 );
}
}
private boolean isThirdStateSupported() {
LookAndFeel laf = UIManager.getLookAndFeel();
return laf instanceof FlatLaf || laf.getClass().getName().equals( "com.apple.laf.AquaLookAndFeel" );
}
}

View File

@@ -0,0 +1,120 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import javax.swing.JButton;
/**
* Subclass of {@link JButton} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatButton
extends JButton
implements FlatComponentExtension
{
// NOTE: enum names must be equal to allowed strings
public enum ButtonType { none, square, roundRect, tab, help, toolBarButton };
/**
* Returns type of a button.
*/
public ButtonType getButtonType() {
return getClientPropertyEnumString( BUTTON_TYPE, ButtonType.class, null, ButtonType.none );
}
/**
* Specifies type of a button.
*/
public void setButtonType( ButtonType buttonType ) {
if( buttonType == ButtonType.none )
buttonType = null;
putClientPropertyEnumString( BUTTON_TYPE, buttonType );
}
/**
* Returns whether the button preferred size will be made square (quadratically).
*/
public boolean isSquareSize() {
return getClientPropertyBoolean( SQUARE_SIZE, false );
}
/**
* Specifies whether the button preferred size will be made square (quadratically).
*/
public void setSquareSize( boolean squareSize ) {
putClientPropertyBoolean( SQUARE_SIZE, squareSize, false );
}
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "Button.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
/**
* Returns minimum height of a component.
*/
public int getMinimumHeight() {
return getClientPropertyInt( MINIMUM_HEIGHT, 0 );
}
/**
* Specifies minimum height of a component.
*/
public void setMinimumHeight( int minimumHeight ) {
putClientProperty( MINIMUM_HEIGHT, (minimumHeight >= 0) ? minimumHeight : null );
}
/**
* Returns the outline color of the component border.
*/
public Object getOutline() {
return getClientProperty( OUTLINE );
}
/**
* Specifies the outline color of the component border.
* <p>
* Allowed Values are:
* <ul>
* <li>{@code null}
* <li>string {@code "error"}
* <li>string {@code "warning"}
* <li>any color (type {@link Color})
* <li>an array of two colors (type {@link Color}[2]) where the first color
* is for focused state and the second for unfocused state
* </ul>
*/
public void setOutline( Object outline ) {
putClientProperty( OUTLINE, outline );
}
}

View File

@@ -0,0 +1,100 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import javax.swing.JComboBox;
/**
* Subclass of {@link JComboBox} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatComboBox<E>
extends JComboBox<E>
implements FlatComponentExtension
{
/**
* Returns the placeholder text that is only painted if the editable combo box is empty.
*/
public String getPlaceholderText() {
return (String) getClientProperty( PLACEHOLDER_TEXT );
}
/**
* Sets the placeholder text that is only painted if the editable combo box is empty.
*/
public void setPlaceholderText( String placeholderText ) {
putClientProperty( PLACEHOLDER_TEXT, placeholderText );
}
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "ComboBox.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
/**
* Returns whether the component is painted with round edges.
*/
public boolean isRoundRect() {
return getClientPropertyBoolean( COMPONENT_ROUND_RECT, false );
}
/**
* Specifies whether the component is painted with round edges.
*/
public void setRoundRect( boolean roundRect ) {
putClientPropertyBoolean( COMPONENT_ROUND_RECT, roundRect, false );
}
/**
* Returns the outline color of the component border.
*/
public Object getOutline() {
return getClientProperty( OUTLINE );
}
/**
* Specifies the outline color of the component border.
* <p>
* Allowed Values are:
* <ul>
* <li>{@code null}
* <li>string {@code "error"}
* <li>string {@code "warning"}
* <li>any color (type {@link Color})
* <li>an array of two colors (type {@link Color}[2]) where the first color
* is for focused state and the second for unfocused state
* </ul>
*/
public void setOutline( Object outline ) {
putClientProperty( OUTLINE, outline );
}
}

View File

@@ -0,0 +1,99 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import java.awt.Color;
import java.awt.Insets;
import javax.swing.JComponent;
import javax.swing.UIManager;
/**
* Base interface for all FlatLaf component extensions.
* Extensions use client properties to store property values in components.
*
* @author Karl Tauber
*/
public interface FlatComponentExtension
{
/**
* Overrides {@link JComponent#getClientProperty(Object)}.
*/
Object getClientProperty( Object key );
/**
* Overrides {@link JComponent#putClientProperty(Object, Object)}.
*/
void putClientProperty( Object key, Object value );
default boolean getClientPropertyBoolean( Object key, String defaultValueKey ) {
Object value = getClientProperty( key );
return (value instanceof Boolean) ? (boolean) value : UIManager.getBoolean( defaultValueKey );
}
default boolean getClientPropertyBoolean( Object key, boolean defaultValue ) {
Object value = getClientProperty( key );
return (value instanceof Boolean) ? (boolean) value : defaultValue;
}
default void putClientPropertyBoolean( Object key, boolean value, boolean defaultValue ) {
putClientProperty( key, (value != defaultValue) ? value : null );
}
default int getClientPropertyInt( Object key, String defaultValueKey ) {
Object value = getClientProperty( key );
return (value instanceof Integer) ? (int) value : UIManager.getInt( defaultValueKey );
}
default int getClientPropertyInt( Object key, int defaultValue ) {
Object value = getClientProperty( key );
return (value instanceof Integer) ? (int) value : defaultValue;
}
default Color getClientPropertyColor( Object key, String defaultValueKey ) {
Object value = getClientProperty( key );
return (value instanceof Color) ? (Color) value : UIManager.getColor( defaultValueKey );
}
default Insets getClientPropertyInsets( Object key, String defaultValueKey ) {
Object value = getClientProperty( key );
return (value instanceof Insets) ? (Insets) value : UIManager.getInsets( defaultValueKey );
}
default <T extends Enum<T>> T getClientPropertyEnumString( Object key, Class<T> enumType,
String defaultValueKey, T defaultValue )
{
Object value = getClientProperty( key );
if( !(value instanceof String) && defaultValueKey != null )
value = UIManager.getString( defaultValueKey );
if( value instanceof String ) {
try {
return Enum.valueOf( enumType, (String) value );
} catch( IllegalArgumentException ex ) {
ex.printStackTrace();
}
}
return defaultValue;
}
default <T extends Enum<T>> void putClientPropertyEnumString( Object key, Enum<T> value ) {
putClientProperty( key, (value != null) ? value.toString() : null );
}
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import javax.swing.JEditorPane;
/**
* Subclass of {@link JEditorPane} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatEditorPane
extends JEditorPane
implements FlatComponentExtension
{
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "Component.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
}

View File

@@ -0,0 +1,117 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import javax.swing.JFormattedTextField;
import com.formdev.flatlaf.extras.components.FlatTextField.SelectAllOnFocusPolicy;
/**
* Subclass of {@link JFormattedTextField} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatFormattedTextField
extends JFormattedTextField
implements FlatComponentExtension
{
/**
* Returns the placeholder text that is only painted if the text field is empty.
*/
public String getPlaceholderText() {
return (String) getClientProperty( PLACEHOLDER_TEXT );
}
/**
* Sets the placeholder text that is only painted if the text field is empty.
*/
public void setPlaceholderText( String placeholderText ) {
putClientProperty( PLACEHOLDER_TEXT, placeholderText );
}
/**
* Returns whether all text is selected when the text component gains focus.
*/
public SelectAllOnFocusPolicy getSelectAllOnFocusPolicy() {
return getClientPropertyEnumString( SELECT_ALL_ON_FOCUS_POLICY, SelectAllOnFocusPolicy.class,
"TextComponent.selectAllOnFocusPolicy", SelectAllOnFocusPolicy.once );
}
/**
* Specifies whether all text is selected when the text component gains focus.
*/
public void setSelectAllOnFocusPolicy( SelectAllOnFocusPolicy selectAllOnFocusPolicy ) {
putClientPropertyEnumString( SELECT_ALL_ON_FOCUS_POLICY, selectAllOnFocusPolicy );
}
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "Component.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
/**
* Returns whether the component is painted with round edges.
*/
public boolean isRoundRect() {
return getClientPropertyBoolean( COMPONENT_ROUND_RECT, false );
}
/**
* Specifies whether the component is painted with round edges.
*/
public void setRoundRect( boolean roundRect ) {
putClientPropertyBoolean( COMPONENT_ROUND_RECT, roundRect, false );
}
/**
* Returns the outline color of the component border.
*/
public Object getOutline() {
return getClientProperty( OUTLINE );
}
/**
* Specifies the outline color of the component border.
* <p>
* Allowed Values are:
* <ul>
* <li>{@code null}
* <li>string {@code "error"}
* <li>string {@code "warning"}
* <li>any color (type {@link Color})
* <li>an array of two colors (type {@link Color}[2]) where the first color
* is for focused state and the second for unfocused state
* </ul>
*/
public void setOutline( Object outline ) {
putClientProperty( OUTLINE, outline );
}
}

View File

@@ -0,0 +1,117 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import javax.swing.JPasswordField;
import com.formdev.flatlaf.extras.components.FlatTextField.SelectAllOnFocusPolicy;
/**
* Subclass of {@link JPasswordField} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatPasswordField
extends JPasswordField
implements FlatComponentExtension
{
/**
* Returns the placeholder text that is only painted if the text field is empty.
*/
public String getPlaceholderText() {
return (String) getClientProperty( PLACEHOLDER_TEXT );
}
/**
* Sets the placeholder text that is only painted if the text field is empty.
*/
public void setPlaceholderText( String placeholderText ) {
putClientProperty( PLACEHOLDER_TEXT, placeholderText );
}
/**
* Returns whether all text is selected when the text component gains focus.
*/
public SelectAllOnFocusPolicy getSelectAllOnFocusPolicy() {
return getClientPropertyEnumString( SELECT_ALL_ON_FOCUS_POLICY, SelectAllOnFocusPolicy.class,
"TextComponent.selectAllOnFocusPolicy", SelectAllOnFocusPolicy.once );
}
/**
* Specifies whether all text is selected when the text component gains focus.
*/
public void setSelectAllOnFocusPolicy( SelectAllOnFocusPolicy selectAllOnFocusPolicy ) {
putClientPropertyEnumString( SELECT_ALL_ON_FOCUS_POLICY, selectAllOnFocusPolicy );
}
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "Component.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
/**
* Returns whether the component is painted with round edges.
*/
public boolean isRoundRect() {
return getClientPropertyBoolean( COMPONENT_ROUND_RECT, false );
}
/**
* Specifies whether the component is painted with round edges.
*/
public void setRoundRect( boolean roundRect ) {
putClientPropertyBoolean( COMPONENT_ROUND_RECT, roundRect, false );
}
/**
* Returns the outline color of the component border.
*/
public Object getOutline() {
return getClientProperty( OUTLINE );
}
/**
* Specifies the outline color of the component border.
* <p>
* Allowed Values are:
* <ul>
* <li>{@code null}
* <li>string {@code "error"}
* <li>string {@code "warning"}
* <li>any color (type {@link Color})
* <li>an array of two colors (type {@link Color}[2]) where the first color
* is for focused state and the second for unfocused state
* </ul>
*/
public void setOutline( Object outline ) {
putClientProperty( OUTLINE, outline );
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import javax.swing.JProgressBar;
/**
* Subclass of {@link JProgressBar} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatProgressBar
extends JProgressBar
implements FlatComponentExtension
{
/**
* Returns whether the progress bar has always the larger height even if no string is painted.
*/
public boolean isLargeHeight() {
return getClientPropertyBoolean( PROGRESS_BAR_LARGE_HEIGHT, false );
}
/**
* Specifies whether the progress bar has always the larger height even if no string is painted.
*/
public void setLargeHeight( boolean largeHeight ) {
putClientPropertyBoolean( PROGRESS_BAR_LARGE_HEIGHT, largeHeight, false );
}
/**
* Returns whether the progress bar is paint with square edges.
*/
public boolean isSquare() {
return getClientPropertyBoolean( PROGRESS_BAR_SQUARE, false );
}
/**
* Specifies whether the progress bar is paint with square edges.
*/
public void setSquare( boolean square ) {
putClientPropertyBoolean( PROGRESS_BAR_SQUARE, square, false );
}
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import javax.swing.JScrollBar;
/**
* Subclass of {@link JScrollBar} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatScrollBar
extends JScrollBar
implements FlatComponentExtension
{
/**
* Returns whether the decrease/increase arrow buttons of a scrollbar are shown.
*/
public boolean isShowButtons() {
return getClientPropertyBoolean( SCROLL_BAR_SHOW_BUTTONS, "ScrollBar.showButtons" );
}
/**
* Specifies whether the decrease/increase arrow buttons of a scrollbar are shown.
*/
public void setShowButtons( boolean showButtons ) {
putClientProperty( SCROLL_BAR_SHOW_BUTTONS, showButtons );
}
}

View File

@@ -0,0 +1,85 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import javax.swing.JScrollPane;
/**
* Subclass of {@link JScrollPane} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatScrollPane
extends JScrollPane
implements FlatComponentExtension
{
/**
* Returns whether the decrease/increase arrow buttons of a scrollbar are shown.
*/
public boolean isShowButtons() {
return getClientPropertyBoolean( SCROLL_BAR_SHOW_BUTTONS, "ScrollBar.showButtons" );
}
/**
* Specifies whether the decrease/increase arrow buttons of a scrollbar are shown.
*/
public void setShowButtons( boolean showButtons ) {
putClientProperty( SCROLL_BAR_SHOW_BUTTONS, showButtons );
}
/**
* Returns whether the scroll pane uses smooth scrolling.
*/
public boolean isSmoothScrolling() {
return getClientPropertyBoolean( SCROLL_PANE_SMOOTH_SCROLLING, "ScrollPane.smoothScrolling" );
}
/**
* Specifies whether the scroll pane uses smooth scrolling.
*/
public void setSmoothScrolling( boolean smoothScrolling ) {
putClientProperty( SCROLL_PANE_SMOOTH_SCROLLING, smoothScrolling );
}
/**
* Returns the outline color of the component border.
*/
public Object getOutline() {
return getClientProperty( OUTLINE );
}
/**
* Specifies the outline color of the component border.
* <p>
* Allowed Values are:
* <ul>
* <li>{@code null}
* <li>string {@code "error"}
* <li>string {@code "warning"}
* <li>any color (type {@link Color})
* <li>an array of two colors (type {@link Color}[2]) where the first color
* is for focused state and the second for unfocused state
* </ul>
*/
public void setOutline( Object outline ) {
putClientProperty( OUTLINE, outline );
}
}

View File

@@ -0,0 +1,85 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import javax.swing.JSpinner;
/**
* Subclass of {@link JSpinner} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatSpinner
extends JSpinner
implements FlatComponentExtension
{
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "Component.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
/**
* Returns whether the component is painted with round edges.
*/
public boolean isRoundRect() {
return getClientPropertyBoolean( COMPONENT_ROUND_RECT, false );
}
/**
* Specifies whether the component is painted with round edges.
*/
public void setRoundRect( boolean roundRect ) {
putClientPropertyBoolean( COMPONENT_ROUND_RECT, roundRect, false );
}
/**
* Returns the outline color of the component border.
*/
public Object getOutline() {
return getClientProperty( OUTLINE );
}
/**
* Specifies the outline color of the component border.
* <p>
* Allowed Values are:
* <ul>
* <li>{@code null}
* <li>string {@code "error"}
* <li>string {@code "warning"}
* <li>any color (type {@link Color})
* <li>an array of two colors (type {@link Color}[2]) where the first color
* is for focused state and the second for unfocused state
* </ul>
*/
public void setOutline( Object outline ) {
putClientProperty( OUTLINE, outline );
}
}

View File

@@ -0,0 +1,543 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Component;
import java.awt.Insets;
import java.util.function.BiConsumer;
import javax.swing.JComponent;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;
/**
* Subclass of {@link JTabbedPane} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatTabbedPane
extends JTabbedPane
implements FlatComponentExtension
{
/**
* Returns whether separators are shown between tabs.
*/
public boolean isShowTabSeparators() {
return getClientPropertyBoolean( TABBED_PANE_SHOW_TAB_SEPARATORS, "TabbedPane.showTabSeparators" );
}
/**
* Specifies whether separators are shown between tabs.
*/
public void setShowTabSeparators( boolean showTabSeparators ) {
putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators );
}
/**
* Returns whether the separator between tabs area and content area should be shown.
*/
public boolean isShowContentSeparators() {
return getClientPropertyBoolean( TABBED_PANE_SHOW_CONTENT_SEPARATOR, true );
}
/**
* Specifies whether the separator between tabs area and content area should be shown.
*/
public void setShowContentSeparators( boolean showContentSeparators ) {
putClientPropertyBoolean( TABBED_PANE_SHOW_CONTENT_SEPARATOR, showContentSeparators, true );
}
/**
* Returns whether a full border is painted around a tabbed pane.
*/
public boolean isHasFullBorder() {
return getClientPropertyBoolean( TABBED_PANE_HAS_FULL_BORDER, "TabbedPane.hasFullBorder" );
}
/**
* Specifies whether a full border is painted around a tabbed pane.
*/
public void setHasFullBorder( boolean hasFullBorder ) {
putClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder );
}
/**
* Returns whether the tab area should be hidden if it contains only one tab.
*/
public boolean isHideTabAreaWithOneTab() {
return getClientPropertyBoolean( TABBED_PANE_HIDE_TAB_AREA_WITH_ONE_TAB, false );
}
/**
* Specifies whether the tab area should be hidden if it contains only one tab.
*/
public void setHideTabAreaWithOneTab( boolean hideTabAreaWithOneTab ) {
putClientPropertyBoolean( TABBED_PANE_HIDE_TAB_AREA_WITH_ONE_TAB, hideTabAreaWithOneTab, false );
}
/**
* Returns the minimum width of a tab.
*/
public int getMinimumTabWidth() {
return getClientPropertyInt( TABBED_PANE_MINIMUM_TAB_WIDTH, "TabbedPane.minimumTabWidth" );
}
/**
* Specifies the minimum width of a tab.
*/
public void setMinimumTabWidth( int minimumTabWidth ) {
putClientProperty( TABBED_PANE_MINIMUM_TAB_WIDTH, (minimumTabWidth >= 0) ? minimumTabWidth : null );
}
/**
* Returns the minimum width of the tab at the given tab index.
*/
public int getMinimumTabWidth( int tabIndex ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
return clientPropertyInt( c, TABBED_PANE_MINIMUM_TAB_WIDTH, 0 );
}
/**
* Specifies the minimum width of the tab at the given tab index.
*/
public void setMinimumTabWidth( int tabIndex, int minimumTabWidth ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
c.putClientProperty( TABBED_PANE_MINIMUM_TAB_WIDTH, (minimumTabWidth >= 0) ? minimumTabWidth : null );
}
/**
* Returns the maximum width of a tab.
*/
public int getMaximumTabWidth() {
return getClientPropertyInt( TABBED_PANE_MAXIMUM_TAB_WIDTH, "TabbedPane.maximumTabWidth" );
}
/**
* Specifies the maximum width of a tab.
* <p>
* Applied only if tab does not have a custom tab component
* (see {@link javax.swing.JTabbedPane#setTabComponentAt(int, java.awt.Component)}).
*/
public void setMaximumTabWidth( int maximumTabWidth ) {
putClientProperty( TABBED_PANE_MAXIMUM_TAB_WIDTH, (maximumTabWidth >= 0) ? maximumTabWidth : null );
}
/**
* Returns the maximum width of the tab at the given tab index.
*/
public int getMaximumTabWidth( int tabIndex ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
return clientPropertyInt( c, TABBED_PANE_MAXIMUM_TAB_WIDTH, 0 );
}
/**
* Specifies the maximum width of the tab at the given tab index.
* <p>
* Applied only if tab does not have a custom tab component
* (see {@link javax.swing.JTabbedPane#setTabComponentAt(int, java.awt.Component)}).
*/
public void setMaximumTabWidth( int tabIndex, int maximumTabWidth ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
c.putClientProperty( TABBED_PANE_MAXIMUM_TAB_WIDTH, (maximumTabWidth >= 0) ? maximumTabWidth : null );
}
/**
* Returns the minimum height of a tab.
*/
public int getTabHeight() {
return getClientPropertyInt( TABBED_PANE_TAB_HEIGHT, "TabbedPane.tabHeight" );
}
/**
* Specifies the minimum height of a tab.
*
* @see #setTabInsets(Insets)
*/
public void setTabHeight( int tabHeight ) {
putClientProperty( TABBED_PANE_TAB_HEIGHT, (tabHeight >= 0) ? tabHeight : null );
}
/**
* Returns the insets of a tab.
*/
public Insets getTabInsets() {
return getClientPropertyInsets( TABBED_PANE_TAB_INSETS, "TabbedPane.tabInsets" );
}
/**
* Specifies the insets of a tab.
*
* @see #setTabHeight(int)
*/
public void setTabInsets( Insets tabInsets ) {
putClientProperty( TABBED_PANE_TAB_INSETS, tabInsets );
}
/**
* Returns the insets of the tab at the given tab index.
*/
public Insets getTabInsets( int tabIndex ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
return (Insets) c.getClientProperty( TABBED_PANE_TAB_INSETS );
}
/**
* Specifies the insets of the tab at the given tab index.
*
* @see #setTabHeight(int)
*/
public void setTabInsets( int tabIndex, Insets tabInsets ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
c.putClientProperty( TABBED_PANE_TAB_INSETS, tabInsets );
}
/**
* Returns the insets of the tab area.
*/
public Insets getTabAreaInsets() {
return getClientPropertyInsets( TABBED_PANE_TAB_AREA_INSETS, "TabbedPane.tabAreaInsets" );
}
/**
* Specifies the insets of the tab area.
*/
public void setTabAreaInsets( Insets tabAreaInsets ) {
putClientProperty( TABBED_PANE_TAB_AREA_INSETS, tabAreaInsets );
}
/**
* Returns whether all tabs are closable.
*/
public boolean isTabsClosable() {
return getClientPropertyBoolean( TABBED_PANE_TAB_CLOSABLE, false );
}
/**
* Specifies whether all tabs are closable.
* If set to {@code true}, all tabs in that tabbed pane are closable.
* To make individual tabs closable, use {@link #setTabClosable(int, boolean)}.
* <p>
* Note that you have to specify a callback (see {@link #setTabCloseCallback(BiConsumer)})
* that is invoked when the user clicks a tab close button.
* The callback is responsible for closing the tab.
*/
public void setTabsClosable( boolean tabClosable ) {
putClientPropertyBoolean( TABBED_PANE_TAB_CLOSABLE, tabClosable, false );
}
/**
* Returns whether the tab at the given tab index is closable.
*/
public Boolean isTabClosable( int tabIndex ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
Object value = c.getClientProperty( TABBED_PANE_TAB_CLOSABLE );
return (value instanceof Boolean) ? (boolean) value : isTabsClosable();
}
/**
* Specifies whether the tab at the given tab index is closable.
* To make all tabs closable, use {@link #setTabsClosable(boolean)}.
* <p>
* Note that you have to specify a callback (see {@link #setTabCloseCallback(BiConsumer)})
* that is invoked when the user clicks a tab close button.
* The callback is responsible for closing the tab.
*/
public void setTabClosable( int tabIndex, boolean tabClosable ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
c.putClientProperty( TABBED_PANE_TAB_CLOSABLE, tabClosable );
}
/**
* Returns the tooltip text used for tab close buttons.
*/
public String getTabCloseToolTipText() {
return (String) getClientProperty( TABBED_PANE_TAB_CLOSE_TOOLTIPTEXT );
}
/**
* Specifies the tooltip text used for tab close buttons.
*/
public void setTabCloseToolTipText( String tabCloseToolTipText ) {
putClientProperty( TABBED_PANE_TAB_CLOSE_TOOLTIPTEXT, tabCloseToolTipText );
}
/**
* Returns the tooltip text used for tab close button at the given tab index.
*/
public String getTabCloseToolTipText( int tabIndex ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
return (String) c.getClientProperty( TABBED_PANE_TAB_CLOSE_TOOLTIPTEXT );
}
/**
* Specifies the tooltip text used for tab close button at the given tab index.
*/
public void setTabCloseToolTipText( int tabIndex, String tabCloseToolTipText ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
c.putClientProperty( TABBED_PANE_TAB_CLOSE_TOOLTIPTEXT, tabCloseToolTipText );
}
/**
* Returns the callback that is invoked when a tab close button is clicked.
* The callback is responsible for closing the tab.
*/
@SuppressWarnings( "unchecked" )
public BiConsumer<JTabbedPane, Integer> getTabCloseCallback() {
return (BiConsumer<JTabbedPane, Integer>) getClientProperty( TABBED_PANE_TAB_CLOSE_CALLBACK );
}
/**
* Specifies the callback that is invoked when a tab close button is clicked.
* The callback is responsible for closing the tab.
* <p>
* Use a {@link java.util.function.BiConsumer}&lt;javax.swing.JTabbedPane, Integer&gt;
* that receives the tabbed pane and the tab index as parameters:
* <pre>{@code
* myTabbedPane.setTabCloseCallback( (tabbedPane, tabIndex) -> {
* // close tab here
* } );
* }</pre>
* If you need to check whether a modifier key (e.g. Alt or Shift) was pressed
* while the user clicked the tab close button, use {@link java.awt.EventQueue#getCurrentEvent}
* to get current event, check whether it is a {@link java.awt.event.MouseEvent}
* and invoke its methods. E.g.
* <pre>{@code
* AWTEvent e = EventQueue.getCurrentEvent();
* boolean shift = (e instanceof MouseEvent) ? ((MouseEvent)e).isShiftDown() : false;
* }</pre>
*/
public void setTabCloseCallback( BiConsumer<JTabbedPane, Integer> tabCloseCallback ) {
putClientProperty( TABBED_PANE_TAB_CLOSE_CALLBACK, tabCloseCallback );
}
/**
* Returns the callback that is invoked when the tab close button at the given tab index is clicked.
* The callback is responsible for closing the tab.
*/
@SuppressWarnings( "unchecked" )
public BiConsumer<JTabbedPane, Integer> getTabCloseCallback( int tabIndex ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
return (BiConsumer<JTabbedPane, Integer>) c.getClientProperty( TABBED_PANE_TAB_CLOSE_CALLBACK );
}
/**
* Specifies the callback that is invoked when the tab close button at the given tab index is clicked.
* The callback is responsible for closing the tab.
*
* @see #setTabCloseCallback(BiConsumer)
*/
public void setTabCloseCallback( int tabIndex, BiConsumer<JTabbedPane, Integer> tabCloseCallback ) {
JComponent c = (JComponent) getComponentAt( tabIndex );
c.putClientProperty( TABBED_PANE_TAB_CLOSE_CALLBACK, tabCloseCallback );
}
// NOTE: enum names must be equal to allowed strings
public enum TabsPopupPolicy { never, asNeeded };
/**
* Returns the display policy for the "more tabs" button,
* which shows a popup menu with the (partly) hidden tabs.
*/
public TabsPopupPolicy getTabsPopupPolicy() {
return getClientPropertyEnumString( TABBED_PANE_TABS_POPUP_POLICY, TabsPopupPolicy.class,
"TabbedPane.tabsPopupPolicy", TabsPopupPolicy.asNeeded );
}
/**
* Specifies the display policy for the "more tabs" button,
* which shows a popup menu with the (partly) hidden tabs.
*/
public void setTabsPopupPolicy( TabsPopupPolicy tabsPopupPolicy ) {
putClientPropertyEnumString( TABBED_PANE_TABS_POPUP_POLICY, tabsPopupPolicy );
}
// NOTE: enum names must be equal to allowed strings
public enum ScrollButtonsPolicy { never, asNeeded, asNeededSingle };
/**
* Returns the display policy for the forward/backward scroll arrow buttons.
*/
public ScrollButtonsPolicy getScrollButtonsPolicy() {
return getClientPropertyEnumString( TABBED_PANE_SCROLL_BUTTONS_POLICY, ScrollButtonsPolicy.class,
"TabbedPane.scrollButtonsPolicy", ScrollButtonsPolicy.asNeededSingle );
}
/**
* Specifies the display policy for the forward/backward scroll arrow buttons.
*/
public void setScrollButtonsPolicy( ScrollButtonsPolicy scrollButtonsPolicy ) {
putClientPropertyEnumString( TABBED_PANE_SCROLL_BUTTONS_POLICY, scrollButtonsPolicy );
}
// NOTE: enum names must be equal to allowed strings
public enum ScrollButtonsPlacement { both, trailing };
/**
* Returns the placement of the forward/backward scroll arrow buttons.
*/
public ScrollButtonsPlacement getScrollButtonsPlacement() {
return getClientPropertyEnumString( TABBED_PANE_SCROLL_BUTTONS_PLACEMENT, ScrollButtonsPlacement.class,
"TabbedPane.scrollButtonsPlacement", ScrollButtonsPlacement.both );
}
/**
* Specifies the placement of the forward/backward scroll arrow buttons.
*/
public void setScrollButtonsPlacement( ScrollButtonsPlacement scrollButtonsPlacement ) {
putClientPropertyEnumString( TABBED_PANE_SCROLL_BUTTONS_PLACEMENT, scrollButtonsPlacement );
}
// NOTE: enum names must be equal to allowed strings
public enum TabAreaAlignment { leading, trailing, center, fill };
/**
* Returns the alignment of the tab area.
*/
public TabAreaAlignment getTabAreaAlignment() {
return getClientPropertyEnumString( TABBED_PANE_TAB_AREA_ALIGNMENT, TabAreaAlignment.class,
"TabbedPane.tabAreaAlignment", TabAreaAlignment.leading );
}
/**
* Specifies the alignment of the tab area.
*/
public void setTabAreaAlignment( TabAreaAlignment tabAreaAlignment ) {
putClientPropertyEnumString( TABBED_PANE_TAB_AREA_ALIGNMENT, tabAreaAlignment );
}
// NOTE: enum names must be equal to allowed strings
public enum TabAlignment { leading, trailing, center };
/**
* Returns the horizontal alignment of the tab title and icon.
*/
public TabAlignment getTabAlignment() {
return getClientPropertyEnumString( TABBED_PANE_TAB_ALIGNMENT, TabAlignment.class,
"TabbedPane.tabAlignment", TabAlignment.center );
}
/**
* Specifies the horizontal alignment of the tab title and icon.
*/
public void setTabAlignment( TabAlignment tabAlignment ) {
putClientPropertyEnumString( TABBED_PANE_TAB_ALIGNMENT, tabAlignment );
}
// NOTE: enum names must be equal to allowed strings
public enum TabWidthMode { preferred, equal, compact };
/**
* Returns how the tabs should be sized.
*/
public TabWidthMode getTabWidthMode() {
return getClientPropertyEnumString( TABBED_PANE_TAB_WIDTH_MODE, TabWidthMode.class,
"TabbedPane.tabWidthMode", TabWidthMode.preferred );
}
/**
* Specifies how the tabs should be sized.
*/
public void setTabWidthMode( TabWidthMode tabWidthMode ) {
putClientPropertyEnumString( TABBED_PANE_TAB_WIDTH_MODE, tabWidthMode );
}
/**
* Returns the tab icon placement (relative to tab title).
*/
public int getTabIconPlacement() {
return getClientPropertyInt( TABBED_PANE_TAB_ICON_PLACEMENT, SwingConstants.LEADING );
}
/**
* Specifies the tab icon placement (relative to tab title).
* <p>
* Allowed Values are:
* <ul>
* <li>{@link SwingConstants#LEADING} (default)
* <li>{@link SwingConstants#TRAILING}
* <li>{@link SwingConstants#TOP}
* <li>{@link SwingConstants#BOTTOM}
* </ul>
*/
public void setTabIconPlacement( int tabIconPlacement ) {
putClientProperty( TABBED_PANE_TAB_ICON_PLACEMENT, (tabIconPlacement >= 0) ? tabIconPlacement : null );
}
/**
* Returns a component that will be placed at the leading edge of the tabs area.
*/
public Component getLeadingComponent() {
return (Component) getClientProperty( TABBED_PANE_LEADING_COMPONENT );
}
/**
* Specifies a component that will be placed at the leading edge of the tabs area.
* <p>
* For top and bottom tab placement, the layed out component size will be
* the preferred component width and the tab area height.<br>
* For left and right tab placement, the layed out component size will be
* the tab area width and the preferred component height.
*/
public void setLeadingComponent( Component leadingComponent ) {
putClientProperty( TABBED_PANE_LEADING_COMPONENT, leadingComponent );
}
/**
* Returns a component that will be placed at the trailing edge of the tabs area.
*/
public Component getTrailingComponent() {
return (Component) getClientProperty( TABBED_PANE_TRAILING_COMPONENT );
}
/**
* Specifies a component that will be placed at the trailing edge of the tabs area.
* <p>
* For top and bottom tab placement, the layed out component size will be
* the available horizontal space (minimum is preferred component width) and the tab area height.<br>
* For left and right tab placement, the layed out component size will be
* the tab area width and the available vertical space (minimum is preferred component height).
*/
public void setTrailingComponent( Component trailingComponent ) {
putClientProperty( TABBED_PANE_TRAILING_COMPONENT, trailingComponent );
}
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import javax.swing.JTextArea;
/**
* Subclass of {@link JTextArea} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatTextArea
extends JTextArea
implements FlatComponentExtension
{
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "Component.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
}

View File

@@ -0,0 +1,119 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import javax.swing.JTextField;
/**
* Subclass of {@link JTextField} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatTextField
extends JTextField
implements FlatComponentExtension
{
/**
* Returns the placeholder text that is only painted if the text field is empty.
*/
public String getPlaceholderText() {
return (String) getClientProperty( PLACEHOLDER_TEXT );
}
/**
* Sets the placeholder text that is only painted if the text field is empty.
*/
public void setPlaceholderText( String placeholderText ) {
putClientProperty( PLACEHOLDER_TEXT, placeholderText );
}
// NOTE: enum names must be equal to allowed strings
public enum SelectAllOnFocusPolicy { never, once, always };
/**
* Returns whether all text is selected when the text component gains focus.
*/
public SelectAllOnFocusPolicy getSelectAllOnFocusPolicy() {
return getClientPropertyEnumString( SELECT_ALL_ON_FOCUS_POLICY, SelectAllOnFocusPolicy.class,
"TextComponent.selectAllOnFocusPolicy", SelectAllOnFocusPolicy.once );
}
/**
* Specifies whether all text is selected when the text component gains focus.
*/
public void setSelectAllOnFocusPolicy( SelectAllOnFocusPolicy selectAllOnFocusPolicy ) {
putClientPropertyEnumString( SELECT_ALL_ON_FOCUS_POLICY, selectAllOnFocusPolicy );
}
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "Component.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
/**
* Returns whether the component is painted with round edges.
*/
public boolean isRoundRect() {
return getClientPropertyBoolean( COMPONENT_ROUND_RECT, false );
}
/**
* Specifies whether the component is painted with round edges.
*/
public void setRoundRect( boolean roundRect ) {
putClientPropertyBoolean( COMPONENT_ROUND_RECT, roundRect, false );
}
/**
* Returns the outline color of the component border.
*/
public Object getOutline() {
return getClientProperty( OUTLINE );
}
/**
* Specifies the outline color of the component border.
* <p>
* Allowed Values are:
* <ul>
* <li>{@code null}
* <li>string {@code "error"}
* <li>string {@code "warning"}
* <li>any color (type {@link Color})
* <li>an array of two colors (type {@link Color}[2]) where the first color
* is for focused state and the second for unfocused state
* </ul>
*/
public void setOutline( Object outline ) {
putClientProperty( OUTLINE, outline );
}
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import javax.swing.JTextPane;
/**
* Subclass of {@link JTextPane} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatTextPane
extends JTextPane
implements FlatComponentExtension
{
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "Component.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
}

View File

@@ -0,0 +1,163 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import javax.swing.JToggleButton;
import com.formdev.flatlaf.extras.components.FlatButton.ButtonType;
/**
* Subclass of {@link JToggleButton} that provides easy access to FlatLaf specific client properties.
*
* @author Karl Tauber
*/
public class FlatToggleButton
extends JToggleButton
implements FlatComponentExtension
{
/**
* Returns type of a button.
*/
public ButtonType getButtonType() {
return getClientPropertyEnumString( BUTTON_TYPE, ButtonType.class, null, ButtonType.none );
}
/**
* Specifies type of a button.
*/
public void setButtonType( ButtonType buttonType ) {
if( buttonType == ButtonType.none )
buttonType = null;
putClientPropertyEnumString( BUTTON_TYPE, buttonType );
}
/**
* Returns whether the button preferred size will be made square (quadratically).
*/
public boolean isSquareSize() {
return getClientPropertyBoolean( SQUARE_SIZE, false );
}
/**
* Specifies whether the button preferred size will be made square (quadratically).
*/
public void setSquareSize( boolean squareSize ) {
putClientPropertyBoolean( SQUARE_SIZE, squareSize, false );
}
/**
* Returns minimum width of a component.
*/
public int getMinimumWidth() {
return getClientPropertyInt( MINIMUM_WIDTH, "ToggleButton.minimumWidth" );
}
/**
* Specifies minimum width of a component.
*/
public void setMinimumWidth( int minimumWidth ) {
putClientProperty( MINIMUM_WIDTH, (minimumWidth >= 0) ? minimumWidth : null );
}
/**
* Returns minimum height of a component.
*/
public int getMinimumHeight() {
return getClientPropertyInt( MINIMUM_HEIGHT, 0 );
}
/**
* Specifies minimum height of a component.
*/
public void setMinimumHeight( int minimumHeight ) {
putClientProperty( MINIMUM_HEIGHT, (minimumHeight >= 0) ? minimumHeight : null );
}
/**
* Returns the outline color of the component border.
*/
public Object getOutline() {
return getClientProperty( OUTLINE );
}
/**
* Specifies the outline color of the component border.
* <p>
* Allowed Values are:
* <ul>
* <li>{@code null}
* <li>string {@code "error"}
* <li>string {@code "warning"}
* <li>any color (type {@link Color})
* <li>an array of two colors (type {@link Color}[2]) where the first color
* is for focused state and the second for unfocused state
* </ul>
*/
public void setOutline( Object outline ) {
putClientProperty( OUTLINE, outline );
}
/**
* Returns height of underline if toggle button type is {@link ButtonType#tab}.
*/
public int getTabUnderlineHeight() {
return getClientPropertyInt( TAB_BUTTON_UNDERLINE_HEIGHT, "ToggleButton.tab.underlineHeight" );
}
/**
* Specifies height of underline if toggle button type is {@link ButtonType#tab}.
*/
public void setTabUnderlineHeight( int tabUnderlineHeight ) {
putClientProperty( TAB_BUTTON_UNDERLINE_HEIGHT, (tabUnderlineHeight >= 0) ? tabUnderlineHeight : null );
}
/**
* Returns color of underline if toggle button type is {@link ButtonType#tab}.
*/
public Color getTabUnderlineColor() {
return getClientPropertyColor( TAB_BUTTON_UNDERLINE_COLOR, "ToggleButton.tab.underlineColor" );
}
/**
* Specifies color of underline if toggle button type is {@link ButtonType#tab}.
*/
public void setTabUnderlineColor( Color tabUnderlineColor ) {
putClientProperty( TAB_BUTTON_UNDERLINE_COLOR, tabUnderlineColor );
}
/**
* Returns background color if selected and toggle button type is {@link ButtonType#tab}.
*/
public Color getTabSelectedBackground() {
return getClientPropertyColor( TAB_BUTTON_SELECTED_BACKGROUND, "ToggleButton.tab.selectedBackground" );
}
/**
* Specifies background color if selected and toggle button type is {@link ButtonType#tab}.
*/
public void setTabSelectedBackground( Color tabSelectedBackground ) {
putClientProperty( TAB_BUTTON_SELECTED_BACKGROUND, tabSelectedBackground );
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright 2021 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import javax.swing.JTree;
/**
* Subclass of {@link JTree} that provides easy access to FlatLaf specific client properties.
*
*/
public class FlatTree
extends JTree
implements FlatComponentExtension
{
/**
* Returns if the tree shows a wide selection
*/
public boolean isWideSelection() {
return getClientPropertyBoolean( TREE_WIDE_SELECTION, "Tree.wideSelection" );
}
/**
* Sets if the tree shows a wide selection
*/
public void setWideSelection( boolean wideSelection ) {
putClientProperty( TREE_WIDE_SELECTION, wideSelection );
}
/**
* Returns whether tree item selection is painted. Default is {@code true}.
* If set to {@code false}, then the tree cell renderer is responsible for painting selection.
*/
public boolean isPaintSelection() {
return getClientPropertyBoolean( TREE_PAINT_SELECTION, true );
}
/**
* Specifies whether tree item selection is painted. Default is {@code true}.
* If set to {@code false}, then the tree cell renderer is responsible for painting selection.
*/
public void setPaintSelection( boolean paintSelection ) {
putClientProperty( TREE_PAINT_SELECTION, paintSelection );
}
}

View File

@@ -0,0 +1,255 @@
/*
* Copyright 2019 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras.components;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ItemEvent;
import javax.swing.JCheckBox;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import com.formdev.flatlaf.FlatLaf;
/**
* A tri-state check box.
* <p>
* The initial state is {@link State#INDETERMINATE}.
* <p>
* By default the third state is allowed and clicking on the checkbox cycles thru all
* three states. If you want that the user can cycle only thru two states, disallow
* intermediate state using {@link #setAllowIndeterminate(boolean)}. Then you can still
* set the indeterminate state via API if necessary, but the user can not.
* <p>
* The default state cycle order is {@link State#UNSELECTED} to {@link State#INDETERMINATE}
* to {@link State#SELECTED}.
* This is the same order as used by macOS, win32, IntelliJ IDEA and on the web as recommended by W3C in
* <a href="https://www.w3.org/TR/wai-aria-practices-1.1/examples/checkbox/checkbox-2/checkbox-2.html">Tri-State Checkbox Example</a>).
* <p>
* If {@link #isAltStateCycleOrder()} returns {@code true},
* the state cycle order is {@link State#UNSELECTED} to {@link State#SELECTED}
* to {@link State#INDETERMINATE}. This order is used by Windows 10 UWP apps.
* <p>
* If you prefer the alternative state cycle order for all tri-state check boxes, enable it using:
* <pre>
* UIManager.put( "FlatTriStateCheckBox.altStateCycleOrder", true );
* </pre>
* <p>
* To display the third state, this component requires an LaF that supports painting
* the indeterminate state if client property {@code "JButton.selectedState"} has the
* value {@code "indeterminate"}.
* FlatLaf and macOS Aqua LaF support the third state.
* For other LaFs a magenta rectangle is painted around the component for the third state.
*
* @author Karl Tauber
*/
public class FlatTriStateCheckBox
extends JCheckBox
{
public enum State { UNSELECTED, INDETERMINATE, SELECTED }
private State state;
private boolean allowIndeterminate = true;
private boolean altStateCycleOrder = UIManager.getBoolean( "FlatTriStateCheckBox.altStateCycleOrder" );
public FlatTriStateCheckBox() {
this( null );
}
public FlatTriStateCheckBox( String text ) {
this( text, State.INDETERMINATE );
}
public FlatTriStateCheckBox( String text, State initialState ) {
super( text );
setModel( new ToggleButtonModel() {
@Override
public boolean isSelected() {
return state != State.UNSELECTED;
}
@Override
public void setSelected( boolean b ) {
setState( nextState( state ) );
fireStateChanged();
fireItemStateChanged( new ItemEvent( this, ItemEvent.ITEM_STATE_CHANGED, this,
isSelected() ? ItemEvent.SELECTED : ItemEvent.DESELECTED ) );
}
} );
setState( initialState );
}
/**
* Returns the state as {@link State} enum.
* <p>
* Alternatively you can use {@link #getChecked()} to get all three states as {@link Boolean}
* or {@link #isIndeterminate()} to check only for indeterminate state.
*/
public State getState() {
return state;
}
/**
* Sets the state as {@link State} enum.
*/
public void setState( State state ) {
if( this.state == state )
return;
State oldState = this.state;
this.state = state;
putClientProperty( SELECTED_STATE, (state == State.INDETERMINATE) ? SELECTED_STATE_INDETERMINATE : null );
firePropertyChange( "state", oldState, state );
repaint();
}
/**
* Returns the next state that follows the given state, depending on
* {@link #isAllowIndeterminate()} and {@link #isAltStateCycleOrder()}.
*/
protected State nextState( State state ) {
if( !altStateCycleOrder ) {
// default cycle order: UNSELECTED --> INDETERMINATE --> SELECTED
switch( state ) {
default:
case UNSELECTED: return allowIndeterminate ? State.INDETERMINATE : State.SELECTED;
case INDETERMINATE: return State.SELECTED;
case SELECTED: return State.UNSELECTED;
}
} else {
// alternative cycle order: INDETERMINATE --> UNSELECTED --> SELECTED
switch( state ) {
default:
case UNSELECTED: return State.SELECTED;
case INDETERMINATE: return State.UNSELECTED;
case SELECTED: return allowIndeterminate ? State.INDETERMINATE : State.UNSELECTED;
}
}
}
/**
* Returns the state as {@link Boolean}.
* Returns {@code null} if the state is {@link State#INDETERMINATE}.
* <p>
* Alternatively you can use {@link #getState()} to get state as {@link State} enum
* or {@link #isIndeterminate()} to check only for indeterminate state.
*/
public Boolean getChecked() {
switch( state ) {
default:
case UNSELECTED: return false;
case INDETERMINATE: return null;
case SELECTED: return true;
}
}
/**
* Sets the state as {@link Boolean}.
* Passing {@code null} sets state to {@link State#INDETERMINATE}.
*/
public void setChecked( Boolean value ) {
setState( (value == null) ? State.INDETERMINATE : (value ? State.SELECTED : State.UNSELECTED) );
}
@Override
public void setSelected( boolean b ) {
setState( b ? State.SELECTED : State.UNSELECTED );
}
/**
* Returns whether state is indeterminate.
*/
public boolean isIndeterminate() {
return state == State.INDETERMINATE;
}
/**
* Sets indeterminate state.
*/
public void setIndeterminate( boolean indeterminate ) {
if( indeterminate )
setState( State.INDETERMINATE );
else if( state == State.INDETERMINATE )
setState( State.UNSELECTED );
}
/**
* Returns whether indeterminate state is allowed.
* <p>
* This affects only the user when clicking on the checkbox.
* Setting state to indeterminate via API is always allowed.
*/
public boolean isAllowIndeterminate() {
return allowIndeterminate;
}
/**
* Sets whether indeterminate state is allowed.
* <p>
* This affects only the user when clicking on the checkbox.
* Setting state to indeterminate via API is always allowed.
*/
public void setAllowIndeterminate( boolean allowIndeterminate ) {
this.allowIndeterminate = allowIndeterminate;
}
/**
* Returns whether alternative state cycle order should be used.
*/
public boolean isAltStateCycleOrder() {
return altStateCycleOrder;
}
/**
* Sets whether alternative state cycle order should be used.
*/
public void setAltStateCycleOrder( boolean altStateCycleOrder ) {
this.altStateCycleOrder = altStateCycleOrder;
}
@Override
protected void paintComponent( Graphics g ) {
super.paintComponent( g );
if( state == State.INDETERMINATE && !isIndeterminateStateSupported() )
paintIndeterminateState( g );
}
/**
* Paints the indeterminate state if the current LaF does not support displaying
* the indeterminate state.
* The default implementation draws a magenta rectangle around the component.
*/
protected void paintIndeterminateState( Graphics g ) {
g.setColor( Color.magenta );
g.drawRect( 0, 0, getWidth() - 1, getHeight() - 1 );
}
/**
* Returns whether the current LaF supports displaying the indeterminate state.
* Returns {@code true} for FlatLaf and macOS Aqua.
*/
protected boolean isIndeterminateStateSupported() {
LookAndFeel laf = UIManager.getLookAndFeel();
return laf instanceof FlatLaf || laf.getClass().getName().equals( "com.apple.laf.AquaLookAndFeel" );
}
}

View File

@@ -24,4 +24,7 @@ module com.formdev.flatlaf.extras {
requires com.formdev.flatlaf;
exports com.formdev.flatlaf.extras;
exports com.formdev.flatlaf.extras.components;
opens com.formdev.flatlaf.extras.resources;
}

View File

@@ -0,0 +1,212 @@
#
# Copyright 2021 FormDev Software GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# This file lists UI keys of colors, which are computed at runtime.
#
# Colors marked as `derived` in properties files are computed at runtime based on
# a variable base color (usually the current background color of a component).
# This works only for a limited set of UI keys.
#
# The property key is the UI key of a color, which is computed at runtime.
# The property value is the UI key of the base color.
#
# This file is not used at runtime.
# It is only used in tooling (e.g. UI Defaults Inspector or UIDefaultsDump).
#
#---- system colors ----
scrollbar = null
#---- Button ----
Button.focusedBackground = Button.background
Button.hoverBackground = Button.background
Button.pressedBackground = Button.background
Button.selectedBackground = Button.background
Button.disabledBackground = Button.background
Button.disabledSelectedBackground = Button.background
Button.default.focusedBackground = Button.default.background
Button.default.hoverBackground = Button.default.background
Button.default.pressedBackground = Button.default.background
Button.toolbar.hoverBackground = Button.background
Button.toolbar.pressedBackground = Button.background
Button.toolbar.selectedBackground = Button.background
#---- CheckBox ----
CheckBox.icon.disabledBackground = CheckBox.icon.background
CheckBox.icon.focusedBackground = CheckBox.icon.background
CheckBox.icon.hoverBackground = CheckBox.icon.background
CheckBox.icon.pressedBackground = CheckBox.icon.background
CheckBox.icon.selectedFocusedBackground = CheckBox.icon.selectedBackground
CheckBox.icon.selectedHoverBackground = CheckBox.icon.selectedBackground
CheckBox.icon.selectedPressedBackground = CheckBox.icon.selectedBackground
CheckBox.icon[filled].disabledBackground = CheckBox.icon[filled].background
CheckBox.icon[filled].focusedBackground = CheckBox.icon[filled].background
CheckBox.icon[filled].hoverBackground = CheckBox.icon[filled].background
CheckBox.icon[filled].pressedBackground = CheckBox.icon[filled].background
CheckBox.icon[filled].selectedFocusedBackground = CheckBox.icon[filled].selectedBackground
CheckBox.icon[filled].selectedHoverBackground = CheckBox.icon[filled].selectedBackground
CheckBox.icon[filled].selectedPressedBackground = CheckBox.icon[filled].selectedBackground
#---- CheckBoxMenuItem ----
CheckBoxMenuItem.selectionBackground = CheckBoxMenuItem.background
#---- ComboBox ----
ComboBox.buttonDisabledArrowColor = ComboBox.buttonArrowColor
ComboBox.buttonHoverArrowColor = ComboBox.buttonArrowColor
ComboBox.buttonPressedArrowColor = ComboBox.buttonArrowColor
#---- Component ----
Component.custom.borderColor = null
#---- HelpButton ----
HelpButton.disabledBackground = HelpButton.background
HelpButton.focusedBackground = HelpButton.background
HelpButton.hoverBackground = HelpButton.background
HelpButton.pressedBackground = HelpButton.background
#---- InternalFrame ----
InternalFrame.buttonHoverBackground = InternalFrame.activeTitleBackground
InternalFrame.buttonPressedBackground = InternalFrame.activeTitleBackground
#---- Menu ----
Menu.selectionBackground = Menu.background
#---- MenuBar ----
MenuBar.hoverBackground = Menu.background
MenuBar.underlineSelectionBackground = Menu.background
#---- MenuItem ----
MenuItem.checkBackground = MenuItem.selectionBackground
MenuItem.underlineSelectionBackground = MenuItem.background
MenuItem.underlineSelectionCheckBackground = MenuItem.selectionBackground
MenuItem.selectionBackground = MenuItem.background
#---- RadioButtonMenuItem ----
RadioButtonMenuItem.selectionBackground = RadioButtonMenuItem.background
#---- RootPane ----
RootPane.activeBorderColor = Panel.background
RootPane.inactiveBorderColor = Panel.background
#---- ScrollBar ----
ScrollBar.track = ScrollBar.background
ScrollBar.thumb = ScrollBar.track
ScrollBar.hoverTrackColor = ScrollBar.track
ScrollBar.hoverThumbColor = ScrollBar.thumb
ScrollBar.pressedTrackColor = ScrollBar.track
ScrollBar.pressedThumbColor = ScrollBar.thumb
ScrollBar.buttonDisabledArrowColor = ScrollBar.buttonArrowColor
ScrollBar.hoverButtonBackground = ScrollBar.background
ScrollBar.pressedButtonBackground = ScrollBar.background
#---- ScrollPane ----
ScrollPane.background = null
#---- Slider ----
Slider.focusedColor = Component.focusColor
Slider.hoverThumbColor = Slider.thumbColor
Slider.pressedThumbColor = Slider.thumbColor
Slider.disabledThumbColor = Slider.thumbColor
#---- Spinner ----
Spinner.buttonDisabledArrowColor = Spinner.buttonArrowColor
Spinner.buttonHoverArrowColor = Spinner.buttonArrowColor
Spinner.buttonPressedArrowColor = Spinner.buttonArrowColor
#---- SplitPaneDivider ----
SplitPaneDivider.oneTouchHoverArrowColor = SplitPaneDivider.oneTouchArrowColor
SplitPaneDivider.oneTouchPressedArrowColor = SplitPaneDivider.oneTouchArrowColor
#---- TabbedPane ----
TabbedPane.selectedBackground = TabbedPane.background
TabbedPane.hoverColor = TabbedPane.background
TabbedPane.focusColor = TabbedPane.background
TabbedPane.closeBackground = TabbedPane.background
TabbedPane.closeHoverBackground = TabbedPane.background
TabbedPane.closePressedBackground = TabbedPane.background
TabbedPane.closeForeground = TabbedPane.foreground
TabbedPane.closeHoverForeground = TabbedPane.foreground
TabbedPane.closePressedForeground = TabbedPane.foreground
TabbedPane.buttonHoverBackground = TabbedPane.background
TabbedPane.buttonPressedBackground = TabbedPane.background
#---- TitlePane ----
TitlePane.buttonHoverBackground = TitlePane.background
TitlePane.buttonPressedBackground = TitlePane.background
#---- ToggleButton ----
ToggleButton.focusedBackground = ToggleButton.background
ToggleButton.hoverBackground = ToggleButton.background
ToggleButton.pressedBackground = ToggleButton.background
ToggleButton.selectedBackground = ToggleButton.background
ToggleButton.disabledBackground = ToggleButton.background
ToggleButton.disabledSelectedBackground = ToggleButton.background
ToggleButton.toolbar.hoverBackground = ToggleButton.background
ToggleButton.toolbar.pressedBackground = ToggleButton.background
ToggleButton.toolbar.selectedBackground = ToggleButton.background
ToggleButton.tab.hoverBackground = null

View File

@@ -11,8 +11,7 @@ out.
Download
--------
FlatLaf IntelliJ Themes Pack binaries are available on **JCenter** and **Maven
Central**.
FlatLaf IntelliJ Themes Pack binaries are available on **Maven Central**.
If you use Maven or Gradle, add a dependency with following coordinates to your
build script:
@@ -23,11 +22,7 @@ build script:
Otherwise download `flatlaf-intellij-themes-<version>.jar` here:
[![Download](https://api.bintray.com/packages/jformdesigner/flatlaf/flatlaf-intellij-themes/images/download.svg)](https://bintray.com/jformdesigner/flatlaf/flatlaf-intellij-themes/_latestVersion)
You also need `flatlaf-<version>.jar`, which you can download here:
[![Download](https://api.bintray.com/packages/jformdesigner/flatlaf/flatlaf/images/download.svg)](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.formdev/flatlaf-intellij-themes/badge.svg?style=flat-square&color=007ec6)](https://maven-badges.herokuapp.com/maven-central/com.formdev/flatlaf-intellij-themes)
How to use?
@@ -105,6 +100,8 @@ Name | Class
[Material Palenight Contrast (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialPalenightContrastIJTheme`
[Monokai Pro (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMonokaiProIJTheme`
[Monokai Pro Contrast (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMonokaiProContrastIJTheme`
[Moonlight (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMoonlightIJTheme`
[Moonlight Contrast (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMoonlightContrastIJTheme`
[Night Owl (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatNightOwlIJTheme`
[Night Owl Contrast (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatNightOwlContrastIJTheme`
[Solarized Dark (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatSolarizedDarkIJTheme`

View File

@@ -28,65 +28,84 @@ import javax.swing.UIManager.LookAndFeelInfo;
*/
public class FlatAllIJThemes
{
public static final LookAndFeelInfo[] INFOS = {
new LookAndFeelInfo( "Arc", "com.formdev.flatlaf.intellijthemes.FlatArcIJTheme" ),
new LookAndFeelInfo( "Arc - Orange", "com.formdev.flatlaf.intellijthemes.FlatArcOrangeIJTheme" ),
new LookAndFeelInfo( "Arc Dark", "com.formdev.flatlaf.intellijthemes.FlatArcDarkIJTheme" ),
new LookAndFeelInfo( "Arc Dark - Orange", "com.formdev.flatlaf.intellijthemes.FlatArcDarkOrangeIJTheme" ),
new LookAndFeelInfo( "Carbon", "com.formdev.flatlaf.intellijthemes.FlatCarbonIJTheme" ),
new LookAndFeelInfo( "Cobalt 2", "com.formdev.flatlaf.intellijthemes.FlatCobalt2IJTheme" ),
new LookAndFeelInfo( "Cyan light", "com.formdev.flatlaf.intellijthemes.FlatCyanLightIJTheme" ),
new LookAndFeelInfo( "Dark Flat", "com.formdev.flatlaf.intellijthemes.FlatDarkFlatIJTheme" ),
new LookAndFeelInfo( "Dark purple", "com.formdev.flatlaf.intellijthemes.FlatDarkPurpleIJTheme" ),
new LookAndFeelInfo( "Dracula", "com.formdev.flatlaf.intellijthemes.FlatDraculaIJTheme" ),
new LookAndFeelInfo( "Gradianto Dark Fuchsia", "com.formdev.flatlaf.intellijthemes.FlatGradiantoDarkFuchsiaIJTheme" ),
new LookAndFeelInfo( "Gradianto Deep Ocean", "com.formdev.flatlaf.intellijthemes.FlatGradiantoDeepOceanIJTheme" ),
new LookAndFeelInfo( "Gradianto Midnight Blue", "com.formdev.flatlaf.intellijthemes.FlatGradiantoMidnightBlueIJTheme" ),
new LookAndFeelInfo( "Gradianto Nature Green", "com.formdev.flatlaf.intellijthemes.FlatGradiantoNatureGreenIJTheme" ),
new LookAndFeelInfo( "Gray", "com.formdev.flatlaf.intellijthemes.FlatGrayIJTheme" ),
new LookAndFeelInfo( "Gruvbox Dark Hard", "com.formdev.flatlaf.intellijthemes.FlatGruvboxDarkHardIJTheme" ),
new LookAndFeelInfo( "Gruvbox Dark Medium", "com.formdev.flatlaf.intellijthemes.FlatGruvboxDarkMediumIJTheme" ),
new LookAndFeelInfo( "Gruvbox Dark Soft", "com.formdev.flatlaf.intellijthemes.FlatGruvboxDarkSoftIJTheme" ),
new LookAndFeelInfo( "Hiberbee Dark", "com.formdev.flatlaf.intellijthemes.FlatHiberbeeDarkIJTheme" ),
new LookAndFeelInfo( "High contrast", "com.formdev.flatlaf.intellijthemes.FlatHighContrastIJTheme" ),
new LookAndFeelInfo( "Light Flat", "com.formdev.flatlaf.intellijthemes.FlatLightFlatIJTheme" ),
new LookAndFeelInfo( "Material Design Dark", "com.formdev.flatlaf.intellijthemes.FlatMaterialDesignDarkIJTheme" ),
new LookAndFeelInfo( "Monocai", "com.formdev.flatlaf.intellijthemes.FlatMonocaiIJTheme" ),
new LookAndFeelInfo( "Nord", "com.formdev.flatlaf.intellijthemes.FlatNordIJTheme" ),
new LookAndFeelInfo( "One Dark", "com.formdev.flatlaf.intellijthemes.FlatOneDarkIJTheme" ),
new LookAndFeelInfo( "Solarized Dark", "com.formdev.flatlaf.intellijthemes.FlatSolarizedDarkIJTheme" ),
new LookAndFeelInfo( "Solarized Light", "com.formdev.flatlaf.intellijthemes.FlatSolarizedLightIJTheme" ),
new LookAndFeelInfo( "Spacegray", "com.formdev.flatlaf.intellijthemes.FlatSpacegrayIJTheme" ),
new LookAndFeelInfo( "Vuesion", "com.formdev.flatlaf.intellijthemes.FlatVuesionIJTheme" ),
new LookAndFeelInfo( "Arc Dark (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatArcDarkIJTheme" ),
new LookAndFeelInfo( "Arc Dark Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatArcDarkContrastIJTheme" ),
new LookAndFeelInfo( "Atom One Dark (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatAtomOneDarkIJTheme" ),
new LookAndFeelInfo( "Atom One Dark Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatAtomOneDarkContrastIJTheme" ),
new LookAndFeelInfo( "Atom One Light (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatAtomOneLightIJTheme" ),
new LookAndFeelInfo( "Atom One Light Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatAtomOneLightContrastIJTheme" ),
new LookAndFeelInfo( "Dracula (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatDraculaIJTheme" ),
new LookAndFeelInfo( "Dracula Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatDraculaContrastIJTheme" ),
new LookAndFeelInfo( "GitHub (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubIJTheme" ),
new LookAndFeelInfo( "GitHub Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubContrastIJTheme" ),
new LookAndFeelInfo( "Light Owl (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatLightOwlIJTheme" ),
new LookAndFeelInfo( "Light Owl Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatLightOwlContrastIJTheme" ),
new LookAndFeelInfo( "Material Darker (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDarkerIJTheme" ),
new LookAndFeelInfo( "Material Darker Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDarkerContrastIJTheme" ),
new LookAndFeelInfo( "Material Deep Ocean (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDeepOceanIJTheme" ),
new LookAndFeelInfo( "Material Deep Ocean Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDeepOceanContrastIJTheme" ),
new LookAndFeelInfo( "Material Lighter (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialLighterIJTheme" ),
new LookAndFeelInfo( "Material Lighter Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialLighterContrastIJTheme" ),
new LookAndFeelInfo( "Material Oceanic (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialOceanicIJTheme" ),
new LookAndFeelInfo( "Material Oceanic Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialOceanicContrastIJTheme" ),
new LookAndFeelInfo( "Material Palenight (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialPalenightIJTheme" ),
new LookAndFeelInfo( "Material Palenight Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialPalenightContrastIJTheme" ),
new LookAndFeelInfo( "Monokai Pro (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMonokaiProIJTheme" ),
new LookAndFeelInfo( "Monokai Pro Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMonokaiProContrastIJTheme" ),
new LookAndFeelInfo( "Night Owl (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatNightOwlIJTheme" ),
new LookAndFeelInfo( "Night Owl Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatNightOwlContrastIJTheme" ),
new LookAndFeelInfo( "Solarized Dark (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatSolarizedDarkIJTheme" ),
new LookAndFeelInfo( "Solarized Dark Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatSolarizedDarkContrastIJTheme" ),
new LookAndFeelInfo( "Solarized Light (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatSolarizedLightIJTheme" ),
new LookAndFeelInfo( "Solarized Light Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatSolarizedLightContrastIJTheme" ),
public static final FlatIJLookAndFeelInfo[] INFOS = {
new FlatIJLookAndFeelInfo( "Arc", "com.formdev.flatlaf.intellijthemes.FlatArcIJTheme", false ),
new FlatIJLookAndFeelInfo( "Arc - Orange", "com.formdev.flatlaf.intellijthemes.FlatArcOrangeIJTheme", false ),
new FlatIJLookAndFeelInfo( "Arc Dark", "com.formdev.flatlaf.intellijthemes.FlatArcDarkIJTheme", true ),
new FlatIJLookAndFeelInfo( "Arc Dark - Orange", "com.formdev.flatlaf.intellijthemes.FlatArcDarkOrangeIJTheme", true ),
new FlatIJLookAndFeelInfo( "Carbon", "com.formdev.flatlaf.intellijthemes.FlatCarbonIJTheme", true ),
new FlatIJLookAndFeelInfo( "Cobalt 2", "com.formdev.flatlaf.intellijthemes.FlatCobalt2IJTheme", true ),
new FlatIJLookAndFeelInfo( "Cyan light", "com.formdev.flatlaf.intellijthemes.FlatCyanLightIJTheme", false ),
new FlatIJLookAndFeelInfo( "Dark Flat", "com.formdev.flatlaf.intellijthemes.FlatDarkFlatIJTheme", true ),
new FlatIJLookAndFeelInfo( "Dark purple", "com.formdev.flatlaf.intellijthemes.FlatDarkPurpleIJTheme", true ),
new FlatIJLookAndFeelInfo( "Dracula", "com.formdev.flatlaf.intellijthemes.FlatDraculaIJTheme", true ),
new FlatIJLookAndFeelInfo( "Gradianto Dark Fuchsia", "com.formdev.flatlaf.intellijthemes.FlatGradiantoDarkFuchsiaIJTheme", true ),
new FlatIJLookAndFeelInfo( "Gradianto Deep Ocean", "com.formdev.flatlaf.intellijthemes.FlatGradiantoDeepOceanIJTheme", true ),
new FlatIJLookAndFeelInfo( "Gradianto Midnight Blue", "com.formdev.flatlaf.intellijthemes.FlatGradiantoMidnightBlueIJTheme", true ),
new FlatIJLookAndFeelInfo( "Gradianto Nature Green", "com.formdev.flatlaf.intellijthemes.FlatGradiantoNatureGreenIJTheme", true ),
new FlatIJLookAndFeelInfo( "Gray", "com.formdev.flatlaf.intellijthemes.FlatGrayIJTheme", false ),
new FlatIJLookAndFeelInfo( "Gruvbox Dark Hard", "com.formdev.flatlaf.intellijthemes.FlatGruvboxDarkHardIJTheme", true ),
new FlatIJLookAndFeelInfo( "Gruvbox Dark Medium", "com.formdev.flatlaf.intellijthemes.FlatGruvboxDarkMediumIJTheme", true ),
new FlatIJLookAndFeelInfo( "Gruvbox Dark Soft", "com.formdev.flatlaf.intellijthemes.FlatGruvboxDarkSoftIJTheme", true ),
new FlatIJLookAndFeelInfo( "Hiberbee Dark", "com.formdev.flatlaf.intellijthemes.FlatHiberbeeDarkIJTheme", true ),
new FlatIJLookAndFeelInfo( "High contrast", "com.formdev.flatlaf.intellijthemes.FlatHighContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Light Flat", "com.formdev.flatlaf.intellijthemes.FlatLightFlatIJTheme", false ),
new FlatIJLookAndFeelInfo( "Material Design Dark", "com.formdev.flatlaf.intellijthemes.FlatMaterialDesignDarkIJTheme", true ),
new FlatIJLookAndFeelInfo( "Monocai", "com.formdev.flatlaf.intellijthemes.FlatMonocaiIJTheme", true ),
new FlatIJLookAndFeelInfo( "Nord", "com.formdev.flatlaf.intellijthemes.FlatNordIJTheme", true ),
new FlatIJLookAndFeelInfo( "One Dark", "com.formdev.flatlaf.intellijthemes.FlatOneDarkIJTheme", true ),
new FlatIJLookAndFeelInfo( "Solarized Dark", "com.formdev.flatlaf.intellijthemes.FlatSolarizedDarkIJTheme", true ),
new FlatIJLookAndFeelInfo( "Solarized Light", "com.formdev.flatlaf.intellijthemes.FlatSolarizedLightIJTheme", false ),
new FlatIJLookAndFeelInfo( "Spacegray", "com.formdev.flatlaf.intellijthemes.FlatSpacegrayIJTheme", true ),
new FlatIJLookAndFeelInfo( "Vuesion", "com.formdev.flatlaf.intellijthemes.FlatVuesionIJTheme", true ),
new FlatIJLookAndFeelInfo( "Arc Dark (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatArcDarkIJTheme", true ),
new FlatIJLookAndFeelInfo( "Arc Dark Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatArcDarkContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Atom One Dark (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatAtomOneDarkIJTheme", true ),
new FlatIJLookAndFeelInfo( "Atom One Dark Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatAtomOneDarkContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Atom One Light (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatAtomOneLightIJTheme", false ),
new FlatIJLookAndFeelInfo( "Atom One Light Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatAtomOneLightContrastIJTheme", false ),
new FlatIJLookAndFeelInfo( "Dracula (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatDraculaIJTheme", true ),
new FlatIJLookAndFeelInfo( "Dracula Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatDraculaContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "GitHub (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubIJTheme", false ),
new FlatIJLookAndFeelInfo( "GitHub Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubContrastIJTheme", false ),
new FlatIJLookAndFeelInfo( "Light Owl (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatLightOwlIJTheme", false ),
new FlatIJLookAndFeelInfo( "Light Owl Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatLightOwlContrastIJTheme", false ),
new FlatIJLookAndFeelInfo( "Material Darker (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDarkerIJTheme", true ),
new FlatIJLookAndFeelInfo( "Material Darker Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDarkerContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Material Deep Ocean (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDeepOceanIJTheme", true ),
new FlatIJLookAndFeelInfo( "Material Deep Ocean Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDeepOceanContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Material Lighter (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialLighterIJTheme", false ),
new FlatIJLookAndFeelInfo( "Material Lighter Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialLighterContrastIJTheme", false ),
new FlatIJLookAndFeelInfo( "Material Oceanic (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialOceanicIJTheme", true ),
new FlatIJLookAndFeelInfo( "Material Oceanic Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialOceanicContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Material Palenight (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialPalenightIJTheme", true ),
new FlatIJLookAndFeelInfo( "Material Palenight Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialPalenightContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Monokai Pro (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMonokaiProIJTheme", true ),
new FlatIJLookAndFeelInfo( "Monokai Pro Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMonokaiProContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Moonlight (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMoonlightIJTheme", true ),
new FlatIJLookAndFeelInfo( "Moonlight Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMoonlightContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Night Owl (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatNightOwlIJTheme", true ),
new FlatIJLookAndFeelInfo( "Night Owl Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatNightOwlContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Solarized Dark (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatSolarizedDarkIJTheme", true ),
new FlatIJLookAndFeelInfo( "Solarized Dark Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatSolarizedDarkContrastIJTheme", true ),
new FlatIJLookAndFeelInfo( "Solarized Light (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatSolarizedLightIJTheme", false ),
new FlatIJLookAndFeelInfo( "Solarized Light Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatSolarizedLightContrastIJTheme", false ),
};
//---- class FlatIJLookAndFeelInfo ----------------------------------------
public static class FlatIJLookAndFeelInfo
extends LookAndFeelInfo
{
private final boolean dark;
public FlatIJLookAndFeelInfo( String name, String className, boolean dark ) {
super( name, className );
this.dark = dark;
}
public boolean isDark() {
return dark;
}
}
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.intellijthemes.materialthemeuilite;
//
// DO NOT MODIFY
// Generated with com.formdev.flatlaf.demo.intellijthemes.IJThemesClassGenerator
//
import com.formdev.flatlaf.IntelliJTheme;
/**
* @author Karl Tauber
*/
public class FlatMoonlightContrastIJTheme
extends IntelliJTheme.ThemeLaf
{
public static final String NAME = "Moonlight Contrast (Material)";
public static boolean install() {
try {
return install( new FlatMoonlightContrastIJTheme() );
} catch( RuntimeException ex ) {
return false;
}
}
public static void installLafInfo() {
installLafInfo( NAME, FlatMoonlightContrastIJTheme.class );
}
public FlatMoonlightContrastIJTheme() {
super( Utils.loadTheme( "Moonlight Contrast.theme.json" ) );
}
@Override
public String getName() {
return NAME;
}
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.intellijthemes.materialthemeuilite;
//
// DO NOT MODIFY
// Generated with com.formdev.flatlaf.demo.intellijthemes.IJThemesClassGenerator
//
import com.formdev.flatlaf.IntelliJTheme;
/**
* @author Karl Tauber
*/
public class FlatMoonlightIJTheme
extends IntelliJTheme.ThemeLaf
{
public static final String NAME = "Moonlight (Material)";
public static boolean install() {
try {
return install( new FlatMoonlightIJTheme() );
} catch( RuntimeException ex ) {
return false;
}
}
public static void installLafInfo() {
installLafInfo( NAME, FlatMoonlightIJTheme.class );
}
public FlatMoonlightIJTheme() {
super( Utils.loadTheme( "Moonlight.theme.json" ) );
}
@Override
public String getName() {
return NAME;
}
}

View File

@@ -2,218 +2,258 @@
"name": "Dracula",
"dark": true,
"author": "Zihan Ma",
"editorScheme": "/themes/dracula.xml",
"editorScheme": "/themes/Dracula.xml",
"colors": {
"accentColor": "#ff79c6",
"secondaryAccentColor": "#bd93f9",
"primaryForeground": "#f8f8f2",
"primaryBackground": "#414450",
"secondaryBackground": "#3a3d4c",
"hoverBackground": "#282a36",
"selectionBackground": "#6272a4",
"selectionInactiveBackground": "#4e5a82",
"borderColor": "#282a36",
"separatorColor": "#5d5e66"
},
"ui": {
"*": {
"arc": "7",
"background": "#414450",
"selectionBackground": "#6272a4",
"selectionInactiveBackground": "#4e5a82",
"inactiveBackground": "#414450",
"borderColor": "#282a36"
"background": "primaryBackground",
"selectionForeground": "primaryForeground",
"selectionInactiveForeground": "primaryForeground",
"selectionBackground": "selectionBackground",
"selectionInactiveBackground": "selectionInactiveBackground",
"inactiveBackground": "primaryBackground",
"disabledBackground": "primaryBackground",
"borderColor": "borderColor",
"separatorColor": "separatorColor"
},
"Borders": {
"color": "#282a36",
"ContrastBorderColor": "#282a36"
"color": "borderColor",
"ContrastBorderColor": "borderColor"
},
"ActionButton": {
"hoverBackground": "#282a35",
"hoverBorderColor": "#282a35",
"pressedBackground": "#282a35",
"pressedBorderColor": "#282a35"
"hoverBackground": "hoverBackground",
"hoverBorderColor": "hoverBackground",
"pressedBackground": "hoverBackground",
"pressedBorderColor": "hoverBackground"
},
"Button": {
"foreground": "#f8f8f2",
"startBorderColor": "#6272a4",
"endBorderColor": "#6272a4",
"startBackground": "#6272a4",
"endBackground": "#6272a4",
"focusedBorderColor": "#bd93f9",
"foreground": "primaryForeground",
"startBorderColor": "selectionBackground",
"endBorderColor": "selectionBackground",
"startBackground": "#4f566d",
"endBackground": "#4f566d",
"focusedBorderColor": "secondaryAccentColor",
"disabledBorderColor": "#4f566d",
"default": {
"foreground": "#f8f8f2",
"startBackground": "#6272a4",
"endBackground": "#6272a4",
"startBorderColor": "#bd93f9",
"endBorderColor": "#bd93f9",
"focusColor": "#bd93f9",
"focusedBorderColor": "#bd93f9"
"foreground": "primaryForeground",
"startBackground": "selectionBackground",
"endBackground": "selectionBackground",
"startBorderColor": "secondaryAccentColor",
"endBorderColor": "secondaryAccentColor",
"focusColor": "secondaryAccentColor",
"focusedBorderColor": "secondaryAccentColor"
}
},
"Counter": {
"foreground": "#414450",
"foreground": "primaryBackground",
"background": "#2fc864"
},
"CheckBoxMenuItem": {
"acceleratorSelectionForeground": "#ff79c6"
"acceleratorSelectionForeground": "accentColor"
},
"ComboBox": {
"modifiedItemForeground": "#ff79c6",
"modifiedItemForeground": "accentColor",
"ArrowButton": {
"background": "#44475a",
"nonEditableBackground": "#44475a",
"iconColor": "#bd93f9"
"background": "secondaryBackground",
"nonEditableBackground": "secondaryBackground",
"disabledIconColor": "#576285",
"iconColor": "secondaryAccentColor"
},
"selectionBackground": "#bd93f9",
"nonEditableBackground": "#44475a"
"selectionBackground": "secondaryAccentColor",
"nonEditableBackground": "secondaryBackground"
},
"CompletionPopup": {
"selectionBackground": "#6272a4",
"selectionInactiveBackground": "#4e5a82",
"matchForeground": "#ff79c6"
"selectionBackground": "selectionBackground",
"selectionInactiveBackground": "selectionInactiveBackground",
"matchForeground": "accentColor"
},
"Component": {
"focusColor": "#bd93f9",
"borderColor": "#6272a4",
"focusedBorderColor": "#6272a4",
"focusColor": "secondaryAccentColor",
"borderColor": "selectionBackground",
"focusedBorderColor": "selectionBackground",
"disabledBorderColor": "selectionBackground",
"errorFocusColor": "#ff5554",
"inactiveErrorFocusColor": "#ff5554",
"warningFocusColor": "#f1fa8c",
"inactiveWarningFocusColor": "#f1fa8c"
},
"DragAndDrop": {
"areaBorderColor": "#6272a4"
"areaBorderColor": "selectionBackground"
},
"Editor": {
"background": "#44475a",
"shortcutForeground": "#ff79c6"
"background": "secondaryBackground",
"shortcutForeground": "accentColor"
},
"EditorTabs": {
"background": "#44475a",
"underlinedTabBackground": "#313341",
"underlineColor": "#bd93f9",
"underlineHeight": 1
"background": "secondaryBackground",
"underlinedTabBackground": "#292b38",
"underlineColor": "secondaryAccentColor",
"underlineHeight": 2
},
"FileColor": {
"Blue": "#8be9fd",
"Green": "#63667E",
"Orange": "#ffb86c",
"Yellow": "#44475a",
"Rose": "#ff79c6",
"Violet": "#bd93f9"
"Blue": "#344f54",
"Green": "#344535",
"Orange": "#533f30",
"Yellow": "#4f4b41",
"Rose": "#4c273c",
"Violet": "#382b4a"
},
"Label": {
"foreground": "#f8f8f2",
"errorForeground": "#ff5554"
},
"Link": {
"activeForeground": "#ff79c6",
"hoverForeground": "#ff79c6",
"visitedForeground": "#bd93f9",
"pressedForeground": "#bd93f9"
"activeForeground": "accentColor",
"hoverForeground": "accentColor",
"visitedForeground": "secondaryAccentColor",
"pressedForeground": "secondaryAccentColor"
},
"Notification": {
"borderColor": "#6272a4",
"borderColor": "selectionBackground",
"errorBorderColor": "#ff5554",
"errorBackground": "#414450",
"errorForeground": "#f8f8f2",
"errorBackground": "primaryBackground",
"errorForeground": "primaryForeground",
"ToolWindow": {
"warningForeground": "#f8f8f2",
"warningBackground": "#414450",
"warningForeground": "primaryForeground",
"warningBackground": "primaryBackground",
"warningBorderColor": "#ffb86c",
"errorForeground": "#f8f8f2",
"errorForeground": "primaryForeground",
"errorBorderColor": "#ff5554",
"errorBackground": "#414450",
"informativeForeground": "#f8f8f2",
"informativeBackground": "#414450",
"errorBackground": "primaryBackground",
"informativeForeground": "primaryForeground",
"informativeBackground": "primaryBackground",
"informativeBorderColor": "#50fa7b"
}
},
"PasswordField": {
"background": "secondaryBackground"
},
"Plugins": {
"SearchField": {
"background": "#44475a"
"background": "secondaryBackground"
},
"SectionHeader": {
"foreground": "#f8f8f2"
"foreground": "primaryForeground"
},
"lightSelectionBackground": "#282a35",
"hoverBackground": "hoverBackground",
"lightSelectionBackground": "hoverBackground",
"Button": {
"installBorderColor": "#bd93f9",
"installForeground": "#bd93f9",
"installBackground": "#414450",
"installFillForeground": "#414450",
"installFillBackground": "#bd93f9",
"installFocusedBackground": "#414450",
"installBorderColor": "secondaryAccentColor",
"installForeground": "secondaryAccentColor",
"installBackground": "primaryBackground",
"installFillForeground": "primaryBackground",
"installFillBackground": "secondaryAccentColor",
"installFocusedBackground": "primaryBackground",
"updateBorderColor": "#5da3f4",
"updateForeground": "#f8f8f2",
"updateForeground": "primaryForeground",
"updateBackground": "#5da3f4"
},
"Tab": {
"selectedBackground": "#282a35",
"selectedForeground": "#f8f8f2",
"hoverBackground": "#282a35"
"selectedBackground": "hoverBackground",
"selectedForeground": "primaryForeground",
"hoverBackground": "hoverBackground"
}
},
"ProgressBar": {
"failedColor": "#ff5554",
"failedEndColor": "#ff5554",
"trackColor": "#6272a4",
"progressColor": "#ff79c6",
"trackColor": "selectionBackground",
"progressColor": "accentColor",
"indeterminateStartColor": "#93b8f9",
"indeterminateEndColor": "#bd93f9",
"indeterminateEndColor": "secondaryAccentColor",
"passedColor": "#50fa7b",
"passedEndColor": "#50fa7b"
},
"Popup": {
"Header": {
"activeBackground": "#44475a",
"inactiveBackground": "#44475a"
"activeBackground": "secondaryBackground",
"inactiveBackground": "secondaryBackground"
}
},
"ScrollBar": {
"Mac": {
"hoverThumbColor": "#bd93f9",
"hoverThumbColor": "secondaryAccentColor",
"Transparent": {
"hoverThumbColor": "#bd93f9"
"hoverThumbColor": "secondaryAccentColor"
}
}
},
"SearchEverywhere": {
"SearchField": {
"background": "#44475a"
"background": "secondaryBackground"
},
"Tab": {
"selectedBackground": "#313341",
"selectedForeground": "#f8f8f2"
"selectedForeground": "primaryForeground"
}
},
"SearchMatch": {
"startBackground": "#ff79c6",
"endBackground": "#ff79c6"
"startBackground": "accentColor",
"endBackground": "accentColor"
},
"Separator": {
"separatorColor": "separatorColor"
},
"SidePanel": {
"background": "secondaryBackground"
},
"StatusBar": {
"hoverBackground": "hoverBackground"
},
"Separator.separatorColor": "#282a35",
"TabbedPane": {
"tabSelectionHeight": 1,
"focusColor": "#282a35",
"hoverColor": "#282a35",
"underlineColor": "#bd93f9",
"contentAreaColor": "#282a35"
"focusColor": "hoverBackground",
"hoverColor": "hoverBackground",
"underlineColor": "secondaryAccentColor",
"contentAreaColor": "hoverBackground"
},
"Table": {
"gridColor": "#5d617a",
"hoverBackground": "selectionBackground"
},
"TableHeader": {
"bottomSeparatorColor": "separatorColor"
},
"TextField": {
"background": "secondaryBackground"
},
"ToggleButton": {
"onBackground": "#50fa7b",
"onForeground": "#282a35",
"offBackground": "#6272a4",
"offForeground": "#282a35",
"buttonColor": "#f8f8f2"
"onForeground": "hoverBackground",
"offBackground": "selectionBackground",
"offForeground": "hoverBackground",
"buttonColor": "primaryForeground"
},
"ToolWindow": {
"Button": {
"hoverBackground": "#282a35"
"hoverBackground": "hoverBackground"
},
"Header": {
"background": "#44475a",
"inactiveBackground": "#44475a"
"background": "#484c60",
"inactiveBackground": "secondaryBackground"
},
"HeaderTab": {
"underlineColor": "#bd93f9",
"underlineHeight": 1,
"underlinedTabBackground": "#313341",
"underlineColor": "secondaryAccentColor",
"underlineHeight": 2,
"underlinedTabBackground": "#292b38",
"underlinedTabInactiveBackground": "#313341"
}
},
"Tree": {
"modifiedItemForeground": "#ff79c6",
"selectionBackground": "#6272a4",
"selectionInactiveBackground": "#4e5a82"
"modifiedItemForeground": "accentColor",
"selectionBackground": "selectionBackground",
"selectionInactiveBackground": "selectionInactiveBackground"
},
"ValidationTooltip": {
"errorBackground": "#ff5554",
@@ -224,28 +264,38 @@
"VersionControl": {
"FileHistory": {
"Commit": {
"selectedBranchBackground": "#44475a"
"selectedBranchBackground": "secondaryBackground"
}
},
"GitLog": {
"headIconColor": "#f1fa8c",
"localBranchIconColor": "#50fa7b",
"remoteBranchIconColor": "#bd93f9",
"tagIconColor": "#ff79c6",
"remoteBranchIconColor": "secondaryAccentColor",
"tagIconColor": "accentColor",
"otherIconColor": "#8be9fd"
},
"Log": {
"Commit": {
"currentBranchBackground": "#44475a"
"hoveredBackground": "selectionBackground",
"currentBranchBackground": "secondaryBackground"
}
},
"RefLabel": {
"foreground": "primaryForeground"
}
},
"WelcomeScreen": {
"separatorColor": "#191b1f",
"SidePanel": {
"background": "secondaryBackground"
},
"separatorColor": "separatorColor",
"Projects": {
"background": "#282a35",
"selectionBackground": "#44475a",
"selectionInactiveBackground": "#44475a"
"background": "hoverBackground",
"selectionBackground": "secondaryBackground",
"selectionInactiveBackground": "secondaryBackground",
"actions": {
"background": "hoverBackground"
}
}
}
},
@@ -269,10 +319,12 @@
"Objects.Yellow": "#f1fa8c",
"Objects.YellowDark": "#f1fa8c",
"Objects.BlackText": "#282a35",
"Checkbox.Foreground.Selected.Dark": "#f8f8f2",
"Checkbox.Border.Default.Dark": "#bd93f9",
"Checkbox.Border.Selected.Dark": "#bd93f9",
"Checkbox.Border.Disabled.Dark": "#6272a4",
"Checkbox.Background.Default.Dark": "#6272a4",
"Checkbox.Foreground.Selected.Dark": "#f8f8f2",
"Checkbox.Background.Disabled.Dark": "#414450",
"Checkbox.Focus.Wide.Dark": "#bd93f9",
"Checkbox.Focus.Thin.Selected.Dark": "#bd93f9",
"Checkbox.Focus.Thin.Default.Dark": "#bd93f9"

Some files were not shown because too many files have changed in this diff Show More