mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-10 22:17:13 -06:00
Compare commits
157 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
140ebfdb92 | ||
|
|
37d0179de1 | ||
|
|
823d4b0fe2 | ||
|
|
dd1eacf4f0 | ||
|
|
86c33dd686 | ||
|
|
c6757cc61b | ||
|
|
a38cf284dd | ||
|
|
575b8e3f7f | ||
|
|
bc443f47f1 | ||
|
|
b631bcc0db | ||
|
|
5ccd92ece6 | ||
|
|
2f3c8868a7 | ||
|
|
6f7b5e8005 | ||
|
|
10d1e4b798 | ||
|
|
9d5934df14 | ||
|
|
be507de6c1 | ||
|
|
e5d3c08821 | ||
|
|
027b4ab7da | ||
|
|
fefea0d7ec | ||
|
|
33f30bfd19 | ||
|
|
e9d4b9961a | ||
|
|
b94248fe79 | ||
|
|
225975e0dd | ||
|
|
eac7492143 | ||
|
|
b3c40bf448 | ||
|
|
02f7cd77f4 | ||
|
|
7f8f3aa99b | ||
|
|
0bcdc14909 | ||
|
|
526c25a02b | ||
|
|
f48da9dab1 | ||
|
|
2e8dfda12e | ||
|
|
63da576d85 | ||
|
|
0ab4206540 | ||
|
|
212ae90401 | ||
|
|
d4e5d0be45 | ||
|
|
3520a0f1fb | ||
|
|
036090a947 | ||
|
|
dc570c683a | ||
|
|
9f85d34c91 | ||
|
|
16bf1fb6c3 | ||
|
|
47c4d508e0 | ||
|
|
e5d9060623 | ||
|
|
fdf28fc385 | ||
|
|
9015a4d56b | ||
|
|
38301454a6 | ||
|
|
9b3a22c4ca | ||
|
|
548dbc3649 | ||
|
|
3474129812 | ||
|
|
63193feebe | ||
|
|
51f22bfe75 | ||
|
|
7d0f7e1c8e | ||
|
|
dd8ab242fb | ||
|
|
60f3428da7 | ||
|
|
c6fec0a131 | ||
|
|
fdc43fc0d3 | ||
|
|
0b880aa335 | ||
|
|
74f50ec992 | ||
|
|
1bdf4532db | ||
|
|
f97783ddef | ||
|
|
1024d6fc07 | ||
|
|
3ec59d0c58 | ||
|
|
c43249316c | ||
|
|
ed5180ffd6 | ||
|
|
e9ec769340 | ||
|
|
5e16ff8dff | ||
|
|
364b6631ea | ||
|
|
48a18e53e3 | ||
|
|
bcc8282d73 | ||
|
|
15017ed49c | ||
|
|
50d36fe91b | ||
|
|
23e67a2908 | ||
|
|
0dab1b73cc | ||
|
|
3c086a92e2 | ||
|
|
647d72514b | ||
|
|
15328b4fd7 | ||
|
|
b49a498f9c | ||
|
|
8d14d5f87c | ||
|
|
a6db352ecd | ||
|
|
ccbb26c176 | ||
|
|
8f6af73541 | ||
|
|
a59f17fdb2 | ||
|
|
14222e40ad | ||
|
|
7d48bf06fe | ||
|
|
1d06a2c2e8 | ||
|
|
cf141f0e55 | ||
|
|
9113c31612 | ||
|
|
00b4e0a6fd | ||
|
|
e3cac95d37 | ||
|
|
64d850c583 | ||
|
|
2fe1b9e726 | ||
|
|
1315d847b9 | ||
|
|
b5954102b6 | ||
|
|
1c8ba0c538 | ||
|
|
be18317a6d | ||
|
|
88d2b8266e | ||
|
|
949ca5ddff | ||
|
|
3eb53b9648 | ||
|
|
e4a03ede1f | ||
|
|
cb65dc0e9d | ||
|
|
8ec907050e | ||
|
|
15ba00a902 | ||
|
|
89d0c301c2 | ||
|
|
2f47466f3b | ||
|
|
d70eca9774 | ||
|
|
95ce92fa18 | ||
|
|
b3db52b2ed | ||
|
|
c40912013d | ||
|
|
1c08e98c1c | ||
|
|
3f202a7cdc | ||
|
|
6f3aea8fc1 | ||
|
|
0896143838 | ||
|
|
ea94899a28 | ||
|
|
d2109cef86 | ||
|
|
cda146366c | ||
|
|
678b879a01 | ||
|
|
4c885c5e7b | ||
|
|
d5002b1c33 | ||
|
|
4f8b6d6b28 | ||
|
|
66dab41539 | ||
|
|
9e4940228d | ||
|
|
cbb11ebb03 | ||
|
|
073a25f381 | ||
|
|
40592ab876 | ||
|
|
bbfe624b51 | ||
|
|
a2af9e4c65 | ||
|
|
0123a8895f | ||
|
|
53854a4d13 | ||
|
|
4fdd44858f | ||
|
|
3c58879ce5 | ||
|
|
a7c6a881b3 | ||
|
|
ef065d31a0 | ||
|
|
d059d6b448 | ||
|
|
2d0a6f1bec | ||
|
|
a3cc5a1938 | ||
|
|
435068515a | ||
|
|
956001dbd7 | ||
|
|
460f0d9dee | ||
|
|
5155ec93c9 | ||
|
|
8bb8883e22 | ||
|
|
ffb7a6dfbb | ||
|
|
176de6f245 | ||
|
|
11f9740dbf | ||
|
|
42a91ba26c | ||
|
|
234003e2b1 | ||
|
|
534384438b | ||
|
|
ab51f35d5d | ||
|
|
511a4044d7 | ||
|
|
821efaff40 | ||
|
|
91bc994532 | ||
|
|
1323b46ac7 | ||
|
|
3a8b30ca8e | ||
|
|
923d58519f | ||
|
|
eabb1f84f6 | ||
|
|
cfbe44b946 | ||
|
|
81c35eab46 | ||
|
|
a1c7c29113 | ||
|
|
1293e2a074 |
29
.github/workflows/ci.yml
vendored
29
.github/workflows/ci.yml
vendored
@@ -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"
|
||||
|
||||
155
CHANGELOG.md
155
CHANGELOG.md
@@ -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
138
README.md
@@ -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:
|
||||
|
||||
[](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
|
||||
[](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)
|
||||
-  [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
|
||||
-  [DbVisualizer](https://www.dbvis.com/) 12.0
|
||||
(**commercial**) - the universal database tool for developers, analysts and
|
||||
DBAs
|
||||
-  [MagicPlot](https://magicplot.com/) 3.0
|
||||
(**commercial**) - Software for nonlinear fitting, plotting and data analysis
|
||||
- 
|
||||
[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
|
||||
- 
|
||||
[Burp Suite Professional and Community Edition](https://portswigger.net/burp/pro)
|
||||
2020.11.2 (**commercial**) - the leading software for web security testing
|
||||
- 
|
||||
[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**)
|
||||
-  [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...
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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" ) }
|
||||
}
|
||||
|
||||
@@ -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}<javax.swing.JComponent>
|
||||
*/
|
||||
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}<javax.swing.JTabbedPane, Integer>
|
||||
* 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 -----------------------------------------------------
|
||||
|
||||
/**
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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" )
|
||||
|
||||
@@ -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}
|
||||
*/
|
||||
|
||||
@@ -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" );
|
||||
|
||||
@@ -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 + "'" );
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 ) {
|
||||
|
||||
@@ -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}.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 -----------------------------------------------
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 ) );
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ------------------------------------------------------
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 ----------------------------------
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 ) {
|
||||
|
||||
@@ -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' );
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
* {
|
||||
* @Override public int getIconWidth() { return 100; }
|
||||
* @Override public int getIconHeight() { return 20; }
|
||||
*
|
||||
* @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 );
|
||||
* }
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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%)
|
||||
|
||||
@@ -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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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%)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
|
||||
# base theme (light, dark, intellij or darcula)
|
||||
@baseTheme=light
|
||||
@baseTheme = light
|
||||
|
||||
# add you theme defaults here
|
||||
@background=#ccc
|
||||
@background = #ccc
|
||||
|
||||
@@ -2,3 +2,12 @@ FlatLaf Demo
|
||||
============
|
||||
|
||||
This sub-project contains the FlatLaf Demo source code.
|
||||
|
||||
|
||||
Download
|
||||
--------
|
||||
|
||||
[](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.
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -481,6 +481,7 @@ class MoreComponentsPanel
|
||||
indeterminateCheckBox,
|
||||
toolTipLabel, toolTip1, toolTip2,
|
||||
toolBarLabel, toolBar1, toolBar2,
|
||||
splitPaneLabel, splitPane3,
|
||||
};
|
||||
|
||||
for( Component c : components )
|
||||
|
||||
@@ -44,10 +44,12 @@ class NewDialog
|
||||
}
|
||||
|
||||
private void okActionPerformed() {
|
||||
System.out.println( "ok" );
|
||||
dispose();
|
||||
}
|
||||
|
||||
private void cancelActionPerformed() {
|
||||
System.out.println( "cancel" );
|
||||
dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ) )
|
||||
|
||||
@@ -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} ),";
|
||||
}
|
||||
|
||||
@@ -14,4 +14,4 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
HintPanel.backgroundColor=darken(#ffffe1,80%)
|
||||
HintPanel.backgroundColor = darken(#ffffe1,80%)
|
||||
|
||||
@@ -14,4 +14,4 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
HintPanel.backgroundColor=#ffffe1
|
||||
HintPanel.backgroundColor = #ffffe1
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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).\
|
||||

|
||||
- [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.\
|
||||

|
||||
- 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:
|
||||
|
||||
[](https://bintray.com/jformdesigner/flatlaf/flatlaf-extras/_latestVersion)
|
||||
[](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:
|
||||
|
||||
[](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
|
||||
[](https://bintray.com/jformdesigner/svgSalamander/svgSalamander/_latestVersion)
|
||||
[](https://maven-badges.herokuapp.com/maven-central/com.formdev/svgSalamander)
|
||||
|
||||
|
||||
Tools
|
||||
|
||||
@@ -40,6 +40,7 @@ tasks {
|
||||
this as StandardJavadocDocletOptions
|
||||
use( true )
|
||||
tags = listOf( "uiDefault", "clientProperty" )
|
||||
addStringOption( "Xdoclint:all,-missing", "-Xdoclint:all,-missing" )
|
||||
}
|
||||
isFailOnError = false
|
||||
}
|
||||
|
||||
@@ -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() + " @ " + 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( " " )
|
||||
.append( "<span style=\"background: " )
|
||||
.append( String.format( "#%06x", c.getRGB() & 0xffffff ) ) // Java CSS does not support alpha; see CSS.hexToColor()
|
||||
.append( ";\">" )
|
||||
.append( " " )
|
||||
.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 ) {
|
||||
|
||||
@@ -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 );
|
||||
@@ -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 -----------------------------------------------------
|
||||
|
||||
@@ -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 )
|
||||
} )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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" );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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}<javax.swing.JTabbedPane, Integer>
|
||||
* 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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
@@ -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" );
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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:
|
||||
|
||||
[](https://bintray.com/jformdesigner/flatlaf/flatlaf-intellij-themes/_latestVersion)
|
||||
|
||||
You also need `flatlaf-<version>.jar`, which you can download here:
|
||||
|
||||
[](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
|
||||
[](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`
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
Reference in New Issue
Block a user