Compare commits
114 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8e423b4552 | ||
|
|
0e288c955c | ||
|
|
7e5c599cc0 | ||
|
|
a961001a4b | ||
|
|
27a347db34 | ||
|
|
b228dbb2df | ||
|
|
09cffc4340 | ||
|
|
e79880d305 | ||
|
|
34266761d1 | ||
|
|
77f17eaa3e | ||
|
|
ac70342cb3 | ||
|
|
d2f16dcaf3 | ||
|
|
abcce2bf68 | ||
|
|
514487074b | ||
|
|
f014e2473f | ||
|
|
80981f7027 | ||
|
|
8e6e971b51 | ||
|
|
4bd3b889dc | ||
|
|
464787dc1e | ||
|
|
a2541a9659 | ||
|
|
099dd87241 | ||
|
|
38eb914420 | ||
|
|
162215b1cf | ||
|
|
c6883f7a92 | ||
|
|
584286b794 | ||
|
|
a48713b7ca | ||
|
|
8f10c2d8bf | ||
|
|
5c0de9aa1c | ||
|
|
5553fd6538 | ||
|
|
e3ed47b37c | ||
|
|
976353d770 | ||
|
|
6fc216dff5 | ||
|
|
3f3961d255 | ||
|
|
875637bc6d | ||
|
|
395333cb3d | ||
|
|
870d039541 | ||
|
|
e8c8bece3f | ||
|
|
bd2f5dd6fe | ||
|
|
73f78d47ae | ||
|
|
8f60755f02 | ||
|
|
44c455419b | ||
|
|
129bc9b3ae | ||
|
|
08ba7dd065 | ||
|
|
dd2cf50a39 | ||
|
|
06eeced5b2 | ||
|
|
be23e5709d | ||
|
|
2735185eb9 | ||
|
|
41dd0acfa3 | ||
|
|
115a2df2b0 | ||
|
|
fcbb3aeed1 | ||
|
|
e9cb85127a | ||
|
|
c9c703fe98 | ||
|
|
0141dfbea2 | ||
|
|
fb7dafbc39 | ||
|
|
0660f9a511 | ||
|
|
a39ae5a8c5 | ||
|
|
03e22e3dbf | ||
|
|
d5e9fd0e5c | ||
|
|
141138ebea | ||
|
|
9026efeb26 | ||
|
|
2ab023beb0 | ||
|
|
8e471fd720 | ||
|
|
13cbbd8bc1 | ||
|
|
b08ccc9767 | ||
|
|
801a7023a4 | ||
|
|
dd06b554da | ||
|
|
23f0504b30 | ||
|
|
262d172cde | ||
|
|
be81cb7876 | ||
|
|
aaf9bd33cb | ||
|
|
7381e2141f | ||
|
|
3923d941c1 | ||
|
|
d134c33499 | ||
|
|
a2b615d4a7 | ||
|
|
37ecd9bd4f | ||
|
|
2e1acb7871 | ||
|
|
2250185487 | ||
|
|
97a1bf90a4 | ||
|
|
73cb63c9f9 | ||
|
|
f61f6b6006 | ||
|
|
7d3ffbc45a | ||
|
|
93ac6fa88a | ||
|
|
09d19a13b7 | ||
|
|
9eaee8d2c4 | ||
|
|
4da0c342f8 | ||
|
|
70fed22737 | ||
|
|
acb62e347a | ||
|
|
78d06d82d6 | ||
|
|
4777bdd250 | ||
|
|
266e9d92d5 | ||
|
|
54c14d0dc8 | ||
|
|
d59d353c2e | ||
|
|
204da2175b | ||
|
|
a8f659f2ac | ||
|
|
a878ebc368 | ||
|
|
152f235ca1 | ||
|
|
d094709dc8 | ||
|
|
97d5792341 | ||
|
|
9429ba7d48 | ||
|
|
af89dd13c1 | ||
|
|
60c6c5b37a | ||
|
|
5ed40cab1d | ||
|
|
1bebfe9cf2 | ||
|
|
e2618c37a2 | ||
|
|
f2ab848c46 | ||
|
|
93b82c0e97 | ||
|
|
4ac5ad06f2 | ||
|
|
a3788038bb | ||
|
|
12af2de99e | ||
|
|
225b722b1b | ||
|
|
1d9c8ca65e | ||
|
|
8ee6588d46 | ||
|
|
7c25f087fb | ||
|
|
d0b0f098d9 |
81
CHANGELOG.md
@@ -1,6 +1,87 @@
|
|||||||
FlatLaf Change Log
|
FlatLaf Change Log
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
## 0.34
|
||||||
|
|
||||||
|
- Menus: New menu item renderer brings stable left margins, right aligned
|
||||||
|
accelerators and larger gap between text and accelerator. This makes menus
|
||||||
|
look more modern and more similar to native platform menus.
|
||||||
|
- New underline menu selection style that displays selected menu items similar
|
||||||
|
to tabs (to enable use `UIManager.put( "MenuItem.selectionType", "underline"
|
||||||
|
);`).
|
||||||
|
- Menus: Fixed text color of selected menu items that use HTML. (issue #87)
|
||||||
|
- Menus: On Windows, pressing <kbd>F10</kbd> now activates the menu bar without
|
||||||
|
showing a menu popup (as usual on Windows platform). On other platforms the
|
||||||
|
first menu popup is shown.
|
||||||
|
- Menus: On Windows, releasing <kbd>Alt</kbd> key now activates the menu bar (as
|
||||||
|
usual on Windows platform). (issue #43)
|
||||||
|
- Menus: Fixed inconsistent left padding in menu items. (issue #3)
|
||||||
|
- Menus: Fixed: Setting `iconTextGap` property on a menu item did increase left
|
||||||
|
and right margins. (issue #54)
|
||||||
|
- Hide mnemonics if window is deactivated (e.g. <kbd>Alt+Tab</kbd> to another
|
||||||
|
window). (issue #43)
|
||||||
|
- macOS: Enabled drop shadows for popup menus and combobox popups. (issue #94)
|
||||||
|
- macOS: Fixed NPE if using `JMenuBar` in `JInternalFrame` and macOS screen menu
|
||||||
|
bar is enabled (with `-Dapple.laf.useScreenMenuBar=true`). (issue #90)
|
||||||
|
|
||||||
|
|
||||||
|
## 0.33
|
||||||
|
|
||||||
|
- Improved creation of disabled grayscale icons used in disabled buttons, labels
|
||||||
|
and tabs. They now have more contrast and are lighter in light themes and
|
||||||
|
darker in dark themes. (issue #70)
|
||||||
|
- IntelliJ Themes: Fixed ComboBox size and Spinner border in all Material UI
|
||||||
|
Lite themes and limit tree row height in all Material UI Lite themes and some
|
||||||
|
other themes.
|
||||||
|
- IntelliJ Themes: Material UI Lite themes did not work when using
|
||||||
|
[IntelliJ Themes Pack](flatlaf-intellij-themes) addon. (PR #88, issue #89)
|
||||||
|
- IntelliJ Themes: Added Java 9 module descriptor to
|
||||||
|
`flatlaf-intellij-themes-<version>.jar`.
|
||||||
|
|
||||||
|
|
||||||
|
## 0.32
|
||||||
|
|
||||||
|
- New [IntelliJ Themes Pack](flatlaf-intellij-themes) addon bundles many popular
|
||||||
|
open-source 3rd party themes from JetBrains Plugins Repository into a JAR and
|
||||||
|
provides Java classes to use them.
|
||||||
|
- IntelliJ Themes: Fixed button and toggle button colors. (issue #86)
|
||||||
|
- Updated IntelliJ Themes in demo to the latest versions.
|
||||||
|
- ToggleButton: Compute selected background color based on current component
|
||||||
|
background. (issue #32)
|
||||||
|
|
||||||
|
|
||||||
|
## 0.31
|
||||||
|
|
||||||
|
- Focus indication border (or background) no longer hidden when temporary
|
||||||
|
loosing focus (e.g. showing a popup menu).
|
||||||
|
- List, Table and Tree: Item selection color of focused components no longer
|
||||||
|
change from blue to gray when temporary loosing focus (e.g. showing a popup
|
||||||
|
menu).
|
||||||
|
|
||||||
|
|
||||||
|
## 0.30
|
||||||
|
|
||||||
|
- Windows: Fixed rendering of Unicode characters. Previously not all Unicode
|
||||||
|
characters were rendered on Windows. (issue #81)
|
||||||
|
|
||||||
|
|
||||||
|
## 0.29
|
||||||
|
|
||||||
|
- Linux: Fixed scaling if `GDK_SCALE` environment variable is set or if running
|
||||||
|
on JetBrains Runtime. (issue #69)
|
||||||
|
- Tree: Fixed repainting wide selection on focus gained/lost.
|
||||||
|
- ComboBox: No longer ignore `JComboBox.prototypeDisplayValue` when computing
|
||||||
|
popup width. (issue #80)
|
||||||
|
- Support changing default font used for all components with automatic scaling
|
||||||
|
UI if using larger font. Use `UIManager.put( "defaultFont", myFont );`
|
||||||
|
- No longer use system property `sun.java2d.uiScale`. (Java 8 only)
|
||||||
|
- Support specifying custom scale factor in system property `flatlaf.uiScale`
|
||||||
|
also for Java 9 and later.
|
||||||
|
- Demo: Support using own FlatLaf themes (`.properties` files) that are located
|
||||||
|
in working directory of Demo application. Shown in the "Themes" list under
|
||||||
|
category "Current Directory".
|
||||||
|
|
||||||
|
|
||||||
## 0.28
|
## 0.28
|
||||||
|
|
||||||
- PasswordField: Warn about enabled Caps Lock.
|
- PasswordField: Warn about enabled Caps Lock.
|
||||||
|
|||||||
12
README.md
@@ -19,7 +19,8 @@ IntelliJ IDEA 2019.2+ and uses almost the same colors and icons.
|
|||||||
IntelliJ Platform Themes
|
IntelliJ Platform Themes
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
FlatLaf can use 3rd party themes created for IntelliJ Platform:
|
FlatLaf can use 3rd party themes created for IntelliJ Platform (see
|
||||||
|
[IntelliJ Themes Pack](flatlaf-intellij-themes)):
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -70,6 +71,7 @@ Addons
|
|||||||
|
|
||||||
- [SwingX](flatlaf-swingx)
|
- [SwingX](flatlaf-swingx)
|
||||||
- [JIDE Common Layer](flatlaf-jide-oss)
|
- [JIDE Common Layer](flatlaf-jide-oss)
|
||||||
|
- [IntelliJ Themes Pack](flatlaf-intellij-themes)
|
||||||
|
|
||||||
|
|
||||||
Projects using FlatLaf
|
Projects using FlatLaf
|
||||||
@@ -79,7 +81,13 @@ Projects using FlatLaf
|
|||||||
- [jclasslib bytecode viewer](https://github.com/ingokegel/jclasslib) 5.5
|
- [jclasslib bytecode viewer](https://github.com/ingokegel/jclasslib) 5.5
|
||||||
- [KeyStore Explorer](https://keystore-explorer.org/) 5.4.3
|
- [KeyStore Explorer](https://keystore-explorer.org/) 5.4.3
|
||||||
- [OWASP Zed Attack Proxy (ZAP)](https://www.zaproxy.org/) (in weekly releases)
|
- [OWASP Zed Attack Proxy (ZAP)](https://www.zaproxy.org/) (in weekly releases)
|
||||||
|
- [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)
|
- [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)
|
- [Rest Suite](https://github.com/supanadit/restsuite)
|
||||||
- [ControllerBuddy](https://github.com/bwRavencl/ControllerBuddy)
|
- [ControllerBuddy](https://github.com/bwRavencl/ControllerBuddy)
|
||||||
- [SpringRemote](https://github.com/HaleyWang/SpringRemote)
|
- [SpringRemote](https://github.com/HaleyWang/SpringRemote)
|
||||||
@@ -89,6 +97,8 @@ Projects using FlatLaf
|
|||||||
[mendelson AS2](https://mendelson-e-c.com/as2/),
|
[mendelson AS2](https://mendelson-e-c.com/as2/),
|
||||||
[AS4](https://mendelson-e-c.com/as4/) and
|
[AS4](https://mendelson-e-c.com/as4/) and
|
||||||
[OFTP2](https://mendelson-e-c.com/oftp2) (commercial)
|
[OFTP2](https://mendelson-e-c.com/oftp2) (commercial)
|
||||||
|
- [MeteoInfo](https://github.com/meteoinfo/MeteoInfo) 2.1.6
|
||||||
|
- [lsfusion platform](https://github.com/lsfusion/platform)
|
||||||
- and more...
|
- and more...
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
val releaseVersion = "0.28"
|
val releaseVersion = "0.34"
|
||||||
val developmentVersion = "0.29-SNAPSHOT"
|
val developmentVersion = "0.35-SNAPSHOT"
|
||||||
|
|
||||||
version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion
|
version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion
|
||||||
|
|
||||||
|
|||||||
80
buildSrc/src/main/java/ReorderJarEntries.java
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.StandardOpenOption;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reorders entries in a JAR file so that .properties files are placed before .class files,
|
||||||
|
* which is necessary to workaround an issue in NetBeans 11.3 (and older).
|
||||||
|
* See issues #13 and #93.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class ReorderJarEntries
|
||||||
|
{
|
||||||
|
public static void reorderJarEntries( File jarFile )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
ByteArrayOutputStream outStream = new ByteArrayOutputStream( (int) jarFile.length() + 1000 );
|
||||||
|
|
||||||
|
try( ZipOutputStream zipOutStream = new ZipOutputStream( outStream ) ) {
|
||||||
|
// 1st pass: copy .properties files
|
||||||
|
copyFiles( zipOutStream, jarFile, name -> name.endsWith( ".properties" ) );
|
||||||
|
|
||||||
|
// 2st pass: copy other files
|
||||||
|
copyFiles( zipOutStream, jarFile, name -> !name.endsWith( ".properties" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace JAR
|
||||||
|
Files.write( jarFile.toPath(), outStream.toByteArray(),
|
||||||
|
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void copyFiles( ZipOutputStream dest, File jarFile, Predicate<String> filter )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
try( ZipInputStream zipInputStream = new ZipInputStream( new FileInputStream( jarFile ) ) ) {
|
||||||
|
ZipEntry entry;
|
||||||
|
while( (entry = zipInputStream.getNextEntry()) != null ) {
|
||||||
|
if( filter.test( entry.getName() ) ) {
|
||||||
|
dest.putNextEntry( entry );
|
||||||
|
copyFile( zipInputStream, dest );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void copyFile( InputStream src, OutputStream dest )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
byte[] buf = new byte[8*1024];
|
||||||
|
int len;
|
||||||
|
while( (len = src.read( buf )) > 0 )
|
||||||
|
dest.write( buf, 0, len );
|
||||||
|
dest.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,11 @@ plugins {
|
|||||||
|
|
||||||
if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) {
|
if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) {
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
create( "java9" ) {
|
||||||
|
java {
|
||||||
|
setSrcDirs( listOf( "src/main/java9" ) )
|
||||||
|
}
|
||||||
|
}
|
||||||
create( "module-info" ) {
|
create( "module-info" ) {
|
||||||
java {
|
java {
|
||||||
// include "src/main/java" here to get compile errors if classes are
|
// include "src/main/java" here to get compile errors if classes are
|
||||||
@@ -52,10 +57,20 @@ tasks {
|
|||||||
archiveBaseName.set( "flatlaf" )
|
archiveBaseName.set( "flatlaf" )
|
||||||
|
|
||||||
if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) {
|
if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) {
|
||||||
|
manifest.attributes( "Multi-Release" to "true" )
|
||||||
|
|
||||||
|
into( "META-INF/versions/9" ) {
|
||||||
|
from( sourceSets["java9"].output )
|
||||||
|
}
|
||||||
|
|
||||||
from( sourceSets["module-info"].output ) {
|
from( sourceSets["module-info"].output ) {
|
||||||
include( "module-info.class" )
|
include( "module-info.class" )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
ReorderJarEntries.reorderJarEntries( outputs.files.singleFile );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
javadoc {
|
javadoc {
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
package com.formdev.flatlaf;
|
package com.formdev.flatlaf;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import javax.swing.LookAndFeel;
|
||||||
|
import javax.swing.UIDefaults;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Addon for FlatLaf UI defaults.
|
* Addon for FlatLaf UI defaults.
|
||||||
@@ -50,6 +52,13 @@ public abstract class FlatDefaultsAddon
|
|||||||
return addonClass.getResourceAsStream( propertiesName );
|
return addonClass.getResourceAsStream( propertiesName );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows modifying UI defaults after loading UI defaults.
|
||||||
|
* The default implementation does nothing.
|
||||||
|
*/
|
||||||
|
public void afterDefaultsLoading( LookAndFeel laf, UIDefaults defaults ) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the priority used to sort addon loading.
|
* Returns the priority used to sort addon loading.
|
||||||
* The order is only important if you want overwrite UI defaults of other addons.
|
* The order is only important if you want overwrite UI defaults of other addons.
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default color palette for action icons and object icons.
|
||||||
|
* <p>
|
||||||
|
* The idea is to use only this well defined set of colors in SVG icons and
|
||||||
|
* then they are replaced at runtime to dark variants or to other theme colors.
|
||||||
|
* Then a single SVG icon (light variant) can be used for dark themes too.
|
||||||
|
* IntelliJ Platform uses this mechanism to allow themes to change IntelliJ Platform icons.
|
||||||
|
* <p>
|
||||||
|
* Use the {@code *_DARK} colors only in {@code *_dark.svg} files.
|
||||||
|
* <p>
|
||||||
|
* The colors are based on IntelliJ Platform
|
||||||
|
* <a href="https://jetbrains.design/intellij/principles/icons/#action-icons">Action icons</a>
|
||||||
|
* and
|
||||||
|
* <a href="https://jetbrains.design/intellij/principles/icons/#noun-icons">Noun icons</a>
|
||||||
|
* <p>
|
||||||
|
* These colors may be changed by IntelliJ Platform themes.
|
||||||
|
* <p>
|
||||||
|
* You may use these colors also in your application (outside of SVG icons), but do
|
||||||
|
* not use the RGB values defined in this enum.<br>
|
||||||
|
* Instead use {@code UIManager.getColor( FlatIconColors.ACTIONS_GREY.key )}.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public enum FlatIconColors
|
||||||
|
{
|
||||||
|
// colors for action icons
|
||||||
|
// see https://jetbrains.design/intellij/principles/icons/#action-icons
|
||||||
|
ACTIONS_RED ( 0xDB5860, "Actions.Red", true, false ),
|
||||||
|
ACTIONS_RED_DARK ( 0xC75450, "Actions.Red", false, true ),
|
||||||
|
ACTIONS_YELLOW ( 0xEDA200, "Actions.Yellow", true, false ),
|
||||||
|
ACTIONS_YELLOW_DARK ( 0xF0A732, "Actions.Yellow", false, true ),
|
||||||
|
ACTIONS_GREEN ( 0x59A869, "Actions.Green", true, false ),
|
||||||
|
ACTIONS_GREEN_DARK ( 0x499C54, "Actions.Green", false, true ),
|
||||||
|
ACTIONS_BLUE ( 0x389FD6, "Actions.Blue", true, false ),
|
||||||
|
ACTIONS_BLUE_DARK ( 0x3592C4, "Actions.Blue", false, true ),
|
||||||
|
ACTIONS_GREY ( 0x6E6E6E, "Actions.Grey", true, false ),
|
||||||
|
ACTIONS_GREY_DARK ( 0xAFB1B3, "Actions.Grey", false, true ),
|
||||||
|
ACTIONS_GREYINLINE ( 0x7F8B91, "Actions.GreyInline", true, false ),
|
||||||
|
ACTIONS_GREYINLINE_DARK ( 0x7F8B91, "Actions.GreyInline", false, true ),
|
||||||
|
|
||||||
|
// colors for object icons
|
||||||
|
// see https://jetbrains.design/intellij/principles/icons/#noun-icons
|
||||||
|
OBJECTS_GREY ( 0x9AA7B0, "Objects.Grey" ),
|
||||||
|
OBJECTS_BLUE ( 0x40B6E0, "Objects.Blue" ),
|
||||||
|
OBJECTS_GREEN ( 0x62B543, "Objects.Green" ),
|
||||||
|
OBJECTS_YELLOW ( 0xF4AF3D, "Objects.Yellow" ),
|
||||||
|
OBJECTS_YELLOW_DARK ( 0xD9A343, "Objects.YellowDark" ),
|
||||||
|
OBJECTS_PURPLE ( 0xB99BF8, "Objects.Purple" ),
|
||||||
|
OBJECTS_PINK ( 0xF98B9E, "Objects.Pink" ),
|
||||||
|
OBJECTS_RED ( 0xF26522, "Objects.Red" ),
|
||||||
|
OBJECTS_RED_STATUS ( 0xE05555, "Objects.RedStatus" ),
|
||||||
|
OBJECTS_GREEN_ANDROID ( 0xA4C639, "Objects.GreenAndroid" ),
|
||||||
|
OBJECTS_BLACK_TEXT ( 0x231F20, "Objects.BlackText" );
|
||||||
|
|
||||||
|
public final int rgb;
|
||||||
|
public final String key;
|
||||||
|
|
||||||
|
public final boolean light;
|
||||||
|
public final boolean dark;
|
||||||
|
|
||||||
|
FlatIconColors( int rgb, String key ) {
|
||||||
|
this( rgb, key, true, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
FlatIconColors( int rgb, String key, boolean light, boolean dark ) {
|
||||||
|
this.rgb = rgb;
|
||||||
|
this.key = key;
|
||||||
|
this.light = light;
|
||||||
|
this.dark = dark;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -85,8 +85,12 @@ class FlatInputMaps
|
|||||||
// swap to make it consistent with List and Tree
|
// swap to make it consistent with List and Tree
|
||||||
"HOME", "selectFirstRow",
|
"HOME", "selectFirstRow",
|
||||||
"END", "selectLastRow",
|
"END", "selectLastRow",
|
||||||
|
"shift HOME", "selectFirstRowExtendSelection",
|
||||||
|
"shift END", "selectLastRowExtendSelection",
|
||||||
mac( "ctrl HOME", null ), "selectFirstColumn",
|
mac( "ctrl HOME", null ), "selectFirstColumn",
|
||||||
mac( "ctrl END", null ), "selectLastColumn"
|
mac( "ctrl END", null ), "selectLastColumn",
|
||||||
|
mac( "shift ctrl HOME", null ), "selectFirstColumnExtendSelection",
|
||||||
|
mac( "shift ctrl END", null ), "selectLastColumnExtendSelection"
|
||||||
);
|
);
|
||||||
|
|
||||||
if( !SystemInfo.IS_MAC ) {
|
if( !SystemInfo.IS_MAC ) {
|
||||||
@@ -501,6 +505,9 @@ class FlatInputMaps
|
|||||||
"alt KP_LEFT", "selectParent",
|
"alt KP_LEFT", "selectParent",
|
||||||
"alt KP_RIGHT", "selectChild",
|
"alt KP_RIGHT", "selectChild",
|
||||||
|
|
||||||
|
"shift HOME", "selectFirstExtendSelection",
|
||||||
|
"shift END", "selectLastExtendSelection",
|
||||||
|
|
||||||
"meta A", "selectAll",
|
"meta A", "selectAll",
|
||||||
"meta C", "copy",
|
"meta C", "copy",
|
||||||
"meta V", "paste",
|
"meta V", "paste",
|
||||||
@@ -545,8 +552,6 @@ class FlatInputMaps
|
|||||||
"shift ctrl SPACE", null,
|
"shift ctrl SPACE", null,
|
||||||
"shift ctrl UP", null,
|
"shift ctrl UP", null,
|
||||||
"shift DELETE", null,
|
"shift DELETE", null,
|
||||||
"shift END", null,
|
|
||||||
"shift HOME", null,
|
|
||||||
"shift INSERT", null,
|
"shift INSERT", null,
|
||||||
"shift PAGE_DOWN", null,
|
"shift PAGE_DOWN", null,
|
||||||
"shift PAGE_UP", null,
|
"shift PAGE_UP", null,
|
||||||
|
|||||||
@@ -18,38 +18,46 @@ package com.formdev.flatlaf;
|
|||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Container;
|
|
||||||
import java.awt.EventQueue;
|
import java.awt.EventQueue;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.KeyEventPostProcessor;
|
import java.awt.Image;
|
||||||
import java.awt.KeyboardFocusManager;
|
|
||||||
import java.awt.RenderingHints;
|
import java.awt.RenderingHints;
|
||||||
import java.awt.Toolkit;
|
import java.awt.Toolkit;
|
||||||
import java.awt.Window;
|
import java.awt.Window;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.image.FilteredImageSource;
|
||||||
|
import java.awt.image.ImageFilter;
|
||||||
|
import java.awt.image.ImageProducer;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
import java.lang.ref.WeakReference;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.ServiceLoader;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import javax.swing.AbstractButton;
|
import javax.swing.BorderFactory;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.Icon;
|
||||||
import javax.swing.JRootPane;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.PopupFactory;
|
import javax.swing.PopupFactory;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.UIDefaults;
|
import javax.swing.UIDefaults;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.UnsupportedLookAndFeelException;
|
import javax.swing.UnsupportedLookAndFeelException;
|
||||||
|
import javax.swing.UIDefaults.ActiveValue;
|
||||||
import javax.swing.plaf.ColorUIResource;
|
import javax.swing.plaf.ColorUIResource;
|
||||||
import javax.swing.plaf.FontUIResource;
|
import javax.swing.plaf.FontUIResource;
|
||||||
|
import javax.swing.plaf.UIResource;
|
||||||
import javax.swing.plaf.basic.BasicLookAndFeel;
|
import javax.swing.plaf.basic.BasicLookAndFeel;
|
||||||
|
import javax.swing.text.StyleContext;
|
||||||
import javax.swing.text.html.HTMLEditorKit;
|
import javax.swing.text.html.HTMLEditorKit;
|
||||||
|
import com.formdev.flatlaf.util.GrayFilter;
|
||||||
|
import com.formdev.flatlaf.util.MultiResolutionImageSupport;
|
||||||
import com.formdev.flatlaf.util.SystemInfo;
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
@@ -70,9 +78,7 @@ public abstract class FlatLaf
|
|||||||
private static boolean aquaLoaded;
|
private static boolean aquaLoaded;
|
||||||
private static boolean updateUIPending;
|
private static boolean updateUIPending;
|
||||||
|
|
||||||
private KeyEventPostProcessor mnemonicListener;
|
private MnemonicHandler mnemonicHandler;
|
||||||
private static boolean showMnemonics;
|
|
||||||
private static WeakReference<Window> lastShowMnemonicWindow;
|
|
||||||
|
|
||||||
private Consumer<UIDefaults> postInitialization;
|
private Consumer<UIDefaults> postInitialization;
|
||||||
|
|
||||||
@@ -111,6 +117,26 @@ public abstract class FlatLaf
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Icon getDisabledIcon( JComponent component, Icon icon ) {
|
||||||
|
if( icon instanceof ImageIcon ) {
|
||||||
|
Object grayFilter = UIManager.get( "Component.grayFilter" );
|
||||||
|
ImageFilter filter = (grayFilter instanceof ImageFilter)
|
||||||
|
? (ImageFilter) grayFilter
|
||||||
|
: GrayFilter.createDisabledIconFilter( isDark() ); // fallback
|
||||||
|
|
||||||
|
Function<Image, Image> mapper = img -> {
|
||||||
|
ImageProducer producer = new FilteredImageSource( img.getSource(), filter );
|
||||||
|
return Toolkit.getDefaultToolkit().createImage( producer );
|
||||||
|
};
|
||||||
|
|
||||||
|
Image image = ((ImageIcon)icon).getImage();
|
||||||
|
return new ImageIconUIResource( MultiResolutionImageSupport.map( image, mapper ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
if( SystemInfo.IS_MAC )
|
if( SystemInfo.IS_MAC )
|
||||||
@@ -118,12 +144,9 @@ public abstract class FlatLaf
|
|||||||
|
|
||||||
super.initialize();
|
super.initialize();
|
||||||
|
|
||||||
// add mnemonic listener
|
// install mnemonic handler
|
||||||
mnemonicListener = e -> {
|
mnemonicHandler = new MnemonicHandler();
|
||||||
checkShowMnemonics( e );
|
mnemonicHandler.install();
|
||||||
return false;
|
|
||||||
};
|
|
||||||
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor( mnemonicListener );
|
|
||||||
|
|
||||||
// listen to desktop property changes to update UI if system font or scaling changes
|
// listen to desktop property changes to update UI if system font or scaling changes
|
||||||
if( SystemInfo.IS_WINDOWS ) {
|
if( SystemInfo.IS_WINDOWS ) {
|
||||||
@@ -177,10 +200,10 @@ public abstract class FlatLaf
|
|||||||
desktopPropertyListener = null;
|
desktopPropertyListener = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove mnemonic listener
|
// uninstall mnemonic handler
|
||||||
if( mnemonicListener != null ) {
|
if( mnemonicHandler != null ) {
|
||||||
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventPostProcessor( mnemonicListener );
|
mnemonicHandler.uninstall();
|
||||||
mnemonicListener = null;
|
mnemonicHandler = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// restore default link color
|
// restore default link color
|
||||||
@@ -266,33 +289,59 @@ public abstract class FlatLaf
|
|||||||
initIconColors( defaults, isDark() );
|
initIconColors( defaults, isDark() );
|
||||||
FlatInputMaps.initInputMaps( defaults );
|
FlatInputMaps.initInputMaps( defaults );
|
||||||
|
|
||||||
|
// get addons and sort them by priority
|
||||||
|
ServiceLoader<FlatDefaultsAddon> addonLoader = ServiceLoader.load( FlatDefaultsAddon.class );
|
||||||
|
List<FlatDefaultsAddon> addons = new ArrayList<>();
|
||||||
|
for( FlatDefaultsAddon addon : addonLoader )
|
||||||
|
addons.add( addon );
|
||||||
|
addons.sort( (addon1, addon2) -> addon1.getPriority() - addon2.getPriority() );
|
||||||
|
|
||||||
// load defaults from properties
|
// load defaults from properties
|
||||||
List<Class<?>> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading();
|
List<Class<?>> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading();
|
||||||
if( lafClassesForDefaultsLoading != null )
|
if( lafClassesForDefaultsLoading != null )
|
||||||
UIDefaultsLoader.loadDefaultsFromProperties( lafClassesForDefaultsLoading, defaults );
|
UIDefaultsLoader.loadDefaultsFromProperties( lafClassesForDefaultsLoading, addons, getAdditionalDefaults(), isDark(), defaults );
|
||||||
else
|
else
|
||||||
UIDefaultsLoader.loadDefaultsFromProperties( getClass(), defaults );
|
UIDefaultsLoader.loadDefaultsFromProperties( getClass(), addons, getAdditionalDefaults(), isDark(), defaults );
|
||||||
|
|
||||||
// use Aqua MenuBarUI if Mac screen menubar is enabled
|
// use Aqua MenuBarUI if Mac screen menubar is enabled
|
||||||
if( SystemInfo.IS_MAC && Boolean.getBoolean( "apple.laf.useScreenMenuBar" ) )
|
if( SystemInfo.IS_MAC && Boolean.getBoolean( "apple.laf.useScreenMenuBar" ) ) {
|
||||||
defaults.put( "MenuBarUI", "com.apple.laf.AquaMenuBarUI" );
|
defaults.put( "MenuBarUI", "com.apple.laf.AquaMenuBarUI" );
|
||||||
|
|
||||||
|
// add defaults necessary for AquaMenuBarUI
|
||||||
|
defaults.put( "MenuBar.backgroundPainter", BorderFactory.createEmptyBorder() );
|
||||||
|
}
|
||||||
|
|
||||||
// initialize text antialiasing
|
// initialize text antialiasing
|
||||||
putAATextInfo( defaults );
|
putAATextInfo( defaults );
|
||||||
|
|
||||||
invokePostInitialization( defaults );
|
// apply additional defaults (e.g. from IntelliJ themes)
|
||||||
|
applyAdditionalDefaults( defaults );
|
||||||
|
|
||||||
return defaults;
|
// allow addons modifying UI defaults
|
||||||
}
|
for( FlatDefaultsAddon addon : addons )
|
||||||
|
addon.afterDefaultsLoading( this, defaults );
|
||||||
|
|
||||||
|
// add user scale factor to allow layout managers (e.g. MigLayout) to use it
|
||||||
|
defaults.put( "laf.scaleFactor", (ActiveValue) t -> {
|
||||||
|
return UIScale.getUserScaleFactor();
|
||||||
|
} );
|
||||||
|
|
||||||
void invokePostInitialization( UIDefaults defaults ) {
|
|
||||||
if( postInitialization != null ) {
|
if( postInitialization != null ) {
|
||||||
postInitialization.accept( defaults );
|
postInitialization.accept( defaults );
|
||||||
postInitialization = null;
|
postInitialization = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return defaults;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Class<?>> getLafClassesForDefaultsLoading() {
|
void applyAdditionalDefaults( UIDefaults defaults ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<Class<?>> getLafClassesForDefaultsLoading() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Properties getAdditionalDefaults() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,7 +351,7 @@ public abstract class FlatLaf
|
|||||||
if( SystemInfo.IS_WINDOWS ) {
|
if( SystemInfo.IS_WINDOWS ) {
|
||||||
Font winFont = (Font) Toolkit.getDefaultToolkit().getDesktopProperty( "win.messagebox.font" );
|
Font winFont = (Font) Toolkit.getDefaultToolkit().getDesktopProperty( "win.messagebox.font" );
|
||||||
if( winFont != null )
|
if( winFont != null )
|
||||||
uiFont = new FontUIResource( winFont );
|
uiFont = createCompositeFont( winFont.getFamily(), winFont.getStyle(), winFont.getSize() );
|
||||||
|
|
||||||
} else if( SystemInfo.IS_MAC ) {
|
} else if( SystemInfo.IS_MAC ) {
|
||||||
String fontName;
|
String fontName;
|
||||||
@@ -313,7 +362,8 @@ public abstract class FlatLaf
|
|||||||
// default font on older systems (see com.apple.laf.AquaFonts)
|
// default font on older systems (see com.apple.laf.AquaFonts)
|
||||||
fontName = "Lucida Grande";
|
fontName = "Lucida Grande";
|
||||||
}
|
}
|
||||||
uiFont = new FontUIResource( fontName, Font.PLAIN, 13 );
|
|
||||||
|
uiFont = createCompositeFont( fontName, Font.PLAIN, 13 );
|
||||||
|
|
||||||
} else if( SystemInfo.IS_LINUX ) {
|
} else if( SystemInfo.IS_LINUX ) {
|
||||||
Font font = LinuxFontPolicy.getFont();
|
Font font = LinuxFontPolicy.getFont();
|
||||||
@@ -321,18 +371,34 @@ public abstract class FlatLaf
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( uiFont == null )
|
if( uiFont == null )
|
||||||
return;
|
uiFont = createCompositeFont( Font.SANS_SERIF, Font.PLAIN, 12 );
|
||||||
|
|
||||||
uiFont = UIScale.applyCustomScaleFactor( uiFont );
|
uiFont = UIScale.applyCustomScaleFactor( uiFont );
|
||||||
|
|
||||||
|
// use active value for all fonts to allow changing fonts in all components
|
||||||
|
// (similar as in Nimbus L&F) with:
|
||||||
|
// UIManager.put( "defaultFont", myFont );
|
||||||
|
Object activeFont = new ActiveFont( 1 );
|
||||||
|
|
||||||
// override fonts
|
// override fonts
|
||||||
for( Object key : defaults.keySet() ) {
|
for( Object key : defaults.keySet() ) {
|
||||||
if( key instanceof String && (((String)key).endsWith( ".font" ) || ((String)key).endsWith( "Font" )) )
|
if( key instanceof String && (((String)key).endsWith( ".font" ) || ((String)key).endsWith( "Font" )) )
|
||||||
defaults.put( key, uiFont );
|
defaults.put( key, activeFont );
|
||||||
}
|
}
|
||||||
|
|
||||||
// use smaller font for progress bar
|
// use smaller font for progress bar
|
||||||
defaults.put( "ProgressBar.font", UIScale.scaleFont( uiFont, 0.85f ) );
|
defaults.put( "ProgressBar.font", new ActiveFont( 0.85f ) );
|
||||||
|
|
||||||
|
// set default font
|
||||||
|
defaults.put( "defaultFont", uiFont );
|
||||||
|
}
|
||||||
|
|
||||||
|
static FontUIResource createCompositeFont( String family, int style, int size ) {
|
||||||
|
// using StyleContext.getFont() here because it uses
|
||||||
|
// sun.font.FontUtilities.getCompositeFontUIResource()
|
||||||
|
// and creates a composite font that is able to display all Unicode characters
|
||||||
|
Font font = new StyleContext().getFont( family, style, size );
|
||||||
|
return (font instanceof FontUIResource) ? (FontUIResource) font : new FontUIResource( font );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -348,30 +414,14 @@ public abstract class FlatLaf
|
|||||||
* <a href="https://jetbrains.design/intellij/principles/icons/#action-icons">Action icons</a>
|
* <a href="https://jetbrains.design/intellij/principles/icons/#action-icons">Action icons</a>
|
||||||
* and
|
* and
|
||||||
* <a href="https://jetbrains.design/intellij/principles/icons/#noun-icons">Noun icons</a>
|
* <a href="https://jetbrains.design/intellij/principles/icons/#noun-icons">Noun icons</a>
|
||||||
|
* <p>
|
||||||
|
* These colors may be changed by IntelliJ Platform themes.
|
||||||
*/
|
*/
|
||||||
public static void initIconColors( UIDefaults defaults, boolean dark ) {
|
public static void initIconColors( UIDefaults defaults, boolean dark ) {
|
||||||
// colors for action icons
|
for( FlatIconColors c : FlatIconColors.values() ) {
|
||||||
// see https://jetbrains.design/intellij/principles/icons/#action-icons
|
if( c.light == !dark || c.dark == dark )
|
||||||
defaults.put( "Actions.Red", new ColorUIResource( !dark ? 0xDB5860 : 0xC75450 ) );
|
defaults.put( c.key, new ColorUIResource( c.rgb ) );
|
||||||
defaults.put( "Actions.Yellow", new ColorUIResource( !dark ? 0xEDA200 : 0xF0A732 ) );
|
}
|
||||||
defaults.put( "Actions.Green", new ColorUIResource( !dark ? 0x59A869 : 0x499C54 ) );
|
|
||||||
defaults.put( "Actions.Blue", new ColorUIResource( !dark ? 0x389FD6 : 0x3592C4 ) );
|
|
||||||
defaults.put( "Actions.Grey", new ColorUIResource( !dark ? 0x6E6E6E : 0xAFB1B3 ) );
|
|
||||||
defaults.put( "Actions.GreyInline", new ColorUIResource( !dark ? 0x7F8B91 : 0x7F8B91 ) );
|
|
||||||
|
|
||||||
// colors for object icons
|
|
||||||
// see https://jetbrains.design/intellij/principles/icons/#noun-icons
|
|
||||||
defaults.put( "Objects.Grey", new ColorUIResource( 0x9AA7B0 ) );
|
|
||||||
defaults.put( "Objects.Blue", new ColorUIResource( 0x40B6E0 ) );
|
|
||||||
defaults.put( "Objects.Green", new ColorUIResource( 0x62B543 ) );
|
|
||||||
defaults.put( "Objects.Yellow", new ColorUIResource( 0xF4AF3D ) );
|
|
||||||
defaults.put( "Objects.YellowDark", new ColorUIResource( 0xD9A343 ) );
|
|
||||||
defaults.put( "Objects.Purple", new ColorUIResource( 0xB99BF8 ) );
|
|
||||||
defaults.put( "Objects.Pink", new ColorUIResource( 0xF98B9E ) );
|
|
||||||
defaults.put( "Objects.Red", new ColorUIResource( 0xF26522 ) );
|
|
||||||
defaults.put( "Objects.RedStatus", new ColorUIResource( 0xE05555 ) );
|
|
||||||
defaults.put( "Objects.GreenAndroid", new ColorUIResource( 0xA4C639 ) );
|
|
||||||
defaults.put( "Objects.BlackText", new ColorUIResource( 0x231F20 ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void putAATextInfo( UIDefaults defaults ) {
|
private void putAATextInfo( UIDefaults defaults ) {
|
||||||
@@ -461,85 +511,63 @@ public abstract class FlatLaf
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isShowMnemonics() {
|
public static boolean isShowMnemonics() {
|
||||||
return showMnemonics || !UIManager.getBoolean( "Component.hideMnemonics" );
|
return MnemonicHandler.isShowMnemonics();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void checkShowMnemonics( KeyEvent e ) {
|
public static void showMnemonics( Component c ) {
|
||||||
int keyCode = e.getKeyCode();
|
MnemonicHandler.showMnemonics( true, c );
|
||||||
if( SystemInfo.IS_MAC ) {
|
}
|
||||||
// Ctrl+Alt keys must be pressed on Mac
|
|
||||||
if( keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_ALT )
|
public static void hideMnemonics() {
|
||||||
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED && e.isControlDown() && e.isAltDown(), e.getComponent() );
|
MnemonicHandler.showMnemonics( false, null );
|
||||||
} else {
|
}
|
||||||
// Alt key must be pressed on Windows and Linux
|
|
||||||
if( keyCode == KeyEvent.VK_ALT )
|
//---- class ActiveFont ---------------------------------------------------
|
||||||
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED, e.getComponent() );
|
|
||||||
|
private static class ActiveFont
|
||||||
|
implements ActiveValue
|
||||||
|
{
|
||||||
|
private final float scaleFactor;
|
||||||
|
|
||||||
|
// cache (scaled) font
|
||||||
|
private Font font;
|
||||||
|
private Font lastDefaultFont;
|
||||||
|
|
||||||
|
ActiveFont( float scaleFactor ) {
|
||||||
|
this.scaleFactor = scaleFactor;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static void showMnemonics( boolean show, Component c ) {
|
@Override
|
||||||
if( show == showMnemonics )
|
public Object createValue( UIDefaults table ) {
|
||||||
return;
|
Font defaultFont = UIManager.getFont( "defaultFont" );
|
||||||
|
|
||||||
showMnemonics = show;
|
if( lastDefaultFont != defaultFont ) {
|
||||||
|
lastDefaultFont = defaultFont;
|
||||||
|
|
||||||
// check whether it is necessary to repaint
|
if( scaleFactor != 1 ) {
|
||||||
if( !UIManager.getBoolean( "Component.hideMnemonics" ) )
|
// scale font
|
||||||
return;
|
int newFontSize = Math.round( defaultFont.getSize() * scaleFactor );
|
||||||
|
font = new FontUIResource( defaultFont.deriveFont( (float) newFontSize ) );
|
||||||
if( show ) {
|
} else {
|
||||||
// get root pane
|
// make sure that font is a UIResource for LaF switching
|
||||||
JRootPane rootPane = SwingUtilities.getRootPane( c );
|
font = (defaultFont instanceof UIResource)
|
||||||
if( rootPane == null )
|
? defaultFont
|
||||||
return;
|
: new FontUIResource( defaultFont );
|
||||||
|
}
|
||||||
// get window
|
|
||||||
Window window = SwingUtilities.getWindowAncestor( rootPane );
|
|
||||||
if( window == null )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// repaint components with mnemonics in focused window
|
|
||||||
repaintMnemonics( window );
|
|
||||||
|
|
||||||
lastShowMnemonicWindow = new WeakReference<>( window );
|
|
||||||
} else if( lastShowMnemonicWindow != null ) {
|
|
||||||
Window window = lastShowMnemonicWindow.get();
|
|
||||||
if( window != null )
|
|
||||||
repaintMnemonics( window );
|
|
||||||
|
|
||||||
lastShowMnemonicWindow = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void repaintMnemonics( Container container ) {
|
|
||||||
for( Component c : container.getComponents() ) {
|
|
||||||
if( !c.isVisible() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( hasMnemonic( c ) )
|
|
||||||
c.repaint();
|
|
||||||
|
|
||||||
if( c instanceof Container )
|
|
||||||
repaintMnemonics( (Container) c );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean hasMnemonic( Component c ) {
|
|
||||||
if( c instanceof JLabel && ((JLabel)c).getDisplayedMnemonicIndex() >= 0 )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( c instanceof AbstractButton && ((AbstractButton)c).getDisplayedMnemonicIndex() >= 0 )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( c instanceof JTabbedPane ) {
|
|
||||||
JTabbedPane tabPane = (JTabbedPane) c;
|
|
||||||
int tabCount = tabPane.getTabCount();
|
|
||||||
for( int i = 0; i < tabCount; i++ ) {
|
|
||||||
if( tabPane.getDisplayedMnemonicIndexAt( i ) >= 0 )
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return font;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class ImageIconUIResource ------------------------------------------
|
||||||
|
|
||||||
|
private static class ImageIconUIResource
|
||||||
|
extends ImageIcon
|
||||||
|
implements UIResource
|
||||||
|
{
|
||||||
|
ImageIconUIResource( Image image ) {
|
||||||
|
super( image );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Flat LaF that is able to load UI defaults from properties passed to the constructor.
|
||||||
|
* <p>
|
||||||
|
* Specify the base theme in the properties with {@code @baseTheme=<baseTheme>}.
|
||||||
|
* Allowed values for {@code <baseTheme>} are {@code light} (the default), {@code dark},
|
||||||
|
* {@code intellij} or {@code darcula}.
|
||||||
|
* <p>
|
||||||
|
* The properties are applied after loading the base theme and may overwrite base properties.
|
||||||
|
* All features of FlatLaf properties files are available.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatPropertiesLaf
|
||||||
|
extends FlatLaf
|
||||||
|
{
|
||||||
|
private final String name;
|
||||||
|
private final String baseTheme;
|
||||||
|
private final boolean dark;
|
||||||
|
private final Properties properties;
|
||||||
|
|
||||||
|
public FlatPropertiesLaf( String name, File propertiesFile )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
this( name, new FileInputStream( propertiesFile ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public FlatPropertiesLaf( String name, InputStream in )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
this( name, loadProperties( in ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Properties loadProperties( InputStream in )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
Properties properties = new Properties();
|
||||||
|
try( InputStream in2 = in ) {
|
||||||
|
properties.load( in2 );
|
||||||
|
}
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FlatPropertiesLaf( String name, Properties properties ) {
|
||||||
|
this.name = name;
|
||||||
|
this.properties = properties;
|
||||||
|
|
||||||
|
baseTheme = properties.getProperty( "@baseTheme", "light" );
|
||||||
|
dark = "dark".equalsIgnoreCase( baseTheme ) || "darcula".equalsIgnoreCase( baseTheme );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDark() {
|
||||||
|
return dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ArrayList<Class<?>> getLafClassesForDefaultsLoading() {
|
||||||
|
ArrayList<Class<?>> lafClasses = new ArrayList<>();
|
||||||
|
lafClasses.add( FlatLaf.class );
|
||||||
|
switch( baseTheme.toLowerCase() ) {
|
||||||
|
default:
|
||||||
|
case "light":
|
||||||
|
lafClasses.add( FlatLightLaf.class );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "dark":
|
||||||
|
lafClasses.add( FlatDarkLaf.class );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "intellij":
|
||||||
|
lafClasses.add( FlatLightLaf.class );
|
||||||
|
lafClasses.add( FlatIntelliJLaf.class );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "darcula":
|
||||||
|
lafClasses.add( FlatDarkLaf.class );
|
||||||
|
lafClasses.add( FlatDarculaLaf.class );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return lafClasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Properties getAdditionalDefaults() {
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -86,7 +86,7 @@ public class IntelliJTheme
|
|||||||
* Using a buffered input stream is not necessary.
|
* Using a buffered input stream is not necessary.
|
||||||
*/
|
*/
|
||||||
public static FlatLaf createLaf( InputStream in )
|
public static FlatLaf createLaf( InputStream in )
|
||||||
throws IOException, ParseException
|
throws IOException
|
||||||
{
|
{
|
||||||
return createLaf( new IntelliJTheme( in ) );
|
return createLaf( new IntelliJTheme( in ) );
|
||||||
}
|
}
|
||||||
@@ -106,11 +106,13 @@ public class IntelliJTheme
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings( "unchecked" )
|
@SuppressWarnings( "unchecked" )
|
||||||
public IntelliJTheme( InputStream in )
|
public IntelliJTheme( InputStream in )
|
||||||
throws IOException, ParseException
|
throws IOException
|
||||||
{
|
{
|
||||||
Map<String, Object> json;
|
Map<String, Object> json;
|
||||||
try( Reader reader = new InputStreamReader( in, StandardCharsets.UTF_8 ) ) {
|
try( Reader reader = new InputStreamReader( in, StandardCharsets.UTF_8 ) ) {
|
||||||
json = (Map<String, Object>) Json.parse( reader );
|
json = (Map<String, Object>) Json.parse( reader );
|
||||||
|
} catch( ParseException ex ) {
|
||||||
|
throw new IOException( ex.getMessage(), ex );
|
||||||
}
|
}
|
||||||
|
|
||||||
name = (String) json.get( "name" );
|
name = (String) json.get( "name" );
|
||||||
@@ -132,6 +134,8 @@ public class IntelliJTheme
|
|||||||
defaults.put( "Button.paintShadow", true );
|
defaults.put( "Button.paintShadow", true );
|
||||||
defaults.put( "Button.shadowWidth", dark ? 2 : 1 );
|
defaults.put( "Button.shadowWidth", dark ? 2 : 1 );
|
||||||
|
|
||||||
|
Map<Object, Object> themeSpecificDefaults = removeThemeSpecificDefaults( defaults );
|
||||||
|
|
||||||
loadNamedColors( defaults );
|
loadNamedColors( defaults );
|
||||||
|
|
||||||
// convert Json "ui" structure to UI defaults
|
// convert Json "ui" structure to UI defaults
|
||||||
@@ -183,6 +187,42 @@ public class IntelliJTheme
|
|||||||
if( !uiKeys.contains( "Spinner.background" ) )
|
if( !uiKeys.contains( "Spinner.background" ) )
|
||||||
defaults.put( "Spinner.background", textFieldBackground );
|
defaults.put( "Spinner.background", textFieldBackground );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fix ToggleButton
|
||||||
|
if( !uiKeys.contains( "ToggleButton.startBackground" ) && !uiKeys.contains( "*.startBackground" ) )
|
||||||
|
defaults.put( "ToggleButton.startBackground", defaults.get( "Button.startBackground" ) );
|
||||||
|
if( !uiKeys.contains( "ToggleButton.endBackground" ) && !uiKeys.contains( "*.endBackground" ) )
|
||||||
|
defaults.put( "ToggleButton.endBackground", defaults.get( "Button.endBackground" ) );
|
||||||
|
if( !uiKeys.contains( "ToggleButton.foreground" ) && uiKeys.contains( "Button.foreground" ) )
|
||||||
|
defaults.put( "ToggleButton.foreground", defaults.get( "Button.foreground" ) );
|
||||||
|
|
||||||
|
// limit tree row height
|
||||||
|
int rowHeight = defaults.getInt( "Tree.rowHeight" );
|
||||||
|
if( rowHeight > 22 )
|
||||||
|
defaults.put( "Tree.rowHeight", 22 );
|
||||||
|
|
||||||
|
// apply theme specific UI defaults at the end to allow overwriting
|
||||||
|
defaults.putAll( themeSpecificDefaults );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<Object, Object> removeThemeSpecificDefaults( UIDefaults defaults ) {
|
||||||
|
// search for theme specific UI defaults keys
|
||||||
|
ArrayList<String> themeSpecificKeys = new ArrayList<>();
|
||||||
|
for( Object key : defaults.keySet() ) {
|
||||||
|
if( key instanceof String && ((String)key).startsWith( "[" ) )
|
||||||
|
themeSpecificKeys.add( (String) key );
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove theme specific UI defaults and remember only those for current theme
|
||||||
|
Map<Object, Object> themeSpecificDefaults = new HashMap<>();
|
||||||
|
String currentThemePrefix = '[' + name.replace( ' ', '_' ) + ']';
|
||||||
|
for( String key : themeSpecificKeys ) {
|
||||||
|
Object value = defaults.remove( key );
|
||||||
|
if( key.startsWith( currentThemePrefix ) )
|
||||||
|
themeSpecificDefaults.put( key.substring( currentThemePrefix.length() ), value );
|
||||||
|
}
|
||||||
|
|
||||||
|
return themeSpecificDefaults;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -200,7 +240,7 @@ public class IntelliJTheme
|
|||||||
if( color != null ) {
|
if( color != null ) {
|
||||||
String key = e.getKey();
|
String key = e.getKey();
|
||||||
namedColors.put( key, color );
|
namedColors.put( key, color );
|
||||||
defaults.put( "ColorPalette." + e.getKey(), color );
|
defaults.put( "ColorPalette." + key, color );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -216,6 +256,11 @@ public class IntelliJTheme
|
|||||||
} else {
|
} else {
|
||||||
uiKeys.add( key );
|
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
|
||||||
|
|
||||||
// map keys
|
// map keys
|
||||||
key = uiKeyMapping.getOrDefault( key, key );
|
key = uiKeyMapping.getOrDefault( key, key );
|
||||||
if( key.isEmpty() )
|
if( key.isEmpty() )
|
||||||
@@ -270,7 +315,7 @@ public class IntelliJTheme
|
|||||||
// (e.g. set ComboBox.buttonEditableBackground to *.background
|
// (e.g. set ComboBox.buttonEditableBackground to *.background
|
||||||
// because it is mapped from ComboBox.ArrowButton.background)
|
// because it is mapped from ComboBox.ArrowButton.background)
|
||||||
String km = uiKeyInverseMapping.getOrDefault( k, (String) k );
|
String km = uiKeyInverseMapping.getOrDefault( k, (String) k );
|
||||||
if( km.endsWith( tail ) && !noWildcardReplace.contains( k ) && !((String)k).startsWith( "CheckBox.icon." ) )
|
if( km.endsWith( tail ) && !((String)k).startsWith( "CheckBox.icon." ) )
|
||||||
defaults.put( k, uiValue );
|
defaults.put( k, uiValue );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -412,7 +457,6 @@ public class IntelliJTheme
|
|||||||
private static Map<String, String> uiKeyInverseMapping = new HashMap<>();
|
private static Map<String, String> uiKeyInverseMapping = new HashMap<>();
|
||||||
private static Map<String, String> checkboxKeyMapping = new HashMap<>();
|
private static Map<String, String> checkboxKeyMapping = new HashMap<>();
|
||||||
private static Map<String, String> checkboxDuplicateColors = new HashMap<>();
|
private static Map<String, String> checkboxDuplicateColors = new HashMap<>();
|
||||||
private static Set<String> noWildcardReplace = new HashSet<>();
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// ComboBox
|
// ComboBox
|
||||||
@@ -470,16 +514,6 @@ public class IntelliJTheme
|
|||||||
Map.Entry<String, String>[] entries = checkboxDuplicateColors.entrySet().toArray( new Map.Entry[checkboxDuplicateColors.size()] );
|
Map.Entry<String, String>[] entries = checkboxDuplicateColors.entrySet().toArray( new Map.Entry[checkboxDuplicateColors.size()] );
|
||||||
for( Map.Entry<String, String> e : entries )
|
for( Map.Entry<String, String> e : entries )
|
||||||
checkboxDuplicateColors.put( e.getValue(), e.getKey() );
|
checkboxDuplicateColors.put( e.getValue(), e.getKey() );
|
||||||
|
|
||||||
// because FlatLaf uses Button.background and Button.borderColor,
|
|
||||||
// but IDEA uses Button.startBackground and Button.startBorderColor,
|
|
||||||
// our default button background and border colors may be replaced by
|
|
||||||
// wildcard *.background and *.borderColor colors
|
|
||||||
noWildcardReplace.add( "Button.background" );
|
|
||||||
noWildcardReplace.add( "Button.borderColor" );
|
|
||||||
noWildcardReplace.add( "Button.default.background" );
|
|
||||||
noWildcardReplace.add( "Button.default.borderColor" );
|
|
||||||
noWildcardReplace.add( "ToggleButton.background" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---- class ThemeLaf -----------------------------------------------------
|
//---- class ThemeLaf -----------------------------------------------------
|
||||||
@@ -513,19 +547,12 @@ public class IntelliJTheme
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UIDefaults getDefaults() {
|
void applyAdditionalDefaults( UIDefaults defaults ) {
|
||||||
UIDefaults defaults = super.getDefaults();
|
|
||||||
theme.applyProperties( defaults );
|
theme.applyProperties( defaults );
|
||||||
super.invokePostInitialization( defaults );
|
|
||||||
return defaults;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void invokePostInitialization( UIDefaults defaults ) {
|
protected ArrayList<Class<?>> getLafClassesForDefaultsLoading() {
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
ArrayList<Class<?>> getLafClassesForDefaultsLoading() {
|
|
||||||
ArrayList<Class<?>> lafClasses = new ArrayList<>();
|
ArrayList<Class<?>> lafClasses = new ArrayList<>();
|
||||||
lafClasses.add( FlatLaf.class );
|
lafClasses.add( FlatLaf.class );
|
||||||
lafClasses.add( theme.dark ? FlatDarkLaf.class : FlatLightLaf.class );
|
lafClasses.add( theme.dark ? FlatDarkLaf.class : FlatLightLaf.class );
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.formdev.flatlaf;
|
package com.formdev.flatlaf;
|
||||||
|
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
|
import java.awt.GraphicsConfiguration;
|
||||||
import java.awt.GraphicsEnvironment;
|
import java.awt.GraphicsEnvironment;
|
||||||
import java.awt.Toolkit;
|
import java.awt.Toolkit;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
@@ -28,9 +29,9 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.text.StyleContext;
|
|
||||||
import com.formdev.flatlaf.util.StringUtils;
|
import com.formdev.flatlaf.util.StringUtils;
|
||||||
import com.formdev.flatlaf.util.SystemInfo;
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
@@ -88,9 +89,7 @@ class LinuxFontPolicy
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static Font createFont( String family, int style, int size, double dsize ) {
|
private static Font createFont( String family, int style, int size, double dsize ) {
|
||||||
// using StyleContext.getFont() here because it uses
|
Font font = FlatLaf.createCompositeFont( family, style, size );
|
||||||
// sun.font.FontUtilities.getCompositeFontUIResource()
|
|
||||||
Font font = new StyleContext().getFont( family, style, size );
|
|
||||||
|
|
||||||
// set font size in floating points
|
// set font size in floating points
|
||||||
font = font.deriveFont( style, (float) dsize );
|
font = font.deriveFont( style, (float) dsize );
|
||||||
@@ -99,6 +98,10 @@ class LinuxFontPolicy
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static double getGnomeFontScale() {
|
private static double getGnomeFontScale() {
|
||||||
|
// do not scale font here if JRE scales
|
||||||
|
if( isSystemScaling() )
|
||||||
|
return 96. / 72.;
|
||||||
|
|
||||||
// see class com.sun.java.swing.plaf.gtk.PangoFonts background information
|
// see class com.sun.java.swing.plaf.gtk.PangoFonts background information
|
||||||
|
|
||||||
Object value = Toolkit.getDefaultToolkit().getDesktopProperty( "gnome.Xft/DPI" );
|
Object value = Toolkit.getDefaultToolkit().getDesktopProperty( "gnome.Xft/DPI" );
|
||||||
@@ -168,7 +171,7 @@ class LinuxFontPolicy
|
|||||||
|
|
||||||
// font dpi
|
// font dpi
|
||||||
int dpi = 96;
|
int dpi = 96;
|
||||||
if( forceFontDPI != null ) {
|
if( forceFontDPI != null && !isSystemScaling() ) {
|
||||||
try {
|
try {
|
||||||
dpi = Integer.parseInt( forceFontDPI );
|
dpi = Integer.parseInt( forceFontDPI );
|
||||||
if( dpi <= 0 )
|
if( dpi <= 0 )
|
||||||
@@ -247,4 +250,15 @@ class LinuxFontPolicy
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the JRE scales, which is the case if:
|
||||||
|
* - environment variable GDK_SCALE is set and running on Java 9 or later
|
||||||
|
* - running on JetBrains Runtime 11 or later and scaling is enabled in system Settings
|
||||||
|
*/
|
||||||
|
private static boolean isSystemScaling() {
|
||||||
|
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment()
|
||||||
|
.getDefaultScreenDevice().getDefaultConfiguration();
|
||||||
|
return UIScale.getSystemScaleFactor( gc ) > 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,259 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Container;
|
||||||
|
import java.awt.EventQueue;
|
||||||
|
import java.awt.KeyEventPostProcessor;
|
||||||
|
import java.awt.KeyboardFocusManager;
|
||||||
|
import java.awt.Window;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.WindowAdapter;
|
||||||
|
import java.awt.event.WindowEvent;
|
||||||
|
import java.awt.event.WindowListener;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import javax.swing.AbstractButton;
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuBar;
|
||||||
|
import javax.swing.JRootPane;
|
||||||
|
import javax.swing.JTabbedPane;
|
||||||
|
import javax.swing.MenuElement;
|
||||||
|
import javax.swing.MenuSelectionManager;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.event.ChangeEvent;
|
||||||
|
import javax.swing.event.ChangeListener;
|
||||||
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show/hide mnemonics.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
class MnemonicHandler
|
||||||
|
implements KeyEventPostProcessor, ChangeListener
|
||||||
|
{
|
||||||
|
private static boolean showMnemonics;
|
||||||
|
private static WeakReference<Window> lastShowMnemonicWindow;
|
||||||
|
private static WindowListener windowListener;
|
||||||
|
|
||||||
|
static boolean isShowMnemonics() {
|
||||||
|
return showMnemonics || !UIManager.getBoolean( "Component.hideMnemonics" );
|
||||||
|
}
|
||||||
|
|
||||||
|
void install() {
|
||||||
|
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor( this );
|
||||||
|
MenuSelectionManager.defaultManager().addChangeListener( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
void uninstall() {
|
||||||
|
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventPostProcessor( this );
|
||||||
|
MenuSelectionManager.defaultManager().removeChangeListener( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean postProcessKeyEvent( KeyEvent e ) {
|
||||||
|
int keyCode = e.getKeyCode();
|
||||||
|
if( SystemInfo.IS_MAC ) {
|
||||||
|
// Ctrl+Alt keys must be pressed on Mac
|
||||||
|
if( keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_ALT )
|
||||||
|
showMnemonics( shouldShowMnemonics( e ) && e.isControlDown() && e.isAltDown(), e.getComponent() );
|
||||||
|
} else {
|
||||||
|
// Alt key must be pressed on Windows and Linux
|
||||||
|
if( SystemInfo.IS_WINDOWS )
|
||||||
|
return processKeyEventOnWindows( e );
|
||||||
|
|
||||||
|
if( keyCode == KeyEvent.VK_ALT )
|
||||||
|
showMnemonics( shouldShowMnemonics( e ), e.getComponent() );
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean shouldShowMnemonics( KeyEvent e ) {
|
||||||
|
return e.getID() == KeyEvent.KEY_PRESSED ||
|
||||||
|
MenuSelectionManager.defaultManager().getSelectedPath().length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int altPressedEventCount;
|
||||||
|
private static boolean selectMenuOnAltReleased;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Special Alt key behavior on Windows.
|
||||||
|
*
|
||||||
|
* Press-and-release Alt key selects first menu (if available) and moves focus
|
||||||
|
* temporary to menu bar. If menu bar has focus (some menu is selected),
|
||||||
|
* pressing Alt key unselects menu and moves focus back to permanent focus owner.
|
||||||
|
*/
|
||||||
|
private boolean processKeyEventOnWindows( KeyEvent e ) {
|
||||||
|
if( e.getKeyCode() != KeyEvent.VK_ALT ) {
|
||||||
|
selectMenuOnAltReleased = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( e.getID() == KeyEvent.KEY_PRESSED ) {
|
||||||
|
altPressedEventCount++;
|
||||||
|
|
||||||
|
if( altPressedEventCount == 1 && !e.isConsumed() ) {
|
||||||
|
MenuSelectionManager menuSelectionManager = MenuSelectionManager.defaultManager();
|
||||||
|
selectMenuOnAltReleased = (menuSelectionManager.getSelectedPath().length == 0);
|
||||||
|
|
||||||
|
// if menu is selected when Alt key is pressed then clear menu selection
|
||||||
|
if( !selectMenuOnAltReleased )
|
||||||
|
menuSelectionManager.clearSelectedPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
// show mnemonics
|
||||||
|
showMnemonics( shouldShowMnemonics( e ), e.getComponent() );
|
||||||
|
|
||||||
|
// avoid that the system menu of the window gets focus
|
||||||
|
e.consume();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else if( e.getID() == KeyEvent.KEY_RELEASED ) {
|
||||||
|
altPressedEventCount = 0;
|
||||||
|
|
||||||
|
boolean mnemonicsShown = false;
|
||||||
|
if( selectMenuOnAltReleased && !e.isConsumed() ) {
|
||||||
|
MenuSelectionManager menuSelectionManager = MenuSelectionManager.defaultManager();
|
||||||
|
if( menuSelectionManager.getSelectedPath().length == 0 ) {
|
||||||
|
// get menu bar and first menu
|
||||||
|
Component c = e.getComponent();
|
||||||
|
JRootPane rootPane = SwingUtilities.getRootPane( c );
|
||||||
|
Window window = (rootPane != null) ? SwingUtilities.getWindowAncestor( rootPane ) : null;
|
||||||
|
JMenuBar menuBar = (rootPane != null) ? rootPane.getJMenuBar() : null;
|
||||||
|
if( menuBar == null && window instanceof JFrame )
|
||||||
|
menuBar = ((JFrame)window).getJMenuBar();
|
||||||
|
JMenu firstMenu = (menuBar != null) ? menuBar.getMenu( 0 ) : null;
|
||||||
|
|
||||||
|
// select first menu and show mnemonics
|
||||||
|
if( firstMenu != null ) {
|
||||||
|
menuSelectionManager.setSelectedPath( new MenuElement[] { menuBar, firstMenu } );
|
||||||
|
showMnemonics( true, c );
|
||||||
|
mnemonicsShown = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
selectMenuOnAltReleased = false;
|
||||||
|
|
||||||
|
// hide mnemonics
|
||||||
|
if( !mnemonicsShown )
|
||||||
|
showMnemonics( shouldShowMnemonics( e ), e.getComponent() );
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stateChanged( ChangeEvent e ) {
|
||||||
|
MenuElement[] selectedPath = MenuSelectionManager.defaultManager().getSelectedPath();
|
||||||
|
if( selectedPath.length == 0 && altPressedEventCount == 0 ) {
|
||||||
|
// hide mnemonics when menu selection was canceled
|
||||||
|
showMnemonics( false, null );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void showMnemonics( boolean show, Component c ) {
|
||||||
|
if( show == showMnemonics )
|
||||||
|
return;
|
||||||
|
|
||||||
|
showMnemonics = show;
|
||||||
|
|
||||||
|
// check whether it is necessary to repaint
|
||||||
|
if( !UIManager.getBoolean( "Component.hideMnemonics" ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( show ) {
|
||||||
|
// get root pane
|
||||||
|
JRootPane rootPane = SwingUtilities.getRootPane( c );
|
||||||
|
if( rootPane == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// get window
|
||||||
|
Window window = SwingUtilities.getWindowAncestor( rootPane );
|
||||||
|
if( window == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// repaint components with mnemonics in focused window
|
||||||
|
repaintMnemonics( window );
|
||||||
|
|
||||||
|
// hide mnemonics if window is deactivated (e.g. Alt+Tab to another window)
|
||||||
|
windowListener = new WindowAdapter() {
|
||||||
|
@Override
|
||||||
|
public void windowDeactivated( WindowEvent e ) {
|
||||||
|
altPressedEventCount = 0;
|
||||||
|
selectMenuOnAltReleased = false;
|
||||||
|
|
||||||
|
// use invokeLater() to avoid that the listener is removed
|
||||||
|
// while the listener queue is iterated to fire this event
|
||||||
|
EventQueue.invokeLater( () -> {
|
||||||
|
showMnemonics( false, null );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
window.addWindowListener( windowListener );
|
||||||
|
|
||||||
|
lastShowMnemonicWindow = new WeakReference<>( window );
|
||||||
|
} else if( lastShowMnemonicWindow != null ) {
|
||||||
|
Window window = lastShowMnemonicWindow.get();
|
||||||
|
if( window != null ) {
|
||||||
|
repaintMnemonics( window );
|
||||||
|
|
||||||
|
if( windowListener != null ) {
|
||||||
|
window.removeWindowListener( windowListener );
|
||||||
|
windowListener = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lastShowMnemonicWindow = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void repaintMnemonics( Container container ) {
|
||||||
|
for( Component c : container.getComponents() ) {
|
||||||
|
if( !c.isVisible() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( hasMnemonic( c ) )
|
||||||
|
c.repaint();
|
||||||
|
|
||||||
|
if( c instanceof Container )
|
||||||
|
repaintMnemonics( (Container) c );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean hasMnemonic( Component c ) {
|
||||||
|
if( c instanceof JLabel && ((JLabel)c).getDisplayedMnemonicIndex() >= 0 )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if( c instanceof AbstractButton && ((AbstractButton)c).getDisplayedMnemonicIndex() >= 0 )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if( c instanceof JTabbedPane ) {
|
||||||
|
JTabbedPane tabPane = (JTabbedPane) c;
|
||||||
|
int tabCount = tabPane.getTabCount();
|
||||||
|
for( int i = 0; i < tabCount; i++ ) {
|
||||||
|
if( tabPane.getDisplayedMnemonicIndexAt( i ) >= 0 )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,7 +28,6 @@ import java.util.List;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.ServiceLoader;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.UIDefaults;
|
import javax.swing.UIDefaults;
|
||||||
@@ -42,6 +41,7 @@ import com.formdev.flatlaf.ui.FlatEmptyBorder;
|
|||||||
import com.formdev.flatlaf.ui.FlatLineBorder;
|
import com.formdev.flatlaf.ui.FlatLineBorder;
|
||||||
import com.formdev.flatlaf.util.ColorFunctions;
|
import com.formdev.flatlaf.util.ColorFunctions;
|
||||||
import com.formdev.flatlaf.util.DerivedColor;
|
import com.formdev.flatlaf.util.DerivedColor;
|
||||||
|
import com.formdev.flatlaf.util.GrayFilter;
|
||||||
import com.formdev.flatlaf.util.HSLColor;
|
import com.formdev.flatlaf.util.HSLColor;
|
||||||
import com.formdev.flatlaf.util.StringUtils;
|
import com.formdev.flatlaf.util.StringUtils;
|
||||||
import com.formdev.flatlaf.util.SystemInfo;
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
@@ -63,13 +63,13 @@ class UIDefaultsLoader
|
|||||||
private static final String TYPE_PREFIX = "{";
|
private static final String TYPE_PREFIX = "{";
|
||||||
private static final String TYPE_PREFIX_END = "}";
|
private static final String TYPE_PREFIX_END = "}";
|
||||||
private static final String VARIABLE_PREFIX = "@";
|
private static final String VARIABLE_PREFIX = "@";
|
||||||
@Deprecated
|
|
||||||
private static final String REF_PREFIX = VARIABLE_PREFIX + "@";
|
|
||||||
private static final String PROPERTY_PREFIX = "$";
|
private static final String PROPERTY_PREFIX = "$";
|
||||||
private static final String OPTIONAL_PREFIX = "?";
|
private static final String OPTIONAL_PREFIX = "?";
|
||||||
private static final String GLOBAL_PREFIX = "*.";
|
private static final String GLOBAL_PREFIX = "*.";
|
||||||
|
|
||||||
static void loadDefaultsFromProperties( Class<?> lookAndFeelClass, UIDefaults defaults ) {
|
static void loadDefaultsFromProperties( Class<?> lookAndFeelClass, List<FlatDefaultsAddon> addons,
|
||||||
|
Properties additionalDefaults, boolean dark, UIDefaults defaults )
|
||||||
|
{
|
||||||
// determine classes in class hierarchy in reverse order
|
// determine classes in class hierarchy in reverse order
|
||||||
ArrayList<Class<?>> lafClasses = new ArrayList<>();
|
ArrayList<Class<?>> lafClasses = new ArrayList<>();
|
||||||
for( Class<?> lafClass = lookAndFeelClass;
|
for( Class<?> lafClass = lookAndFeelClass;
|
||||||
@@ -79,10 +79,12 @@ class UIDefaultsLoader
|
|||||||
lafClasses.add( 0, lafClass );
|
lafClasses.add( 0, lafClass );
|
||||||
}
|
}
|
||||||
|
|
||||||
loadDefaultsFromProperties( lafClasses, defaults );
|
loadDefaultsFromProperties( lafClasses, addons, additionalDefaults, dark, defaults );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loadDefaultsFromProperties( List<Class<?>> lafClasses, UIDefaults defaults ) {
|
static void loadDefaultsFromProperties( List<Class<?>> lafClasses, List<FlatDefaultsAddon> addons,
|
||||||
|
Properties additionalDefaults, boolean dark, UIDefaults defaults )
|
||||||
|
{
|
||||||
try {
|
try {
|
||||||
// load core properties files
|
// load core properties files
|
||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
@@ -94,15 +96,8 @@ class UIDefaultsLoader
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// get addons and sort them by priority
|
|
||||||
ServiceLoader<FlatDefaultsAddon> addonLoader = ServiceLoader.load( FlatDefaultsAddon.class );
|
|
||||||
List<FlatDefaultsAddon> addonList = new ArrayList<>();
|
|
||||||
for( FlatDefaultsAddon addon : addonLoader )
|
|
||||||
addonList.add( addon );
|
|
||||||
addonList.sort( (addon1, addon2) -> addon1.getPriority() - addon2.getPriority() );
|
|
||||||
|
|
||||||
// load properties from addons
|
// load properties from addons
|
||||||
for( FlatDefaultsAddon addon : addonList ) {
|
for( FlatDefaultsAddon addon : addons ) {
|
||||||
for( Class<?> lafClass : lafClasses ) {
|
for( Class<?> lafClass : lafClasses ) {
|
||||||
try( InputStream in = addon.getDefaults( lafClass ) ) {
|
try( InputStream in = addon.getDefaults( lafClass ) ) {
|
||||||
if( in != null )
|
if( in != null )
|
||||||
@@ -113,22 +108,40 @@ class UIDefaultsLoader
|
|||||||
|
|
||||||
// collect addon class loaders
|
// collect addon class loaders
|
||||||
List<ClassLoader> addonClassLoaders = new ArrayList<>();
|
List<ClassLoader> addonClassLoaders = new ArrayList<>();
|
||||||
for( FlatDefaultsAddon addon : addonList ) {
|
for( FlatDefaultsAddon addon : addons ) {
|
||||||
ClassLoader addonClassLoader = addon.getClass().getClassLoader();
|
ClassLoader addonClassLoader = addon.getClass().getClassLoader();
|
||||||
if( !addonClassLoaders.contains( addonClassLoader ) )
|
if( !addonClassLoaders.contains( addonClassLoader ) )
|
||||||
addonClassLoaders.add( addonClassLoader );
|
addonClassLoaders.add( addonClassLoader );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add additional defaults
|
||||||
|
if( additionalDefaults != null )
|
||||||
|
properties.putAll( additionalDefaults );
|
||||||
|
|
||||||
// collect all platform specific keys (but do not modify properties)
|
// collect all platform specific keys (but do not modify properties)
|
||||||
ArrayList<String> platformSpecificKeys = new ArrayList<>();
|
ArrayList<String> platformSpecificKeys = new ArrayList<>();
|
||||||
for( Object key : properties.keySet() ) {
|
for( Object okey : properties.keySet() ) {
|
||||||
if( ((String)key).startsWith( "[" ) )
|
String key = (String) okey;
|
||||||
platformSpecificKeys.add( (String) key );
|
if( key.startsWith( "[" ) &&
|
||||||
|
(key.startsWith( "[win]" ) ||
|
||||||
|
key.startsWith( "[mac]" ) ||
|
||||||
|
key.startsWith( "[linux]" ) ||
|
||||||
|
key.startsWith( "[light]" ) ||
|
||||||
|
key.startsWith( "[dark]" )) )
|
||||||
|
platformSpecificKeys.add( key );
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove platform specific properties and re-add only properties
|
// remove platform specific properties and re-add only properties
|
||||||
// for current platform, but with platform prefix removed
|
// for current platform, but with platform prefix removed
|
||||||
if( !platformSpecificKeys.isEmpty() ) {
|
if( !platformSpecificKeys.isEmpty() ) {
|
||||||
|
// handle light/dark specific properties
|
||||||
|
String lightOrDarkPrefix = dark ? "[dark]" : "[light]";
|
||||||
|
for( String key : platformSpecificKeys ) {
|
||||||
|
if( key.startsWith( lightOrDarkPrefix ) )
|
||||||
|
properties.put( key.substring( lightOrDarkPrefix.length() ), properties.remove( key ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle platform specific properties
|
||||||
String platformPrefix =
|
String platformPrefix =
|
||||||
SystemInfo.IS_WINDOWS ? "[win]" :
|
SystemInfo.IS_WINDOWS ? "[win]" :
|
||||||
SystemInfo.IS_MAC ? "[mac]" :
|
SystemInfo.IS_MAC ? "[mac]" :
|
||||||
@@ -198,12 +211,6 @@ class UIDefaultsLoader
|
|||||||
else if( !value.startsWith( VARIABLE_PREFIX ) )
|
else if( !value.startsWith( VARIABLE_PREFIX ) )
|
||||||
return value;
|
return value;
|
||||||
|
|
||||||
// for compatibility
|
|
||||||
if( value.startsWith( REF_PREFIX ) ) {
|
|
||||||
FlatLaf.LOG.log( Level.WARNING, "FlatLaf: Usage of '@@' in .properties files is deprecated. Use '$' instead." );
|
|
||||||
value = value.substring( REF_PREFIX.length() );
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean optional = false;
|
boolean optional = false;
|
||||||
if( value.startsWith( OPTIONAL_PREFIX ) ) {
|
if( value.startsWith( OPTIONAL_PREFIX ) ) {
|
||||||
value = value.substring( OPTIONAL_PREFIX.length() );
|
value = value.substring( OPTIONAL_PREFIX.length() );
|
||||||
@@ -222,7 +229,7 @@ class UIDefaultsLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
private enum ValueType { UNKNOWN, STRING, CHARACTER, INTEGER, FLOAT, BORDER, ICON, INSETS, DIMENSION, COLOR,
|
private enum ValueType { UNKNOWN, STRING, CHARACTER, INTEGER, FLOAT, BORDER, ICON, INSETS, DIMENSION, COLOR,
|
||||||
SCALEDINTEGER, SCALEDFLOAT, SCALEDINSETS, SCALEDDIMENSION, INSTANCE, CLASS }
|
SCALEDINTEGER, SCALEDFLOAT, SCALEDINSETS, SCALEDDIMENSION, INSTANCE, CLASS, GRAYFILTER }
|
||||||
|
|
||||||
static Object parseValue( String key, String value ) {
|
static Object parseValue( String key, String value ) {
|
||||||
return parseValue( key, value, v -> v, Collections.emptyList() );
|
return parseValue( key, value, v -> v, Collections.emptyList() );
|
||||||
@@ -289,6 +296,8 @@ class UIDefaultsLoader
|
|||||||
valueType = ValueType.CHARACTER;
|
valueType = ValueType.CHARACTER;
|
||||||
else if( key.endsWith( "UI" ) )
|
else if( key.endsWith( "UI" ) )
|
||||||
valueType = ValueType.STRING;
|
valueType = ValueType.STRING;
|
||||||
|
else if( key.endsWith( "grayFilter" ) )
|
||||||
|
valueType = ValueType.GRAYFILTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse value
|
// parse value
|
||||||
@@ -308,6 +317,7 @@ class UIDefaultsLoader
|
|||||||
case SCALEDDIMENSION:return parseScaledDimension( value );
|
case SCALEDDIMENSION:return parseScaledDimension( value );
|
||||||
case INSTANCE: return parseInstance( value, addonClassLoaders );
|
case INSTANCE: return parseInstance( value, addonClassLoaders );
|
||||||
case CLASS: return parseClass( value, addonClassLoaders );
|
case CLASS: return parseClass( value, addonClassLoaders );
|
||||||
|
case GRAYFILTER: return parseGrayFilter( value );
|
||||||
case UNKNOWN:
|
case UNKNOWN:
|
||||||
default:
|
default:
|
||||||
// colors
|
// colors
|
||||||
@@ -332,16 +342,17 @@ class UIDefaultsLoader
|
|||||||
|
|
||||||
private static Object parseBorder( String value, Function<String, String> resolver, List<ClassLoader> addonClassLoaders ) {
|
private static Object parseBorder( String value, Function<String, String> resolver, List<ClassLoader> addonClassLoaders ) {
|
||||||
if( value.indexOf( ',' ) >= 0 ) {
|
if( value.indexOf( ',' ) >= 0 ) {
|
||||||
// top,left,bottom,right[,lineColor]
|
// top,left,bottom,right[,lineColor[,lineThickness]]
|
||||||
List<String> parts = split( value, ',' );
|
List<String> parts = split( value, ',' );
|
||||||
Insets insets = parseInsets( value );
|
Insets insets = parseInsets( value );
|
||||||
ColorUIResource lineColor = (parts.size() == 5)
|
ColorUIResource lineColor = (parts.size() >= 5)
|
||||||
? (ColorUIResource) parseColorOrFunction( resolver.apply( parts.get( 4 ) ), resolver, true )
|
? (ColorUIResource) parseColorOrFunction( resolver.apply( parts.get( 4 ) ), resolver, true )
|
||||||
: null;
|
: null;
|
||||||
|
float lineThickness = (parts.size() >= 6) ? parseFloat( parts.get( 5 ), true ) : 1f;
|
||||||
|
|
||||||
return (LazyValue) t -> {
|
return (LazyValue) t -> {
|
||||||
return (lineColor != null)
|
return (lineColor != null)
|
||||||
? new FlatLineBorder( insets, lineColor )
|
? new FlatLineBorder( insets, lineColor, lineThickness )
|
||||||
: new FlatEmptyBorder( insets );
|
: new FlatEmptyBorder( insets );
|
||||||
};
|
};
|
||||||
} else
|
} else
|
||||||
@@ -496,8 +507,8 @@ class UIDefaultsLoader
|
|||||||
throw new IllegalArgumentException( "missing parameters in function '" + value + "'" );
|
throw new IllegalArgumentException( "missing parameters in function '" + value + "'" );
|
||||||
|
|
||||||
switch( function ) {
|
switch( function ) {
|
||||||
case "rgb": return parseColorRgbOrRgba( false, params );
|
case "rgb": return parseColorRgbOrRgba( false, params, resolver, reportError );
|
||||||
case "rgba": return parseColorRgbOrRgba( true, params );
|
case "rgba": return parseColorRgbOrRgba( true, params, resolver, reportError );
|
||||||
case "hsl": return parseColorHslOrHsla( false, params );
|
case "hsl": return parseColorHslOrHsla( false, params );
|
||||||
case "hsla": return parseColorHslOrHsla( true, params );
|
case "hsla": return parseColorHslOrHsla( true, params );
|
||||||
case "lighten": return parseColorLightenOrDarken( true, params, resolver, reportError );
|
case "lighten": return parseColorLightenOrDarken( true, params, resolver, reportError );
|
||||||
@@ -508,17 +519,28 @@ class UIDefaultsLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Syntax: rgb(red,green,blue) or rgba(red,green,blue,alpha)
|
* Syntax: rgb(red,green,blue) or rgba(red,green,blue,alpha) or rgba(color,alpha)
|
||||||
* - red: an integer 0-255
|
* - red: an integer 0-255 or a percentage 0-100%
|
||||||
* - green: an integer 0-255
|
* - green: an integer 0-255 or a percentage 0-100%
|
||||||
* - blue: an integer 0-255
|
* - blue: an integer 0-255 or a percentage 0-100%
|
||||||
* - alpha: an integer 0-255
|
* - alpha: an integer 0-255 or a percentage 0-100%
|
||||||
*/
|
*/
|
||||||
private static ColorUIResource parseColorRgbOrRgba( boolean hasAlpha, List<String> params ) {
|
private static ColorUIResource parseColorRgbOrRgba( boolean hasAlpha, List<String> params,
|
||||||
int red = parseInteger( params.get( 0 ), 0, 255 );
|
Function<String, String> resolver, boolean reportError )
|
||||||
int green = parseInteger( params.get( 1 ), 0, 255 );
|
{
|
||||||
int blue = parseInteger( params.get( 2 ), 0, 255 );
|
if( hasAlpha && params.size() == 2 ) {
|
||||||
int alpha = hasAlpha ? parseInteger( params.get( 3 ), 0, 255 ) : 255;
|
// syntax rgba(color,alpha), which allows adding alpha to any color
|
||||||
|
String colorStr = params.get( 0 );
|
||||||
|
int alpha = parseInteger( params.get( 1 ), 0, 255, true );
|
||||||
|
|
||||||
|
ColorUIResource color = (ColorUIResource) parseColorOrFunction( resolver.apply( colorStr ), resolver, reportError );
|
||||||
|
return new ColorUIResource( new Color( ((alpha & 0xff) << 24) | (color.getRGB() & 0xffffff), true ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int red = parseInteger( params.get( 0 ), 0, 255, true );
|
||||||
|
int green = parseInteger( params.get( 1 ), 0, 255, true );
|
||||||
|
int blue = parseInteger( params.get( 2 ), 0, 255, true );
|
||||||
|
int alpha = hasAlpha ? parseInteger( params.get( 3 ), 0, 255, true ) : 255;
|
||||||
|
|
||||||
return hasAlpha
|
return hasAlpha
|
||||||
? new ColorUIResource( new Color( red, green, blue, alpha ) )
|
? new ColorUIResource( new Color( red, green, blue, alpha ) )
|
||||||
@@ -533,7 +555,7 @@ class UIDefaultsLoader
|
|||||||
* - alpha: a percentage 0-100%
|
* - alpha: a percentage 0-100%
|
||||||
*/
|
*/
|
||||||
private static ColorUIResource parseColorHslOrHsla( boolean hasAlpha, List<String> params ) {
|
private static ColorUIResource parseColorHslOrHsla( boolean hasAlpha, List<String> params ) {
|
||||||
int hue = parseInteger( params.get( 0 ), 0, 360 );
|
int hue = parseInteger( params.get( 0 ), 0, 360, false );
|
||||||
int saturation = parsePercentage( params.get( 1 ) );
|
int saturation = parsePercentage( params.get( 1 ) );
|
||||||
int lightness = parsePercentage( params.get( 2 ) );
|
int lightness = parsePercentage( params.get( 2 ) );
|
||||||
int alpha = hasAlpha ? parsePercentage( params.get( 3 ) ) : 100;
|
int alpha = hasAlpha ? parsePercentage( params.get( 3 ) ) : 100;
|
||||||
@@ -543,35 +565,37 @@ class UIDefaultsLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Syntax: lighten([color,]amount[,options]) or darken([color,]amount[,options])
|
* Syntax: lighten(color,amount[,options]) or darken(color,amount[,options])
|
||||||
* - color: a color (e.g. #f00) or a color function
|
* - color: a color (e.g. #f00) or a color function
|
||||||
* - amount: percentage 0-100%
|
* - amount: percentage 0-100%
|
||||||
* - options: [relative] [autoInverse] [lazy]
|
* - options: [relative] [autoInverse] [lazy] [derived]
|
||||||
*/
|
*/
|
||||||
private static Object parseColorLightenOrDarken( boolean lighten, List<String> params,
|
private static Object parseColorLightenOrDarken( boolean lighten, List<String> params,
|
||||||
Function<String, String> resolver, boolean reportError )
|
Function<String, String> resolver, boolean reportError )
|
||||||
{
|
{
|
||||||
boolean isDerived = params.get( 0 ).endsWith( "%" );
|
String colorStr = params.get( 0 );
|
||||||
String colorStr = isDerived ? null : params.get( 0 );
|
int amount = parsePercentage( params.get( 1 ) );
|
||||||
int nextParam = isDerived ? 0 : 1;
|
|
||||||
int amount = parsePercentage( params.get( nextParam++ ) );
|
|
||||||
boolean relative = false;
|
boolean relative = false;
|
||||||
boolean autoInverse = false;
|
boolean autoInverse = false;
|
||||||
boolean lazy = false;
|
boolean lazy = false;
|
||||||
|
boolean derived = false;
|
||||||
|
|
||||||
if( params.size() > nextParam ) {
|
if( params.size() > 2 ) {
|
||||||
String options = params.get( nextParam++ );
|
String options = params.get( 2 );
|
||||||
relative = options.contains( "relative" );
|
relative = options.contains( "relative" );
|
||||||
autoInverse = options.contains( "autoInverse" );
|
autoInverse = options.contains( "autoInverse" );
|
||||||
lazy = options.contains( "lazy" );
|
lazy = options.contains( "lazy" );
|
||||||
|
derived = options.contains( "derived" );
|
||||||
}
|
}
|
||||||
|
|
||||||
ColorFunctions.ColorFunction function = lighten
|
ColorFunctions.ColorFunction function = lighten
|
||||||
? new ColorFunctions.Lighten( amount, relative, autoInverse )
|
? new ColorFunctions.Lighten( amount, relative, autoInverse )
|
||||||
: new ColorFunctions.Darken( amount, relative, autoInverse );
|
: new ColorFunctions.Darken( amount, relative, autoInverse );
|
||||||
|
|
||||||
if( isDerived )
|
if( derived ) {
|
||||||
return new DerivedColor( function );
|
ColorUIResource color = (ColorUIResource) parseColorOrFunction( resolver.apply( colorStr ), resolver, reportError );
|
||||||
|
return new DerivedColor( ColorFunctions.applyFunctions( color, function ), function );
|
||||||
|
}
|
||||||
|
|
||||||
if( lazy ) {
|
if( lazy ) {
|
||||||
return (LazyValue) t -> {
|
return (LazyValue) t -> {
|
||||||
@@ -608,7 +632,12 @@ class UIDefaultsLoader
|
|||||||
return value.charAt( 0 );
|
return value.charAt( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Integer parseInteger( String value, int min, int max ) {
|
private static Integer parseInteger( String value, int min, int max, boolean allowPercentage ) {
|
||||||
|
if( allowPercentage && value.endsWith( "%" ) ) {
|
||||||
|
int percent = parsePercentage( value );
|
||||||
|
return (max * percent) / 100;
|
||||||
|
}
|
||||||
|
|
||||||
Integer integer = parseInteger( value, true );
|
Integer integer = parseInteger( value, true );
|
||||||
if( integer.intValue() < min || integer.intValue() > max )
|
if( integer.intValue() < min || integer.intValue() > max )
|
||||||
throw new NumberFormatException( "integer '" + value + "' out of range (" + min + '-' + max + ')' );
|
throw new NumberFormatException( "integer '" + value + "' out of range (" + min + '-' + max + ')' );
|
||||||
@@ -663,6 +692,21 @@ class UIDefaultsLoader
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Object parseGrayFilter( String value ) {
|
||||||
|
List<String> numbers = split( value, ',' );
|
||||||
|
try {
|
||||||
|
int brightness = Integer.parseInt( numbers.get( 0 ) );
|
||||||
|
int contrast = Integer.parseInt( numbers.get( 1 ) );
|
||||||
|
int alpha = Integer.parseInt( numbers.get( 2 ) );
|
||||||
|
|
||||||
|
return (LazyValue) t -> {
|
||||||
|
return new GrayFilter( brightness, contrast, alpha );
|
||||||
|
};
|
||||||
|
} catch( NumberFormatException ex ) {
|
||||||
|
throw new IllegalArgumentException( "invalid gray filter '" + value + "'" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Split string and trim parts.
|
* Split string and trim parts.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ public class FlatCheckBoxIcon
|
|||||||
boolean selected = indeterminate || (c instanceof AbstractButton && ((AbstractButton)c).isSelected());
|
boolean selected = indeterminate || (c instanceof AbstractButton && ((AbstractButton)c).isSelected());
|
||||||
|
|
||||||
// paint focused border
|
// paint focused border
|
||||||
if( c.hasFocus() && focusWidth > 0 ) {
|
if( FlatUIUtils.isPermanentFocusOwner( c ) && focusWidth > 0 ) {
|
||||||
g2.setColor( focusColor );
|
g2.setColor( focusColor );
|
||||||
paintFocusBorder( g2 );
|
paintFocusBorder( g2 );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,8 @@ import javax.swing.UIManager;
|
|||||||
*
|
*
|
||||||
* @uiDefault MenuItemCheckBox.icon.checkmarkColor Color
|
* @uiDefault MenuItemCheckBox.icon.checkmarkColor Color
|
||||||
* @uiDefault MenuItemCheckBox.icon.disabledCheckmarkColor Color
|
* @uiDefault MenuItemCheckBox.icon.disabledCheckmarkColor Color
|
||||||
* @uiDefault Menu.selectionForeground Color
|
* @uiDefault MenuItem.selectionForeground Color
|
||||||
|
* @uiDefault MenuItem.selectionType String
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
@@ -39,7 +40,7 @@ public class FlatCheckBoxMenuItemIcon
|
|||||||
{
|
{
|
||||||
protected final Color checkmarkColor = UIManager.getColor( "MenuItemCheckBox.icon.checkmarkColor" );
|
protected final Color checkmarkColor = UIManager.getColor( "MenuItemCheckBox.icon.checkmarkColor" );
|
||||||
protected final Color disabledCheckmarkColor = UIManager.getColor( "MenuItemCheckBox.icon.disabledCheckmarkColor" );
|
protected final Color disabledCheckmarkColor = UIManager.getColor( "MenuItemCheckBox.icon.disabledCheckmarkColor" );
|
||||||
protected final Color selectionForeground = UIManager.getColor( "Menu.selectionForeground" );
|
protected final Color selectionForeground = UIManager.getColor( "MenuItem.selectionForeground" );
|
||||||
|
|
||||||
public FlatCheckBoxMenuItemIcon() {
|
public FlatCheckBoxMenuItemIcon() {
|
||||||
super( 15, 15, null );
|
super( 15, 15, null );
|
||||||
@@ -67,9 +68,14 @@ public class FlatCheckBoxMenuItemIcon
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Color getCheckmarkColor( Component c ) {
|
private Color getCheckmarkColor( Component c ) {
|
||||||
if( c instanceof JMenuItem && ((JMenuItem)c).isArmed() )
|
if( c instanceof JMenuItem && ((JMenuItem)c).isArmed() && !isUnderlineSelection() )
|
||||||
return selectionForeground;
|
return selectionForeground;
|
||||||
|
|
||||||
return c.isEnabled() ? checkmarkColor : disabledCheckmarkColor;
|
return c.isEnabled() ? checkmarkColor : disabledCheckmarkColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isUnderlineSelection() {
|
||||||
|
// not storing value of "MenuItem.selectionType" in class to allow changing at runtime
|
||||||
|
return "underline".equals( UIManager.getString( "MenuItem.selectionType" ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public class FlatHelpButtonIcon
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
boolean enabled = c.isEnabled();
|
boolean enabled = c.isEnabled();
|
||||||
boolean focused = c.hasFocus();
|
boolean focused = FlatUIUtils.isPermanentFocusOwner( c );
|
||||||
|
|
||||||
// paint focused border
|
// paint focused border
|
||||||
if( focused ) {
|
if( focused ) {
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import com.formdev.flatlaf.ui.FlatUIUtils;
|
|||||||
* @uiDefault Menu.icon.arrowColor Color
|
* @uiDefault Menu.icon.arrowColor Color
|
||||||
* @uiDefault Menu.icon.disabledArrowColor Color
|
* @uiDefault Menu.icon.disabledArrowColor Color
|
||||||
* @uiDefault Menu.selectionForeground Color
|
* @uiDefault Menu.selectionForeground Color
|
||||||
|
* @uiDefault MenuItem.selectionType String
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
@@ -65,9 +66,14 @@ public class FlatMenuArrowIcon
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Color getArrowColor( Component c ) {
|
private Color getArrowColor( Component c ) {
|
||||||
if( c instanceof JMenu && ((JMenu)c).isSelected() )
|
if( c instanceof JMenu && ((JMenu)c).isSelected() && !isUnderlineSelection() )
|
||||||
return selectionForeground;
|
return selectionForeground;
|
||||||
|
|
||||||
return c.isEnabled() ? arrowColor : disabledArrowColor;
|
return c.isEnabled() ? arrowColor : disabledArrowColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isUnderlineSelection() {
|
||||||
|
// not storing value of "MenuItem.selectionType" in class to allow changing at runtime
|
||||||
|
return "underline".equals( UIManager.getString( "MenuItem.selectionType" ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ public class FlatBorder
|
|||||||
JViewport viewport = ((JScrollPane)c).getViewport();
|
JViewport viewport = ((JScrollPane)c).getViewport();
|
||||||
Component view = (viewport != null) ? viewport.getView() : null;
|
Component view = (viewport != null) ? viewport.getView() : null;
|
||||||
if( view != null ) {
|
if( view != null ) {
|
||||||
if( view.hasFocus() )
|
if( FlatUIUtils.isPermanentFocusOwner( view ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if( (view instanceof JTable && ((JTable)view).isEditing()) ||
|
if( (view instanceof JTable && ((JTable)view).isEditing()) ||
|
||||||
@@ -133,17 +133,17 @@ public class FlatBorder
|
|||||||
return false;
|
return false;
|
||||||
} else if( c instanceof JComboBox && ((JComboBox<?>)c).isEditable() ) {
|
} else if( c instanceof JComboBox && ((JComboBox<?>)c).isEditable() ) {
|
||||||
Component editorComponent = ((JComboBox<?>)c).getEditor().getEditorComponent();
|
Component editorComponent = ((JComboBox<?>)c).getEditor().getEditorComponent();
|
||||||
return (editorComponent != null) ? editorComponent.hasFocus() : false;
|
return (editorComponent != null) ? FlatUIUtils.isPermanentFocusOwner( editorComponent ) : false;
|
||||||
} else if( c instanceof JSpinner ) {
|
} else if( c instanceof JSpinner ) {
|
||||||
JComponent editor = ((JSpinner)c).getEditor();
|
JComponent editor = ((JSpinner)c).getEditor();
|
||||||
if( editor instanceof JSpinner.DefaultEditor ) {
|
if( editor instanceof JSpinner.DefaultEditor ) {
|
||||||
JTextField textField = ((JSpinner.DefaultEditor)editor).getTextField();
|
JTextField textField = ((JSpinner.DefaultEditor)editor).getTextField();
|
||||||
if( textField != null )
|
if( textField != null )
|
||||||
return textField.hasFocus();
|
return FlatUIUtils.isPermanentFocusOwner( textField );
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} else
|
} else
|
||||||
return c.hasFocus();
|
return FlatUIUtils.isPermanentFocusOwner( c );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isTableCellEditor( Component c ) {
|
protected boolean isTableCellEditor( Component c ) {
|
||||||
|
|||||||
@@ -294,7 +294,9 @@ public class FlatButtonUI
|
|||||||
|
|
||||||
// paint shadow
|
// paint shadow
|
||||||
Color shadowColor = def ? defaultShadowColor : this.shadowColor;
|
Color shadowColor = def ? defaultShadowColor : this.shadowColor;
|
||||||
if( !isToolBarButton && shadowColor != null && shadowWidth > 0 && focusWidth > 0 && !c.hasFocus() && c.isEnabled() ) {
|
if( !isToolBarButton && shadowColor != null && shadowWidth > 0 && focusWidth > 0 &&
|
||||||
|
!FlatUIUtils.isPermanentFocusOwner( c ) && c.isEnabled() )
|
||||||
|
{
|
||||||
g2.setColor( shadowColor );
|
g2.setColor( shadowColor );
|
||||||
g2.fill( new RoundRectangle2D.Float( focusWidth, focusWidth + UIScale.scale( (float) shadowWidth ),
|
g2.fill( new RoundRectangle2D.Float( focusWidth, focusWidth + UIScale.scale( (float) shadowWidth ),
|
||||||
width - focusWidth * 2, height - focusWidth * 2, arc, arc ) );
|
width - focusWidth * 2, height - focusWidth * 2, arc, arc ) );
|
||||||
@@ -382,7 +384,7 @@ public class FlatButtonUI
|
|||||||
if( hoverColor != null && b != null && b.getModel().isRollover() )
|
if( hoverColor != null && b != null && b.getModel().isRollover() )
|
||||||
return hoverColor;
|
return hoverColor;
|
||||||
|
|
||||||
if( focusedColor != null && c.hasFocus() )
|
if( focusedColor != null && FlatUIUtils.isPermanentFocusOwner( c ) )
|
||||||
return focusedColor;
|
return focusedColor;
|
||||||
|
|
||||||
return enabledColor;
|
return enabledColor;
|
||||||
|
|||||||
@@ -16,12 +16,11 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Rectangle;
|
import javax.swing.Icon;
|
||||||
import java.beans.PropertyChangeListener;
|
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JMenuItem;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicCheckBoxMenuItemUI;
|
import javax.swing.plaf.basic.BasicCheckBoxMenuItemUI;
|
||||||
|
|
||||||
@@ -30,29 +29,34 @@ import javax.swing.plaf.basic.BasicCheckBoxMenuItemUI;
|
|||||||
*
|
*
|
||||||
* <!-- BasicCheckBoxMenuItemUI -->
|
* <!-- BasicCheckBoxMenuItemUI -->
|
||||||
*
|
*
|
||||||
* @uiDefault CheckBoxMenuItem.font Font
|
* @uiDefault CheckBoxMenuItem.font Font
|
||||||
* @uiDefault CheckBoxMenuItem.background Color
|
* @uiDefault CheckBoxMenuItem.background Color
|
||||||
* @uiDefault CheckBoxMenuItem.foreground Color
|
* @uiDefault CheckBoxMenuItem.foreground Color
|
||||||
* @uiDefault CheckBoxMenuItem.disabledForeground Color
|
* @uiDefault CheckBoxMenuItem.disabledForeground Color
|
||||||
* @uiDefault CheckBoxMenuItem.selectionBackground Color
|
* @uiDefault CheckBoxMenuItem.selectionBackground Color
|
||||||
* @uiDefault CheckBoxMenuItem.selectionForeground Color
|
* @uiDefault CheckBoxMenuItem.selectionForeground Color
|
||||||
* @uiDefault CheckBoxMenuItem.acceleratorForeground Color
|
* @uiDefault CheckBoxMenuItem.acceleratorForeground Color
|
||||||
* @uiDefault CheckBoxMenuItem.acceleratorSelectionForeground Color
|
* @uiDefault CheckBoxMenuItem.acceleratorSelectionForeground Color
|
||||||
* @uiDefault MenuItem.acceleratorFont Font defaults to MenuItem.font
|
* @uiDefault MenuItem.acceleratorFont Font defaults to MenuItem.font
|
||||||
* @uiDefault MenuItem.acceleratorDelimiter String
|
* @uiDefault MenuItem.acceleratorDelimiter String
|
||||||
* @uiDefault CheckBoxMenuItem.border Border
|
* @uiDefault CheckBoxMenuItem.border Border
|
||||||
* @uiDefault CheckBoxMenuItem.borderPainted boolean
|
* @uiDefault CheckBoxMenuItem.borderPainted boolean
|
||||||
* @uiDefault CheckBoxMenuItem.margin Insets
|
* @uiDefault CheckBoxMenuItem.margin Insets
|
||||||
* @uiDefault CheckBoxMenuItem.arrowIcon Icon
|
* @uiDefault CheckBoxMenuItem.arrowIcon Icon
|
||||||
* @uiDefault CheckBoxMenuItem.checkIcon Icon
|
* @uiDefault CheckBoxMenuItem.checkIcon Icon
|
||||||
* @uiDefault CheckBoxMenuItem.opaque boolean
|
* @uiDefault CheckBoxMenuItem.opaque boolean
|
||||||
* @uiDefault CheckBoxMenuItem.evenHeight boolean
|
*
|
||||||
|
* <!-- FlatCheckBoxMenuItemUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault MenuItem.iconTextGap int
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatCheckBoxMenuItemUI
|
public class FlatCheckBoxMenuItemUI
|
||||||
extends BasicCheckBoxMenuItemUI
|
extends BasicCheckBoxMenuItemUI
|
||||||
{
|
{
|
||||||
|
private FlatMenuItemRenderer renderer;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatCheckBoxMenuItemUI();
|
return new FlatCheckBoxMenuItemUI();
|
||||||
}
|
}
|
||||||
@@ -61,25 +65,30 @@ public class FlatCheckBoxMenuItemUI
|
|||||||
protected void installDefaults() {
|
protected void installDefaults() {
|
||||||
super.installDefaults();
|
super.installDefaults();
|
||||||
|
|
||||||
// scale
|
LookAndFeel.installProperty( menuItem, "iconTextGap", FlatUIUtils.getUIInt( "MenuItem.iconTextGap", 4 ) );
|
||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
renderer = createRenderer();
|
||||||
* Scale defaultTextIconGap again if iconTextGap property has changed.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected PropertyChangeListener createPropertyChangeListener( JComponent c ) {
|
|
||||||
PropertyChangeListener superListener = super.createPropertyChangeListener( c );
|
|
||||||
return e -> {
|
|
||||||
superListener.propertyChange( e );
|
|
||||||
if( e.getPropertyName() == "iconTextGap" )
|
|
||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
|
protected void uninstallDefaults() {
|
||||||
FlatMenuItemUI.paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
|
super.uninstallDefaults();
|
||||||
|
|
||||||
|
renderer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected FlatMenuItemRenderer createRenderer() {
|
||||||
|
return new FlatMenuItemRenderer( menuItem, checkIcon, arrowIcon, acceleratorFont, acceleratorDelimiter );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) {
|
||||||
|
return renderer.getPreferredMenuItemSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paint( Graphics g, JComponent c ) {
|
||||||
|
renderer.paintMenuItem( g, selectionBackground, selectionForeground, disabledForeground,
|
||||||
|
acceleratorForeground, acceleratorSelectionForeground );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -460,12 +460,12 @@ public class FlatComboBoxUI
|
|||||||
//---- class FlatComboPopup -----------------------------------------------
|
//---- class FlatComboPopup -----------------------------------------------
|
||||||
|
|
||||||
@SuppressWarnings( { "rawtypes", "unchecked" } )
|
@SuppressWarnings( { "rawtypes", "unchecked" } )
|
||||||
private class FlatComboPopup
|
protected class FlatComboPopup
|
||||||
extends BasicComboPopup
|
extends BasicComboPopup
|
||||||
{
|
{
|
||||||
private CellPaddingBorder paddingBorder;
|
private CellPaddingBorder paddingBorder;
|
||||||
|
|
||||||
FlatComboPopup( JComboBox combo ) {
|
protected FlatComboPopup( JComboBox combo ) {
|
||||||
super( combo );
|
super( combo );
|
||||||
|
|
||||||
// BasicComboPopup listens to JComboBox.componentOrientation and updates
|
// BasicComboPopup listens to JComboBox.componentOrientation and updates
|
||||||
@@ -480,13 +480,8 @@ public class FlatComboBoxUI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Rectangle computePopupBounds( int px, int py, int pw, int ph ) {
|
protected Rectangle computePopupBounds( int px, int py, int pw, int ph ) {
|
||||||
// get maximum display size of all items, ignoring prototype value
|
// get maximum display size of all items
|
||||||
Object prototype = comboBox.getPrototypeDisplayValue();
|
|
||||||
if( prototype != null )
|
|
||||||
comboBox.setPrototypeDisplayValue( null );
|
|
||||||
Dimension displaySize = getDisplaySize();
|
Dimension displaySize = getDisplaySize();
|
||||||
if( prototype != null )
|
|
||||||
comboBox.setPrototypeDisplayValue( prototype );
|
|
||||||
|
|
||||||
// make popup wider if necessary
|
// make popup wider if necessary
|
||||||
if( displaySize.width > pw ) {
|
if( displaySize.width > pw ) {
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ import java.awt.Insets;
|
|||||||
/**
|
/**
|
||||||
* Line border for various components.
|
* Line border for various components.
|
||||||
*
|
*
|
||||||
* Paints a scaled 1px thick line around the component.
|
* Paints a scaled (usually 1px thick) line around the component.
|
||||||
* The line thickness is not included in the border insets.
|
* The line thickness is not added to the border insets.
|
||||||
* The insets should be at least 1,1,1,1.
|
* The insets should be at least have line thickness (usually 1,1,1,1).
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
@@ -36,10 +36,24 @@ public class FlatLineBorder
|
|||||||
extends FlatEmptyBorder
|
extends FlatEmptyBorder
|
||||||
{
|
{
|
||||||
private final Color lineColor;
|
private final Color lineColor;
|
||||||
|
private final float lineThickness;
|
||||||
|
|
||||||
public FlatLineBorder( Insets insets, Color lineColor ) {
|
public FlatLineBorder( Insets insets, Color lineColor ) {
|
||||||
|
this( insets, lineColor, 1f );
|
||||||
|
}
|
||||||
|
|
||||||
|
public FlatLineBorder( Insets insets, Color lineColor, float lineThickness ) {
|
||||||
super( insets );
|
super( insets );
|
||||||
this.lineColor = lineColor;
|
this.lineColor = lineColor;
|
||||||
|
this.lineThickness = lineThickness;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getLineColor() {
|
||||||
|
return lineColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getLineThickness() {
|
||||||
|
return lineThickness;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -48,7 +62,7 @@ public class FlatLineBorder
|
|||||||
try {
|
try {
|
||||||
FlatUIUtils.setRenderingHints( g2 );
|
FlatUIUtils.setRenderingHints( g2 );
|
||||||
g2.setColor( lineColor );
|
g2.setColor( lineColor );
|
||||||
FlatUIUtils.paintComponentBorder( g2, x, y, width, height, 0f, scale( 1f ), 0f );
|
FlatUIUtils.paintComponentBorder( g2, x, y, width, height, 0f, scale( lineThickness ), 0f );
|
||||||
} finally {
|
} finally {
|
||||||
g2.dispose();
|
g2.dispose();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ public class FlatListUI
|
|||||||
selectionInactiveBackground = UIManager.getColor( "List.selectionInactiveBackground" );
|
selectionInactiveBackground = UIManager.getColor( "List.selectionInactiveBackground" );
|
||||||
selectionInactiveForeground = UIManager.getColor( "List.selectionInactiveForeground" );
|
selectionInactiveForeground = UIManager.getColor( "List.selectionInactiveForeground" );
|
||||||
|
|
||||||
toggleSelectionColors( list.hasFocus() );
|
toggleSelectionColors();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -100,13 +100,13 @@ public class FlatListUI
|
|||||||
@Override
|
@Override
|
||||||
public void focusGained( FocusEvent e ) {
|
public void focusGained( FocusEvent e ) {
|
||||||
super.focusGained( e );
|
super.focusGained( e );
|
||||||
toggleSelectionColors( true );
|
toggleSelectionColors();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void focusLost( FocusEvent e ) {
|
public void focusLost( FocusEvent e ) {
|
||||||
super.focusLost( e );
|
super.focusLost( e );
|
||||||
toggleSelectionColors( false );
|
toggleSelectionColors();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -120,8 +120,8 @@ public class FlatListUI
|
|||||||
* already used in applications. Then either the inactive colors are not used,
|
* already used in applications. Then either the inactive colors are not used,
|
||||||
* or the application has to be changed to extend a FlatLaf renderer.
|
* or the application has to be changed to extend a FlatLaf renderer.
|
||||||
*/
|
*/
|
||||||
private void toggleSelectionColors( boolean focused ) {
|
private void toggleSelectionColors() {
|
||||||
if( focused ) {
|
if( FlatUIUtils.isPermanentFocusOwner( list ) ) {
|
||||||
if( list.getSelectionBackground() == selectionInactiveBackground )
|
if( list.getSelectionBackground() == selectionInactiveBackground )
|
||||||
list.setSelectionBackground( selectionBackground );
|
list.setSelectionBackground( selectionBackground );
|
||||||
if( list.getSelectionForeground() == selectionInactiveForeground )
|
if( list.getSelectionForeground() == selectionInactiveForeground )
|
||||||
|
|||||||
@@ -16,9 +16,20 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import javax.swing.AbstractAction;
|
||||||
|
import javax.swing.ActionMap;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuBar;
|
||||||
|
import javax.swing.MenuElement;
|
||||||
|
import javax.swing.MenuSelectionManager;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
import javax.swing.plaf.ActionMapUIResource;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicMenuBarUI;
|
import javax.swing.plaf.basic.BasicMenuBarUI;
|
||||||
|
import com.formdev.flatlaf.FlatLaf;
|
||||||
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the Flat LaF UI delegate for {@link javax.swing.JMenuBar}.
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JMenuBar}.
|
||||||
@@ -38,4 +49,45 @@ public class FlatMenuBarUI
|
|||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatMenuBarUI();
|
return new FlatMenuBarUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WARNING: This class is not used on macOS if screen menu bar is enabled.
|
||||||
|
* Do not add any functionality here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void installKeyboardActions() {
|
||||||
|
super.installKeyboardActions();
|
||||||
|
|
||||||
|
ActionMap map = SwingUtilities.getUIActionMap( menuBar );
|
||||||
|
if( map == null ) {
|
||||||
|
map = new ActionMapUIResource();
|
||||||
|
SwingUtilities.replaceUIActionMap( menuBar, map );
|
||||||
|
}
|
||||||
|
map.put( "takeFocus", new TakeFocus() );
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class TakeFocus ----------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Activates the menu bar and shows mnemonics.
|
||||||
|
* On Windows, the popup of the first menu is not shown.
|
||||||
|
* On other platforms, the popup of the first menu is shown.
|
||||||
|
*/
|
||||||
|
private static class TakeFocus
|
||||||
|
extends AbstractAction
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void actionPerformed( ActionEvent e ) {
|
||||||
|
JMenuBar menuBar = (JMenuBar) e.getSource();
|
||||||
|
JMenu menu = menuBar.getMenu( 0 );
|
||||||
|
if( menu != null ) {
|
||||||
|
MenuSelectionManager.defaultManager().setSelectedPath( SystemInfo.IS_WINDOWS
|
||||||
|
? new MenuElement[] { menuBar, menu }
|
||||||
|
: new MenuElement[] { menuBar, menu, menu.getPopupMenu() } );
|
||||||
|
|
||||||
|
FlatLaf.showMnemonics( menuBar );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,516 @@
|
|||||||
|
/*
|
||||||
|
* 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.ui;
|
||||||
|
|
||||||
|
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Font;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import java.awt.Paint;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.event.InputEvent;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.text.AttributedCharacterIterator;
|
||||||
|
import javax.swing.Icon;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.KeyStroke;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.plaf.basic.BasicHTML;
|
||||||
|
import javax.swing.text.View;
|
||||||
|
import com.formdev.flatlaf.FlatLaf;
|
||||||
|
import com.formdev.flatlaf.util.Graphics2DProxy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renderer for menu items.
|
||||||
|
*
|
||||||
|
* @uiDefault MenuItem.minimumWidth int
|
||||||
|
* @uiDefault MenuItem.minimumIconSize Dimension
|
||||||
|
* @uiDefault MenuItem.textAcceleratorGap int
|
||||||
|
* @uiDefault MenuItem.textNoAcceleratorGap int
|
||||||
|
* @uiDefault MenuItem.acceleratorArrowGap int
|
||||||
|
* @uiDefault MenuItem.checkBackground Color
|
||||||
|
* @uiDefault MenuItem.underlineSelectionBackground Color
|
||||||
|
* @uiDefault MenuItem.underlineSelectionCheckBackground Color
|
||||||
|
* @uiDefault MenuItem.underlineSelectionColor Color
|
||||||
|
* @uiDefault MenuItem.underlineSelectionHeight Color
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatMenuItemRenderer
|
||||||
|
{
|
||||||
|
protected final JMenuItem menuItem;
|
||||||
|
protected final Icon checkIcon;
|
||||||
|
protected final Icon arrowIcon;
|
||||||
|
protected final Font acceleratorFont;
|
||||||
|
protected final String acceleratorDelimiter;
|
||||||
|
|
||||||
|
protected final int minimumWidth = UIManager.getInt( "MenuItem.minimumWidth" );
|
||||||
|
protected final Dimension minimumIconSize;
|
||||||
|
protected final int textAcceleratorGap = FlatUIUtils.getUIInt( "MenuItem.textAcceleratorGap", 28 );
|
||||||
|
protected final int textNoAcceleratorGap = FlatUIUtils.getUIInt( "MenuItem.textNoAcceleratorGap", 6 );
|
||||||
|
protected final int acceleratorArrowGap = FlatUIUtils.getUIInt( "MenuItem.acceleratorArrowGap", 2 );
|
||||||
|
|
||||||
|
protected final Color checkBackground = UIManager.getColor( "MenuItem.checkBackground" );
|
||||||
|
protected final Insets checkMargins = UIManager.getInsets( "MenuItem.checkMargins" );
|
||||||
|
|
||||||
|
protected final Color underlineSelectionBackground = UIManager.getColor( "MenuItem.underlineSelectionBackground" );
|
||||||
|
protected final Color underlineSelectionCheckBackground = UIManager.getColor( "MenuItem.underlineSelectionCheckBackground" );
|
||||||
|
protected final Color underlineSelectionColor = UIManager.getColor( "MenuItem.underlineSelectionColor" );
|
||||||
|
protected final int underlineSelectionHeight = UIManager.getInt( "MenuItem.underlineSelectionHeight" );
|
||||||
|
|
||||||
|
protected FlatMenuItemRenderer( JMenuItem menuItem, Icon checkIcon, Icon arrowIcon,
|
||||||
|
Font acceleratorFont, String acceleratorDelimiter )
|
||||||
|
{
|
||||||
|
this.menuItem = menuItem;
|
||||||
|
this.checkIcon = checkIcon;
|
||||||
|
this.arrowIcon = arrowIcon;
|
||||||
|
this.acceleratorFont = acceleratorFont;
|
||||||
|
this.acceleratorDelimiter = acceleratorDelimiter;
|
||||||
|
|
||||||
|
Dimension minimumIconSize = UIManager.getDimension( "MenuItem.minimumIconSize" );
|
||||||
|
this.minimumIconSize = (minimumIconSize != null) ? minimumIconSize : new Dimension( 16, 16 );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Dimension getPreferredMenuItemSize() {
|
||||||
|
int width = 0;
|
||||||
|
int height = 0;
|
||||||
|
boolean isTopLevelMenu = isTopLevelMenu( menuItem );
|
||||||
|
|
||||||
|
Rectangle viewRect = new Rectangle( 0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE );
|
||||||
|
Rectangle iconRect = new Rectangle();
|
||||||
|
Rectangle textRect = new Rectangle();
|
||||||
|
|
||||||
|
// layout icon and text
|
||||||
|
SwingUtilities.layoutCompoundLabel( menuItem,
|
||||||
|
menuItem.getFontMetrics( menuItem.getFont() ), menuItem.getText(), getIconForLayout(),
|
||||||
|
menuItem.getVerticalAlignment(), menuItem.getHorizontalAlignment(),
|
||||||
|
menuItem.getVerticalTextPosition(), menuItem.getHorizontalTextPosition(),
|
||||||
|
viewRect, iconRect, textRect, scale( menuItem.getIconTextGap() ) );
|
||||||
|
|
||||||
|
// union icon and text rectangles
|
||||||
|
Rectangle labelRect = iconRect.union( textRect );
|
||||||
|
width += labelRect.width;
|
||||||
|
height = Math.max( labelRect.height, height );
|
||||||
|
|
||||||
|
// accelerator size
|
||||||
|
String accelText = getAcceleratorText();
|
||||||
|
if( accelText != null ) {
|
||||||
|
// gap between text and accelerator
|
||||||
|
width += scale( !isTopLevelMenu ? textAcceleratorGap : menuItem.getIconTextGap() );
|
||||||
|
|
||||||
|
FontMetrics accelFm = menuItem.getFontMetrics( acceleratorFont );
|
||||||
|
width += SwingUtilities.computeStringWidth( accelFm, accelText );
|
||||||
|
height = Math.max( accelFm.getHeight(), height );
|
||||||
|
}
|
||||||
|
|
||||||
|
// arrow size
|
||||||
|
if( !isTopLevelMenu && arrowIcon != null ) {
|
||||||
|
// gap between text and arrow
|
||||||
|
if( accelText == null )
|
||||||
|
width += scale( textNoAcceleratorGap );
|
||||||
|
|
||||||
|
// gap between accelerator and arrow
|
||||||
|
width += scale( acceleratorArrowGap );
|
||||||
|
|
||||||
|
width += arrowIcon.getIconWidth();
|
||||||
|
height = Math.max( arrowIcon.getIconHeight(), height );
|
||||||
|
}
|
||||||
|
|
||||||
|
// add insets
|
||||||
|
Insets insets = menuItem.getInsets();
|
||||||
|
width += insets.left + insets.right;
|
||||||
|
height += insets.top + insets.bottom;
|
||||||
|
|
||||||
|
// minimum width
|
||||||
|
if( !isTopLevelMenu ) {
|
||||||
|
int minimumWidth = FlatUIUtils.minimumWidth( menuItem, this.minimumWidth );
|
||||||
|
width = Math.max( width, scale( minimumWidth ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Dimension( width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void layout( Rectangle viewRect, Rectangle iconRect, Rectangle textRect,
|
||||||
|
Rectangle accelRect, Rectangle arrowRect, Rectangle labelRect )
|
||||||
|
{
|
||||||
|
boolean isTopLevelMenu = isTopLevelMenu( menuItem );
|
||||||
|
|
||||||
|
// layout arrow
|
||||||
|
if( !isTopLevelMenu && arrowIcon != null ) {
|
||||||
|
arrowRect.width = arrowIcon.getIconWidth();
|
||||||
|
arrowRect.height = arrowIcon.getIconHeight();
|
||||||
|
} else
|
||||||
|
arrowRect.setSize( 0, 0 );
|
||||||
|
arrowRect.y = viewRect.y + centerOffset( viewRect.height, arrowRect.height );
|
||||||
|
|
||||||
|
// layout accelerator
|
||||||
|
String accelText = getAcceleratorText();
|
||||||
|
if( accelText != null ) {
|
||||||
|
FontMetrics accelFm = menuItem.getFontMetrics( acceleratorFont );
|
||||||
|
accelRect.width = SwingUtilities.computeStringWidth( accelFm, accelText );
|
||||||
|
accelRect.height = accelFm.getHeight();
|
||||||
|
|
||||||
|
accelRect.y = viewRect.y + centerOffset( viewRect.height, accelRect.height );
|
||||||
|
} else
|
||||||
|
accelRect.setBounds( 0, 0, 0, 0 );
|
||||||
|
|
||||||
|
// compute horizontal positions of accelerator and arrow
|
||||||
|
int accelArrowGap = !isTopLevelMenu ? scale( acceleratorArrowGap ) : 0;
|
||||||
|
if( menuItem.getComponentOrientation().isLeftToRight() ) {
|
||||||
|
// left-to-right
|
||||||
|
arrowRect.x = viewRect.x + viewRect.width - arrowRect.width;
|
||||||
|
accelRect.x = arrowRect.x - accelArrowGap - accelRect.width;
|
||||||
|
} else {
|
||||||
|
// right-to-left
|
||||||
|
arrowRect.x = viewRect.x;
|
||||||
|
accelRect.x = arrowRect.x + accelArrowGap + arrowRect.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
// width of accelerator, arrow and gap
|
||||||
|
int accelArrowWidth = accelRect.width + arrowRect.width;
|
||||||
|
if( accelText != null )
|
||||||
|
accelArrowWidth += scale( !isTopLevelMenu ? textAcceleratorGap : menuItem.getIconTextGap() );
|
||||||
|
if( !isTopLevelMenu && arrowIcon != null ) {
|
||||||
|
if( accelText == null )
|
||||||
|
accelArrowWidth += scale( textNoAcceleratorGap );
|
||||||
|
accelArrowWidth += scale( acceleratorArrowGap );
|
||||||
|
}
|
||||||
|
|
||||||
|
// label rectangle is view rectangle subtracted by accelerator, arrow and gap
|
||||||
|
labelRect.setBounds( viewRect );
|
||||||
|
labelRect.width -= accelArrowWidth;
|
||||||
|
if( !menuItem.getComponentOrientation().isLeftToRight() )
|
||||||
|
labelRect.x += accelArrowWidth;
|
||||||
|
|
||||||
|
// layout icon and text
|
||||||
|
SwingUtilities.layoutCompoundLabel( menuItem,
|
||||||
|
menuItem.getFontMetrics( menuItem.getFont() ), menuItem.getText(), getIconForLayout(),
|
||||||
|
menuItem.getVerticalAlignment(), menuItem.getHorizontalAlignment(),
|
||||||
|
menuItem.getVerticalTextPosition(), menuItem.getHorizontalTextPosition(),
|
||||||
|
labelRect, iconRect, textRect, scale( menuItem.getIconTextGap() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int centerOffset( int wh1, int wh2 ) {
|
||||||
|
return (wh1 / 2) - (wh2 / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void paintMenuItem( Graphics g, Color selectionBackground, Color selectionForeground,
|
||||||
|
Color disabledForeground, Color acceleratorForeground, Color acceleratorSelectionForeground )
|
||||||
|
{
|
||||||
|
Rectangle viewRect = new Rectangle( menuItem.getWidth(), menuItem.getHeight() );
|
||||||
|
|
||||||
|
// subtract insets
|
||||||
|
Insets insets = menuItem.getInsets();
|
||||||
|
viewRect.x += insets.left;
|
||||||
|
viewRect.y += insets.top;
|
||||||
|
viewRect.width -= (insets.left + insets.right);
|
||||||
|
viewRect.height -= (insets.top + insets.bottom);
|
||||||
|
|
||||||
|
Rectangle iconRect = new Rectangle();
|
||||||
|
Rectangle textRect = new Rectangle();
|
||||||
|
Rectangle accelRect = new Rectangle();
|
||||||
|
Rectangle arrowRect = new Rectangle();
|
||||||
|
Rectangle labelRect = new Rectangle();
|
||||||
|
|
||||||
|
layout( viewRect, iconRect, textRect, accelRect, arrowRect, labelRect );
|
||||||
|
|
||||||
|
/*debug
|
||||||
|
g.setColor( Color.green ); g.drawRect( viewRect.x, viewRect.y, viewRect.width - 1, viewRect.height - 1 );
|
||||||
|
g.setColor( Color.red ); g.drawRect( labelRect.x, labelRect.y, labelRect.width - 1, labelRect.height - 1 );
|
||||||
|
g.setColor( Color.blue ); g.drawRect( iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1 );
|
||||||
|
g.setColor( Color.cyan ); g.drawRect( textRect.x, textRect.y, textRect.width - 1, textRect.height - 1 );
|
||||||
|
g.setColor( Color.magenta ); g.drawRect( accelRect.x, accelRect.y, accelRect.width - 1, accelRect.height - 1 );
|
||||||
|
g.setColor( Color.orange ); g.drawRect( arrowRect.x, arrowRect.y, arrowRect.width - 1, arrowRect.height - 1 );
|
||||||
|
debug*/
|
||||||
|
|
||||||
|
paintBackground( g, selectionBackground );
|
||||||
|
paintIcon( g, iconRect, getIconForPainting() );
|
||||||
|
paintText( g, textRect, menuItem.getText(), selectionForeground, disabledForeground );
|
||||||
|
paintAccelerator( g, accelRect, getAcceleratorText(), acceleratorForeground, acceleratorSelectionForeground, disabledForeground );
|
||||||
|
if( !isTopLevelMenu( menuItem ) )
|
||||||
|
paintArrowIcon( g, arrowRect, arrowIcon );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void paintBackground( Graphics g, Color selectionBackground ) {
|
||||||
|
boolean armedOrSelected = isArmedOrSelected( menuItem );
|
||||||
|
if( menuItem.isOpaque() || armedOrSelected ) {
|
||||||
|
int width = menuItem.getWidth();
|
||||||
|
int height = menuItem.getHeight();
|
||||||
|
|
||||||
|
// paint background
|
||||||
|
g.setColor( armedOrSelected
|
||||||
|
? (isUnderlineSelection() ? underlineSelectionBackground : selectionBackground)
|
||||||
|
: menuItem.getBackground() );
|
||||||
|
g.fillRect( 0, 0, width, height );
|
||||||
|
|
||||||
|
// paint underline
|
||||||
|
if( armedOrSelected && isUnderlineSelection() ) {
|
||||||
|
int underlineHeight = scale( underlineSelectionHeight );
|
||||||
|
g.setColor( underlineSelectionColor );
|
||||||
|
if( isTopLevelMenu( menuItem ) ) {
|
||||||
|
// paint underline at bottom
|
||||||
|
g.fillRect( 0, height - underlineHeight, width, underlineHeight );
|
||||||
|
} else if( menuItem.getComponentOrientation().isLeftToRight() ) {
|
||||||
|
// paint underline at left side
|
||||||
|
g.fillRect( 0, 0, underlineHeight, height );
|
||||||
|
} else {
|
||||||
|
// paint underline at right side
|
||||||
|
g.fillRect( width - underlineHeight, 0, underlineHeight, height );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void paintIcon( Graphics g, Rectangle iconRect, Icon icon ) {
|
||||||
|
// if checkbox/radiobutton menu item is selected and also has a custom icon,
|
||||||
|
// 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( isUnderlineSelection() ? underlineSelectionCheckBackground : checkBackground );
|
||||||
|
g.fillRect( r.x, r.y, r.width, r.height );
|
||||||
|
}
|
||||||
|
|
||||||
|
paintIcon( g, menuItem, icon, iconRect );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void paintText( Graphics g, Rectangle textRect, String text, Color selectionForeground, Color disabledForeground ) {
|
||||||
|
View htmlView = (View) menuItem.getClientProperty( BasicHTML.propertyKey );
|
||||||
|
if( htmlView != null ) {
|
||||||
|
paintHTMLText( g, menuItem, textRect, htmlView, isUnderlineSelection() ? null : selectionForeground );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mnemonicIndex = FlatLaf.isShowMnemonics() ? menuItem.getDisplayedMnemonicIndex() : -1;
|
||||||
|
Color foreground = menuItem.getForeground();
|
||||||
|
|
||||||
|
paintText( g, menuItem, textRect, text, mnemonicIndex, menuItem.getFont(),
|
||||||
|
foreground, isUnderlineSelection() ? foreground : selectionForeground, disabledForeground );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void paintAccelerator( Graphics g, Rectangle accelRect, String accelText,
|
||||||
|
Color foreground, Color selectionForeground, Color disabledForeground )
|
||||||
|
{
|
||||||
|
paintText( g, menuItem, accelRect, accelText, -1, acceleratorFont,
|
||||||
|
foreground, isUnderlineSelection() ? foreground : selectionForeground, disabledForeground );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void paintArrowIcon( Graphics g, Rectangle arrowRect, Icon arrowIcon ) {
|
||||||
|
paintIcon( g, menuItem, arrowIcon, arrowRect );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void paintIcon( Graphics g, JMenuItem menuItem, Icon icon, Rectangle iconRect ) {
|
||||||
|
if( icon == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// center because the real icon may be smaller than dimension in iconRect
|
||||||
|
int x = iconRect.x + centerOffset( iconRect.width, icon.getIconWidth() );
|
||||||
|
int y = iconRect.y + centerOffset( iconRect.height, icon.getIconHeight() );
|
||||||
|
|
||||||
|
// paint
|
||||||
|
icon.paintIcon( menuItem, g, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void paintText( Graphics g, JMenuItem menuItem,
|
||||||
|
Rectangle textRect, String text, int mnemonicIndex, Font font,
|
||||||
|
Color foreground, Color selectionForeground, Color disabledForeground )
|
||||||
|
{
|
||||||
|
if( text == null || text.isEmpty() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
FontMetrics fm = menuItem.getFontMetrics( font );
|
||||||
|
|
||||||
|
Font oldFont = g.getFont();
|
||||||
|
g.setFont( font );
|
||||||
|
g.setColor( !menuItem.isEnabled()
|
||||||
|
? disabledForeground
|
||||||
|
: (isArmedOrSelected( menuItem )
|
||||||
|
? selectionForeground
|
||||||
|
: foreground) );
|
||||||
|
|
||||||
|
FlatUIUtils.drawStringUnderlineCharAt( menuItem, g, text, mnemonicIndex,
|
||||||
|
textRect.x, textRect.y + fm.getAscent() );
|
||||||
|
|
||||||
|
g.setFont( oldFont );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void paintHTMLText( Graphics g, JMenuItem menuItem,
|
||||||
|
Rectangle textRect, View htmlView, Color selectionForeground )
|
||||||
|
{
|
||||||
|
if( isArmedOrSelected( menuItem ) && selectionForeground != null )
|
||||||
|
g = new GraphicsProxyWithTextColor( (Graphics2D) g, selectionForeground );
|
||||||
|
|
||||||
|
htmlView.paint( g, textRect );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean isArmedOrSelected( JMenuItem menuItem ) {
|
||||||
|
return menuItem.isArmed() || (menuItem instanceof JMenu && menuItem.isSelected());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean isTopLevelMenu( JMenuItem menuItem ) {
|
||||||
|
return menuItem instanceof JMenu && ((JMenu)menuItem).isTopLevelMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isUnderlineSelection() {
|
||||||
|
return "underline".equals( UIManager.getString( "MenuItem.selectionType" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Icon getIconForPainting() {
|
||||||
|
Icon icon = menuItem.getIcon();
|
||||||
|
|
||||||
|
if( icon == null && checkIcon != null && !isTopLevelMenu( menuItem ) )
|
||||||
|
return checkIcon;
|
||||||
|
|
||||||
|
if( icon == null )
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if( !menuItem.isEnabled() )
|
||||||
|
return menuItem.getDisabledIcon();
|
||||||
|
|
||||||
|
if( menuItem.getModel().isPressed() && menuItem.isArmed() ) {
|
||||||
|
Icon pressedIcon = menuItem.getPressedIcon();
|
||||||
|
if( pressedIcon != null )
|
||||||
|
return pressedIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Icon getIconForLayout() {
|
||||||
|
Icon icon = menuItem.getIcon();
|
||||||
|
|
||||||
|
if( isTopLevelMenu( menuItem ) )
|
||||||
|
return (icon != null) ? new MinSizeIcon( icon ) : null;
|
||||||
|
|
||||||
|
return new MinSizeIcon( (icon != null) ? icon : checkIcon );
|
||||||
|
}
|
||||||
|
|
||||||
|
private KeyStroke cachedAccelerator;
|
||||||
|
private String cachedAcceleratorText;
|
||||||
|
|
||||||
|
private String getAcceleratorText() {
|
||||||
|
KeyStroke accelerator = menuItem.getAccelerator();
|
||||||
|
if( accelerator == null )
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if( accelerator == cachedAccelerator )
|
||||||
|
return cachedAcceleratorText;
|
||||||
|
|
||||||
|
StringBuilder buf = new StringBuilder();
|
||||||
|
int modifiers = accelerator.getModifiers();
|
||||||
|
if( modifiers != 0 )
|
||||||
|
buf.append( InputEvent.getModifiersExText( modifiers ) ).append( acceleratorDelimiter );
|
||||||
|
|
||||||
|
int keyCode = accelerator.getKeyCode();
|
||||||
|
if( keyCode != 0 )
|
||||||
|
buf.append( KeyEvent.getKeyText( keyCode ) );
|
||||||
|
else
|
||||||
|
buf.append( accelerator.getKeyChar() );
|
||||||
|
|
||||||
|
cachedAccelerator = accelerator;
|
||||||
|
cachedAcceleratorText = buf.toString();
|
||||||
|
|
||||||
|
return cachedAcceleratorText;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class MinSizeIcon --------------------------------------------------
|
||||||
|
|
||||||
|
private class MinSizeIcon
|
||||||
|
implements Icon
|
||||||
|
{
|
||||||
|
private final Icon delegate;
|
||||||
|
|
||||||
|
MinSizeIcon( Icon delegate ) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getIconWidth() {
|
||||||
|
int iconWidth = (delegate != null) ? delegate.getIconWidth() : 0;
|
||||||
|
return Math.max( iconWidth, scale( minimumIconSize.width ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getIconHeight() {
|
||||||
|
int iconHeight = (delegate != null) ? delegate.getIconHeight() : 0;
|
||||||
|
return Math.max( iconHeight, scale( minimumIconSize.height ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paintIcon( Component c, Graphics g, int x, int y ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class GraphicsProxyWithTextColor -----------------------------------
|
||||||
|
|
||||||
|
private static class GraphicsProxyWithTextColor
|
||||||
|
extends Graphics2DProxy
|
||||||
|
{
|
||||||
|
private final Color textColor;
|
||||||
|
|
||||||
|
GraphicsProxyWithTextColor( Graphics2D delegate, Color textColor ) {
|
||||||
|
super( delegate );
|
||||||
|
this.textColor = textColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawString( String str, int x, int y ) {
|
||||||
|
Paint oldPaint = getPaint();
|
||||||
|
setPaint( textColor );
|
||||||
|
super.drawString( str, x, y );
|
||||||
|
setPaint( oldPaint );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawString( String str, float x, float y ) {
|
||||||
|
Paint oldPaint = getPaint();
|
||||||
|
setPaint( textColor );
|
||||||
|
super.drawString( str, x, y );
|
||||||
|
setPaint( oldPaint );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawString( AttributedCharacterIterator iterator, int x, int y ) {
|
||||||
|
Paint oldPaint = getPaint();
|
||||||
|
setPaint( textColor );
|
||||||
|
super.drawString( iterator, x, y );
|
||||||
|
setPaint( oldPaint );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawString( AttributedCharacterIterator iterator, float x, float y ) {
|
||||||
|
Paint oldPaint = getPaint();
|
||||||
|
setPaint( textColor );
|
||||||
|
super.drawString( iterator, x, y );
|
||||||
|
setPaint( oldPaint );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawChars( char[] data, int offset, int length, int x, int y ) {
|
||||||
|
Paint oldPaint = getPaint();
|
||||||
|
setPaint( textColor );
|
||||||
|
super.drawChars( data, offset, length, x, y );
|
||||||
|
setPaint( oldPaint );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,48 +16,47 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
import java.awt.Dimension;
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.FontMetrics;
|
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Rectangle;
|
import javax.swing.Icon;
|
||||||
import java.beans.PropertyChangeListener;
|
|
||||||
import javax.swing.ButtonModel;
|
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JMenu;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.JMenuItem;
|
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicMenuItemUI;
|
import javax.swing.plaf.basic.BasicMenuItemUI;
|
||||||
import com.formdev.flatlaf.FlatLaf;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the Flat LaF UI delegate for {@link javax.swing.JMenuItem}.
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JMenuItem}.
|
||||||
*
|
*
|
||||||
* <!-- BasicMenuItemUI -->
|
* <!-- BasicMenuItemUI -->
|
||||||
*
|
*
|
||||||
* @uiDefault MenuItem.font Font
|
* @uiDefault MenuItem.font Font
|
||||||
* @uiDefault MenuItem.background Color
|
* @uiDefault MenuItem.background Color
|
||||||
* @uiDefault MenuItem.foreground Color
|
* @uiDefault MenuItem.foreground Color
|
||||||
* @uiDefault MenuItem.disabledForeground Color
|
* @uiDefault MenuItem.disabledForeground Color
|
||||||
* @uiDefault MenuItem.selectionBackground Color
|
* @uiDefault MenuItem.selectionBackground Color
|
||||||
* @uiDefault MenuItem.selectionForeground Color
|
* @uiDefault MenuItem.selectionForeground Color
|
||||||
* @uiDefault MenuItem.acceleratorForeground Color
|
* @uiDefault MenuItem.acceleratorForeground Color
|
||||||
* @uiDefault MenuItem.acceleratorSelectionForeground Color
|
* @uiDefault MenuItem.acceleratorSelectionForeground Color
|
||||||
* @uiDefault MenuItem.acceleratorFont Font defaults to MenuItem.font
|
* @uiDefault MenuItem.acceleratorFont Font defaults to MenuItem.font
|
||||||
* @uiDefault MenuItem.acceleratorDelimiter String
|
* @uiDefault MenuItem.acceleratorDelimiter String
|
||||||
* @uiDefault MenuItem.border Border
|
* @uiDefault MenuItem.border Border
|
||||||
* @uiDefault MenuItem.borderPainted boolean
|
* @uiDefault MenuItem.borderPainted boolean
|
||||||
* @uiDefault MenuItem.margin Insets
|
* @uiDefault MenuItem.margin Insets
|
||||||
* @uiDefault MenuItem.arrowIcon Icon
|
* @uiDefault MenuItem.arrowIcon Icon
|
||||||
* @uiDefault MenuItem.checkIcon Icon
|
* @uiDefault MenuItem.checkIcon Icon
|
||||||
* @uiDefault MenuItem.opaque boolean
|
* @uiDefault MenuItem.opaque boolean
|
||||||
* @uiDefault MenuItem.evenHeight boolean
|
*
|
||||||
|
* <!-- FlatMenuItemUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault MenuItem.iconTextGap int
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatMenuItemUI
|
public class FlatMenuItemUI
|
||||||
extends BasicMenuItemUI
|
extends BasicMenuItemUI
|
||||||
{
|
{
|
||||||
|
private FlatMenuItemRenderer renderer;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatMenuItemUI();
|
return new FlatMenuItemUI();
|
||||||
}
|
}
|
||||||
@@ -66,42 +65,30 @@ public class FlatMenuItemUI
|
|||||||
protected void installDefaults() {
|
protected void installDefaults() {
|
||||||
super.installDefaults();
|
super.installDefaults();
|
||||||
|
|
||||||
// scale
|
LookAndFeel.installProperty( menuItem, "iconTextGap", FlatUIUtils.getUIInt( "MenuItem.iconTextGap", 4 ) );
|
||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
renderer = createRenderer();
|
||||||
* Scale defaultTextIconGap again if iconTextGap property has changed.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected PropertyChangeListener createPropertyChangeListener( JComponent c ) {
|
|
||||||
PropertyChangeListener superListener = super.createPropertyChangeListener( c );
|
|
||||||
return e -> {
|
|
||||||
superListener.propertyChange( e );
|
|
||||||
if( e.getPropertyName() == "iconTextGap" )
|
|
||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
|
protected void uninstallDefaults() {
|
||||||
paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
|
super.uninstallDefaults();
|
||||||
|
|
||||||
|
renderer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect,
|
protected FlatMenuItemRenderer createRenderer() {
|
||||||
String text, Color disabledForeground, Color selectionForeground )
|
return new FlatMenuItemRenderer( menuItem, checkIcon, arrowIcon, acceleratorFont, acceleratorDelimiter );
|
||||||
{
|
}
|
||||||
FontMetrics fm = menuItem.getFontMetrics( menuItem.getFont() );
|
|
||||||
int mnemonicIndex = FlatLaf.isShowMnemonics() ? menuItem.getDisplayedMnemonicIndex() : -1;
|
|
||||||
|
|
||||||
ButtonModel model = menuItem.getModel();
|
@Override
|
||||||
g.setColor( !model.isEnabled()
|
protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) {
|
||||||
? disabledForeground
|
return renderer.getPreferredMenuItemSize();
|
||||||
: (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())
|
}
|
||||||
? selectionForeground
|
|
||||||
: menuItem.getForeground()) );
|
|
||||||
|
|
||||||
FlatUIUtils.drawStringUnderlineCharAt( menuItem, g, text, mnemonicIndex,
|
@Override
|
||||||
textRect.x, textRect.y + fm.getAscent() );
|
public void paint( Graphics g, JComponent c ) {
|
||||||
|
renderer.paintMenuItem( g, selectionBackground, selectionForeground, disabledForeground,
|
||||||
|
acceleratorForeground, acceleratorSelectionForeground );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,16 +16,17 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Font;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Rectangle;
|
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
|
||||||
import javax.swing.ButtonModel;
|
import javax.swing.ButtonModel;
|
||||||
|
import javax.swing.Icon;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JMenu;
|
import javax.swing.JMenu;
|
||||||
import javax.swing.JMenuItem;
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.event.MouseInputListener;
|
import javax.swing.event.MouseInputListener;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
@@ -36,30 +37,30 @@ import javax.swing.plaf.basic.BasicMenuUI;
|
|||||||
*
|
*
|
||||||
* <!-- BasicMenuUI -->
|
* <!-- BasicMenuUI -->
|
||||||
*
|
*
|
||||||
* @uiDefault Menu.font Font
|
* @uiDefault Menu.font Font
|
||||||
* @uiDefault Menu.background Color
|
* @uiDefault Menu.background Color
|
||||||
* @uiDefault Menu.foreground Color
|
* @uiDefault Menu.foreground Color
|
||||||
* @uiDefault Menu.disabledForeground Color
|
* @uiDefault Menu.disabledForeground Color
|
||||||
* @uiDefault Menu.selectionBackground Color
|
* @uiDefault Menu.selectionBackground Color
|
||||||
* @uiDefault Menu.selectionForeground Color
|
* @uiDefault Menu.selectionForeground Color
|
||||||
* @uiDefault Menu.acceleratorForeground Color
|
* @uiDefault Menu.acceleratorForeground Color
|
||||||
* @uiDefault Menu.acceleratorSelectionForeground Color
|
* @uiDefault Menu.acceleratorSelectionForeground Color
|
||||||
* @uiDefault MenuItem.acceleratorFont Font defaults to MenuItem.font
|
* @uiDefault MenuItem.acceleratorFont Font defaults to MenuItem.font
|
||||||
* @uiDefault MenuItem.acceleratorDelimiter String
|
* @uiDefault MenuItem.acceleratorDelimiter String
|
||||||
* @uiDefault Menu.border Border
|
* @uiDefault Menu.border Border
|
||||||
* @uiDefault Menu.borderPainted boolean
|
* @uiDefault Menu.borderPainted boolean
|
||||||
* @uiDefault Menu.margin Insets
|
* @uiDefault Menu.margin Insets
|
||||||
* @uiDefault Menu.arrowIcon Icon
|
* @uiDefault Menu.arrowIcon Icon
|
||||||
* @uiDefault Menu.checkIcon Icon
|
* @uiDefault Menu.checkIcon Icon
|
||||||
* @uiDefault Menu.opaque boolean
|
* @uiDefault Menu.opaque boolean
|
||||||
* @uiDefault Menu.evenHeight boolean
|
* @uiDefault Menu.crossMenuMnemonic boolean default is false
|
||||||
* @uiDefault Menu.crossMenuMnemonic boolean default is false
|
* @uiDefault Menu.useMenuBarBackgroundForTopLevel boolean default is false
|
||||||
* @uiDefault Menu.useMenuBarBackgroundForTopLevel boolean default is false
|
* @uiDefault MenuBar.background Color used if Menu.useMenuBarBackgroundForTopLevel is true
|
||||||
* @uiDefault MenuBar.background Color used if Menu.useMenuBarBackgroundForTopLevel is true
|
|
||||||
*
|
*
|
||||||
* <!-- FlatMenuUI -->
|
* <!-- FlatMenuUI -->
|
||||||
*
|
*
|
||||||
* @uiDefault MenuBar.hoverBackground Color
|
* @uiDefault MenuItem.iconTextGap int
|
||||||
|
* @uiDefault MenuBar.hoverBackground Color
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
@@ -67,6 +68,7 @@ public class FlatMenuUI
|
|||||||
extends BasicMenuUI
|
extends BasicMenuUI
|
||||||
{
|
{
|
||||||
private Color hoverBackground;
|
private Color hoverBackground;
|
||||||
|
private FlatMenuItemRenderer renderer;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatMenuUI();
|
return new FlatMenuUI();
|
||||||
@@ -76,12 +78,12 @@ public class FlatMenuUI
|
|||||||
protected void installDefaults() {
|
protected void installDefaults() {
|
||||||
super.installDefaults();
|
super.installDefaults();
|
||||||
|
|
||||||
|
LookAndFeel.installProperty( menuItem, "iconTextGap", FlatUIUtils.getUIInt( "MenuItem.iconTextGap", 4 ) );
|
||||||
|
|
||||||
menuItem.setRolloverEnabled( true );
|
menuItem.setRolloverEnabled( true );
|
||||||
|
|
||||||
hoverBackground = UIManager.getColor( "MenuBar.hoverBackground" );
|
hoverBackground = UIManager.getColor( "MenuBar.hoverBackground" );
|
||||||
|
renderer = createRenderer();
|
||||||
// scale
|
|
||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -89,19 +91,11 @@ public class FlatMenuUI
|
|||||||
super.uninstallDefaults();
|
super.uninstallDefaults();
|
||||||
|
|
||||||
hoverBackground = null;
|
hoverBackground = null;
|
||||||
|
renderer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
protected FlatMenuItemRenderer createRenderer() {
|
||||||
* Scale defaultTextIconGap again if iconTextGap property has changed.
|
return new FlatMenuRenderer( menuItem, checkIcon, arrowIcon, acceleratorFont, acceleratorDelimiter );
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected PropertyChangeListener createPropertyChangeListener( JComponent c ) {
|
|
||||||
PropertyChangeListener superListener = super.createPropertyChangeListener( c );
|
|
||||||
return e -> {
|
|
||||||
superListener.propertyChange( e );
|
|
||||||
if( e.getPropertyName() == "iconTextGap" )
|
|
||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -130,19 +124,37 @@ public class FlatMenuUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintBackground( Graphics g, JMenuItem menuItem, Color bgColor ) {
|
protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) {
|
||||||
ButtonModel model = menuItem.getModel();
|
return renderer.getPreferredMenuItemSize();
|
||||||
if( model.isArmed() || model.isSelected() ) {
|
|
||||||
super.paintBackground( g, menuItem, bgColor );
|
|
||||||
} else if( model.isRollover() && model.isEnabled() && ((JMenu)menuItem).isTopLevelMenu() ) {
|
|
||||||
FlatUIUtils.setColor( g, hoverBackground, menuItem.getBackground() );
|
|
||||||
g.fillRect( 0, 0, menuItem.getWidth(), menuItem.getHeight() );
|
|
||||||
} else
|
|
||||||
super.paintBackground( g, menuItem, bgColor );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
|
public void paint( Graphics g, JComponent c ) {
|
||||||
FlatMenuItemUI.paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
|
renderer.paintMenuItem( g, selectionBackground, selectionForeground, disabledForeground,
|
||||||
|
acceleratorForeground, acceleratorSelectionForeground );
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class FlatMenuRenderer ---------------------------------------------
|
||||||
|
|
||||||
|
protected class FlatMenuRenderer
|
||||||
|
extends FlatMenuItemRenderer
|
||||||
|
{
|
||||||
|
protected FlatMenuRenderer( JMenuItem menuItem, Icon checkIcon, Icon arrowIcon,
|
||||||
|
Font acceleratorFont, String acceleratorDelimiter )
|
||||||
|
{
|
||||||
|
super( menuItem, checkIcon, arrowIcon, acceleratorFont, acceleratorDelimiter );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paintBackground( Graphics g, Color selectionBackground ) {
|
||||||
|
ButtonModel model = menuItem.getModel();
|
||||||
|
if( model.isRollover() && !model.isArmed() && !model.isSelected() &&
|
||||||
|
model.isEnabled() && ((JMenu)menuItem).isTopLevelMenu() )
|
||||||
|
{
|
||||||
|
FlatUIUtils.setColor( g, hoverBackground, menuItem.getBackground() );
|
||||||
|
g.fillRect( 0, 0, menuItem.getWidth(), menuItem.getHeight() );
|
||||||
|
} else
|
||||||
|
super.paintBackground( g, selectionBackground );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ public class FlatPasswordFieldUI
|
|||||||
|
|
||||||
protected void paintCapsLock( Graphics g ) {
|
protected void paintCapsLock( Graphics g ) {
|
||||||
JTextComponent c = getComponent();
|
JTextComponent c = getComponent();
|
||||||
if( !c.isFocusOwner() ||
|
if( !FlatUIUtils.isPermanentFocusOwner( c ) ||
|
||||||
!Toolkit.getDefaultToolkit().getLockingKeyState( KeyEvent.VK_CAPS_LOCK ) )
|
!Toolkit.getDefaultToolkit().getLockingKeyState( KeyEvent.VK_CAPS_LOCK ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.formdev.flatlaf.ui;
|
|||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicPopupMenuUI;
|
import javax.swing.plaf.basic.BasicPopupMenuUI;
|
||||||
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the Flat LaF UI delegate for {@link javax.swing.JPopupMenu}.
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JPopupMenu}.
|
||||||
@@ -35,7 +36,28 @@ import javax.swing.plaf.basic.BasicPopupMenuUI;
|
|||||||
public class FlatPopupMenuUI
|
public class FlatPopupMenuUI
|
||||||
extends BasicPopupMenuUI
|
extends BasicPopupMenuUI
|
||||||
{
|
{
|
||||||
|
private boolean oldLightWeightPopupEnabled;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatPopupMenuUI();
|
return new FlatPopupMenuUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void installDefaults() {
|
||||||
|
super.installDefaults();
|
||||||
|
|
||||||
|
// use heavy-weight popups on macOS to get nice drop shadow from OS
|
||||||
|
if( SystemInfo.IS_MAC ) {
|
||||||
|
oldLightWeightPopupEnabled = popupMenu.isLightWeightPopupEnabled();
|
||||||
|
popupMenu.setLightWeightPopupEnabled( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void uninstallDefaults() {
|
||||||
|
super.uninstallDefaults();
|
||||||
|
|
||||||
|
if( SystemInfo.IS_MAC )
|
||||||
|
popupMenu.setLightWeightPopupEnabled( oldLightWeightPopupEnabled );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,12 +16,11 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Rectangle;
|
import javax.swing.Icon;
|
||||||
import java.beans.PropertyChangeListener;
|
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JMenuItem;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI;
|
import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI;
|
||||||
|
|
||||||
@@ -46,13 +45,18 @@ import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI;
|
|||||||
* @uiDefault RadioButtonMenuItem.arrowIcon Icon
|
* @uiDefault RadioButtonMenuItem.arrowIcon Icon
|
||||||
* @uiDefault RadioButtonMenuItem.checkIcon Icon
|
* @uiDefault RadioButtonMenuItem.checkIcon Icon
|
||||||
* @uiDefault RadioButtonMenuItem.opaque boolean
|
* @uiDefault RadioButtonMenuItem.opaque boolean
|
||||||
* @uiDefault RadioButtonMenuItem.evenHeight boolean
|
*
|
||||||
|
* <!-- FlatRadioButtonMenuItemUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault MenuItem.iconTextGap int
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatRadioButtonMenuItemUI
|
public class FlatRadioButtonMenuItemUI
|
||||||
extends BasicRadioButtonMenuItemUI
|
extends BasicRadioButtonMenuItemUI
|
||||||
{
|
{
|
||||||
|
private FlatMenuItemRenderer renderer;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatRadioButtonMenuItemUI();
|
return new FlatRadioButtonMenuItemUI();
|
||||||
}
|
}
|
||||||
@@ -61,25 +65,30 @@ public class FlatRadioButtonMenuItemUI
|
|||||||
protected void installDefaults() {
|
protected void installDefaults() {
|
||||||
super.installDefaults();
|
super.installDefaults();
|
||||||
|
|
||||||
// scale
|
LookAndFeel.installProperty( menuItem, "iconTextGap", FlatUIUtils.getUIInt( "MenuItem.iconTextGap", 4 ) );
|
||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
renderer = createRenderer();
|
||||||
* Scale defaultTextIconGap again if iconTextGap property has changed.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected PropertyChangeListener createPropertyChangeListener( JComponent c ) {
|
|
||||||
PropertyChangeListener superListener = super.createPropertyChangeListener( c );
|
|
||||||
return e -> {
|
|
||||||
superListener.propertyChange( e );
|
|
||||||
if( e.getPropertyName() == "iconTextGap" )
|
|
||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
|
protected void uninstallDefaults() {
|
||||||
FlatMenuItemUI.paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
|
super.uninstallDefaults();
|
||||||
|
|
||||||
|
renderer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected FlatMenuItemRenderer createRenderer() {
|
||||||
|
return new FlatMenuItemRenderer( menuItem, checkIcon, arrowIcon, acceleratorFont, acceleratorDelimiter );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) {
|
||||||
|
return renderer.getPreferredMenuItemSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paint( Graphics g, JComponent c ) {
|
||||||
|
renderer.paintMenuItem( g, selectionBackground, selectionForeground, disabledForeground,
|
||||||
|
acceleratorForeground, acceleratorSelectionForeground );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ public class FlatSliderUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( coloredTrack != null ) {
|
if( coloredTrack != null ) {
|
||||||
FlatUIUtils.setColor( g, slider.hasFocus() ? focusColor : (hover ? hoverColor : thumbColor), thumbColor );
|
FlatUIUtils.setColor( g, FlatUIUtils.isPermanentFocusOwner( slider ) ? focusColor : (hover ? hoverColor : thumbColor), thumbColor );
|
||||||
((Graphics2D)g).fill( coloredTrack );
|
((Graphics2D)g).fill( coloredTrack );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ public class FlatSliderUI
|
|||||||
@Override
|
@Override
|
||||||
public void paintThumb( Graphics g ) {
|
public void paintThumb( Graphics g ) {
|
||||||
FlatUIUtils.setColor( g, slider.isEnabled()
|
FlatUIUtils.setColor( g, slider.isEnabled()
|
||||||
? (slider.hasFocus() ? focusColor : (hover ? hoverColor : thumbColor))
|
? (FlatUIUtils.isPermanentFocusOwner( slider ) ? focusColor : (hover ? hoverColor : thumbColor))
|
||||||
: disabledForeground,
|
: disabledForeground,
|
||||||
thumbColor );
|
thumbColor );
|
||||||
|
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ public class FlatTabbedPaneUI
|
|||||||
boolean enabled = tabPane.isEnabled();
|
boolean enabled = tabPane.isEnabled();
|
||||||
g.setColor( enabled && tabPane.isEnabledAt( tabIndex ) && getRolloverTab() == tabIndex
|
g.setColor( enabled && tabPane.isEnabledAt( tabIndex ) && getRolloverTab() == tabIndex
|
||||||
? hoverColor
|
? hoverColor
|
||||||
: (enabled && isSelected && tabPane.hasFocus()
|
: (enabled && isSelected && FlatUIUtils.isPermanentFocusOwner( tabPane )
|
||||||
? focusColor
|
? focusColor
|
||||||
: (selectedBackground != null && enabled && isSelected
|
: (selectedBackground != null && enabled && isSelected
|
||||||
? selectedBackground
|
? selectedBackground
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ public class FlatTableUI
|
|||||||
selectionInactiveBackground = UIManager.getColor( "Table.selectionInactiveBackground" );
|
selectionInactiveBackground = UIManager.getColor( "Table.selectionInactiveBackground" );
|
||||||
selectionInactiveForeground = UIManager.getColor( "Table.selectionInactiveForeground" );
|
selectionInactiveForeground = UIManager.getColor( "Table.selectionInactiveForeground" );
|
||||||
|
|
||||||
toggleSelectionColors( table.hasFocus() );
|
toggleSelectionColors();
|
||||||
|
|
||||||
int rowHeight = FlatUIUtils.getUIInt( "Table.rowHeight", 16 );
|
int rowHeight = FlatUIUtils.getUIInt( "Table.rowHeight", 16 );
|
||||||
if( rowHeight > 0 )
|
if( rowHeight > 0 )
|
||||||
@@ -160,13 +160,13 @@ public class FlatTableUI
|
|||||||
@Override
|
@Override
|
||||||
public void focusGained( FocusEvent e ) {
|
public void focusGained( FocusEvent e ) {
|
||||||
super.focusGained( e );
|
super.focusGained( e );
|
||||||
toggleSelectionColors( true );
|
toggleSelectionColors();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void focusLost( FocusEvent e ) {
|
public void focusLost( FocusEvent e ) {
|
||||||
super.focusLost( e );
|
super.focusLost( e );
|
||||||
toggleSelectionColors( false );
|
toggleSelectionColors();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -180,8 +180,8 @@ public class FlatTableUI
|
|||||||
* already used in applications. Then either the inactive colors are not used,
|
* already used in applications. Then either the inactive colors are not used,
|
||||||
* or the application has to be changed to extend a FlatLaf renderer.
|
* or the application has to be changed to extend a FlatLaf renderer.
|
||||||
*/
|
*/
|
||||||
private void toggleSelectionColors( boolean focused ) {
|
private void toggleSelectionColors() {
|
||||||
if( focused ) {
|
if( FlatUIUtils.isPermanentFocusOwner( table ) ) {
|
||||||
if( table.getSelectionBackground() == selectionInactiveBackground )
|
if( table.getSelectionBackground() == selectionInactiveBackground )
|
||||||
table.setSelectionBackground( selectionBackground );
|
table.setSelectionBackground( selectionBackground );
|
||||||
if( table.getSelectionForeground() == selectionInactiveForeground )
|
if( table.getSelectionForeground() == selectionInactiveForeground )
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import javax.swing.JComponent;
|
|||||||
import javax.swing.JToolTip;
|
import javax.swing.JToolTip;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
|
import javax.swing.plaf.basic.BasicHTML;
|
||||||
import javax.swing.plaf.basic.BasicToolTipUI;
|
import javax.swing.plaf.basic.BasicToolTipUI;
|
||||||
import com.formdev.flatlaf.util.StringUtils;
|
import com.formdev.flatlaf.util.StringUtils;
|
||||||
|
|
||||||
@@ -134,6 +135,6 @@ public class FlatToolTipUI
|
|||||||
|
|
||||||
private boolean isMultiLine( JComponent c ) {
|
private boolean isMultiLine( JComponent c ) {
|
||||||
String text = ((JToolTip)c).getTipText();
|
String text = ((JToolTip)c).getTipText();
|
||||||
return c.getClientProperty( "html" ) == null && text != null && text.indexOf( '\n' ) >= 0;
|
return c.getClientProperty( BasicHTML.propertyKey ) == null && text != null && text.indexOf( '\n' ) >= 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -221,7 +221,7 @@ public class FlatTreeUI
|
|||||||
TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf )
|
TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf )
|
||||||
{
|
{
|
||||||
boolean isEditing = (editingComponent != null && editingRow == row);
|
boolean isEditing = (editingComponent != null && editingRow == row);
|
||||||
boolean hasFocus = tree.hasFocus();
|
boolean hasFocus = FlatUIUtils.isPermanentFocusOwner( tree );
|
||||||
boolean cellHasFocus = hasFocus && (row == getLeadSelectionRow());
|
boolean cellHasFocus = hasFocus && (row == getLeadSelectionRow());
|
||||||
boolean isSelected = tree.isRowSelected( row );
|
boolean isSelected = tree.isRowSelected( row );
|
||||||
boolean isDropRow = isDropRow( row );
|
boolean isDropRow = isDropRow( row );
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import java.awt.Font;
|
|||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
|
import java.awt.KeyboardFocusManager;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.RenderingHints;
|
import java.awt.RenderingHints;
|
||||||
import java.awt.Shape;
|
import java.awt.Shape;
|
||||||
@@ -41,6 +42,7 @@ import javax.swing.UIManager;
|
|||||||
import javax.swing.plaf.UIResource;
|
import javax.swing.plaf.UIResource;
|
||||||
import com.formdev.flatlaf.FlatClientProperties;
|
import com.formdev.flatlaf.FlatClientProperties;
|
||||||
import com.formdev.flatlaf.util.DerivedColor;
|
import com.formdev.flatlaf.util.DerivedColor;
|
||||||
|
import com.formdev.flatlaf.util.Graphics2DProxy;
|
||||||
import com.formdev.flatlaf.util.HiDPIUtils;
|
import com.formdev.flatlaf.util.HiDPIUtils;
|
||||||
import com.formdev.flatlaf.util.JavaCompatibility;
|
import com.formdev.flatlaf.util.JavaCompatibility;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
@@ -136,6 +138,10 @@ public class FlatUIUtils
|
|||||||
return c instanceof JComponent && Boolean.TRUE.equals( ((JComponent)c).getClientProperty( "JComboBox.isTableCellEditor" ) );
|
return c instanceof JComponent && Boolean.TRUE.equals( ((JComponent)c).getClientProperty( "JComboBox.isTableCellEditor" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isPermanentFocusOwner( Component c ) {
|
||||||
|
return (KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner() == c);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets rendering hints used for painting.
|
* Sets rendering hints used for painting.
|
||||||
*/
|
*/
|
||||||
@@ -422,6 +428,23 @@ public class FlatUIUtils
|
|||||||
public static void drawStringUnderlineCharAt( JComponent c, Graphics g,
|
public static void drawStringUnderlineCharAt( JComponent c, Graphics g,
|
||||||
String text, int underlinedIndex, int x, int y )
|
String text, int underlinedIndex, int x, int y )
|
||||||
{
|
{
|
||||||
|
// scale underline height if necessary
|
||||||
|
if( underlinedIndex >= 0 && UIScale.getUserScaleFactor() > 1 ) {
|
||||||
|
g = new Graphics2DProxy( (Graphics2D) g ) {
|
||||||
|
@Override
|
||||||
|
public void fillRect( int x, int y, int width, int height ) {
|
||||||
|
if( height == 1 ) {
|
||||||
|
// scale height and correct y position
|
||||||
|
// (using 0.9f so that underline height is 1 at scale factor 1.5x)
|
||||||
|
height = Math.round( UIScale.scale( 0.9f ) );
|
||||||
|
y += height - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
super.fillRect( x, y, width, height );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
JavaCompatibility.drawStringUnderlineCharAt( c, g, text, underlinedIndex, x, y );
|
JavaCompatibility.drawStringUnderlineCharAt( c, g, text, underlinedIndex, x, y );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ public class DerivedColor
|
|||||||
{
|
{
|
||||||
private final ColorFunction[] functions;
|
private final ColorFunction[] functions;
|
||||||
|
|
||||||
public DerivedColor( ColorFunction... functions ) {
|
public DerivedColor( Color defaultColor, ColorFunction... functions ) {
|
||||||
super( Color.red );
|
super( (defaultColor != null) ? defaultColor : Color.red );
|
||||||
this.functions = functions;
|
this.functions = functions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,479 @@
|
|||||||
|
/*
|
||||||
|
* 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.Color;
|
||||||
|
import java.awt.Composite;
|
||||||
|
import java.awt.Font;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.GraphicsConfiguration;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.Paint;
|
||||||
|
import java.awt.Polygon;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.RenderingHints;
|
||||||
|
import java.awt.RenderingHints.Key;
|
||||||
|
import java.awt.Shape;
|
||||||
|
import java.awt.Stroke;
|
||||||
|
import java.awt.font.FontRenderContext;
|
||||||
|
import java.awt.font.GlyphVector;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.awt.image.BufferedImageOp;
|
||||||
|
import java.awt.image.ImageObserver;
|
||||||
|
import java.awt.image.RenderedImage;
|
||||||
|
import java.awt.image.renderable.RenderableImage;
|
||||||
|
import java.text.AttributedCharacterIterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A proxy for {@link Graphics2D}.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class Graphics2DProxy
|
||||||
|
extends Graphics2D
|
||||||
|
{
|
||||||
|
private final Graphics2D delegate;
|
||||||
|
|
||||||
|
public Graphics2DProxy( Graphics2D delegate ) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Graphics create() {
|
||||||
|
return delegate.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Graphics create( int x, int y, int width, int height ) {
|
||||||
|
return delegate.create( x, y, width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Color getColor() {
|
||||||
|
return delegate.getColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setColor( Color c ) {
|
||||||
|
delegate.setColor( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPaintMode() {
|
||||||
|
delegate.setPaintMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setXORMode( Color c1 ) {
|
||||||
|
delegate.setXORMode( c1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Font getFont() {
|
||||||
|
return delegate.getFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFont( Font font ) {
|
||||||
|
delegate.setFont( font );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FontMetrics getFontMetrics() {
|
||||||
|
return delegate.getFontMetrics();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FontMetrics getFontMetrics( Font f ) {
|
||||||
|
return delegate.getFontMetrics( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Rectangle getClipBounds() {
|
||||||
|
return delegate.getClipBounds();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clipRect( int x, int y, int width, int height ) {
|
||||||
|
delegate.clipRect( x, y, width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClip( int x, int y, int width, int height ) {
|
||||||
|
delegate.setClip( x, y, width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Shape getClip() {
|
||||||
|
return delegate.getClip();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClip( Shape clip ) {
|
||||||
|
delegate.setClip( clip );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void copyArea( int x, int y, int width, int height, int dx, int dy ) {
|
||||||
|
delegate.copyArea( x, y, width, height, dx, dy );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawLine( int x1, int y1, int x2, int y2 ) {
|
||||||
|
delegate.drawLine( x1, y1, x2, y2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fillRect( int x, int y, int width, int height ) {
|
||||||
|
delegate.fillRect( x, y, width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawRect( int x, int y, int width, int height ) {
|
||||||
|
delegate.drawRect( x, y, width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearRect( int x, int y, int width, int height ) {
|
||||||
|
delegate.clearRect( x, y, width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawRoundRect( int x, int y, int width, int height, int arcWidth, int arcHeight ) {
|
||||||
|
delegate.drawRoundRect( x, y, width, height, arcWidth, arcHeight );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fillRoundRect( int x, int y, int width, int height, int arcWidth, int arcHeight ) {
|
||||||
|
delegate.fillRoundRect( x, y, width, height, arcWidth, arcHeight );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawOval( int x, int y, int width, int height ) {
|
||||||
|
delegate.drawOval( x, y, width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fillOval( int x, int y, int width, int height ) {
|
||||||
|
delegate.fillOval( x, y, width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawArc( int x, int y, int width, int height, int startAngle, int arcAngle ) {
|
||||||
|
delegate.drawArc( x, y, width, height, startAngle, arcAngle );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fillArc( int x, int y, int width, int height, int startAngle, int arcAngle ) {
|
||||||
|
delegate.fillArc( x, y, width, height, startAngle, arcAngle );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawPolyline( int[] xPoints, int[] yPoints, int nPoints ) {
|
||||||
|
delegate.drawPolyline( xPoints, yPoints, nPoints );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawPolygon( int[] xPoints, int[] yPoints, int nPoints ) {
|
||||||
|
delegate.drawPolygon( xPoints, yPoints, nPoints );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawPolygon( Polygon p ) {
|
||||||
|
delegate.drawPolygon( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fillPolygon( int[] xPoints, int[] yPoints, int nPoints ) {
|
||||||
|
delegate.fillPolygon( xPoints, yPoints, nPoints );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fillPolygon( Polygon p ) {
|
||||||
|
delegate.fillPolygon( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawChars( char[] data, int offset, int length, int x, int y ) {
|
||||||
|
delegate.drawChars( data, offset, length, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawBytes( byte[] data, int offset, int length, int x, int y ) {
|
||||||
|
delegate.drawBytes( data, offset, length, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean drawImage( Image img, int x, int y, ImageObserver observer ) {
|
||||||
|
return delegate.drawImage( img, x, y, observer );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean drawImage( Image img, int x, int y, int width, int height, ImageObserver observer ) {
|
||||||
|
return delegate.drawImage( img, x, y, width, height, observer );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean drawImage( Image img, int x, int y, Color bgcolor, ImageObserver observer ) {
|
||||||
|
return delegate.drawImage( img, x, y, bgcolor, observer );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean drawImage( Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer ) {
|
||||||
|
return delegate.drawImage( img, x, y, width, height, bgcolor, observer );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean drawImage( Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer ) {
|
||||||
|
return delegate.drawImage( img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean drawImage( Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer ) {
|
||||||
|
return delegate.drawImage( img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
delegate.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void finalize() {
|
||||||
|
delegate.finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return delegate.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings( "deprecation" )
|
||||||
|
@Override
|
||||||
|
public Rectangle getClipRect() {
|
||||||
|
return delegate.getClipRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hitClip( int x, int y, int width, int height ) {
|
||||||
|
return delegate.hitClip( x, y, width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Rectangle getClipBounds( Rectangle r ) {
|
||||||
|
return delegate.getClipBounds( r );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw3DRect( int x, int y, int width, int height, boolean raised ) {
|
||||||
|
delegate.draw3DRect( x, y, width, height, raised );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fill3DRect( int x, int y, int width, int height, boolean raised ) {
|
||||||
|
delegate.fill3DRect( x, y, width, height, raised );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw( Shape s ) {
|
||||||
|
delegate.draw( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean drawImage( Image img, AffineTransform xform, ImageObserver obs ) {
|
||||||
|
return delegate.drawImage( img, xform, obs );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawImage( BufferedImage img, BufferedImageOp op, int x, int y ) {
|
||||||
|
delegate.drawImage( img, op, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawRenderedImage( RenderedImage img, AffineTransform xform ) {
|
||||||
|
delegate.drawRenderedImage( img, xform );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawRenderableImage( RenderableImage img, AffineTransform xform ) {
|
||||||
|
delegate.drawRenderableImage( img, xform );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawString( String str, int x, int y ) {
|
||||||
|
delegate.drawString( str, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawString( String str, float x, float y ) {
|
||||||
|
delegate.drawString( str, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawString( AttributedCharacterIterator iterator, int x, int y ) {
|
||||||
|
delegate.drawString( iterator, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawString( AttributedCharacterIterator iterator, float x, float y ) {
|
||||||
|
delegate.drawString( iterator, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawGlyphVector( GlyphVector g, float x, float y ) {
|
||||||
|
delegate.drawGlyphVector( g, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fill( Shape s ) {
|
||||||
|
delegate.fill( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hit( Rectangle rect, Shape s, boolean onStroke ) {
|
||||||
|
return delegate.hit( rect, s, onStroke );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GraphicsConfiguration getDeviceConfiguration() {
|
||||||
|
return delegate.getDeviceConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setComposite( Composite comp ) {
|
||||||
|
delegate.setComposite( comp );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPaint( Paint paint ) {
|
||||||
|
delegate.setPaint( paint );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setStroke( Stroke s ) {
|
||||||
|
delegate.setStroke( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRenderingHint( Key hintKey, Object hintValue ) {
|
||||||
|
delegate.setRenderingHint( hintKey, hintValue );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getRenderingHint( Key hintKey ) {
|
||||||
|
return delegate.getRenderingHint( hintKey );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRenderingHints( Map<?, ?> hints ) {
|
||||||
|
delegate.setRenderingHints( hints );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addRenderingHints( Map<?, ?> hints ) {
|
||||||
|
delegate.addRenderingHints( hints );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RenderingHints getRenderingHints() {
|
||||||
|
return delegate.getRenderingHints();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate( int x, int y ) {
|
||||||
|
delegate.translate( x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate( double tx, double ty ) {
|
||||||
|
delegate.translate( tx, ty );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void rotate( double theta ) {
|
||||||
|
delegate.rotate( theta );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void rotate( double theta, double x, double y ) {
|
||||||
|
delegate.rotate( theta, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void scale( double sx, double sy ) {
|
||||||
|
delegate.scale( sx, sy );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shear( double shx, double shy ) {
|
||||||
|
delegate.shear( shx, shy );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void transform( AffineTransform Tx ) {
|
||||||
|
delegate.transform( Tx );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTransform( AffineTransform Tx ) {
|
||||||
|
delegate.setTransform( Tx );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AffineTransform getTransform() {
|
||||||
|
return delegate.getTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Paint getPaint() {
|
||||||
|
return delegate.getPaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Composite getComposite() {
|
||||||
|
return delegate.getComposite();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBackground( Color color ) {
|
||||||
|
delegate.setBackground( color );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Color getBackground() {
|
||||||
|
return delegate.getBackground();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stroke getStroke() {
|
||||||
|
return delegate.getStroke();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clip( Shape s ) {
|
||||||
|
delegate.clip( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FontRenderContext getFontRenderContext() {
|
||||||
|
return delegate.getFontRenderContext();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||||
|
package com.formdev.flatlaf.util;
|
||||||
|
|
||||||
|
import java.awt.image.RGBImageFilter;
|
||||||
|
|
||||||
|
// based on https://github.com/JetBrains/intellij-community/blob/3840eab54746f5c4f301bb3ac78f00a980b5fd6e/platform/util/ui/src/com/intellij/util/ui/UIUtil.java#L253-L347
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An image filter that turns an image into a grayscale image.
|
||||||
|
* Used for icons in disabled buttons and labels.
|
||||||
|
*/
|
||||||
|
public class GrayFilter
|
||||||
|
extends RGBImageFilter
|
||||||
|
{
|
||||||
|
private final float brightness;
|
||||||
|
private final float contrast;
|
||||||
|
private final int alpha;
|
||||||
|
|
||||||
|
private final int origContrast;
|
||||||
|
private final int origBrightness;
|
||||||
|
|
||||||
|
public static GrayFilter createDisabledIconFilter( boolean dark ) {
|
||||||
|
return dark
|
||||||
|
? new GrayFilter( -20, -70, 100 )
|
||||||
|
: new GrayFilter( 25, -25, 100 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param brightness in range [-100..100] where 0 has no effect
|
||||||
|
* @param contrast in range [-100..100] where 0 has no effect
|
||||||
|
* @param alpha in range [0..100] where 0 is transparent, 100 has no effect
|
||||||
|
*/
|
||||||
|
public GrayFilter( int brightness, int contrast, int alpha ) {
|
||||||
|
this.origBrightness = Math.max( -100, Math.min( 100, brightness ) );
|
||||||
|
this.origContrast = Math.max( -100, Math.min( 100, contrast ) );
|
||||||
|
this.alpha = Math.max( 0, Math.min( 100, alpha ) );
|
||||||
|
|
||||||
|
this.brightness = (float) (Math.pow( origBrightness, 3 ) / (100f * 100f)); // cubic in [0..100]
|
||||||
|
this.contrast = origContrast / 100f;
|
||||||
|
|
||||||
|
canFilterIndexColorModel = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GrayFilter() {
|
||||||
|
this( 0, 0, 100 );
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBrightness() {
|
||||||
|
return origBrightness;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getContrast() {
|
||||||
|
return origContrast;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAlpha() {
|
||||||
|
return alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int filterRGB( int x, int y, int rgb ) {
|
||||||
|
// use NTSC conversion formula
|
||||||
|
int gray = (int)(
|
||||||
|
0.30 * (rgb >> 16 & 0xff) +
|
||||||
|
0.59 * (rgb >> 8 & 0xff) +
|
||||||
|
0.11 * (rgb & 0xff));
|
||||||
|
|
||||||
|
if( brightness >= 0 )
|
||||||
|
gray = (int) ((gray + brightness * 255) / (1 + brightness));
|
||||||
|
else
|
||||||
|
gray = (int) (gray / (1 - brightness));
|
||||||
|
|
||||||
|
if( contrast >= 0 ) {
|
||||||
|
if( gray >= 127 )
|
||||||
|
gray = (int) (gray + (255 - gray) * contrast);
|
||||||
|
else
|
||||||
|
gray = (int) (gray - gray * contrast);
|
||||||
|
} else
|
||||||
|
gray = (int) (127 + (gray - 127) * (contrast + 1));
|
||||||
|
|
||||||
|
int a = (alpha != 100)
|
||||||
|
? (((rgb >> 24) & 0xff) * alpha / 100) << 24
|
||||||
|
: (rgb & 0xff000000);
|
||||||
|
|
||||||
|
return a | (gray << 16) | (gray << 8) | gray;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.util;
|
||||||
|
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Support for multi-resolution images available since Java 9.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class MultiResolutionImageSupport
|
||||||
|
{
|
||||||
|
public static boolean isAvailable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isMultiResolutionImage( Image image ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Image create( int baseImageIndex, Image... resolutionVariants ) {
|
||||||
|
return resolutionVariants[baseImageIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Image map( Image image, Function<Image, Image> mapper ) {
|
||||||
|
return mapper.apply( image );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,6 +24,7 @@ import java.awt.GraphicsEnvironment;
|
|||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.beans.PropertyChangeSupport;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
@@ -48,12 +49,15 @@ import javax.swing.plaf.UIResource;
|
|||||||
*
|
*
|
||||||
* 2) user scaling mode
|
* 2) user scaling mode
|
||||||
*
|
*
|
||||||
* This mode is mainly for Java 8 compatibility, but is also used on Linux.
|
* This mode is mainly for Java 8 compatibility, but is also used on Linux
|
||||||
|
* or if the default font is changed.
|
||||||
* The user scale factor is computed based on the used font.
|
* The user scale factor is computed based on the used font.
|
||||||
* The JRE does not scale anything.
|
* The JRE does not scale anything.
|
||||||
* So we have to invoke {@link #scale(float)} where necessary.
|
* So we have to invoke {@link #scale(float)} where necessary.
|
||||||
* There is only one user scale factor for all displays.
|
* There is only one user scale factor for all displays.
|
||||||
* The user scale factor may change if the active LaF or "Label.font" has changed.
|
* The user scale factor may change if the active LaF, "defaultFont" or "Label.font" has changed.
|
||||||
|
* If system scaling mode is available the user scale factor is usually 1,
|
||||||
|
* but may be larger on Linux or if the default font is changed.
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
@@ -61,6 +65,20 @@ public class UIScale
|
|||||||
{
|
{
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
|
private static PropertyChangeSupport changeSupport;
|
||||||
|
|
||||||
|
public static void addPropertyChangeListener( PropertyChangeListener listener ) {
|
||||||
|
if( changeSupport == null )
|
||||||
|
changeSupport = new PropertyChangeSupport( UIScale.class );
|
||||||
|
changeSupport.addPropertyChangeListener( listener );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removePropertyChangeListener( PropertyChangeListener listener ) {
|
||||||
|
if( changeSupport == null )
|
||||||
|
return;
|
||||||
|
changeSupport.removePropertyChangeListener( listener );
|
||||||
|
}
|
||||||
|
|
||||||
//---- system scaling (Java 9) --------------------------------------------
|
//---- system scaling (Java 9) --------------------------------------------
|
||||||
|
|
||||||
private static Boolean jreHiDPI;
|
private static Boolean jreHiDPI;
|
||||||
@@ -110,27 +128,33 @@ public class UIScale
|
|||||||
return;
|
return;
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
|
||||||
if( isUserScalingEnabled() ) {
|
if( !isUserScalingEnabled() )
|
||||||
// listener to update scale factor if LaF changed or if Label.font changed
|
return;
|
||||||
// (e.g. option "Override default fonts" in IntelliJ IDEA)
|
|
||||||
PropertyChangeListener listener = new PropertyChangeListener() {
|
// listener to update scale factor if LaF changed, "defaultFont" or "Label.font" changed
|
||||||
@Override
|
PropertyChangeListener listener = new PropertyChangeListener() {
|
||||||
public void propertyChange( PropertyChangeEvent e ) {
|
@Override
|
||||||
String propName = e.getPropertyName();
|
public void propertyChange( PropertyChangeEvent e ) {
|
||||||
if( "lookAndFeel".equals( propName ) ) {
|
switch( e.getPropertyName() ) {
|
||||||
|
case "lookAndFeel":
|
||||||
// it is not necessary (and possible) to remove listener of old LaF defaults
|
// it is not necessary (and possible) to remove listener of old LaF defaults
|
||||||
if( e.getNewValue() instanceof LookAndFeel )
|
if( e.getNewValue() instanceof LookAndFeel )
|
||||||
UIManager.getLookAndFeelDefaults().addPropertyChangeListener( this );
|
UIManager.getLookAndFeelDefaults().addPropertyChangeListener( this );
|
||||||
updateScaleFactor();
|
updateScaleFactor();
|
||||||
} else if( "Label.font".equals( propName ) )
|
break;
|
||||||
updateScaleFactor();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
UIManager.addPropertyChangeListener( listener );
|
|
||||||
UIManager.getLookAndFeelDefaults().addPropertyChangeListener( listener );
|
|
||||||
|
|
||||||
updateScaleFactor();
|
case "defaultFont":
|
||||||
}
|
case "Label.font":
|
||||||
|
updateScaleFactor();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
UIManager.addPropertyChangeListener( listener );
|
||||||
|
UIManager.getDefaults().addPropertyChangeListener( listener );
|
||||||
|
UIManager.getLookAndFeelDefaults().addPropertyChangeListener( listener );
|
||||||
|
|
||||||
|
updateScaleFactor();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void updateScaleFactor() {
|
private static void updateScaleFactor() {
|
||||||
@@ -141,7 +165,9 @@ public class UIScale
|
|||||||
// because even if we are on a HiDPI display it is not sure
|
// because even if we are on a HiDPI display it is not sure
|
||||||
// that a larger font size is set by the current LaF
|
// that a larger font size is set by the current LaF
|
||||||
// (e.g. can avoid large icons with small text)
|
// (e.g. can avoid large icons with small text)
|
||||||
Font font = UIManager.getFont( "Label.font" );
|
Font font = UIManager.getFont( "defaultFont" );
|
||||||
|
if( font == null )
|
||||||
|
font = UIManager.getFont( "Label.font" );
|
||||||
|
|
||||||
setUserScaleFactor( computeScaleFactor( font ) );
|
setUserScaleFactor( computeScaleFactor( font ) );
|
||||||
}
|
}
|
||||||
@@ -168,26 +194,17 @@ public class UIScale
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isUserScalingEnabled() {
|
private static boolean isUserScalingEnabled() {
|
||||||
if( isSystemScalingEnabled() && !SystemInfo.IS_LINUX )
|
|
||||||
return false; // disable user scaling if JRE scales
|
|
||||||
|
|
||||||
// same as in IntelliJ IDEA
|
// same as in IntelliJ IDEA
|
||||||
String hidpi = System.getProperty( "hidpi" );
|
String hidpi = System.getProperty( "hidpi" );
|
||||||
return (hidpi != null) ? Boolean.parseBoolean( hidpi ) : true;
|
return (hidpi != null) ? Boolean.parseBoolean( hidpi ) : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies a custom scale factor given in system properties "flatlaf.uiScale"
|
* Applies a custom scale factor given in system property "flatlaf.uiScale"
|
||||||
* or "sun.java2d.uiScale" to the given font.
|
* to the given font.
|
||||||
*/
|
*/
|
||||||
public static FontUIResource applyCustomScaleFactor( FontUIResource font ) {
|
public static FontUIResource applyCustomScaleFactor( FontUIResource font ) {
|
||||||
if( UIScale.isSystemScalingEnabled() )
|
|
||||||
return font;
|
|
||||||
|
|
||||||
String uiScale = System.getProperty( "flatlaf.uiScale" );
|
String uiScale = System.getProperty( "flatlaf.uiScale" );
|
||||||
if( uiScale == null )
|
|
||||||
uiScale = System.getProperty( "sun.java2d.uiScale" );
|
|
||||||
|
|
||||||
float scaleFactor = parseScaleFactor( uiScale );
|
float scaleFactor = parseScaleFactor( uiScale );
|
||||||
if( scaleFactor <= 0 )
|
if( scaleFactor <= 0 )
|
||||||
return font;
|
return font;
|
||||||
@@ -200,14 +217,6 @@ public class UIScale
|
|||||||
return new FontUIResource( font.deriveFont( (float) newFontSize ) );
|
return new FontUIResource( font.deriveFont( (float) newFontSize ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Scales the given font.
|
|
||||||
*/
|
|
||||||
public static FontUIResource scaleFont( FontUIResource font, float scaleFactor ) {
|
|
||||||
int newFontSize = Math.round( font.getSize() * scaleFactor );
|
|
||||||
return new FontUIResource( font.deriveFont( (float) newFontSize ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Similar to sun.java2d.SunGraphicsEnvironment.getScaleFactor(String)
|
* Similar to sun.java2d.SunGraphicsEnvironment.getScaleFactor(String)
|
||||||
*/
|
*/
|
||||||
@@ -245,10 +254,14 @@ public class UIScale
|
|||||||
else // round scale factor to 1/4
|
else // round scale factor to 1/4
|
||||||
scaleFactor = Math.round( scaleFactor * 4f ) / 4f;
|
scaleFactor = Math.round( scaleFactor * 4f ) / 4f;
|
||||||
|
|
||||||
|
float oldScaleFactor = UIScale.scaleFactor;
|
||||||
UIScale.scaleFactor = scaleFactor;
|
UIScale.scaleFactor = scaleFactor;
|
||||||
|
|
||||||
if( DEBUG )
|
if( DEBUG )
|
||||||
System.out.println( "HiDPI scale factor " + scaleFactor );
|
System.out.println( "HiDPI scale factor " + scaleFactor );
|
||||||
|
|
||||||
|
if( changeSupport != null )
|
||||||
|
changeSupport.firePropertyChange( "userScaleFactor", oldScaleFactor, scaleFactor );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float scale( float value ) {
|
public static float scale( float value ) {
|
||||||
|
|||||||
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* 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.Image;
|
||||||
|
import java.awt.image.AbstractMultiResolutionImage;
|
||||||
|
import java.awt.image.BaseMultiResolutionImage;
|
||||||
|
import java.awt.image.MultiResolutionImage;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.IdentityHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import javax.swing.ImageIcon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Support for multi-resolution images available since Java 9.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class MultiResolutionImageSupport
|
||||||
|
{
|
||||||
|
public static boolean isAvailable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isMultiResolutionImage( Image image ) {
|
||||||
|
return image instanceof MultiResolutionImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Image create( int baseImageIndex, Image... resolutionVariants ) {
|
||||||
|
return new BaseMultiResolutionImage( baseImageIndex, resolutionVariants );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Image map( Image image, Function<Image, Image> mapper ) {
|
||||||
|
return image instanceof MultiResolutionImage
|
||||||
|
? new MappedMultiResolutionImage( image, mapper )
|
||||||
|
: mapper.apply( image );
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class MappedMultiResolutionImage -----------------------------------
|
||||||
|
|
||||||
|
private static class MappedMultiResolutionImage
|
||||||
|
extends AbstractMultiResolutionImage
|
||||||
|
{
|
||||||
|
private final Image mrImage;
|
||||||
|
private final Function<Image, Image> mapper;
|
||||||
|
private final IdentityHashMap<Image, Image> cache = new IdentityHashMap<>();
|
||||||
|
|
||||||
|
MappedMultiResolutionImage( Image mrImage, Function<Image, Image> mapper ) {
|
||||||
|
assert mrImage instanceof MultiResolutionImage;
|
||||||
|
|
||||||
|
this.mrImage = mrImage;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getResolutionVariant( double destImageWidth, double destImageHeight ) {
|
||||||
|
Image variant = ((MultiResolutionImage)mrImage).getResolutionVariant( destImageWidth, destImageHeight );
|
||||||
|
return mapAndCacheImage( variant );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Image> getResolutionVariants() {
|
||||||
|
List<Image> variants = ((MultiResolutionImage)mrImage).getResolutionVariants();
|
||||||
|
List<Image> mappedVariants = new ArrayList<>();
|
||||||
|
for( Image image : variants )
|
||||||
|
mappedVariants.add( mapAndCacheImage( image ) );
|
||||||
|
return mappedVariants;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Image getBaseImage() {
|
||||||
|
return mapAndCacheImage( mrImage );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Image mapAndCacheImage( Image image ) {
|
||||||
|
return cache.computeIfAbsent( image, img -> {
|
||||||
|
return new ImageIcon( mapper.apply( img ) ).getImage();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,13 +29,12 @@
|
|||||||
@disabledText=#777777
|
@disabledText=#777777
|
||||||
@textComponentBackground=#45494A
|
@textComponentBackground=#45494A
|
||||||
@menuBackground=darken(@background,5%)
|
@menuBackground=darken(@background,5%)
|
||||||
|
@menuHoverBackground=lighten(@menuBackground,10%)
|
||||||
|
@menuCheckBackground=lighten(@menuBackground,10%)
|
||||||
|
@menuCheckHoverBackground=lighten(@menuBackground,20%)
|
||||||
@cellFocusColor=#000000
|
@cellFocusColor=#000000
|
||||||
@icon=#adadad
|
@icon=#adadad
|
||||||
|
|
||||||
# Button
|
|
||||||
@buttonHoverBackground=lighten(3%,autoInverse)
|
|
||||||
@buttonPressedBackground=lighten(6%,autoInverse)
|
|
||||||
|
|
||||||
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
|
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
|
||||||
@dropCellBackground=darken(List.selectionBackground,10%,lazy)
|
@dropCellBackground=darken(List.selectionBackground,10%,lazy)
|
||||||
@dropCellForeground=lazy(List.selectionForeground)
|
@dropCellForeground=lazy(List.selectionForeground)
|
||||||
@@ -57,7 +56,7 @@
|
|||||||
*.disabledBackground=@background
|
*.disabledBackground=@background
|
||||||
*.disabledForeground=@disabledText
|
*.disabledForeground=@disabledText
|
||||||
*.disabledText=@disabledText
|
*.disabledText=@disabledText
|
||||||
*.acceleratorForeground=#bbbbbb
|
*.acceleratorForeground=darken(@foreground,15%)
|
||||||
*.acceleratorSelectionForeground=@selectionForeground
|
*.acceleratorSelectionForeground=@selectionForeground
|
||||||
|
|
||||||
|
|
||||||
@@ -73,8 +72,8 @@ controlDkShadow=lighten($controlShadow,10%)
|
|||||||
#---- Button ----
|
#---- Button ----
|
||||||
|
|
||||||
Button.background=#4c5052
|
Button.background=#4c5052
|
||||||
Button.hoverBackground=@buttonHoverBackground
|
Button.hoverBackground=lighten($Button.background,3%,derived autoInverse)
|
||||||
Button.pressedBackground=@buttonPressedBackground
|
Button.pressedBackground=lighten($Button.background,6%,derived autoInverse)
|
||||||
|
|
||||||
Button.borderColor=#5e6060
|
Button.borderColor=#5e6060
|
||||||
Button.disabledBorderColor=#5e6060
|
Button.disabledBorderColor=#5e6060
|
||||||
@@ -83,16 +82,16 @@ Button.hoverBorderColor=$Button.focusedBorderColor
|
|||||||
|
|
||||||
Button.default.background=#365880
|
Button.default.background=#365880
|
||||||
Button.default.foreground=#bbbbbb
|
Button.default.foreground=#bbbbbb
|
||||||
Button.default.hoverBackground=@buttonHoverBackground
|
Button.default.hoverBackground=lighten($Button.default.background,3%,derived autoInverse)
|
||||||
Button.default.pressedBackground=@buttonPressedBackground
|
Button.default.pressedBackground=lighten($Button.default.background,6%,derived autoInverse)
|
||||||
Button.default.borderColor=#4c708c
|
Button.default.borderColor=#4c708c
|
||||||
Button.default.hoverBorderColor=#537699
|
Button.default.hoverBorderColor=#537699
|
||||||
Button.default.focusedBorderColor=#537699
|
Button.default.focusedBorderColor=#537699
|
||||||
Button.default.focusColor=#43688c
|
Button.default.focusColor=#43688c
|
||||||
Button.default.boldText=true
|
Button.default.boldText=true
|
||||||
|
|
||||||
Button.toolbar.hoverBackground=#4c5052
|
Button.toolbar.hoverBackground=lighten($Button.background,1%,derived autoInverse)
|
||||||
Button.toolbar.pressedBackground=#555a5d
|
Button.toolbar.pressedBackground=lighten($Button.background,4%,derived autoInverse)
|
||||||
|
|
||||||
|
|
||||||
#---- CheckBox ----
|
#---- CheckBox ----
|
||||||
@@ -105,8 +104,8 @@ CheckBox.icon.hoverBorderColor=$CheckBox.icon.focusedBorderColor
|
|||||||
CheckBox.icon.selectedFocusedBorderColor=#466D94
|
CheckBox.icon.selectedFocusedBorderColor=#466D94
|
||||||
CheckBox.icon.background=#43494A
|
CheckBox.icon.background=#43494A
|
||||||
CheckBox.icon.disabledBackground=@background
|
CheckBox.icon.disabledBackground=@background
|
||||||
CheckBox.icon.hoverBackground=@buttonHoverBackground
|
CheckBox.icon.hoverBackground=lighten($CheckBox.icon.background,3%,derived autoInverse)
|
||||||
CheckBox.icon.pressedBackground=@buttonPressedBackground
|
CheckBox.icon.pressedBackground=lighten($CheckBox.icon.background,6%,derived autoInverse)
|
||||||
CheckBox.icon.selectedBackground=#43494A
|
CheckBox.icon.selectedBackground=#43494A
|
||||||
CheckBox.icon.checkmarkColor=#A7A7A7
|
CheckBox.icon.checkmarkColor=#A7A7A7
|
||||||
CheckBox.icon.disabledCheckmarkColor=#606060
|
CheckBox.icon.disabledCheckmarkColor=#606060
|
||||||
@@ -129,6 +128,7 @@ Component.disabledBorderColor=#646464
|
|||||||
Component.focusedBorderColor=#466d94
|
Component.focusedBorderColor=#466d94
|
||||||
Component.focusColor=#3d6185
|
Component.focusColor=#3d6185
|
||||||
Component.linkColor=#589df6
|
Component.linkColor=#589df6
|
||||||
|
Component.grayFilter=-20,-70,100
|
||||||
|
|
||||||
|
|
||||||
#---- Desktop ----
|
#---- Desktop ----
|
||||||
@@ -151,8 +151,8 @@ InternalFrame.inactiveTitleForeground=@disabledText
|
|||||||
InternalFrame.activeBorderColor=lighten($Component.borderColor,10%)
|
InternalFrame.activeBorderColor=lighten($Component.borderColor,10%)
|
||||||
InternalFrame.inactiveBorderColor=$Component.borderColor
|
InternalFrame.inactiveBorderColor=$Component.borderColor
|
||||||
|
|
||||||
InternalFrame.buttonHoverBackground=lighten(10%,autoInverse)
|
InternalFrame.buttonHoverBackground=lighten($InternalFrame.activeTitleBackground,10%,derived autoInverse)
|
||||||
InternalFrame.buttonPressedBackground=lighten(20%,autoInverse)
|
InternalFrame.buttonPressedBackground=lighten($InternalFrame.activeTitleBackground,20%,derived autoInverse)
|
||||||
InternalFrame.closeHoverBackground=lazy(Actions.Red)
|
InternalFrame.closeHoverBackground=lazy(Actions.Red)
|
||||||
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
|
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
|
||||||
InternalFrame.closeHoverForeground=#fff
|
InternalFrame.closeHoverForeground=#fff
|
||||||
@@ -173,7 +173,7 @@ Menu.icon.disabledArrowColor=#606060
|
|||||||
#---- MenuBar ----
|
#---- MenuBar ----
|
||||||
|
|
||||||
MenuBar.borderColor=#515151
|
MenuBar.borderColor=#515151
|
||||||
MenuBar.hoverBackground=lighten($MenuBar.background,10%)
|
MenuBar.hoverBackground=@menuHoverBackground
|
||||||
|
|
||||||
|
|
||||||
#---- MenuItemCheckBox ----
|
#---- MenuItemCheckBox ----
|
||||||
@@ -218,7 +218,7 @@ Separator.foreground=#515151
|
|||||||
Slider.trackColor=#646464
|
Slider.trackColor=#646464
|
||||||
Slider.thumbColor=#A6A6A6
|
Slider.thumbColor=#A6A6A6
|
||||||
Slider.tickColor=#888888
|
Slider.tickColor=#888888
|
||||||
Slider.hoverColor=darken(15%,autoInverse)
|
Slider.hoverColor=darken($Slider.thumbColor,15%,derived autoInverse)
|
||||||
Slider.disabledForeground=#4c5052
|
Slider.disabledForeground=#4c5052
|
||||||
|
|
||||||
|
|
||||||
@@ -253,11 +253,11 @@ TableHeader.bottomSeparatorColor=$TableHeader.separatorColor
|
|||||||
|
|
||||||
#---- ToggleButton ----
|
#---- ToggleButton ----
|
||||||
|
|
||||||
ToggleButton.selectedBackground=#64696C
|
ToggleButton.selectedBackground=lighten($ToggleButton.background,10%,derived autoInverse)
|
||||||
ToggleButton.selectedForeground=@foreground
|
ToggleButton.selectedForeground=@foreground
|
||||||
ToggleButton.disabledSelectedBackground=#525658
|
ToggleButton.disabledSelectedBackground=lighten($ToggleButton.background,3%,derived autoInverse)
|
||||||
|
|
||||||
ToggleButton.toolbar.selectedBackground=#5c6164
|
ToggleButton.toolbar.selectedBackground=lighten($ToggleButton.background,7%,derived autoInverse)
|
||||||
|
|
||||||
|
|
||||||
#---- ToolTip ----
|
#---- ToolTip ----
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ ViewportUI=com.formdev.flatlaf.ui.FlatViewportUI
|
|||||||
#---- variables ----
|
#---- variables ----
|
||||||
|
|
||||||
@textComponentMargin=2,6,2,6
|
@textComponentMargin=2,6,2,6
|
||||||
@menuItemMargin=2,8,2,8
|
@menuItemMargin=3,6,3,6
|
||||||
|
|
||||||
|
|
||||||
#---- system colors ----
|
#---- system colors ----
|
||||||
@@ -269,7 +269,6 @@ InternalFrameTitlePane.border=0,8,0,0
|
|||||||
|
|
||||||
#---- List ----
|
#---- List ----
|
||||||
|
|
||||||
List.border=1,0,1,0
|
|
||||||
List.border=0,0,0,0
|
List.border=0,0,0,0
|
||||||
List.cellMargins=1,6,1,6
|
List.cellMargins=1,6,1,6
|
||||||
List.cellFocusColor=@cellFocusColor
|
List.cellFocusColor=@cellFocusColor
|
||||||
@@ -300,7 +299,7 @@ Menu.background=@menuBackground
|
|||||||
|
|
||||||
MenuBar.border=com.formdev.flatlaf.ui.FlatMenuBarBorder
|
MenuBar.border=com.formdev.flatlaf.ui.FlatMenuBarBorder
|
||||||
MenuBar.background=@menuBackground
|
MenuBar.background=@menuBackground
|
||||||
MenuBar.itemMargins=3,3,3,3
|
MenuBar.itemMargins=3,8,3,8
|
||||||
|
|
||||||
|
|
||||||
#---- MenuItem ----
|
#---- MenuItem ----
|
||||||
@@ -312,9 +311,23 @@ MenuItem.margin=@menuItemMargin
|
|||||||
MenuItem.opaque=false
|
MenuItem.opaque=false
|
||||||
MenuItem.borderPainted=true
|
MenuItem.borderPainted=true
|
||||||
MenuItem.background=@menuBackground
|
MenuItem.background=@menuBackground
|
||||||
|
MenuItem.checkBackground=@menuCheckBackground
|
||||||
|
MenuItem.checkMargins=2,2,2,2
|
||||||
|
MenuItem.minimumWidth=72
|
||||||
|
MenuItem.minimumIconSize=16,16
|
||||||
|
MenuItem.iconTextGap=6
|
||||||
|
MenuItem.textAcceleratorGap=24
|
||||||
|
MenuItem.textNoAcceleratorGap=6
|
||||||
|
MenuItem.acceleratorArrowGap=2
|
||||||
MenuItem.acceleratorDelimiter=-
|
MenuItem.acceleratorDelimiter=-
|
||||||
[mac]MenuItem.acceleratorDelimiter=
|
[mac]MenuItem.acceleratorDelimiter=
|
||||||
|
|
||||||
|
# for MenuItem.selectionType=underline
|
||||||
|
MenuItem.underlineSelectionBackground=@menuHoverBackground
|
||||||
|
MenuItem.underlineSelectionCheckBackground=@menuCheckHoverBackground
|
||||||
|
MenuItem.underlineSelectionColor=$TabbedPane.underlineColor
|
||||||
|
MenuItem.underlineSelectionHeight=3
|
||||||
|
|
||||||
|
|
||||||
#---- OptionPane ----
|
#---- OptionPane ----
|
||||||
|
|
||||||
@@ -578,14 +591,6 @@ ToolBar.spacingBorder=$Button.toolbar.spacingInsets
|
|||||||
ToolTipManager.enableToolTipMode=activeApplication
|
ToolTipManager.enableToolTipMode=activeApplication
|
||||||
|
|
||||||
|
|
||||||
#---- ToolTip ----
|
|
||||||
|
|
||||||
ToolTip.border=4,6,4,6,$Component.borderColor
|
|
||||||
ToolTip.borderInactive=null
|
|
||||||
ToolTip.backgroundInactive=$ToolTip.background
|
|
||||||
ToolTip.foregroundInactive=@disabledText
|
|
||||||
|
|
||||||
|
|
||||||
#---- Tree ----
|
#---- Tree ----
|
||||||
|
|
||||||
Tree.border=1,1,1,1
|
Tree.border=1,1,1,1
|
||||||
@@ -599,6 +604,7 @@ Tree.dropLineColor=@dropLineColor
|
|||||||
Tree.rendererFillBackground=false
|
Tree.rendererFillBackground=false
|
||||||
Tree.rendererMargins=1,2,1,2
|
Tree.rendererMargins=1,2,1,2
|
||||||
Tree.wideSelection=true
|
Tree.wideSelection=true
|
||||||
|
Tree.repaintWholeRow=true
|
||||||
Tree.paintLines=false
|
Tree.paintLines=false
|
||||||
Tree.leftChildIndent=7
|
Tree.leftChildIndent=7
|
||||||
Tree.rightChildIndent=11
|
Tree.rightChildIndent=11
|
||||||
|
|||||||
@@ -29,13 +29,12 @@
|
|||||||
@disabledText=#8C8C8C
|
@disabledText=#8C8C8C
|
||||||
@textComponentBackground=#ffffff
|
@textComponentBackground=#ffffff
|
||||||
@menuBackground=#fff
|
@menuBackground=#fff
|
||||||
|
@menuHoverBackground=darken(@menuBackground,10%)
|
||||||
|
@menuCheckBackground=darken(@menuBackground,10%)
|
||||||
|
@menuCheckHoverBackground=darken(@menuBackground,20%)
|
||||||
@cellFocusColor=#000000
|
@cellFocusColor=#000000
|
||||||
@icon=#afafaf
|
@icon=#afafaf
|
||||||
|
|
||||||
# Button
|
|
||||||
@buttonHoverBackground=darken(3%,autoInverse)
|
|
||||||
@buttonPressedBackground=darken(10%,autoInverse)
|
|
||||||
|
|
||||||
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
|
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
|
||||||
@dropCellBackground=lighten(List.selectionBackground,10%,lazy)
|
@dropCellBackground=lighten(List.selectionBackground,10%,lazy)
|
||||||
@dropCellForeground=lazy(List.selectionForeground)
|
@dropCellForeground=lazy(List.selectionForeground)
|
||||||
@@ -57,7 +56,7 @@
|
|||||||
*.disabledBackground=@background
|
*.disabledBackground=@background
|
||||||
*.disabledForeground=@disabledText
|
*.disabledForeground=@disabledText
|
||||||
*.disabledText=@disabledText
|
*.disabledText=@disabledText
|
||||||
*.acceleratorForeground=#505050
|
*.acceleratorForeground=lighten(@foreground,30%)
|
||||||
*.acceleratorSelectionForeground=@selectionForeground
|
*.acceleratorSelectionForeground=@selectionForeground
|
||||||
|
|
||||||
|
|
||||||
@@ -74,8 +73,8 @@ controlDkShadow=darken($controlShadow,15%)
|
|||||||
|
|
||||||
Button.background=#ffffff
|
Button.background=#ffffff
|
||||||
Button.focusedBackground=#e3f1fa
|
Button.focusedBackground=#e3f1fa
|
||||||
Button.hoverBackground=@buttonHoverBackground
|
Button.hoverBackground=darken($Button.background,3%,derived autoInverse)
|
||||||
Button.pressedBackground=@buttonPressedBackground
|
Button.pressedBackground=darken($Button.background,10%,derived autoInverse)
|
||||||
|
|
||||||
Button.borderColor=$Component.borderColor
|
Button.borderColor=$Component.borderColor
|
||||||
Button.disabledBorderColor=$Component.disabledBorderColor
|
Button.disabledBorderColor=$Component.disabledBorderColor
|
||||||
@@ -85,16 +84,16 @@ Button.hoverBorderColor=$Button.focusedBorderColor
|
|||||||
Button.default.background=$Button.background
|
Button.default.background=$Button.background
|
||||||
Button.default.foreground=@foreground
|
Button.default.foreground=@foreground
|
||||||
Button.default.focusedBackground=$Button.focusedBackground
|
Button.default.focusedBackground=$Button.focusedBackground
|
||||||
Button.default.hoverBackground=@buttonHoverBackground
|
Button.default.hoverBackground=$Button.hoverBackground
|
||||||
Button.default.pressedBackground=@buttonPressedBackground
|
Button.default.pressedBackground=$Button.pressedBackground
|
||||||
Button.default.borderColor=#4F9EE3
|
Button.default.borderColor=#4F9EE3
|
||||||
Button.default.hoverBorderColor=$Button.hoverBorderColor
|
Button.default.hoverBorderColor=$Button.hoverBorderColor
|
||||||
Button.default.focusedBorderColor=$Button.focusedBorderColor
|
Button.default.focusedBorderColor=$Button.focusedBorderColor
|
||||||
Button.default.focusColor=$Component.focusColor
|
Button.default.focusColor=$Component.focusColor
|
||||||
Button.default.borderWidth=2
|
Button.default.borderWidth=2
|
||||||
|
|
||||||
Button.toolbar.hoverBackground=#dfdfdf
|
Button.toolbar.hoverBackground=darken($Button.background,12%,derived autoInverse)
|
||||||
Button.toolbar.pressedBackground=#d8d8d8
|
Button.toolbar.pressedBackground=darken($Button.background,15%,derived autoInverse)
|
||||||
|
|
||||||
|
|
||||||
#---- CheckBox ----
|
#---- CheckBox ----
|
||||||
@@ -107,8 +106,8 @@ CheckBox.icon.hoverBorderColor=$CheckBox.icon.focusedBorderColor
|
|||||||
CheckBox.icon.background=#FFFFFF
|
CheckBox.icon.background=#FFFFFF
|
||||||
CheckBox.icon.disabledBackground=@background
|
CheckBox.icon.disabledBackground=@background
|
||||||
CheckBox.icon.focusedBackground=$Button.focusedBackground
|
CheckBox.icon.focusedBackground=$Button.focusedBackground
|
||||||
CheckBox.icon.hoverBackground=@buttonHoverBackground
|
CheckBox.icon.hoverBackground=$Button.hoverBackground
|
||||||
CheckBox.icon.pressedBackground=@buttonPressedBackground
|
CheckBox.icon.pressedBackground=$Button.pressedBackground
|
||||||
CheckBox.icon.selectedBackground=#FFFFFF
|
CheckBox.icon.selectedBackground=#FFFFFF
|
||||||
CheckBox.icon.checkmarkColor=#4F9EE3
|
CheckBox.icon.checkmarkColor=#4F9EE3
|
||||||
CheckBox.icon.disabledCheckmarkColor=#ABABAB
|
CheckBox.icon.disabledCheckmarkColor=#ABABAB
|
||||||
@@ -131,6 +130,7 @@ Component.disabledBorderColor=#cfcfcf
|
|||||||
Component.focusedBorderColor=#87afda
|
Component.focusedBorderColor=#87afda
|
||||||
Component.focusColor=#97c3f3
|
Component.focusColor=#97c3f3
|
||||||
Component.linkColor=#2470B3
|
Component.linkColor=#2470B3
|
||||||
|
Component.grayFilter=25,-25,100
|
||||||
|
|
||||||
|
|
||||||
#---- Desktop ----
|
#---- Desktop ----
|
||||||
@@ -158,8 +158,8 @@ InternalFrame.inactiveTitleForeground=@disabledText
|
|||||||
InternalFrame.activeBorderColor=darken($Component.borderColor,20%)
|
InternalFrame.activeBorderColor=darken($Component.borderColor,20%)
|
||||||
InternalFrame.inactiveBorderColor=$Component.borderColor
|
InternalFrame.inactiveBorderColor=$Component.borderColor
|
||||||
|
|
||||||
InternalFrame.buttonHoverBackground=darken(10%,autoInverse)
|
InternalFrame.buttonHoverBackground=darken($InternalFrame.activeTitleBackground,10%,derived autoInverse)
|
||||||
InternalFrame.buttonPressedBackground=darken(20%,autoInverse)
|
InternalFrame.buttonPressedBackground=darken($InternalFrame.activeTitleBackground,20%,derived autoInverse)
|
||||||
InternalFrame.closeHoverBackground=lazy(Actions.Red)
|
InternalFrame.closeHoverBackground=lazy(Actions.Red)
|
||||||
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
|
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
|
||||||
InternalFrame.closeHoverForeground=#fff
|
InternalFrame.closeHoverForeground=#fff
|
||||||
@@ -180,7 +180,7 @@ Menu.icon.disabledArrowColor=#ABABAB
|
|||||||
#---- MenuBar ----
|
#---- MenuBar ----
|
||||||
|
|
||||||
MenuBar.borderColor=#cdcdcd
|
MenuBar.borderColor=#cdcdcd
|
||||||
MenuBar.hoverBackground=darken($MenuBar.background,10%)
|
MenuBar.hoverBackground=@menuHoverBackground
|
||||||
|
|
||||||
|
|
||||||
#---- MenuItemCheckBox ----
|
#---- MenuItemCheckBox ----
|
||||||
@@ -225,7 +225,7 @@ Separator.foreground=#d1d1d1
|
|||||||
Slider.trackColor=#c4c4c4
|
Slider.trackColor=#c4c4c4
|
||||||
Slider.thumbColor=#6e6e6e
|
Slider.thumbColor=#6e6e6e
|
||||||
Slider.tickColor=#888888
|
Slider.tickColor=#888888
|
||||||
Slider.hoverColor=lighten(15%,autoInverse)
|
Slider.hoverColor=lighten($Slider.thumbColor,15%,derived autoInverse)
|
||||||
Slider.disabledForeground=#c0c0c0
|
Slider.disabledForeground=#c0c0c0
|
||||||
|
|
||||||
|
|
||||||
@@ -260,15 +260,16 @@ TableHeader.bottomSeparatorColor=$TableHeader.separatorColor
|
|||||||
|
|
||||||
#---- ToggleButton ----
|
#---- ToggleButton ----
|
||||||
|
|
||||||
ToggleButton.selectedBackground=#cfcfcf
|
ToggleButton.selectedBackground=darken($ToggleButton.background,20%,derived autoInverse)
|
||||||
ToggleButton.selectedForeground=@foreground
|
ToggleButton.selectedForeground=@foreground
|
||||||
ToggleButton.disabledSelectedBackground=#dfdfdf
|
ToggleButton.disabledSelectedBackground=darken($ToggleButton.background,13%,derived autoInverse)
|
||||||
|
|
||||||
ToggleButton.toolbar.selectedBackground=#cfcfcf
|
ToggleButton.toolbar.selectedBackground=$ToggleButton.selectedBackground
|
||||||
|
|
||||||
|
|
||||||
#---- ToolTip ----
|
#---- ToolTip ----
|
||||||
|
|
||||||
|
ToolTip.border=4,6,4,6,$InternalFrame.activeBorderColor
|
||||||
ToolTip.background=#fafafa
|
ToolTip.background=#fafafa
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,16 @@
|
|||||||
|
|
||||||
#---- Button ----
|
#---- Button ----
|
||||||
|
|
||||||
|
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.hoverBorderColor=null
|
Button.hoverBorderColor=null
|
||||||
Button.default.hoverBorderColor=null
|
Button.default.hoverBorderColor=null
|
||||||
|
|
||||||
@@ -23,3 +33,32 @@ Button.default.hoverBorderColor=null
|
|||||||
#---- HelpButton ----
|
#---- HelpButton ----
|
||||||
|
|
||||||
HelpButton.hoverBorderColor=null
|
HelpButton.hoverBorderColor=null
|
||||||
|
|
||||||
|
|
||||||
|
#---- ToggleButton ----
|
||||||
|
|
||||||
|
ToggleButton.startBackground=$ToggleButton.background
|
||||||
|
ToggleButton.endBackground=$ToggleButton.background
|
||||||
|
[dark]ToggleButton.selectedBackground=lighten($ToggleButton.background,15%,derived autoInverse)
|
||||||
|
[dark]ToggleButton.disabledSelectedBackground=lighten($ToggleButton.background,5%,derived autoInverse)
|
||||||
|
|
||||||
|
|
||||||
|
#---- theme specific ----
|
||||||
|
|
||||||
|
[Gruvbox_Dark_Hard]ToggleButton.selectedBackground=$ToggleButton.selectedBackground
|
||||||
|
[Gruvbox_Dark_Hard]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground
|
||||||
|
|
||||||
|
[Gruvbox_Dark_Medium]ToggleButton.selectedBackground=$ToggleButton.selectedBackground
|
||||||
|
[Gruvbox_Dark_Medium]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground
|
||||||
|
|
||||||
|
[Gruvbox_Dark_Soft]ToggleButton.selectedBackground=$ToggleButton.selectedBackground
|
||||||
|
[Gruvbox_Dark_Soft]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground
|
||||||
|
|
||||||
|
[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
|
||||||
|
|||||||
13
flatlaf-demo/DemoLaf.properties
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# This file demonstrates using a FlatLaf theme file in the FlatLaf Demo application.
|
||||||
|
# Must be in the working directory of the Demo application.
|
||||||
|
# Shown in the "Themes" list under category "Current Directory".
|
||||||
|
#
|
||||||
|
# Modifications to this file are automatically loaded by the FlatLaf Demo application
|
||||||
|
# when the Demo window is activated.
|
||||||
|
|
||||||
|
|
||||||
|
# base theme (light, dark, intellij or darcula)
|
||||||
|
@baseTheme=light
|
||||||
|
|
||||||
|
# add you theme defaults here
|
||||||
|
@background=#ccc
|
||||||
@@ -30,6 +30,7 @@ plugins {
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation( project( ":flatlaf-core" ) )
|
implementation( project( ":flatlaf-core" ) )
|
||||||
implementation( project( ":flatlaf-extras" ) )
|
implementation( project( ":flatlaf-extras" ) )
|
||||||
|
implementation( project( ":flatlaf-intellij-themes" ) )
|
||||||
implementation( "com.miglayout:miglayout-swing:5.2" )
|
implementation( "com.miglayout:miglayout-swing:5.2" )
|
||||||
implementation( "com.jgoodies:jgoodies-forms:1.9.0" )
|
implementation( "com.jgoodies:jgoodies-forms:1.9.0" )
|
||||||
}
|
}
|
||||||
@@ -38,12 +39,16 @@ tasks {
|
|||||||
jar {
|
jar {
|
||||||
dependsOn( ":flatlaf-core:jar" )
|
dependsOn( ":flatlaf-core:jar" )
|
||||||
dependsOn( ":flatlaf-extras:jar" )
|
dependsOn( ":flatlaf-extras:jar" )
|
||||||
|
dependsOn( ":flatlaf-intellij-themes:jar" )
|
||||||
|
|
||||||
manifest {
|
manifest {
|
||||||
attributes( "Main-Class" to "com.formdev.flatlaf.demo.FlatLafDemo" )
|
attributes( "Main-Class" to "com.formdev.flatlaf.demo.FlatLafDemo" )
|
||||||
|
|
||||||
|
if( JavaVersion.current() >= JavaVersion.VERSION_1_9 )
|
||||||
|
attributes( "Multi-Release" to "true" )
|
||||||
}
|
}
|
||||||
|
|
||||||
exclude( "META-INF/versions/**" )
|
exclude( "module-info.class" )
|
||||||
|
|
||||||
// include all dependencies in jar
|
// include all dependencies in jar
|
||||||
from( {
|
from( {
|
||||||
|
|||||||
@@ -310,14 +310,13 @@ class BasicComponentsPanel
|
|||||||
add(comboBox4, "cell 4 4,growx");
|
add(comboBox4, "cell 4 4,growx");
|
||||||
|
|
||||||
//---- comboBox5 ----
|
//---- comboBox5 ----
|
||||||
comboBox5.setPrototypeDisplayValue("12345");
|
|
||||||
comboBox5.setModel(new DefaultComboBoxModel<>(new String[] {
|
comboBox5.setModel(new DefaultComboBoxModel<>(new String[] {
|
||||||
"wide popup if text is longer",
|
"wide popup if text is longer",
|
||||||
"aa",
|
"aa",
|
||||||
"bbb",
|
"bbb",
|
||||||
"cccc"
|
"cccc"
|
||||||
}));
|
}));
|
||||||
add(comboBox5, "cell 5 4,growx");
|
add(comboBox5, "cell 5 4,growx,wmax 100");
|
||||||
|
|
||||||
//---- spinnerLabel ----
|
//---- spinnerLabel ----
|
||||||
spinnerLabel.setText("JSpinner:");
|
spinnerLabel.setText("JSpinner:");
|
||||||
@@ -603,14 +602,17 @@ class BasicComponentsPanel
|
|||||||
|
|
||||||
//---- cutMenuItem ----
|
//---- cutMenuItem ----
|
||||||
cutMenuItem.setText("Cut");
|
cutMenuItem.setText("Cut");
|
||||||
|
cutMenuItem.setMnemonic('C');
|
||||||
popupMenu1.add(cutMenuItem);
|
popupMenu1.add(cutMenuItem);
|
||||||
|
|
||||||
//---- copyMenuItem ----
|
//---- copyMenuItem ----
|
||||||
copyMenuItem.setText("Copy");
|
copyMenuItem.setText("Copy");
|
||||||
|
copyMenuItem.setMnemonic('O');
|
||||||
popupMenu1.add(copyMenuItem);
|
popupMenu1.add(copyMenuItem);
|
||||||
|
|
||||||
//---- pasteMenuItem ----
|
//---- pasteMenuItem ----
|
||||||
pasteMenuItem.setText("Paste");
|
pasteMenuItem.setText("Paste");
|
||||||
|
pasteMenuItem.setMnemonic('P');
|
||||||
popupMenu1.add(pasteMenuItem);
|
popupMenu1.add(pasteMenuItem);
|
||||||
}
|
}
|
||||||
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
||||||
|
|||||||
@@ -242,7 +242,6 @@ new FormModel {
|
|||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JComboBox" ) {
|
add( new FormComponent( "javax.swing.JComboBox" ) {
|
||||||
name: "comboBox5"
|
name: "comboBox5"
|
||||||
"prototypeDisplayValue": "12345"
|
|
||||||
"model": new javax.swing.DefaultComboBoxModel {
|
"model": new javax.swing.DefaultComboBoxModel {
|
||||||
selectedItem: "wide popup if text is longer"
|
selectedItem: "wide popup if text is longer"
|
||||||
addElement( "wide popup if text is longer" )
|
addElement( "wide popup if text is longer" )
|
||||||
@@ -251,7 +250,7 @@ new FormModel {
|
|||||||
addElement( "cccc" )
|
addElement( "cccc" )
|
||||||
}
|
}
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 5 4,growx"
|
"value": "cell 5 4,growx,wmax 100"
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
name: "spinnerLabel"
|
name: "spinnerLabel"
|
||||||
@@ -602,14 +601,17 @@ new FormModel {
|
|||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "cutMenuItem"
|
name: "cutMenuItem"
|
||||||
"text": "Cut"
|
"text": "Cut"
|
||||||
|
"mnemonic": 67
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "copyMenuItem"
|
name: "copyMenuItem"
|
||||||
"text": "Copy"
|
"text": "Copy"
|
||||||
|
"mnemonic": 79
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "pasteMenuItem"
|
name: "pasteMenuItem"
|
||||||
"text": "Paste"
|
"text": "Paste"
|
||||||
|
"mnemonic": 80
|
||||||
} )
|
} )
|
||||||
}, new FormLayoutConstraints( null ) {
|
}, new FormLayoutConstraints( null ) {
|
||||||
"location": new java.awt.Point( 0, 500 )
|
"location": new java.awt.Point( 0, 500 )
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class ControlBar
|
|||||||
(SystemInfo.IS_LINUX && className.equals( "com.sun.java.swing.plaf.gtk.GTKLookAndFeel") ) )
|
(SystemInfo.IS_LINUX && className.equals( "com.sun.java.swing.plaf.gtk.GTKLookAndFeel") ) )
|
||||||
name += " (F9)";
|
name += " (F9)";
|
||||||
else if( className.equals( MetalLookAndFeel.class.getName() ) )
|
else if( className.equals( MetalLookAndFeel.class.getName() ) )
|
||||||
name += " (F10)";
|
name += " (F12)";
|
||||||
else if( className.equals( NimbusLookAndFeel.class.getName() ) )
|
else if( className.equals( NimbusLookAndFeel.class.getName() ) )
|
||||||
name += " (F11)";
|
name += " (F11)";
|
||||||
|
|
||||||
@@ -83,6 +83,11 @@ class ControlBar
|
|||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
UIScale.addPropertyChangeListener( e -> {
|
||||||
|
// update info label because user scale factor may change
|
||||||
|
updateInfoLabel();
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
void initialize( JFrame frame, JTabbedPane tabbedPane ) {
|
void initialize( JFrame frame, JTabbedPane tabbedPane ) {
|
||||||
@@ -101,7 +106,7 @@ class ControlBar
|
|||||||
registerSwitchToLookAndFeel( KeyEvent.VK_F9, "com.apple.laf.AquaLookAndFeel" );
|
registerSwitchToLookAndFeel( KeyEvent.VK_F9, "com.apple.laf.AquaLookAndFeel" );
|
||||||
else if( SystemInfo.IS_LINUX )
|
else if( SystemInfo.IS_LINUX )
|
||||||
registerSwitchToLookAndFeel( KeyEvent.VK_F9, "com.sun.java.swing.plaf.gtk.GTKLookAndFeel" );
|
registerSwitchToLookAndFeel( KeyEvent.VK_F9, "com.sun.java.swing.plaf.gtk.GTKLookAndFeel" );
|
||||||
registerSwitchToLookAndFeel( KeyEvent.VK_F10, MetalLookAndFeel.class.getName() );
|
registerSwitchToLookAndFeel( KeyEvent.VK_F12, MetalLookAndFeel.class.getName() );
|
||||||
registerSwitchToLookAndFeel( KeyEvent.VK_F11, NimbusLookAndFeel.class.getName() );
|
registerSwitchToLookAndFeel( KeyEvent.VK_F11, NimbusLookAndFeel.class.getName() );
|
||||||
|
|
||||||
// register ESC key to close frame
|
// register ESC key to close frame
|
||||||
|
|||||||
@@ -81,6 +81,11 @@ class DataComponentsPanel
|
|||||||
JScrollPane scrollPane5 = new JScrollPane();
|
JScrollPane scrollPane5 = new JScrollPane();
|
||||||
table1 = new JTable();
|
table1 = new JTable();
|
||||||
dndCheckBox = new JCheckBox();
|
dndCheckBox = new JCheckBox();
|
||||||
|
JPopupMenu popupMenu2 = new JPopupMenu();
|
||||||
|
JMenuItem menuItem3 = new JMenuItem();
|
||||||
|
JMenuItem menuItem4 = new JMenuItem();
|
||||||
|
JMenuItem menuItem5 = new JMenuItem();
|
||||||
|
JMenuItem menuItem6 = new JMenuItem();
|
||||||
|
|
||||||
//======== this ========
|
//======== this ========
|
||||||
setLayout(new MigLayout(
|
setLayout(new MigLayout(
|
||||||
@@ -126,6 +131,7 @@ class DataComponentsPanel
|
|||||||
@Override
|
@Override
|
||||||
public String getElementAt(int i) { return values[i]; }
|
public String getElementAt(int i) { return values[i]; }
|
||||||
});
|
});
|
||||||
|
list1.setComponentPopupMenu(popupMenu2);
|
||||||
scrollPane1.setViewportView(list1);
|
scrollPane1.setViewportView(list1);
|
||||||
}
|
}
|
||||||
add(scrollPane1, "cell 1 0,growx");
|
add(scrollPane1, "cell 1 0,growx");
|
||||||
@@ -198,6 +204,7 @@ class DataComponentsPanel
|
|||||||
add(node1);
|
add(node1);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
tree1.setComponentPopupMenu(popupMenu2);
|
||||||
scrollPane3.setViewportView(tree1);
|
scrollPane3.setViewportView(tree1);
|
||||||
}
|
}
|
||||||
add(scrollPane3, "cell 1 1,growx");
|
add(scrollPane3, "cell 1 1,growx");
|
||||||
@@ -287,6 +294,7 @@ class DataComponentsPanel
|
|||||||
}))));
|
}))));
|
||||||
}
|
}
|
||||||
table1.setAutoCreateRowSorter(true);
|
table1.setAutoCreateRowSorter(true);
|
||||||
|
table1.setComponentPopupMenu(popupMenu2);
|
||||||
scrollPane5.setViewportView(table1);
|
scrollPane5.setViewportView(table1);
|
||||||
}
|
}
|
||||||
add(scrollPane5, "cell 1 2 2 1,growx,width 300");
|
add(scrollPane5, "cell 1 2 2 1,growx,width 300");
|
||||||
@@ -296,6 +304,27 @@ class DataComponentsPanel
|
|||||||
dndCheckBox.setMnemonic('D');
|
dndCheckBox.setMnemonic('D');
|
||||||
dndCheckBox.addActionListener(e -> dndChanged());
|
dndCheckBox.addActionListener(e -> dndChanged());
|
||||||
add(dndCheckBox, "cell 0 3 3 1");
|
add(dndCheckBox, "cell 0 3 3 1");
|
||||||
|
|
||||||
|
//======== popupMenu2 ========
|
||||||
|
{
|
||||||
|
|
||||||
|
//---- menuItem3 ----
|
||||||
|
menuItem3.setText("Some Action");
|
||||||
|
popupMenu2.add(menuItem3);
|
||||||
|
|
||||||
|
//---- menuItem4 ----
|
||||||
|
menuItem4.setText("More Action");
|
||||||
|
popupMenu2.add(menuItem4);
|
||||||
|
popupMenu2.addSeparator();
|
||||||
|
|
||||||
|
//---- menuItem5 ----
|
||||||
|
menuItem5.setText("No Action");
|
||||||
|
popupMenu2.add(menuItem5);
|
||||||
|
|
||||||
|
//---- menuItem6 ----
|
||||||
|
menuItem6.setText("Noop Action");
|
||||||
|
popupMenu2.add(menuItem6);
|
||||||
|
}
|
||||||
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
||||||
|
|
||||||
((JComboBox)((DefaultCellEditor)table1.getColumnModel().getColumn( 3 ).getCellEditor()).getComponent()).setEditable( true );
|
((JComboBox)((DefaultCellEditor)table1.getColumnModel().getColumn( 3 ).getCellEditor()).getComponent()).setEditable( true );
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
JFDML JFormDesigner: "7.0.0.0.194" Java: "13.0.1" encoding: "UTF-8"
|
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.2" encoding: "UTF-8"
|
||||||
|
|
||||||
new FormModel {
|
new FormModel {
|
||||||
contentType: "form/swing"
|
contentType: "form/swing"
|
||||||
@@ -39,6 +39,7 @@ new FormModel {
|
|||||||
addElement( "item 14" )
|
addElement( "item 14" )
|
||||||
addElement( "item 15" )
|
addElement( "item 15" )
|
||||||
}
|
}
|
||||||
|
"componentPopupMenu": new FormReference( "popupMenu2" )
|
||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.typeParameters": "String"
|
"JavaCodeGenerator.typeParameters": "String"
|
||||||
"JavaCodeGenerator.variableLocal": false
|
"JavaCodeGenerator.variableLocal": false
|
||||||
@@ -143,6 +144,7 @@ new FormModel {
|
|||||||
} )
|
} )
|
||||||
} )
|
} )
|
||||||
} )
|
} )
|
||||||
|
"componentPopupMenu": new FormReference( "popupMenu2" )
|
||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.variableLocal": false
|
"JavaCodeGenerator.variableLocal": false
|
||||||
}
|
}
|
||||||
@@ -299,6 +301,7 @@ new FormModel {
|
|||||||
add( null )
|
add( null )
|
||||||
} )
|
} )
|
||||||
"autoCreateRowSorter": true
|
"autoCreateRowSorter": true
|
||||||
|
"componentPopupMenu": new FormReference( "popupMenu2" )
|
||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.variableLocal": false
|
"JavaCodeGenerator.variableLocal": false
|
||||||
}
|
}
|
||||||
@@ -321,5 +324,29 @@ new FormModel {
|
|||||||
"location": new java.awt.Point( 0, 0 )
|
"location": new java.awt.Point( 0, 0 )
|
||||||
"size": new java.awt.Dimension( 790, 715 )
|
"size": new java.awt.Dimension( 790, 715 )
|
||||||
} )
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPopupMenu", new FormLayoutManager( class javax.swing.JPopupMenu ) ) {
|
||||||
|
name: "popupMenu2"
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "menuItem3"
|
||||||
|
"text": "Some Action"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "menuItem4"
|
||||||
|
"text": "More Action"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
||||||
|
name: "separator1"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "menuItem5"
|
||||||
|
"text": "No Action"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "menuItem6"
|
||||||
|
"text": "Noop Action"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( null ) {
|
||||||
|
"location": new java.awt.Point( 0, 740 )
|
||||||
|
} )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ import java.awt.*;
|
|||||||
import java.awt.event.*;
|
import java.awt.event.*;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import javax.swing.text.DefaultEditorKit;
|
import javax.swing.text.DefaultEditorKit;
|
||||||
|
import com.formdev.flatlaf.FlatLaf;
|
||||||
|
import com.formdev.flatlaf.demo.extras.*;
|
||||||
import com.formdev.flatlaf.demo.intellijthemes.*;
|
import com.formdev.flatlaf.demo.intellijthemes.*;
|
||||||
import com.formdev.flatlaf.extras.FlatSVGIcon;
|
import com.formdev.flatlaf.extras.FlatSVGIcon;
|
||||||
import net.miginfocom.swing.*;
|
import net.miginfocom.swing.*;
|
||||||
@@ -52,12 +54,57 @@ class DemoFrame
|
|||||||
DemoPrefs.getState().putInt( FlatLafDemo.KEY_TAB, tabbedPane.getSelectedIndex() );
|
DemoPrefs.getState().putInt( FlatLafDemo.KEY_TAB, tabbedPane.getSelectedIndex() );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void menuItemActionPerformed(ActionEvent e) {
|
private void menuItemActionPerformed( ActionEvent e ) {
|
||||||
SwingUtilities.invokeLater( () -> {
|
SwingUtilities.invokeLater( () -> {
|
||||||
JOptionPane.showMessageDialog( this, e.getActionCommand(), "Menu Item", JOptionPane.PLAIN_MESSAGE );
|
JOptionPane.showMessageDialog( this, e.getActionCommand(), "Menu Item", JOptionPane.PLAIN_MESSAGE );
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void underlineMenuSelection() {
|
||||||
|
UIManager.put( "MenuItem.selectionType", underlineMenuSelectionMenuItem.isSelected() ? "underline" : null );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fontFamilyChanged( ActionEvent e ) {
|
||||||
|
String fontFamily = e.getActionCommand();
|
||||||
|
|
||||||
|
Font font = UIManager.getFont( "defaultFont" );
|
||||||
|
Font newFont = new Font( fontFamily, font.getStyle(), font.getSize() );
|
||||||
|
UIManager.put( "defaultFont", newFont );
|
||||||
|
|
||||||
|
FlatLaf.updateUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fontSizeChanged( ActionEvent e ) {
|
||||||
|
String fontSizeStr = e.getActionCommand();
|
||||||
|
|
||||||
|
Font font = UIManager.getFont( "defaultFont" );
|
||||||
|
Font newFont = font.deriveFont( (float) Integer.parseInt( fontSizeStr ) );
|
||||||
|
UIManager.put( "defaultFont", newFont );
|
||||||
|
|
||||||
|
FlatLaf.updateUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void restoreFont() {
|
||||||
|
UIManager.put( "defaultFont", null );
|
||||||
|
FlatLaf.updateUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void incrFont() {
|
||||||
|
Font font = UIManager.getFont( "defaultFont" );
|
||||||
|
Font newFont = font.deriveFont( (float) (font.getSize() + 1) );
|
||||||
|
UIManager.put( "defaultFont", newFont );
|
||||||
|
|
||||||
|
FlatLaf.updateUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void decrFont() {
|
||||||
|
Font font = UIManager.getFont( "defaultFont" );
|
||||||
|
Font newFont = font.deriveFont( (float) Math.max( font.getSize() - 1, 8 ) );
|
||||||
|
UIManager.put( "defaultFont", newFont );
|
||||||
|
|
||||||
|
FlatLaf.updateUI();
|
||||||
|
}
|
||||||
|
|
||||||
private void initComponents() {
|
private void initComponents() {
|
||||||
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
||||||
JMenuBar menuBar1 = new JMenuBar();
|
JMenuBar menuBar1 = new JMenuBar();
|
||||||
@@ -83,9 +130,16 @@ class DemoFrame
|
|||||||
JMenuItem projectViewMenuItem = new JMenuItem();
|
JMenuItem projectViewMenuItem = new JMenuItem();
|
||||||
JMenuItem structureViewMenuItem = new JMenuItem();
|
JMenuItem structureViewMenuItem = new JMenuItem();
|
||||||
JMenuItem propertiesViewMenuItem = new JMenuItem();
|
JMenuItem propertiesViewMenuItem = new JMenuItem();
|
||||||
|
JMenuItem menuItem1 = new JMenuItem();
|
||||||
JRadioButtonMenuItem radioButtonMenuItem1 = new JRadioButtonMenuItem();
|
JRadioButtonMenuItem radioButtonMenuItem1 = new JRadioButtonMenuItem();
|
||||||
JRadioButtonMenuItem radioButtonMenuItem2 = new JRadioButtonMenuItem();
|
JRadioButtonMenuItem radioButtonMenuItem2 = new JRadioButtonMenuItem();
|
||||||
JRadioButtonMenuItem radioButtonMenuItem3 = new JRadioButtonMenuItem();
|
JRadioButtonMenuItem radioButtonMenuItem3 = new JRadioButtonMenuItem();
|
||||||
|
fontMenu = new JMenu();
|
||||||
|
JMenuItem restoreFontMenuItem = new JMenuItem();
|
||||||
|
JMenuItem incrFontMenuItem = new JMenuItem();
|
||||||
|
JMenuItem decrFontMenuItem = new JMenuItem();
|
||||||
|
JMenu optionsMenu = new JMenu();
|
||||||
|
underlineMenuSelectionMenuItem = new JCheckBoxMenuItem();
|
||||||
JMenu helpMenu = new JMenu();
|
JMenu helpMenu = new JMenu();
|
||||||
JMenuItem aboutMenuItem = new JMenuItem();
|
JMenuItem aboutMenuItem = new JMenuItem();
|
||||||
JToolBar toolBar1 = new JToolBar();
|
JToolBar toolBar1 = new JToolBar();
|
||||||
@@ -103,6 +157,7 @@ class DemoFrame
|
|||||||
DataComponentsPanel dataComponentsPanel = new DataComponentsPanel();
|
DataComponentsPanel dataComponentsPanel = new DataComponentsPanel();
|
||||||
TabsPanel tabsPanel = new TabsPanel();
|
TabsPanel tabsPanel = new TabsPanel();
|
||||||
OptionPanePanel optionPanePanel = new OptionPanePanel();
|
OptionPanePanel optionPanePanel = new OptionPanePanel();
|
||||||
|
ExtrasPanel extrasPanel1 = new ExtrasPanel();
|
||||||
controlBar = new ControlBar();
|
controlBar = new ControlBar();
|
||||||
IJThemesPanel themesPanel = new IJThemesPanel();
|
IJThemesPanel themesPanel = new IJThemesPanel();
|
||||||
|
|
||||||
@@ -262,6 +317,10 @@ class DemoFrame
|
|||||||
menu1.add(propertiesViewMenuItem);
|
menu1.add(propertiesViewMenuItem);
|
||||||
}
|
}
|
||||||
viewMenu.add(menu1);
|
viewMenu.add(menu1);
|
||||||
|
|
||||||
|
//---- menuItem1 ----
|
||||||
|
menuItem1.setText("<html>some <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>");
|
||||||
|
viewMenu.add(menuItem1);
|
||||||
viewMenu.addSeparator();
|
viewMenu.addSeparator();
|
||||||
|
|
||||||
//---- radioButtonMenuItem1 ----
|
//---- radioButtonMenuItem1 ----
|
||||||
@@ -285,6 +344,41 @@ class DemoFrame
|
|||||||
}
|
}
|
||||||
menuBar1.add(viewMenu);
|
menuBar1.add(viewMenu);
|
||||||
|
|
||||||
|
//======== fontMenu ========
|
||||||
|
{
|
||||||
|
fontMenu.setText("Font");
|
||||||
|
|
||||||
|
//---- restoreFontMenuItem ----
|
||||||
|
restoreFontMenuItem.setText("Restore Font");
|
||||||
|
restoreFontMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_0, KeyEvent.CTRL_MASK));
|
||||||
|
restoreFontMenuItem.addActionListener(e -> restoreFont());
|
||||||
|
fontMenu.add(restoreFontMenuItem);
|
||||||
|
|
||||||
|
//---- incrFontMenuItem ----
|
||||||
|
incrFontMenuItem.setText("Increase Font Size");
|
||||||
|
incrFontMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, KeyEvent.CTRL_MASK));
|
||||||
|
incrFontMenuItem.addActionListener(e -> incrFont());
|
||||||
|
fontMenu.add(incrFontMenuItem);
|
||||||
|
|
||||||
|
//---- decrFontMenuItem ----
|
||||||
|
decrFontMenuItem.setText("Decrease Font Size");
|
||||||
|
decrFontMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, KeyEvent.CTRL_MASK));
|
||||||
|
decrFontMenuItem.addActionListener(e -> decrFont());
|
||||||
|
fontMenu.add(decrFontMenuItem);
|
||||||
|
}
|
||||||
|
menuBar1.add(fontMenu);
|
||||||
|
|
||||||
|
//======== optionsMenu ========
|
||||||
|
{
|
||||||
|
optionsMenu.setText("Options");
|
||||||
|
|
||||||
|
//---- underlineMenuSelectionMenuItem ----
|
||||||
|
underlineMenuSelectionMenuItem.setText("Use underline menu selection");
|
||||||
|
underlineMenuSelectionMenuItem.addActionListener(e -> underlineMenuSelection());
|
||||||
|
optionsMenu.add(underlineMenuSelectionMenuItem);
|
||||||
|
}
|
||||||
|
menuBar1.add(optionsMenu);
|
||||||
|
|
||||||
//======== helpMenu ========
|
//======== helpMenu ========
|
||||||
{
|
{
|
||||||
helpMenu.setText("Help");
|
helpMenu.setText("Help");
|
||||||
@@ -355,6 +449,7 @@ class DemoFrame
|
|||||||
tabbedPane.addTab("Data Components", dataComponentsPanel);
|
tabbedPane.addTab("Data Components", dataComponentsPanel);
|
||||||
tabbedPane.addTab("SplitPane & Tabs", tabsPanel);
|
tabbedPane.addTab("SplitPane & Tabs", tabsPanel);
|
||||||
tabbedPane.addTab("Option Pane", optionPanePanel);
|
tabbedPane.addTab("Option Pane", optionPanePanel);
|
||||||
|
tabbedPane.addTab("Extras", extrasPanel1);
|
||||||
}
|
}
|
||||||
contentPanel.add(tabbedPane, "cell 0 0");
|
contentPanel.add(tabbedPane, "cell 0 0");
|
||||||
}
|
}
|
||||||
@@ -387,9 +482,31 @@ class DemoFrame
|
|||||||
cutMenuItem.addActionListener( new DefaultEditorKit.CutAction() );
|
cutMenuItem.addActionListener( new DefaultEditorKit.CutAction() );
|
||||||
copyMenuItem.addActionListener( new DefaultEditorKit.CopyAction() );
|
copyMenuItem.addActionListener( new DefaultEditorKit.CopyAction() );
|
||||||
pasteMenuItem.addActionListener( new DefaultEditorKit.PasteAction() );
|
pasteMenuItem.addActionListener( new DefaultEditorKit.PasteAction() );
|
||||||
|
|
||||||
|
// add font families
|
||||||
|
fontMenu.addSeparator();
|
||||||
|
String[] fontFamilies = { "Arial", "Comic Sans MS", "Courier New", "Dialog",
|
||||||
|
"Monospaced", "SansSerif", "Serif", "Tahoma", "Verdana" };
|
||||||
|
for( String fontFamily : fontFamilies ) {
|
||||||
|
JMenuItem fontItem = new JMenuItem( fontFamily );
|
||||||
|
fontItem.addActionListener( this::fontFamilyChanged );
|
||||||
|
fontMenu.add( fontItem );
|
||||||
|
}
|
||||||
|
|
||||||
|
// add font sizes
|
||||||
|
fontMenu.addSeparator();
|
||||||
|
int[] fontSizes = { 8, 10, 12, 14, 16, 18, 20, 24, 28 };
|
||||||
|
for( int fontSize : fontSizes ) {
|
||||||
|
String fontSizeStr = Integer.toString( fontSize );
|
||||||
|
JMenuItem fontItem = new JMenuItem( fontSizeStr );
|
||||||
|
fontItem.addActionListener( this::fontSizeChanged );
|
||||||
|
fontMenu.add( fontItem );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
|
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
|
||||||
|
private JMenu fontMenu;
|
||||||
|
private JCheckBoxMenuItem underlineMenuSelectionMenuItem;
|
||||||
private JTabbedPane tabbedPane;
|
private JTabbedPane tabbedPane;
|
||||||
private ControlBar controlBar;
|
private ControlBar controlBar;
|
||||||
// JFormDesigner - End of variables declaration //GEN-END:variables
|
// JFormDesigner - End of variables declaration //GEN-END:variables
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
JFDML JFormDesigner: "7.0.0.0.194" Java: "13.0.1" encoding: "UTF-8"
|
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.2" encoding: "UTF-8"
|
||||||
|
|
||||||
new FormModel {
|
new FormModel {
|
||||||
contentType: "form/swing"
|
contentType: "form/swing"
|
||||||
@@ -93,6 +93,11 @@ new FormModel {
|
|||||||
}, new FormLayoutConstraints( null ) {
|
}, new FormLayoutConstraints( null ) {
|
||||||
"title": "Option Pane"
|
"title": "Option Pane"
|
||||||
} )
|
} )
|
||||||
|
add( new FormComponent( "com.formdev.flatlaf.demo.extras.ExtrasPanel" ) {
|
||||||
|
name: "extrasPanel1"
|
||||||
|
}, new FormLayoutConstraints( null ) {
|
||||||
|
"title": "Extras"
|
||||||
|
} )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 0 0"
|
"value": "cell 0 0"
|
||||||
} )
|
} )
|
||||||
@@ -259,6 +264,10 @@ new FormModel {
|
|||||||
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
} )
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "menuItem1"
|
||||||
|
"text": "<html>some <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>"
|
||||||
|
} )
|
||||||
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
||||||
name: "separator8"
|
name: "separator8"
|
||||||
} )
|
} )
|
||||||
@@ -285,6 +294,43 @@ new FormModel {
|
|||||||
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
} )
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
|
name: "fontMenu"
|
||||||
|
"text": "Font"
|
||||||
|
auxiliary() {
|
||||||
|
"JavaCodeGenerator.variableLocal": false
|
||||||
|
}
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "restoreFontMenuItem"
|
||||||
|
"text": "Restore Font"
|
||||||
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 48, 130, false )
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "restoreFont", false ) )
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "incrFontMenuItem"
|
||||||
|
"text": "Increase Font Size"
|
||||||
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 521, 130, false )
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "incrFont", false ) )
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "decrFontMenuItem"
|
||||||
|
"text": "Decrease Font Size"
|
||||||
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 45, 130, false )
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "decrFont", false ) )
|
||||||
|
} )
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
|
name: "optionsMenu"
|
||||||
|
"text": "Options"
|
||||||
|
add( new FormComponent( "javax.swing.JCheckBoxMenuItem" ) {
|
||||||
|
name: "underlineMenuSelectionMenuItem"
|
||||||
|
"text": "Use underline menu selection"
|
||||||
|
auxiliary() {
|
||||||
|
"JavaCodeGenerator.variableLocal": false
|
||||||
|
}
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "underlineMenuSelection", false ) )
|
||||||
|
} )
|
||||||
|
} )
|
||||||
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
name: "helpMenu"
|
name: "helpMenu"
|
||||||
"text": "Help"
|
"text": "Help"
|
||||||
|
|||||||
@@ -16,13 +16,16 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.demo;
|
package com.formdev.flatlaf.demo;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.util.prefs.Preferences;
|
import java.util.prefs.Preferences;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import com.formdev.flatlaf.FlatLaf;
|
import com.formdev.flatlaf.FlatLaf;
|
||||||
import com.formdev.flatlaf.FlatLightLaf;
|
import com.formdev.flatlaf.FlatLightLaf;
|
||||||
|
import com.formdev.flatlaf.FlatPropertiesLaf;
|
||||||
import com.formdev.flatlaf.IntelliJTheme;
|
import com.formdev.flatlaf.IntelliJTheme;
|
||||||
import com.formdev.flatlaf.demo.intellijthemes.IJThemesPanel;
|
import com.formdev.flatlaf.demo.intellijthemes.IJThemesPanel;
|
||||||
|
import com.formdev.flatlaf.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
@@ -30,12 +33,12 @@ import com.formdev.flatlaf.demo.intellijthemes.IJThemesPanel;
|
|||||||
public class DemoPrefs
|
public class DemoPrefs
|
||||||
{
|
{
|
||||||
public static final String KEY_LAF = "laf";
|
public static final String KEY_LAF = "laf";
|
||||||
public static final String KEY_LAF_INTELLIJ_THEME = "lafIntelliJTheme";
|
public static final String KEY_LAF_THEME = "lafTheme";
|
||||||
|
|
||||||
public static final String RESOURCE_PREFIX = "res:";
|
public static final String RESOURCE_PREFIX = "res:";
|
||||||
public static final String FILE_PREFIX = "file:";
|
public static final String FILE_PREFIX = "file:";
|
||||||
|
|
||||||
public static final String INTELLIJ_THEME_UI_KEY = "__FlatLaf.demo.intelliJTheme";
|
public static final String THEME_UI_KEY = "__FlatLaf.demo.theme";
|
||||||
|
|
||||||
private static Preferences state;
|
private static Preferences state;
|
||||||
|
|
||||||
@@ -55,16 +58,27 @@ public class DemoPrefs
|
|||||||
else {
|
else {
|
||||||
String lafClassName = state.get( KEY_LAF, FlatLightLaf.class.getName() );
|
String lafClassName = state.get( KEY_LAF, FlatLightLaf.class.getName() );
|
||||||
if( IntelliJTheme.ThemeLaf.class.getName().equals( lafClassName ) ) {
|
if( IntelliJTheme.ThemeLaf.class.getName().equals( lafClassName ) ) {
|
||||||
String intelliJTheme = state.get( KEY_LAF_INTELLIJ_THEME, "" );
|
String theme = state.get( KEY_LAF_THEME, "" );
|
||||||
if( intelliJTheme.startsWith( RESOURCE_PREFIX ) )
|
if( theme.startsWith( RESOURCE_PREFIX ) )
|
||||||
IntelliJTheme.install( IJThemesPanel.class.getResourceAsStream( intelliJTheme.substring( RESOURCE_PREFIX.length() ) ) );
|
IntelliJTheme.install( IJThemesPanel.class.getResourceAsStream( IJThemesPanel.THEMES_PACKAGE + theme.substring( RESOURCE_PREFIX.length() ) ) );
|
||||||
else if( intelliJTheme.startsWith( FILE_PREFIX ) )
|
else if( theme.startsWith( FILE_PREFIX ) )
|
||||||
FlatLaf.install( IntelliJTheme.createLaf( new FileInputStream( intelliJTheme.substring( FILE_PREFIX.length() ) ) ) );
|
FlatLaf.install( IntelliJTheme.createLaf( new FileInputStream( theme.substring( FILE_PREFIX.length() ) ) ) );
|
||||||
else
|
else
|
||||||
FlatLightLaf.install();
|
FlatLightLaf.install();
|
||||||
|
|
||||||
if( !intelliJTheme.isEmpty() )
|
if( !theme.isEmpty() )
|
||||||
UIManager.getLookAndFeelDefaults().put( INTELLIJ_THEME_UI_KEY, intelliJTheme );
|
UIManager.getLookAndFeelDefaults().put( THEME_UI_KEY, theme );
|
||||||
|
} else if( FlatPropertiesLaf.class.getName().equals( lafClassName ) ) {
|
||||||
|
String theme = state.get( KEY_LAF_THEME, "" );
|
||||||
|
if( theme.startsWith( FILE_PREFIX ) ) {
|
||||||
|
File themeFile = new File( theme.substring( FILE_PREFIX.length() ) );
|
||||||
|
String themeName = StringUtils.removeTrailing( themeFile.getName(), ".properties" );
|
||||||
|
FlatLaf.install( new FlatPropertiesLaf( themeName, themeFile ) );
|
||||||
|
} else
|
||||||
|
FlatLightLaf.install();
|
||||||
|
|
||||||
|
if( !theme.isEmpty() )
|
||||||
|
UIManager.getLookAndFeelDefaults().put( THEME_UI_KEY, theme );
|
||||||
} else
|
} else
|
||||||
UIManager.setLookAndFeel( lafClassName );
|
UIManager.setLookAndFeel( lafClassName );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.formdev.flatlaf.demo;
|
package com.formdev.flatlaf.demo;
|
||||||
|
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
@@ -27,6 +28,9 @@ public class FlatLafDemo
|
|||||||
static final String KEY_TAB = "tab";
|
static final String KEY_TAB = "tab";
|
||||||
|
|
||||||
public static void main( String[] args ) {
|
public static void main( String[] args ) {
|
||||||
|
if( SystemInfo.IS_MAC )
|
||||||
|
System.setProperty( "apple.laf.useScreenMenuBar", "true" );
|
||||||
|
|
||||||
SwingUtilities.invokeLater( () -> {
|
SwingUtilities.invokeLater( () -> {
|
||||||
DemoPrefs.init( PREFS_ROOT_PATH );
|
DemoPrefs.init( PREFS_ROOT_PATH );
|
||||||
|
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ class MoreComponentsPanel
|
|||||||
JButton button7 = new JButton();
|
JButton button7 = new JButton();
|
||||||
JButton button8 = new JButton();
|
JButton button8 = new JButton();
|
||||||
JToggleButton toggleButton6 = new JToggleButton();
|
JToggleButton toggleButton6 = new JToggleButton();
|
||||||
|
JButton button1 = new JButton();
|
||||||
|
|
||||||
//======== this ========
|
//======== this ========
|
||||||
setLayout(new MigLayout(
|
setLayout(new MigLayout(
|
||||||
@@ -380,6 +381,11 @@ class MoreComponentsPanel
|
|||||||
toggleButton6.setIcon(UIManager.getIcon("Tree.leafIcon"));
|
toggleButton6.setIcon(UIManager.getIcon("Tree.leafIcon"));
|
||||||
toggleButton6.setSelected(true);
|
toggleButton6.setSelected(true);
|
||||||
toolBar1.add(toggleButton6);
|
toolBar1.add(toggleButton6);
|
||||||
|
|
||||||
|
//---- button1 ----
|
||||||
|
button1.setIcon(new ImageIcon(getClass().getResource("/com/formdev/flatlaf/demo/icons/intellij-showWriteAccess.png")));
|
||||||
|
button1.setEnabled(false);
|
||||||
|
toolBar1.add(button1);
|
||||||
}
|
}
|
||||||
add(toolBar1, "cell 1 10 3 1,growx");
|
add(toolBar1, "cell 1 10 3 1,growx");
|
||||||
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8"
|
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.2" encoding: "UTF-8"
|
||||||
|
|
||||||
new FormModel {
|
new FormModel {
|
||||||
contentType: "form/swing"
|
contentType: "form/swing"
|
||||||
@@ -355,6 +355,11 @@ new FormModel {
|
|||||||
"icon": new com.jformdesigner.model.SwingIcon( 2, "Tree.leafIcon" )
|
"icon": new com.jformdesigner.model.SwingIcon( 2, "Tree.leafIcon" )
|
||||||
"selected": true
|
"selected": true
|
||||||
} )
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JButton" ) {
|
||||||
|
name: "button1"
|
||||||
|
"icon": new com.jformdesigner.model.SwingIcon( 0, "/com/formdev/flatlaf/demo/icons/intellij-showWriteAccess.png" )
|
||||||
|
"enabled": false
|
||||||
|
} )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 1 10 3 1,growx"
|
"value": "cell 1 10 3 1,growx"
|
||||||
} )
|
} )
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import net.miginfocom.swing.*;
|
|||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
class OptionPanePanel
|
class OptionPanePanel
|
||||||
extends JScrollPane
|
extends JPanel
|
||||||
{
|
{
|
||||||
OptionPanePanel() {
|
OptionPanePanel() {
|
||||||
initComponents();
|
initComponents();
|
||||||
@@ -48,6 +48,7 @@ class OptionPanePanel
|
|||||||
|
|
||||||
private void initComponents() {
|
private void initComponents() {
|
||||||
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
||||||
|
JScrollPane scrollPane1 = new JScrollPane();
|
||||||
ScrollablePanel panel9 = new ScrollablePanel();
|
ScrollablePanel panel9 = new ScrollablePanel();
|
||||||
JLabel plainLabel = new JLabel();
|
JLabel plainLabel = new JLabel();
|
||||||
JPanel panel1 = new JPanel();
|
JPanel panel1 = new JPanel();
|
||||||
@@ -83,200 +84,206 @@ class OptionPanePanel
|
|||||||
OptionPanePanel.ShowDialogLinkLabel customShowDialogLabel = new OptionPanePanel.ShowDialogLinkLabel();
|
OptionPanePanel.ShowDialogLinkLabel customShowDialogLabel = new OptionPanePanel.ShowDialogLinkLabel();
|
||||||
|
|
||||||
//======== this ========
|
//======== this ========
|
||||||
setBorder(BorderFactory.createEmptyBorder());
|
setLayout(new BorderLayout());
|
||||||
|
|
||||||
//======== panel9 ========
|
//======== scrollPane1 ========
|
||||||
{
|
{
|
||||||
panel9.setLayout(new MigLayout(
|
scrollPane1.setBorder(BorderFactory.createEmptyBorder());
|
||||||
"flowy,hidemode 3",
|
|
||||||
// columns
|
|
||||||
"[]" +
|
|
||||||
"[]" +
|
|
||||||
"[fill]",
|
|
||||||
// rows
|
|
||||||
"[top]" +
|
|
||||||
"[top]" +
|
|
||||||
"[top]" +
|
|
||||||
"[top]" +
|
|
||||||
"[top]" +
|
|
||||||
"[top]" +
|
|
||||||
"[top]" +
|
|
||||||
"[top]"));
|
|
||||||
|
|
||||||
//---- plainLabel ----
|
//======== panel9 ========
|
||||||
plainLabel.setText("Plain");
|
|
||||||
panel9.add(plainLabel, "cell 0 0");
|
|
||||||
|
|
||||||
//======== panel1 ========
|
|
||||||
{
|
{
|
||||||
panel1.setBorder(LineBorder.createGrayLineBorder());
|
panel9.setLayout(new MigLayout(
|
||||||
panel1.setLayout(new BorderLayout());
|
"flowy,hidemode 3",
|
||||||
|
// columns
|
||||||
|
"[]" +
|
||||||
|
"[]" +
|
||||||
|
"[fill]",
|
||||||
|
// rows
|
||||||
|
"[top]" +
|
||||||
|
"[top]" +
|
||||||
|
"[top]" +
|
||||||
|
"[top]" +
|
||||||
|
"[top]" +
|
||||||
|
"[top]" +
|
||||||
|
"[top]" +
|
||||||
|
"[top]"));
|
||||||
|
|
||||||
//---- plainOptionPane ----
|
//---- plainLabel ----
|
||||||
plainOptionPane.setMessage("Hello world.");
|
plainLabel.setText("Plain");
|
||||||
panel1.add(plainOptionPane, BorderLayout.CENTER);
|
panel9.add(plainLabel, "cell 0 0");
|
||||||
|
|
||||||
|
//======== panel1 ========
|
||||||
|
{
|
||||||
|
panel1.setBorder(LineBorder.createGrayLineBorder());
|
||||||
|
panel1.setLayout(new BorderLayout());
|
||||||
|
|
||||||
|
//---- plainOptionPane ----
|
||||||
|
plainOptionPane.setMessage("Hello world.");
|
||||||
|
panel1.add(plainOptionPane, BorderLayout.CENTER);
|
||||||
|
}
|
||||||
|
panel9.add(panel1, "cell 1 0");
|
||||||
|
|
||||||
|
//---- plainShowDialogLabel ----
|
||||||
|
plainShowDialogLabel.setOptionPane(plainOptionPane);
|
||||||
|
plainShowDialogLabel.setTitleLabel(plainLabel);
|
||||||
|
panel9.add(plainShowDialogLabel, "cell 2 0");
|
||||||
|
|
||||||
|
//---- errorLabel ----
|
||||||
|
errorLabel.setText("Error");
|
||||||
|
panel9.add(errorLabel, "cell 0 1");
|
||||||
|
|
||||||
|
//======== panel2 ========
|
||||||
|
{
|
||||||
|
panel2.setBorder(LineBorder.createGrayLineBorder());
|
||||||
|
panel2.setLayout(new BorderLayout());
|
||||||
|
|
||||||
|
//---- errorOptionPane ----
|
||||||
|
errorOptionPane.setMessageType(JOptionPane.ERROR_MESSAGE);
|
||||||
|
errorOptionPane.setOptionType(JOptionPane.OK_CANCEL_OPTION);
|
||||||
|
errorOptionPane.setMessage("Your PC ran into a problem. Buy a new one.");
|
||||||
|
panel2.add(errorOptionPane, BorderLayout.CENTER);
|
||||||
|
}
|
||||||
|
panel9.add(panel2, "cell 1 1");
|
||||||
|
|
||||||
|
//---- errorShowDialogLabel ----
|
||||||
|
errorShowDialogLabel.setTitleLabel(errorLabel);
|
||||||
|
errorShowDialogLabel.setOptionPane(errorOptionPane);
|
||||||
|
panel9.add(errorShowDialogLabel, "cell 2 1");
|
||||||
|
|
||||||
|
//---- informationLabel ----
|
||||||
|
informationLabel.setText("Information");
|
||||||
|
panel9.add(informationLabel, "cell 0 2");
|
||||||
|
|
||||||
|
//======== panel3 ========
|
||||||
|
{
|
||||||
|
panel3.setBorder(LineBorder.createGrayLineBorder());
|
||||||
|
panel3.setLayout(new BorderLayout());
|
||||||
|
|
||||||
|
//---- informationOptionPane ----
|
||||||
|
informationOptionPane.setMessageType(JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
informationOptionPane.setOptionType(JOptionPane.YES_NO_OPTION);
|
||||||
|
informationOptionPane.setMessage("Text with\nmultiple lines\n(use \\n to separate lines)");
|
||||||
|
panel3.add(informationOptionPane, BorderLayout.CENTER);
|
||||||
|
}
|
||||||
|
panel9.add(panel3, "cell 1 2");
|
||||||
|
|
||||||
|
//---- informationShowDialogLabel ----
|
||||||
|
informationShowDialogLabel.setOptionPane(informationOptionPane);
|
||||||
|
informationShowDialogLabel.setTitleLabel(informationLabel);
|
||||||
|
panel9.add(informationShowDialogLabel, "cell 2 2");
|
||||||
|
|
||||||
|
//---- questionLabel ----
|
||||||
|
questionLabel.setText("Question");
|
||||||
|
panel9.add(questionLabel, "cell 0 3");
|
||||||
|
|
||||||
|
//======== panel4 ========
|
||||||
|
{
|
||||||
|
panel4.setBorder(LineBorder.createGrayLineBorder());
|
||||||
|
panel4.setLayout(new BorderLayout());
|
||||||
|
|
||||||
|
//---- questionOptionPane ----
|
||||||
|
questionOptionPane.setMessageType(JOptionPane.QUESTION_MESSAGE);
|
||||||
|
questionOptionPane.setOptionType(JOptionPane.YES_NO_CANCEL_OPTION);
|
||||||
|
questionOptionPane.setMessage("Answer the question. What question? Don't know. Just writing useless text to make this longer than 80 characters.");
|
||||||
|
panel4.add(questionOptionPane, BorderLayout.CENTER);
|
||||||
|
}
|
||||||
|
panel9.add(panel4, "cell 1 3");
|
||||||
|
|
||||||
|
//---- questionShowDialogLabel ----
|
||||||
|
questionShowDialogLabel.setOptionPane(questionOptionPane);
|
||||||
|
questionShowDialogLabel.setTitleLabel(questionLabel);
|
||||||
|
panel9.add(questionShowDialogLabel, "cell 2 3");
|
||||||
|
|
||||||
|
//---- warningLabel ----
|
||||||
|
warningLabel.setText("Warning");
|
||||||
|
panel9.add(warningLabel, "cell 0 4");
|
||||||
|
|
||||||
|
//======== panel5 ========
|
||||||
|
{
|
||||||
|
panel5.setBorder(LineBorder.createGrayLineBorder());
|
||||||
|
panel5.setLayout(new BorderLayout());
|
||||||
|
|
||||||
|
//---- warningOptionPane ----
|
||||||
|
warningOptionPane.setMessageType(JOptionPane.WARNING_MESSAGE);
|
||||||
|
warningOptionPane.setOptionType(JOptionPane.OK_CANCEL_OPTION);
|
||||||
|
warningOptionPane.setMessage("<html>I like <b>bold</b>,<br> and I like <i>italic</i>,<br> and I like to have<br> many lines.<br> Lots of lines.");
|
||||||
|
panel5.add(warningOptionPane, BorderLayout.CENTER);
|
||||||
|
}
|
||||||
|
panel9.add(panel5, "cell 1 4");
|
||||||
|
|
||||||
|
//---- warningShowDialogLabel ----
|
||||||
|
warningShowDialogLabel.setOptionPane(warningOptionPane);
|
||||||
|
warningShowDialogLabel.setTitleLabel(warningLabel);
|
||||||
|
panel9.add(warningShowDialogLabel, "cell 2 4");
|
||||||
|
|
||||||
|
//---- inputLabel ----
|
||||||
|
inputLabel.setText("Input");
|
||||||
|
panel9.add(inputLabel, "cell 0 5");
|
||||||
|
|
||||||
|
//======== panel7 ========
|
||||||
|
{
|
||||||
|
panel7.setBorder(LineBorder.createGrayLineBorder());
|
||||||
|
panel7.setLayout(new BorderLayout());
|
||||||
|
|
||||||
|
//---- inputOptionPane ----
|
||||||
|
inputOptionPane.setWantsInput(true);
|
||||||
|
inputOptionPane.setOptionType(JOptionPane.OK_CANCEL_OPTION);
|
||||||
|
inputOptionPane.setMessage("Enter whatever you want:");
|
||||||
|
panel7.add(inputOptionPane, BorderLayout.CENTER);
|
||||||
|
}
|
||||||
|
panel9.add(panel7, "cell 1 5");
|
||||||
|
|
||||||
|
//---- inputShowDialogLabel ----
|
||||||
|
inputShowDialogLabel.setOptionPane(inputOptionPane);
|
||||||
|
inputShowDialogLabel.setTitleLabel(inputLabel);
|
||||||
|
panel9.add(inputShowDialogLabel, "cell 2 5");
|
||||||
|
|
||||||
|
//---- inputIconLabel ----
|
||||||
|
inputIconLabel.setText("Input + icon");
|
||||||
|
panel9.add(inputIconLabel, "cell 0 6");
|
||||||
|
|
||||||
|
//======== panel8 ========
|
||||||
|
{
|
||||||
|
panel8.setBorder(LineBorder.createGrayLineBorder());
|
||||||
|
panel8.setLayout(new BorderLayout());
|
||||||
|
|
||||||
|
//---- inputIconOptionPane ----
|
||||||
|
inputIconOptionPane.setMessageType(JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
inputIconOptionPane.setWantsInput(true);
|
||||||
|
inputIconOptionPane.setOptionType(JOptionPane.OK_CANCEL_OPTION);
|
||||||
|
inputIconOptionPane.setMessage("Enter something:");
|
||||||
|
panel8.add(inputIconOptionPane, BorderLayout.CENTER);
|
||||||
|
}
|
||||||
|
panel9.add(panel8, "cell 1 6");
|
||||||
|
|
||||||
|
//---- inputIconShowDialogLabel ----
|
||||||
|
inputIconShowDialogLabel.setTitleLabel(inputIconLabel);
|
||||||
|
inputIconShowDialogLabel.setOptionPane(inputIconOptionPane);
|
||||||
|
panel9.add(inputIconShowDialogLabel, "cell 2 6");
|
||||||
|
|
||||||
|
//---- customLabel ----
|
||||||
|
customLabel.setText("Custom");
|
||||||
|
panel9.add(customLabel, "cell 0 7");
|
||||||
|
|
||||||
|
//======== panel6 ========
|
||||||
|
{
|
||||||
|
panel6.setBorder(LineBorder.createGrayLineBorder());
|
||||||
|
panel6.setLayout(new BorderLayout());
|
||||||
|
|
||||||
|
//---- customOptionPane ----
|
||||||
|
customOptionPane.setIcon(UIManager.getIcon("Tree.leafIcon"));
|
||||||
|
panel6.add(customOptionPane, BorderLayout.CENTER);
|
||||||
|
}
|
||||||
|
panel9.add(panel6, "cell 1 7");
|
||||||
|
|
||||||
|
//---- customShowDialogLabel ----
|
||||||
|
customShowDialogLabel.setOptionPane(customOptionPane);
|
||||||
|
customShowDialogLabel.setTitleLabel(customLabel);
|
||||||
|
panel9.add(customShowDialogLabel, "cell 2 7");
|
||||||
}
|
}
|
||||||
panel9.add(panel1, "cell 1 0");
|
scrollPane1.setViewportView(panel9);
|
||||||
|
|
||||||
//---- plainShowDialogLabel ----
|
|
||||||
plainShowDialogLabel.setOptionPane(plainOptionPane);
|
|
||||||
plainShowDialogLabel.setTitleLabel(plainLabel);
|
|
||||||
panel9.add(plainShowDialogLabel, "cell 2 0");
|
|
||||||
|
|
||||||
//---- errorLabel ----
|
|
||||||
errorLabel.setText("Error");
|
|
||||||
panel9.add(errorLabel, "cell 0 1");
|
|
||||||
|
|
||||||
//======== panel2 ========
|
|
||||||
{
|
|
||||||
panel2.setBorder(LineBorder.createGrayLineBorder());
|
|
||||||
panel2.setLayout(new BorderLayout());
|
|
||||||
|
|
||||||
//---- errorOptionPane ----
|
|
||||||
errorOptionPane.setMessageType(JOptionPane.ERROR_MESSAGE);
|
|
||||||
errorOptionPane.setOptionType(JOptionPane.OK_CANCEL_OPTION);
|
|
||||||
errorOptionPane.setMessage("Your PC ran into a problem. Buy a new one.");
|
|
||||||
panel2.add(errorOptionPane, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
panel9.add(panel2, "cell 1 1");
|
|
||||||
|
|
||||||
//---- errorShowDialogLabel ----
|
|
||||||
errorShowDialogLabel.setTitleLabel(errorLabel);
|
|
||||||
errorShowDialogLabel.setOptionPane(errorOptionPane);
|
|
||||||
panel9.add(errorShowDialogLabel, "cell 2 1");
|
|
||||||
|
|
||||||
//---- informationLabel ----
|
|
||||||
informationLabel.setText("Information");
|
|
||||||
panel9.add(informationLabel, "cell 0 2");
|
|
||||||
|
|
||||||
//======== panel3 ========
|
|
||||||
{
|
|
||||||
panel3.setBorder(LineBorder.createGrayLineBorder());
|
|
||||||
panel3.setLayout(new BorderLayout());
|
|
||||||
|
|
||||||
//---- informationOptionPane ----
|
|
||||||
informationOptionPane.setMessageType(JOptionPane.INFORMATION_MESSAGE);
|
|
||||||
informationOptionPane.setOptionType(JOptionPane.YES_NO_OPTION);
|
|
||||||
informationOptionPane.setMessage("Text with\nmultiple lines\n(use \\n to separate lines)");
|
|
||||||
panel3.add(informationOptionPane, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
panel9.add(panel3, "cell 1 2");
|
|
||||||
|
|
||||||
//---- informationShowDialogLabel ----
|
|
||||||
informationShowDialogLabel.setOptionPane(informationOptionPane);
|
|
||||||
informationShowDialogLabel.setTitleLabel(informationLabel);
|
|
||||||
panel9.add(informationShowDialogLabel, "cell 2 2");
|
|
||||||
|
|
||||||
//---- questionLabel ----
|
|
||||||
questionLabel.setText("Question");
|
|
||||||
panel9.add(questionLabel, "cell 0 3");
|
|
||||||
|
|
||||||
//======== panel4 ========
|
|
||||||
{
|
|
||||||
panel4.setBorder(LineBorder.createGrayLineBorder());
|
|
||||||
panel4.setLayout(new BorderLayout());
|
|
||||||
|
|
||||||
//---- questionOptionPane ----
|
|
||||||
questionOptionPane.setMessageType(JOptionPane.QUESTION_MESSAGE);
|
|
||||||
questionOptionPane.setOptionType(JOptionPane.YES_NO_CANCEL_OPTION);
|
|
||||||
questionOptionPane.setMessage("Answer the question. What question? Don't know. Just writing useless text to make this longer than 80 characters.");
|
|
||||||
panel4.add(questionOptionPane, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
panel9.add(panel4, "cell 1 3");
|
|
||||||
|
|
||||||
//---- questionShowDialogLabel ----
|
|
||||||
questionShowDialogLabel.setOptionPane(questionOptionPane);
|
|
||||||
questionShowDialogLabel.setTitleLabel(questionLabel);
|
|
||||||
panel9.add(questionShowDialogLabel, "cell 2 3");
|
|
||||||
|
|
||||||
//---- warningLabel ----
|
|
||||||
warningLabel.setText("Warning");
|
|
||||||
panel9.add(warningLabel, "cell 0 4");
|
|
||||||
|
|
||||||
//======== panel5 ========
|
|
||||||
{
|
|
||||||
panel5.setBorder(LineBorder.createGrayLineBorder());
|
|
||||||
panel5.setLayout(new BorderLayout());
|
|
||||||
|
|
||||||
//---- warningOptionPane ----
|
|
||||||
warningOptionPane.setMessageType(JOptionPane.WARNING_MESSAGE);
|
|
||||||
warningOptionPane.setOptionType(JOptionPane.OK_CANCEL_OPTION);
|
|
||||||
warningOptionPane.setMessage("<html>I like <b>bold</b>,<br> and I like <i>italic</i>,<br> and I like to have<br> many lines.<br> Lots of lines.");
|
|
||||||
panel5.add(warningOptionPane, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
panel9.add(panel5, "cell 1 4");
|
|
||||||
|
|
||||||
//---- warningShowDialogLabel ----
|
|
||||||
warningShowDialogLabel.setOptionPane(warningOptionPane);
|
|
||||||
warningShowDialogLabel.setTitleLabel(warningLabel);
|
|
||||||
panel9.add(warningShowDialogLabel, "cell 2 4");
|
|
||||||
|
|
||||||
//---- inputLabel ----
|
|
||||||
inputLabel.setText("Input");
|
|
||||||
panel9.add(inputLabel, "cell 0 5");
|
|
||||||
|
|
||||||
//======== panel7 ========
|
|
||||||
{
|
|
||||||
panel7.setBorder(LineBorder.createGrayLineBorder());
|
|
||||||
panel7.setLayout(new BorderLayout());
|
|
||||||
|
|
||||||
//---- inputOptionPane ----
|
|
||||||
inputOptionPane.setWantsInput(true);
|
|
||||||
inputOptionPane.setOptionType(JOptionPane.OK_CANCEL_OPTION);
|
|
||||||
inputOptionPane.setMessage("Enter whatever you want:");
|
|
||||||
panel7.add(inputOptionPane, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
panel9.add(panel7, "cell 1 5");
|
|
||||||
|
|
||||||
//---- inputShowDialogLabel ----
|
|
||||||
inputShowDialogLabel.setOptionPane(inputOptionPane);
|
|
||||||
inputShowDialogLabel.setTitleLabel(inputLabel);
|
|
||||||
panel9.add(inputShowDialogLabel, "cell 2 5");
|
|
||||||
|
|
||||||
//---- inputIconLabel ----
|
|
||||||
inputIconLabel.setText("Input + icon");
|
|
||||||
panel9.add(inputIconLabel, "cell 0 6");
|
|
||||||
|
|
||||||
//======== panel8 ========
|
|
||||||
{
|
|
||||||
panel8.setBorder(LineBorder.createGrayLineBorder());
|
|
||||||
panel8.setLayout(new BorderLayout());
|
|
||||||
|
|
||||||
//---- inputIconOptionPane ----
|
|
||||||
inputIconOptionPane.setMessageType(JOptionPane.INFORMATION_MESSAGE);
|
|
||||||
inputIconOptionPane.setWantsInput(true);
|
|
||||||
inputIconOptionPane.setOptionType(JOptionPane.OK_CANCEL_OPTION);
|
|
||||||
inputIconOptionPane.setMessage("Enter something:");
|
|
||||||
panel8.add(inputIconOptionPane, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
panel9.add(panel8, "cell 1 6");
|
|
||||||
|
|
||||||
//---- inputIconShowDialogLabel ----
|
|
||||||
inputIconShowDialogLabel.setTitleLabel(inputIconLabel);
|
|
||||||
inputIconShowDialogLabel.setOptionPane(inputIconOptionPane);
|
|
||||||
panel9.add(inputIconShowDialogLabel, "cell 2 6");
|
|
||||||
|
|
||||||
//---- customLabel ----
|
|
||||||
customLabel.setText("Custom");
|
|
||||||
panel9.add(customLabel, "cell 0 7");
|
|
||||||
|
|
||||||
//======== panel6 ========
|
|
||||||
{
|
|
||||||
panel6.setBorder(LineBorder.createGrayLineBorder());
|
|
||||||
panel6.setLayout(new BorderLayout());
|
|
||||||
|
|
||||||
//---- customOptionPane ----
|
|
||||||
customOptionPane.setIcon(UIManager.getIcon("Tree.leafIcon"));
|
|
||||||
panel6.add(customOptionPane, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
panel9.add(panel6, "cell 1 7");
|
|
||||||
|
|
||||||
//---- customShowDialogLabel ----
|
|
||||||
customShowDialogLabel.setOptionPane(customOptionPane);
|
|
||||||
customShowDialogLabel.setTitleLabel(customLabel);
|
|
||||||
panel9.add(customShowDialogLabel, "cell 2 7");
|
|
||||||
}
|
}
|
||||||
setViewportView(panel9);
|
add(scrollPane1, BorderLayout.CENTER);
|
||||||
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8"
|
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.2" encoding: "UTF-8"
|
||||||
|
|
||||||
new FormModel {
|
new FormModel {
|
||||||
contentType: "form/swing"
|
contentType: "form/swing"
|
||||||
@@ -6,244 +6,249 @@ new FormModel {
|
|||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.defaultVariableLocal": true
|
"JavaCodeGenerator.defaultVariableLocal": true
|
||||||
}
|
}
|
||||||
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
||||||
name: "this"
|
name: "this"
|
||||||
"border": new javax.swing.border.EmptyBorder( 0, 0, 0, 0 )
|
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
|
||||||
add( new FormContainer( "com.formdev.flatlaf.demo.ScrollablePanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
|
name: "scrollPane1"
|
||||||
"$layoutConstraints": "flowy,hidemode 3"
|
"border": new javax.swing.border.EmptyBorder( 0, 0, 0, 0 )
|
||||||
"$columnConstraints": "[][][fill]"
|
add( new FormContainer( "com.formdev.flatlaf.demo.ScrollablePanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
|
||||||
"$rowConstraints": "[top][top][top][top][top][top][top][top]"
|
"$layoutConstraints": "flowy,hidemode 3"
|
||||||
} ) {
|
"$columnConstraints": "[][][fill]"
|
||||||
name: "panel9"
|
"$rowConstraints": "[top][top][top][top][top][top][top][top]"
|
||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
} ) {
|
||||||
name: "plainLabel"
|
name: "panel9"
|
||||||
"text": "Plain"
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
name: "plainLabel"
|
||||||
"value": "cell 0 0"
|
"text": "Plain"
|
||||||
} )
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
"value": "cell 0 0"
|
||||||
name: "panel1"
|
|
||||||
"border": &LineBorder0 new javax.swing.border.LineBorder( sfield java.awt.Color gray, 1, false )
|
|
||||||
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
|
||||||
name: "plainOptionPane"
|
|
||||||
"message": "Hello world."
|
|
||||||
}, new FormLayoutConstraints( class java.lang.String ) {
|
|
||||||
"value": "Center"
|
|
||||||
} )
|
} )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
||||||
"value": "cell 1 0"
|
name: "panel1"
|
||||||
} )
|
"border": &LineBorder0 new javax.swing.border.LineBorder( sfield java.awt.Color gray, 1, false )
|
||||||
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
||||||
name: "plainShowDialogLabel"
|
name: "plainOptionPane"
|
||||||
"optionPane": new FormReference( "plainOptionPane" )
|
"message": "Hello world."
|
||||||
"titleLabel": new FormReference( "plainLabel" )
|
}, new FormLayoutConstraints( class java.lang.String ) {
|
||||||
auxiliary() {
|
"value": "Center"
|
||||||
"JavaCodeGenerator.variableLocal": false
|
} )
|
||||||
}
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
"value": "cell 1 0"
|
||||||
"value": "cell 2 0"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
|
||||||
name: "errorLabel"
|
|
||||||
"text": "Error"
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 0 1"
|
|
||||||
} )
|
|
||||||
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
|
||||||
name: "panel2"
|
|
||||||
"border": #LineBorder0
|
|
||||||
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
|
||||||
name: "errorOptionPane"
|
|
||||||
"messageType": 0
|
|
||||||
"optionType": 2
|
|
||||||
"message": "Your PC ran into a problem. Buy a new one."
|
|
||||||
}, new FormLayoutConstraints( class java.lang.String ) {
|
|
||||||
"value": "Center"
|
|
||||||
} )
|
} )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
||||||
"value": "cell 1 1"
|
name: "plainShowDialogLabel"
|
||||||
} )
|
"optionPane": new FormReference( "plainOptionPane" )
|
||||||
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
"titleLabel": new FormReference( "plainLabel" )
|
||||||
name: "errorShowDialogLabel"
|
|
||||||
"titleLabel": new FormReference( "errorLabel" )
|
|
||||||
"optionPane": new FormReference( "errorOptionPane" )
|
|
||||||
auxiliary() {
|
|
||||||
"JavaCodeGenerator.variableLocal": false
|
|
||||||
}
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 2 1"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
|
||||||
name: "informationLabel"
|
|
||||||
"text": "Information"
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 0 2"
|
|
||||||
} )
|
|
||||||
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
|
||||||
name: "panel3"
|
|
||||||
"border": #LineBorder0
|
|
||||||
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
|
||||||
name: "informationOptionPane"
|
|
||||||
"messageType": 1
|
|
||||||
"optionType": 0
|
|
||||||
"message": "Text with\nmultiple lines\n(use \\n to separate lines)"
|
|
||||||
}, new FormLayoutConstraints( class java.lang.String ) {
|
|
||||||
"value": "Center"
|
|
||||||
} )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 1 2"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
|
||||||
name: "informationShowDialogLabel"
|
|
||||||
"optionPane": new FormReference( "informationOptionPane" )
|
|
||||||
"titleLabel": new FormReference( "informationLabel" )
|
|
||||||
auxiliary() {
|
|
||||||
"JavaCodeGenerator.variableLocal": false
|
|
||||||
}
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 2 2"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
|
||||||
name: "questionLabel"
|
|
||||||
"text": "Question"
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 0 3"
|
|
||||||
} )
|
|
||||||
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
|
||||||
name: "panel4"
|
|
||||||
"border": #LineBorder0
|
|
||||||
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
|
||||||
name: "questionOptionPane"
|
|
||||||
"messageType": 3
|
|
||||||
"optionType": 1
|
|
||||||
"message": "Answer the question. What question? Don't know. Just writing useless text to make this longer than 80 characters."
|
|
||||||
}, new FormLayoutConstraints( class java.lang.String ) {
|
|
||||||
"value": "Center"
|
|
||||||
} )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 1 3"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
|
||||||
name: "questionShowDialogLabel"
|
|
||||||
"optionPane": new FormReference( "questionOptionPane" )
|
|
||||||
"titleLabel": new FormReference( "questionLabel" )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 2 3"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
|
||||||
name: "warningLabel"
|
|
||||||
"text": "Warning"
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 0 4"
|
|
||||||
} )
|
|
||||||
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
|
||||||
name: "panel5"
|
|
||||||
"border": #LineBorder0
|
|
||||||
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
|
||||||
name: "warningOptionPane"
|
|
||||||
"messageType": 2
|
|
||||||
"optionType": 2
|
|
||||||
"message": "<html>I like <b>bold</b>,<br> and I like <i>italic</i>,<br> and I like to have<br> many lines.<br> Lots of lines."
|
|
||||||
}, new FormLayoutConstraints( class java.lang.String ) {
|
|
||||||
"value": "Center"
|
|
||||||
} )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 1 4"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
|
||||||
name: "warningShowDialogLabel"
|
|
||||||
"optionPane": new FormReference( "warningOptionPane" )
|
|
||||||
"titleLabel": new FormReference( "warningLabel" )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 2 4"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
|
||||||
name: "inputLabel"
|
|
||||||
"text": "Input"
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 0 5"
|
|
||||||
} )
|
|
||||||
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
|
||||||
name: "panel7"
|
|
||||||
"border": #LineBorder0
|
|
||||||
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
|
||||||
name: "inputOptionPane"
|
|
||||||
"wantsInput": true
|
|
||||||
"optionType": 2
|
|
||||||
"message": "Enter whatever you want:"
|
|
||||||
}, new FormLayoutConstraints( class java.lang.String ) {
|
|
||||||
"value": "Center"
|
|
||||||
} )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 1 5"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
|
||||||
name: "inputShowDialogLabel"
|
|
||||||
"optionPane": new FormReference( "inputOptionPane" )
|
|
||||||
"titleLabel": new FormReference( "inputLabel" )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 2 5"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
|
||||||
name: "inputIconLabel"
|
|
||||||
"text": "Input + icon"
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 0 6"
|
|
||||||
} )
|
|
||||||
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
|
||||||
name: "panel8"
|
|
||||||
"border": #LineBorder0
|
|
||||||
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
|
||||||
name: "inputIconOptionPane"
|
|
||||||
"messageType": 1
|
|
||||||
"wantsInput": true
|
|
||||||
"optionType": 2
|
|
||||||
"message": "Enter something:"
|
|
||||||
}, new FormLayoutConstraints( class java.lang.String ) {
|
|
||||||
"value": "Center"
|
|
||||||
} )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 1 6"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
|
||||||
name: "inputIconShowDialogLabel"
|
|
||||||
"titleLabel": new FormReference( "inputIconLabel" )
|
|
||||||
"optionPane": new FormReference( "inputIconOptionPane" )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 2 6"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
|
||||||
name: "customLabel"
|
|
||||||
"text": "Custom"
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 0 7"
|
|
||||||
} )
|
|
||||||
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
|
||||||
name: "panel6"
|
|
||||||
"border": #LineBorder0
|
|
||||||
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
|
||||||
name: "customOptionPane"
|
|
||||||
"icon": new com.jformdesigner.model.SwingIcon( 2, "Tree.leafIcon" )
|
|
||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.variableLocal": false
|
"JavaCodeGenerator.variableLocal": false
|
||||||
}
|
}
|
||||||
}, new FormLayoutConstraints( class java.lang.String ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "Center"
|
"value": "cell 2 0"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "errorLabel"
|
||||||
|
"text": "Error"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 1"
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
||||||
|
name: "panel2"
|
||||||
|
"border": #LineBorder0
|
||||||
|
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
||||||
|
name: "errorOptionPane"
|
||||||
|
"messageType": 0
|
||||||
|
"optionType": 2
|
||||||
|
"message": "Your PC ran into a problem. Buy a new one."
|
||||||
|
}, new FormLayoutConstraints( class java.lang.String ) {
|
||||||
|
"value": "Center"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 1"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
||||||
|
name: "errorShowDialogLabel"
|
||||||
|
"titleLabel": new FormReference( "errorLabel" )
|
||||||
|
"optionPane": new FormReference( "errorOptionPane" )
|
||||||
|
auxiliary() {
|
||||||
|
"JavaCodeGenerator.variableLocal": false
|
||||||
|
}
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 2 1"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "informationLabel"
|
||||||
|
"text": "Information"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 2"
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
||||||
|
name: "panel3"
|
||||||
|
"border": #LineBorder0
|
||||||
|
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
||||||
|
name: "informationOptionPane"
|
||||||
|
"messageType": 1
|
||||||
|
"optionType": 0
|
||||||
|
"message": "Text with\nmultiple lines\n(use \\n to separate lines)"
|
||||||
|
}, new FormLayoutConstraints( class java.lang.String ) {
|
||||||
|
"value": "Center"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 2"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
||||||
|
name: "informationShowDialogLabel"
|
||||||
|
"optionPane": new FormReference( "informationOptionPane" )
|
||||||
|
"titleLabel": new FormReference( "informationLabel" )
|
||||||
|
auxiliary() {
|
||||||
|
"JavaCodeGenerator.variableLocal": false
|
||||||
|
}
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 2 2"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "questionLabel"
|
||||||
|
"text": "Question"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 3"
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
||||||
|
name: "panel4"
|
||||||
|
"border": #LineBorder0
|
||||||
|
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
||||||
|
name: "questionOptionPane"
|
||||||
|
"messageType": 3
|
||||||
|
"optionType": 1
|
||||||
|
"message": "Answer the question. What question? Don't know. Just writing useless text to make this longer than 80 characters."
|
||||||
|
}, new FormLayoutConstraints( class java.lang.String ) {
|
||||||
|
"value": "Center"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 3"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
||||||
|
name: "questionShowDialogLabel"
|
||||||
|
"optionPane": new FormReference( "questionOptionPane" )
|
||||||
|
"titleLabel": new FormReference( "questionLabel" )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 2 3"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "warningLabel"
|
||||||
|
"text": "Warning"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 4"
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
||||||
|
name: "panel5"
|
||||||
|
"border": #LineBorder0
|
||||||
|
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
||||||
|
name: "warningOptionPane"
|
||||||
|
"messageType": 2
|
||||||
|
"optionType": 2
|
||||||
|
"message": "<html>I like <b>bold</b>,<br> and I like <i>italic</i>,<br> and I like to have<br> many lines.<br> Lots of lines."
|
||||||
|
}, new FormLayoutConstraints( class java.lang.String ) {
|
||||||
|
"value": "Center"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 4"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
||||||
|
name: "warningShowDialogLabel"
|
||||||
|
"optionPane": new FormReference( "warningOptionPane" )
|
||||||
|
"titleLabel": new FormReference( "warningLabel" )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 2 4"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "inputLabel"
|
||||||
|
"text": "Input"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 5"
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
||||||
|
name: "panel7"
|
||||||
|
"border": #LineBorder0
|
||||||
|
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
||||||
|
name: "inputOptionPane"
|
||||||
|
"wantsInput": true
|
||||||
|
"optionType": 2
|
||||||
|
"message": "Enter whatever you want:"
|
||||||
|
}, new FormLayoutConstraints( class java.lang.String ) {
|
||||||
|
"value": "Center"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 5"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
||||||
|
name: "inputShowDialogLabel"
|
||||||
|
"optionPane": new FormReference( "inputOptionPane" )
|
||||||
|
"titleLabel": new FormReference( "inputLabel" )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 2 5"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "inputIconLabel"
|
||||||
|
"text": "Input + icon"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 6"
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
||||||
|
name: "panel8"
|
||||||
|
"border": #LineBorder0
|
||||||
|
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
||||||
|
name: "inputIconOptionPane"
|
||||||
|
"messageType": 1
|
||||||
|
"wantsInput": true
|
||||||
|
"optionType": 2
|
||||||
|
"message": "Enter something:"
|
||||||
|
}, new FormLayoutConstraints( class java.lang.String ) {
|
||||||
|
"value": "Center"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 6"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
||||||
|
name: "inputIconShowDialogLabel"
|
||||||
|
"titleLabel": new FormReference( "inputIconLabel" )
|
||||||
|
"optionPane": new FormReference( "inputIconOptionPane" )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 2 6"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "customLabel"
|
||||||
|
"text": "Custom"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 7"
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
|
||||||
|
name: "panel6"
|
||||||
|
"border": #LineBorder0
|
||||||
|
add( new FormComponent( "javax.swing.JOptionPane" ) {
|
||||||
|
name: "customOptionPane"
|
||||||
|
"icon": new com.jformdesigner.model.SwingIcon( 2, "Tree.leafIcon" )
|
||||||
|
auxiliary() {
|
||||||
|
"JavaCodeGenerator.variableLocal": false
|
||||||
|
}
|
||||||
|
}, new FormLayoutConstraints( class java.lang.String ) {
|
||||||
|
"value": "Center"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 7"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
||||||
|
name: "customShowDialogLabel"
|
||||||
|
"optionPane": new FormReference( "customOptionPane" )
|
||||||
|
"titleLabel": new FormReference( "customLabel" )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 2 7"
|
||||||
} )
|
} )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 1 7"
|
|
||||||
} )
|
|
||||||
add( new FormComponent( "com.formdev.flatlaf.demo.OptionPanePanel$ShowDialogLinkLabel" ) {
|
|
||||||
name: "customShowDialogLabel"
|
|
||||||
"optionPane": new FormReference( "customOptionPane" )
|
|
||||||
"titleLabel": new FormReference( "customLabel" )
|
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
|
||||||
"value": "cell 2 7"
|
|
||||||
} )
|
} )
|
||||||
|
}, new FormLayoutConstraints( class java.lang.String ) {
|
||||||
|
"value": "Center"
|
||||||
} )
|
} )
|
||||||
}, new FormLayoutConstraints( null ) {
|
}, new FormLayoutConstraints( null ) {
|
||||||
"location": new java.awt.Point( 0, 0 )
|
"location": new java.awt.Point( 0, 0 )
|
||||||
"size": new java.awt.Dimension( 790, 840 )
|
"size": new java.awt.Dimension( 840, 900 )
|
||||||
} )
|
} )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,132 @@
|
|||||||
|
/*
|
||||||
|
* 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.demo.extras;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import com.formdev.flatlaf.extras.*;
|
||||||
|
import net.miginfocom.swing.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class ExtrasPanel
|
||||||
|
extends JPanel
|
||||||
|
{
|
||||||
|
public ExtrasPanel() {
|
||||||
|
initComponents();
|
||||||
|
|
||||||
|
triStateLabel1.setText( triStateCheckBox1.getState().toString() );
|
||||||
|
|
||||||
|
addSVGIcon( "actions/copy.svg" );
|
||||||
|
addSVGIcon( "actions/colors.svg" );
|
||||||
|
addSVGIcon( "actions/execute.svg" );
|
||||||
|
addSVGIcon( "actions/suspend.svg" );
|
||||||
|
addSVGIcon( "actions/intentionBulb.svg" );
|
||||||
|
addSVGIcon( "actions/quickfixOffBulb.svg" );
|
||||||
|
|
||||||
|
addSVGIcon( "objects/abstractClass.svg" );
|
||||||
|
addSVGIcon( "objects/abstractMethod.svg" );
|
||||||
|
addSVGIcon( "objects/annotationtype.svg" );
|
||||||
|
addSVGIcon( "objects/annotationtype.svg" );
|
||||||
|
addSVGIcon( "objects/css.svg" );
|
||||||
|
addSVGIcon( "objects/javaScript.svg" );
|
||||||
|
addSVGIcon( "objects/xhtml.svg" );
|
||||||
|
|
||||||
|
addSVGIcon( "errorDialog.svg" );
|
||||||
|
addSVGIcon( "informationDialog.svg" );
|
||||||
|
addSVGIcon( "warningDialog.svg" );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addSVGIcon( String name ) {
|
||||||
|
svgIconsPanel.add( new JLabel( new FlatSVGIcon( "com/formdev/flatlaf/demo/extras/svg/" + name ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void triStateCheckBox1Changed() {
|
||||||
|
triStateLabel1.setText( triStateCheckBox1.getState().toString() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initComponents() {
|
||||||
|
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
||||||
|
label4 = new JLabel();
|
||||||
|
label1 = new JLabel();
|
||||||
|
triStateCheckBox1 = new TriStateCheckBox();
|
||||||
|
triStateLabel1 = new JLabel();
|
||||||
|
label2 = new JLabel();
|
||||||
|
svgIconsPanel = new JPanel();
|
||||||
|
label3 = new JLabel();
|
||||||
|
|
||||||
|
//======== this ========
|
||||||
|
setLayout(new MigLayout(
|
||||||
|
"hidemode 3",
|
||||||
|
// columns
|
||||||
|
"[]" +
|
||||||
|
"[]" +
|
||||||
|
"[left]",
|
||||||
|
// rows
|
||||||
|
"[]para" +
|
||||||
|
"[]" +
|
||||||
|
"[]" +
|
||||||
|
"[]"));
|
||||||
|
|
||||||
|
//---- label4 ----
|
||||||
|
label4.setText("Note: Components on this page require the flatlaf-extras library.");
|
||||||
|
add(label4, "cell 0 0 3 1");
|
||||||
|
|
||||||
|
//---- label1 ----
|
||||||
|
label1.setText("TriStateCheckBox:");
|
||||||
|
add(label1, "cell 0 1");
|
||||||
|
|
||||||
|
//---- triStateCheckBox1 ----
|
||||||
|
triStateCheckBox1.setText("three states");
|
||||||
|
triStateCheckBox1.addActionListener(e -> triStateCheckBox1Changed());
|
||||||
|
add(triStateCheckBox1, "cell 1 1");
|
||||||
|
|
||||||
|
//---- triStateLabel1 ----
|
||||||
|
triStateLabel1.setText("text");
|
||||||
|
add(triStateLabel1, "cell 2 1");
|
||||||
|
|
||||||
|
//---- label2 ----
|
||||||
|
label2.setText("SVG Icons:");
|
||||||
|
add(label2, "cell 0 2");
|
||||||
|
|
||||||
|
//======== svgIconsPanel ========
|
||||||
|
{
|
||||||
|
svgIconsPanel.setLayout(new MigLayout(
|
||||||
|
"insets 0,hidemode 3",
|
||||||
|
// columns
|
||||||
|
"[fill]",
|
||||||
|
// rows
|
||||||
|
"[grow,center]"));
|
||||||
|
}
|
||||||
|
add(svgIconsPanel, "cell 1 2 2 1");
|
||||||
|
|
||||||
|
//---- label3 ----
|
||||||
|
label3.setText("The icons may change colors when switching to another theme.");
|
||||||
|
add(label3, "cell 1 3 2 1");
|
||||||
|
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
||||||
|
}
|
||||||
|
|
||||||
|
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
|
||||||
|
private JLabel label4;
|
||||||
|
private JLabel label1;
|
||||||
|
private TriStateCheckBox triStateCheckBox1;
|
||||||
|
private JLabel triStateLabel1;
|
||||||
|
private JLabel label2;
|
||||||
|
private JPanel svgIconsPanel;
|
||||||
|
private JLabel label3;
|
||||||
|
// JFormDesigner - End of variables declaration //GEN-END:variables
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.2" encoding: "UTF-8"
|
||||||
|
|
||||||
|
new FormModel {
|
||||||
|
contentType: "form/swing"
|
||||||
|
root: new FormRoot {
|
||||||
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
|
||||||
|
"$layoutConstraints": "hidemode 3"
|
||||||
|
"$columnConstraints": "[][][left]"
|
||||||
|
"$rowConstraints": "[]para[][][]"
|
||||||
|
} ) {
|
||||||
|
name: "this"
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "label4"
|
||||||
|
"text": "Note: Components on this page require the flatlaf-extras library."
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 0 3 1"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "label1"
|
||||||
|
"text": "TriStateCheckBox:"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 1"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "com.formdev.flatlaf.extras.TriStateCheckBox" ) {
|
||||||
|
name: "triStateCheckBox1"
|
||||||
|
"text": "three states"
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "triStateCheckBox1Changed", false ) )
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 1"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "triStateLabel1"
|
||||||
|
"text": "text"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 2 1"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "label2"
|
||||||
|
"text": "SVG Icons:"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 0 2"
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
|
||||||
|
"$layoutConstraints": "insets 0,hidemode 3"
|
||||||
|
"$columnConstraints": "[fill]"
|
||||||
|
"$rowConstraints": "[grow,center]"
|
||||||
|
} ) {
|
||||||
|
name: "svgIconsPanel"
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 2 2 1"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
|
name: "label3"
|
||||||
|
"text": "The icons may change colors when switching to another theme."
|
||||||
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
|
"value": "cell 1 3 2 1"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( null ) {
|
||||||
|
"location": new java.awt.Point( 0, 0 )
|
||||||
|
"size": new java.awt.Dimension( 500, 300 )
|
||||||
|
} )
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
/*
|
||||||
|
* 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.demo.intellijthemes;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.StandardOpenOption;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This tool creates look and feel classes for all themes listed in themes.json.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class IJThemesClassGenerator
|
||||||
|
{
|
||||||
|
public static void main( String[] args ) {
|
||||||
|
IJThemesManager themesManager = new IJThemesManager();
|
||||||
|
themesManager.loadBundledThemes();
|
||||||
|
|
||||||
|
String toPath = "../flatlaf-intellij-themes/src/main/java" + IJThemesPanel.THEMES_PACKAGE + "..";
|
||||||
|
|
||||||
|
StringBuilder allInfos = new StringBuilder();
|
||||||
|
StringBuilder markdownTable = new StringBuilder();
|
||||||
|
markdownTable.append( "Name | Class\n" );
|
||||||
|
markdownTable.append( "-----|------\n" );
|
||||||
|
|
||||||
|
for( IJThemeInfo ti : themesManager.bundledThemes ) {
|
||||||
|
if( ti.sourceCodeUrl == null || ti.sourceCodePath == null )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
generateClass( ti, toPath, allInfos, markdownTable );
|
||||||
|
}
|
||||||
|
|
||||||
|
Path out = new File( toPath, "FlatAllIJThemes.java" ).toPath();
|
||||||
|
String allThemes = CLASS_HEADER + ALL_THEMES_TEMPLATE.replace( "${allInfos}", allInfos );
|
||||||
|
writeFile( out, allThemes );
|
||||||
|
|
||||||
|
System.out.println( markdownTable );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void generateClass( IJThemeInfo ti, String toPath, StringBuilder allInfos, StringBuilder markdownTable ) {
|
||||||
|
String resourceName = ti.resourceName;
|
||||||
|
String resourcePath = null;
|
||||||
|
int resSep = resourceName.indexOf( '/' );
|
||||||
|
if( resSep >= 0 ) {
|
||||||
|
resourcePath = resourceName.substring( 0, resSep );
|
||||||
|
resourceName = resourceName.substring( resSep + 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
String name = ti.name;
|
||||||
|
int nameSep = name.indexOf( '/' );
|
||||||
|
if( nameSep >= 0 )
|
||||||
|
name = name.substring( nameSep + 1 ).trim();
|
||||||
|
|
||||||
|
StringBuilder buf = new StringBuilder();
|
||||||
|
for( String n : name.split( " " ) ) {
|
||||||
|
if( n.length() == 0 || n.equals( "-" ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( Character.isUpperCase( n.charAt( 0 ) ) )
|
||||||
|
buf.append( n );
|
||||||
|
else
|
||||||
|
buf.append( Character.toUpperCase( n.charAt( 0 ) ) ).append( n.substring( 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
String subPackage = (resourcePath != null) ? '.' + resourcePath.replace( "-", "" ) : "";
|
||||||
|
String themeClass = "Flat" + buf + "IJTheme";
|
||||||
|
String themeFile = resourceName;
|
||||||
|
|
||||||
|
String classBody = CLASS_HEADER + CLASS_TEMPLATE
|
||||||
|
.replace( "${subPackage}", subPackage )
|
||||||
|
.replace( "${themeClass}", themeClass )
|
||||||
|
.replace( "${themeFile}", themeFile );
|
||||||
|
|
||||||
|
File toDir = new File( toPath );
|
||||||
|
if( resourcePath != null )
|
||||||
|
toDir = new File( toDir, resourcePath.replace( "-", "" ) );
|
||||||
|
|
||||||
|
Path out = new File( toDir, themeClass + ".java" ).toPath();
|
||||||
|
writeFile( out, classBody );
|
||||||
|
|
||||||
|
if( allInfos.length() > 0 )
|
||||||
|
allInfos.append( '\n' );
|
||||||
|
allInfos.append( THEME_TEMPLATE
|
||||||
|
.replace( "${subPackage}", subPackage )
|
||||||
|
.replace( "${themeClass}", themeClass )
|
||||||
|
.replace( "${themeName}", name ) );
|
||||||
|
|
||||||
|
markdownTable.append( String.format( "[%s](%s) | `com.formdev.flatlaf.intellijthemes%s.%s`\n",
|
||||||
|
name, ti.sourceCodeUrl, subPackage, themeClass ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void writeFile( Path out, String content ) {
|
||||||
|
try {
|
||||||
|
Files.write( out, content.getBytes( StandardCharsets.ISO_8859_1 ),
|
||||||
|
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING );
|
||||||
|
} catch( IOException ex ) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String CLASS_HEADER =
|
||||||
|
"/*\n" +
|
||||||
|
" * Copyright 2020 FormDev Software GmbH\n" +
|
||||||
|
" *\n" +
|
||||||
|
" * Licensed under the Apache License, Version 2.0 (the \"License\");\n" +
|
||||||
|
" * you may not use this file except in compliance with the License.\n" +
|
||||||
|
" * You may obtain a copy of the License at\n" +
|
||||||
|
" *\n" +
|
||||||
|
" * https://www.apache.org/licenses/LICENSE-2.0\n" +
|
||||||
|
" *\n" +
|
||||||
|
" * Unless required by applicable law or agreed to in writing, software\n" +
|
||||||
|
" * distributed under the License is distributed on an \"AS IS\" BASIS,\n" +
|
||||||
|
" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" +
|
||||||
|
" * See the License for the specific language governing permissions and\n" +
|
||||||
|
" * limitations under the License.\n" +
|
||||||
|
" */\n" +
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
private static final String CLASS_TEMPLATE =
|
||||||
|
"package com.formdev.flatlaf.intellijthemes${subPackage};\n" +
|
||||||
|
"\n" +
|
||||||
|
"import com.formdev.flatlaf.IntelliJTheme;\n" +
|
||||||
|
"\n" +
|
||||||
|
"/**\n" +
|
||||||
|
" * @author Karl Tauber\n" +
|
||||||
|
" */\n" +
|
||||||
|
"public class ${themeClass}\n" +
|
||||||
|
" extends IntelliJTheme.ThemeLaf\n" +
|
||||||
|
"{\n" +
|
||||||
|
" public static boolean install( ) {\n" +
|
||||||
|
" try {\n" +
|
||||||
|
" return install( new ${themeClass}() );\n" +
|
||||||
|
" } catch( RuntimeException ex ) {\n" +
|
||||||
|
" return false;\n" +
|
||||||
|
" }\n" +
|
||||||
|
" }\n" +
|
||||||
|
"\n" +
|
||||||
|
" public ${themeClass}() {\n" +
|
||||||
|
" super( Utils.loadTheme( \"${themeFile}\" ) );\n" +
|
||||||
|
" }\n" +
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
private static final String ALL_THEMES_TEMPLATE =
|
||||||
|
"package com.formdev.flatlaf.intellijthemes;\n" +
|
||||||
|
"\n" +
|
||||||
|
"import javax.swing.UIManager.LookAndFeelInfo;\n" +
|
||||||
|
"\n" +
|
||||||
|
"/**\n" +
|
||||||
|
" * @author Karl Tauber\n" +
|
||||||
|
" */\n" +
|
||||||
|
"public class FlatAllIJThemes\n" +
|
||||||
|
"{\n" +
|
||||||
|
" public static final LookAndFeelInfo[] INFOS = {\n" +
|
||||||
|
"${allInfos}\n" +
|
||||||
|
" };\n" +
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
private static final String THEME_TEMPLATE =
|
||||||
|
" new LookAndFeelInfo( \"${themeName}\", \"com.formdev.flatlaf.intellijthemes${subPackage}.${themeClass}\" ),";
|
||||||
|
}
|
||||||
@@ -68,7 +68,9 @@ class IJThemesManager
|
|||||||
// get current working directory
|
// get current working directory
|
||||||
File directory = new File( "" ).getAbsoluteFile();
|
File directory = new File( "" ).getAbsoluteFile();
|
||||||
|
|
||||||
File[] themeFiles = directory.listFiles( (dir, name) -> name.endsWith( ".theme.json" ) );
|
File[] themeFiles = directory.listFiles( (dir, name) -> {
|
||||||
|
return name.endsWith( ".theme.json" ) || name.endsWith( ".properties" );
|
||||||
|
} );
|
||||||
if( themeFiles == null )
|
if( themeFiles == null )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -77,7 +79,10 @@ class IJThemesManager
|
|||||||
|
|
||||||
moreThemes.clear();
|
moreThemes.clear();
|
||||||
for( File f : themeFiles ) {
|
for( File f : themeFiles ) {
|
||||||
String name = StringUtils.removeTrailing( f.getName(), ".theme.json" );
|
String fname = f.getName();
|
||||||
|
String name = fname.endsWith( ".properties" )
|
||||||
|
? StringUtils.removeTrailing( fname, ".properties" )
|
||||||
|
: StringUtils.removeTrailing( fname, ".theme.json" );
|
||||||
moreThemes.add( new IJThemeInfo( name, null, null, null, null, null, f, null ) );
|
moreThemes.add( new IJThemeInfo( name, null, null, null, null, null, f, null ) );
|
||||||
lastModifiedMap.put( f, f.lastModified() );
|
lastModifiedMap.put( f, f.lastModified() );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import com.formdev.flatlaf.FlatDarkLaf;
|
|||||||
import com.formdev.flatlaf.FlatIntelliJLaf;
|
import com.formdev.flatlaf.FlatIntelliJLaf;
|
||||||
import com.formdev.flatlaf.FlatLaf;
|
import com.formdev.flatlaf.FlatLaf;
|
||||||
import com.formdev.flatlaf.FlatLightLaf;
|
import com.formdev.flatlaf.FlatLightLaf;
|
||||||
|
import com.formdev.flatlaf.FlatPropertiesLaf;
|
||||||
import com.formdev.flatlaf.IntelliJTheme;
|
import com.formdev.flatlaf.IntelliJTheme;
|
||||||
import com.formdev.flatlaf.demo.DemoPrefs;
|
import com.formdev.flatlaf.demo.DemoPrefs;
|
||||||
import com.formdev.flatlaf.extras.FlatSVGIcon;
|
import com.formdev.flatlaf.extras.FlatSVGIcon;
|
||||||
@@ -58,6 +59,8 @@ import net.miginfocom.swing.*;
|
|||||||
public class IJThemesPanel
|
public class IJThemesPanel
|
||||||
extends JPanel
|
extends JPanel
|
||||||
{
|
{
|
||||||
|
public static final String THEMES_PACKAGE = "/com/formdev/flatlaf/intellijthemes/themes/";
|
||||||
|
|
||||||
private final IJThemesManager themesManager = new IJThemesManager();
|
private final IJThemesManager themesManager = new IJThemesManager();
|
||||||
private final List<IJThemeInfo> themes = new ArrayList<>();
|
private final List<IJThemeInfo> themes = new ArrayList<>();
|
||||||
private final HashMap<Integer, String> categories = new HashMap<>();
|
private final HashMap<Integer, String> categories = new HashMap<>();
|
||||||
@@ -71,6 +74,7 @@ public class IJThemesPanel
|
|||||||
private Window window;
|
private Window window;
|
||||||
|
|
||||||
private File lastDirectory;
|
private File lastDirectory;
|
||||||
|
private boolean isAdjustingThemesList;
|
||||||
|
|
||||||
public IJThemesPanel() {
|
public IJThemesPanel() {
|
||||||
initComponents();
|
initComponents();
|
||||||
@@ -134,6 +138,10 @@ public class IJThemesPanel
|
|||||||
themes.add( new IJThemeInfo( "Flat IntelliJ", null, null, null, null, null, null, FlatIntelliJLaf.class.getName() ) );
|
themes.add( new IJThemeInfo( "Flat IntelliJ", null, null, null, null, null, null, FlatIntelliJLaf.class.getName() ) );
|
||||||
themes.add( new IJThemeInfo( "Flat Darcula", null, null, null, null, null, null, FlatDarculaLaf.class.getName() ) );
|
themes.add( new IJThemeInfo( "Flat Darcula", null, null, null, null, null, null, FlatDarculaLaf.class.getName() ) );
|
||||||
|
|
||||||
|
// add themes from directory
|
||||||
|
categories.put( themes.size(), "Current Directory" );
|
||||||
|
themes.addAll( themesManager.moreThemes );
|
||||||
|
|
||||||
// add uncategorized bundled themes
|
// add uncategorized bundled themes
|
||||||
categories.put( themes.size(), "IntelliJ Themes" );
|
categories.put( themes.size(), "IntelliJ Themes" );
|
||||||
for( IJThemeInfo ti : themesManager.bundledThemes ) {
|
for( IJThemeInfo ti : themesManager.bundledThemes ) {
|
||||||
@@ -157,10 +165,6 @@ public class IJThemesPanel
|
|||||||
themes.add( ti );
|
themes.add( ti );
|
||||||
}
|
}
|
||||||
|
|
||||||
// add themes from directory
|
|
||||||
categories.put( themes.size(), "Current Directory" );
|
|
||||||
themes.addAll( themesManager.moreThemes );
|
|
||||||
|
|
||||||
// remember selection
|
// remember selection
|
||||||
IJThemeInfo oldSel = themesList.getSelectedValue();
|
IJThemeInfo oldSel = themesList.getSelectedValue();
|
||||||
|
|
||||||
@@ -193,14 +197,14 @@ public class IJThemesPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void themesListValueChanged( ListSelectionEvent e ) {
|
private void themesListValueChanged( ListSelectionEvent e ) {
|
||||||
if( e.getValueIsAdjusting() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
IJThemeInfo themeInfo = themesList.getSelectedValue();
|
IJThemeInfo themeInfo = themesList.getSelectedValue();
|
||||||
boolean bundledTheme = (themeInfo != null && themeInfo.resourceName != null);
|
boolean bundledTheme = (themeInfo != null && themeInfo.resourceName != null);
|
||||||
saveButton.setEnabled( bundledTheme );
|
saveButton.setEnabled( bundledTheme );
|
||||||
sourceCodeButton.setEnabled( bundledTheme );
|
sourceCodeButton.setEnabled( bundledTheme );
|
||||||
|
|
||||||
|
if( e.getValueIsAdjusting() || isAdjustingThemesList )
|
||||||
|
return;
|
||||||
|
|
||||||
EventQueue.invokeLater( () -> {
|
EventQueue.invokeLater( () -> {
|
||||||
setTheme( themeInfo );
|
setTheme( themeInfo );
|
||||||
} );
|
} );
|
||||||
@@ -223,15 +227,19 @@ public class IJThemesPanel
|
|||||||
}
|
}
|
||||||
} else if( themeInfo.themeFile != null ) {
|
} else if( themeInfo.themeFile != null ) {
|
||||||
try {
|
try {
|
||||||
FlatLaf.install( IntelliJTheme.createLaf( new FileInputStream( themeInfo.themeFile ) ) );
|
if( themeInfo.themeFile.getName().endsWith( ".properties" ) ) {
|
||||||
DemoPrefs.getState().put( DemoPrefs.KEY_LAF_INTELLIJ_THEME, DemoPrefs.FILE_PREFIX + themeInfo.themeFile );
|
FlatLaf.install( new FlatPropertiesLaf( themeInfo.name, themeInfo.themeFile ) );
|
||||||
|
} else
|
||||||
|
FlatLaf.install( IntelliJTheme.createLaf( new FileInputStream( themeInfo.themeFile ) ) );
|
||||||
|
|
||||||
|
DemoPrefs.getState().put( DemoPrefs.KEY_LAF_THEME, DemoPrefs.FILE_PREFIX + themeInfo.themeFile );
|
||||||
} catch( Exception ex ) {
|
} catch( Exception ex ) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
showInformationDialog( "Failed to load '" + themeInfo.themeFile + "'.", ex );
|
showInformationDialog( "Failed to load '" + themeInfo.themeFile + "'.", ex );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IntelliJTheme.install( getClass().getResourceAsStream( themeInfo.resourceName ) );
|
IntelliJTheme.install( getClass().getResourceAsStream( THEMES_PACKAGE + themeInfo.resourceName ) );
|
||||||
DemoPrefs.getState().put( DemoPrefs.KEY_LAF_INTELLIJ_THEME, DemoPrefs.RESOURCE_PREFIX + themeInfo.resourceName );
|
DemoPrefs.getState().put( DemoPrefs.KEY_LAF_THEME, DemoPrefs.RESOURCE_PREFIX + themeInfo.resourceName );
|
||||||
}
|
}
|
||||||
|
|
||||||
// update all components
|
// update all components
|
||||||
@@ -253,7 +261,7 @@ public class IJThemesPanel
|
|||||||
|
|
||||||
// save theme
|
// save theme
|
||||||
try {
|
try {
|
||||||
Files.copy( getClass().getResourceAsStream( themeInfo.resourceName ),
|
Files.copy( getClass().getResourceAsStream( THEMES_PACKAGE + themeInfo.resourceName ),
|
||||||
file.toPath(), StandardCopyOption.REPLACE_EXISTING );
|
file.toPath(), StandardCopyOption.REPLACE_EXISTING );
|
||||||
} catch( IOException ex ) {
|
} catch( IOException ex ) {
|
||||||
showInformationDialog( "Failed to save theme to '" + file + "'.", ex );
|
showInformationDialog( "Failed to save theme to '" + file + "'.", ex );
|
||||||
@@ -266,7 +274,7 @@ public class IJThemesPanel
|
|||||||
File licenseFile = new File( file.getParentFile(),
|
File licenseFile = new File( file.getParentFile(),
|
||||||
StringUtils.removeTrailing( file.getName(), ".theme.json" ) +
|
StringUtils.removeTrailing( file.getName(), ".theme.json" ) +
|
||||||
themeInfo.licenseFile.substring( themeInfo.licenseFile.indexOf( '.' ) ) );
|
themeInfo.licenseFile.substring( themeInfo.licenseFile.indexOf( '.' ) ) );
|
||||||
Files.copy( getClass().getResourceAsStream( themeInfo.licenseFile ),
|
Files.copy( getClass().getResourceAsStream( THEMES_PACKAGE + themeInfo.licenseFile ),
|
||||||
licenseFile.toPath(), StandardCopyOption.REPLACE_EXISTING );
|
licenseFile.toPath(), StandardCopyOption.REPLACE_EXISTING );
|
||||||
} catch( IOException ex ) {
|
} catch( IOException ex ) {
|
||||||
showInformationDialog( "Failed to save theme license to '" + file + "'.", ex );
|
showInformationDialog( "Failed to save theme license to '" + file + "'.", ex );
|
||||||
@@ -331,17 +339,17 @@ public class IJThemesPanel
|
|||||||
|
|
||||||
private void selectedCurrentLookAndFeel() {
|
private void selectedCurrentLookAndFeel() {
|
||||||
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
|
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
|
||||||
String intelliJTheme = UIManager.getLookAndFeelDefaults().getString( DemoPrefs.INTELLIJ_THEME_UI_KEY );
|
String theme = UIManager.getLookAndFeelDefaults().getString( DemoPrefs.THEME_UI_KEY );
|
||||||
|
|
||||||
if( intelliJTheme == null && lookAndFeel instanceof IntelliJTheme.ThemeLaf )
|
if( theme == null && (lookAndFeel instanceof IntelliJTheme.ThemeLaf || lookAndFeel instanceof FlatPropertiesLaf) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Predicate<IJThemeInfo> test;
|
Predicate<IJThemeInfo> test;
|
||||||
if( intelliJTheme != null && intelliJTheme.startsWith( DemoPrefs.RESOURCE_PREFIX ) ) {
|
if( theme != null && theme.startsWith( DemoPrefs.RESOURCE_PREFIX ) ) {
|
||||||
String resourceName = intelliJTheme.substring( DemoPrefs.RESOURCE_PREFIX.length() );
|
String resourceName = theme.substring( DemoPrefs.RESOURCE_PREFIX.length() );
|
||||||
test = ti -> Objects.equals( ti.resourceName, resourceName );
|
test = ti -> Objects.equals( ti.resourceName, resourceName );
|
||||||
} else if( intelliJTheme != null && intelliJTheme.startsWith( DemoPrefs.FILE_PREFIX ) ) {
|
} else if( theme != null && theme.startsWith( DemoPrefs.FILE_PREFIX ) ) {
|
||||||
File themeFile = new File( intelliJTheme.substring( DemoPrefs.FILE_PREFIX.length() ) );
|
File themeFile = new File( theme.substring( DemoPrefs.FILE_PREFIX.length() ) );
|
||||||
test = ti -> Objects.equals( ti.themeFile, themeFile );
|
test = ti -> Objects.equals( ti.themeFile, themeFile );
|
||||||
} else {
|
} else {
|
||||||
String lafClassName = lookAndFeel.getClass().getName();
|
String lafClassName = lookAndFeel.getClass().getName();
|
||||||
@@ -356,11 +364,13 @@ public class IJThemesPanel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isAdjustingThemesList = true;
|
||||||
if( newSel >= 0 ) {
|
if( newSel >= 0 ) {
|
||||||
if( newSel != themesList.getSelectedIndex() )
|
if( newSel != themesList.getSelectedIndex() )
|
||||||
themesList.setSelectedIndex( newSel );
|
themesList.setSelectedIndex( newSel );
|
||||||
} else
|
} else
|
||||||
themesList.clearSelection();
|
themesList.clearSelection();
|
||||||
|
isAdjustingThemesList = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initComponents() {
|
private void initComponents() {
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public class IJThemesUpdater
|
|||||||
else if( fromUrl.contains( "gitlab.com" ) )
|
else if( fromUrl.contains( "gitlab.com" ) )
|
||||||
fromUrl = fromUrl.replace( "/blob/", "/raw/" );
|
fromUrl = fromUrl.replace( "/blob/", "/raw/" );
|
||||||
|
|
||||||
String toPath = "src/main/resources/com/formdev/flatlaf/demo/intellijthemes/" + ti.resourceName;
|
String toPath = "../flatlaf-intellij-themes/src/main/resources" + IJThemesPanel.THEMES_PACKAGE + ti.resourceName;
|
||||||
|
|
||||||
download( fromUrl, toPath );
|
download( fromUrl, toPath );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
The icons in this folder are 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/
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd" transform="translate(2 2)">
|
||||||
|
<rect width="5.5" height="5.5" fill="#59A869"/>
|
||||||
|
<rect width="5.5" height="5.5" x="6.5" fill="#EDA200"/>
|
||||||
|
<rect width="5.5" height="5.5" y="6.5" fill="#389FD6"/>
|
||||||
|
<rect width="5.5" height="5.5" x="6.5" y="6.5" fill="#DB5860"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 403 B |
@@ -1,6 +1,6 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
<g fill="none" fill-rule="evenodd">
|
<g fill="none" fill-rule="evenodd">
|
||||||
<path fill="#AFB1B3" d="M11,3 L4,3 L4,11 L2,11 L2,1 L11,1 L11,3 Z"/>
|
<path fill="#6E6E6E" d="M11,3 L4,3 L4,11 L2,11 L2,1 L11,1 L11,3 Z"/>
|
||||||
<path fill="#AFB1B3" d="M5,4 L14,4 L14,14 L5,14 L5,4 Z M7,6 L7,7 L12,7 L12,6 L7,6 Z M7,10 L7,11 L12,11 L12,10 L7,10 Z M7,8 L7,9 L12,9 L12,8 L7,8 Z"/>
|
<path fill="#6E6E6E" d="M5,4 L14,4 L14,14 L5,14 L5,4 Z M7,6 L7,7 L12,7 L12,6 L7,6 Z M7,10 L7,11 L12,11 L12,10 L7,10 Z M7,8 L7,9 L12,9 L12,8 L7,8 Z"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 363 B After Width: | Height: | Size: 363 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<polygon fill="#59A869" fill-rule="evenodd" points="4 2 14 8 4 14"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 162 B |
@@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<rect width="6" height="1" x="5" y="12" fill="#6E6E6E"/>
|
||||||
|
<path fill="#6E6E6E" d="M5.5,14 L10.5,14 L10.5,14 C10.5,14.5522847 10.0522847,15 9.5,15 L6.5,15 C5.94771525,15 5.5,14.5522847 5.5,14 Z"/>
|
||||||
|
<path fill="#EDA200" d="M13,5.2 C13,9.2 11,8.96875 11,11 L5,11 C5,9.03125 3,9.2 3,5.2 C3,2.991 5.23878906,1 8,1 C10.76125,1 13,2.99103125 13,5.2 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 493 B |
@@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<rect width="6" height="1" x="5" y="12" fill="#6E6E6E"/>
|
||||||
|
<path fill="#6E6E6E" d="M5.5,14 L10.5,14 L10.5,14 C10.5,14.5522847 10.0522847,15 9.5,15 L6.5,15 C5.94771525,15 5.5,14.5522847 5.5,14 Z"/>
|
||||||
|
<path fill="#389FD6" d="M13,5.2 C13,9.2 11,8.96875 11,11 L5,11 C5,9.03125 3,9.2 3,5.2 C3,2.991 5.23878906,1 8,1 C10.76125,1 13,2.99103125 13,5.2 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 493 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<rect width="10" height="10" x="3" y="3" fill="#DB5860" fill-rule="evenodd"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 171 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||||||
|
<path fill="#DB5860" fill-rule="evenodd" d="M16,30 C8.2680135,30 2,23.7319865 2,16 C2,8.2680135 8.2680135,2 16,2 C23.7319865,2 30,8.2680135 30,16 C30,23.7319865 23.7319865,30 16,30 Z M14,7 L14,18 L18,18 L18,7 L14,7 Z M14,21 L14,25 L18,25 L18,21 L14,21 Z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 350 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||||||
|
<path fill="#389FD6" fill-rule="evenodd" d="M16,30 C8.2680135,30 2,23.7319865 2,16 C2,8.2680135 8.2680135,2 16,2 C23.7319865,2 30,8.2680135 30,16 C30,23.7319865 23.7319865,30 16,30 Z M14,7 L14,18 L18,18 L18,7 L14,7 Z M14,21 L14,25 L18,25 L18,21 L14,21 Z" transform="rotate(180 16 16)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 380 B |
@@ -0,0 +1,19 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<defs>
|
||||||
|
<rect id="abstractclass-a" width="8" height="14"/>
|
||||||
|
</defs>
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<path fill="#9AA7B0" fill-opacity=".8" d="M3 3.1055C1.764 4.3685 1 6.0935 1 8.0005 1 9.9065 1.764 11.6315 3 12.8945L3 3.1055zM13 3.1055L13 12.8945C14.236 11.6315 15 9.9065 15 8.0005 15 6.0935 14.236 4.3675 13 3.1055"/>
|
||||||
|
<g transform="translate(4 1)">
|
||||||
|
<mask id="abstractclass-b" fill="#fff">
|
||||||
|
<use xlink:href="#abstractclass-a"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#abstractclass-b)">
|
||||||
|
<g transform="translate(-4 -1)">
|
||||||
|
<path fill="#40B6E0" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
|
||||||
|
<path fill="#231F20" fill-opacity=".7" d="M5,4.28253174 C4.53,4.74153174 4.028,4.978 3.1,5 C2.061,5.022 1,4.2794 1,3.0004 C1,1.7124 1.971,1 3.1,1 C3.94833171,1 4.54833171,1.18475342 4.9,1.55426025 L5.5162,0.836730957 C4.8293999,0.270175195 4.28826904,0.0004 3.0982,0.0004 C1.3402,0.0004 0.0002,1.3584 0.0002,3.0004 C0.0002,4.6824 1.3642,6.0004 3.0022,6.0004 C4.29284668,6.0004 5.0232,5.5934 5.6162,4.9814 C5.2054,4.51548783 5,4.28253174 5,4.28253174 Z" transform="translate(5 5)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,19 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<defs>
|
||||||
|
<rect id="abstractmethod-a" width="8" height="14"/>
|
||||||
|
</defs>
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<path fill="#9AA7B0" fill-opacity=".8" d="M3 3.1055C1.764 4.3685 1 6.0935 1 8.0005 1 9.9065 1.764 11.6315 3 12.8945L3 3.1055zM13 3.1055L13 12.8945C14.236 11.6315 15 9.9065 15 8.0005 15 6.0935 14.236 4.3675 13 3.1055"/>
|
||||||
|
<g transform="translate(4 1)">
|
||||||
|
<mask id="abstractmethod-b" fill="#fff">
|
||||||
|
<use xlink:href="#abstractmethod-a"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#abstractmethod-b)">
|
||||||
|
<g transform="translate(-4 -1)">
|
||||||
|
<path fill="#F98B9E" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
|
||||||
|
<path fill="#231F20" fill-opacity=".7" d="M6.9922,2 C6.9912,1.251 6.63513184,0.0003 4.98162842,0.0003 C4.11224365,0.0003 3.6576,0.502 3.5986,0.6 C3.28363037,0.194116211 2.94411621,0.0003 2.1,0.0003 C1.63194173,0.0003 1.26527507,0.0999436667 1,0.299231 L1,0.0003 L0,0.0003 L0,5.0003 L1,5.0003 C0.966666667,3.1563 0.966666667,2.1562 1,2 C1.05,1.7657 1.05,1 2,1 C2.95,1 2.999,1.537 3,2 L3,5.0003 L4,5.0003 L4,2 C4,1.686 3.95911952,1 4.98162842,1 C6.00413731,1 6.00413731,1.73961181 6.00469971,2 C6.00469971,2.79041884 6.00469971,3.38323296 6.00469971,3.77844238 C6.00469971,4.0499663 6.00469971,4.45725217 6.00469971,5.0003 L6.9972,5.0003 L6.9922,2 Z" transform="translate(5 6)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<path fill="#62B543" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
|
||||||
|
<path fill="#231F20" fill-opacity=".7" d="M3.6281,2.7611 C3.4731,2.8511 3.3451,2.9741 3.2461,3.1241 C3.1511,3.2721 3.0811,3.4411 3.0391,3.6261 C2.9971,3.8091 2.9761,3.9961 2.9761,4.1841 C2.9761,4.5861 3.0491,4.8721 3.1971,5.0581 C3.3491,5.2481 3.5541,5.3451 3.8051,5.3451 C3.9701,5.3451 4.1151,5.3071 4.2371,5.2311 C4.3571,5.1581 4.4571,5.0531 4.5331,4.9201 C4.6061,4.7931 4.6631,4.6401 4.7011,4.4641 C4.7391,4.2941 4.7641,4.1011 4.7731,3.8931 L4.8421,2.6991 L4.8001,2.6891 C4.6851,2.6621 4.5981,2.6481 4.5001,2.6371 C4.4021,2.6271 4.3041,2.6221 4.2021,2.6221 C3.9781,2.6221 3.7861,2.6681 3.6281,2.7611 Z M0.0021,4.0006 C0.0021,0.0011 3.66741943,0.0011 4.3161,0.0011 C4.65105644,0.0011 8.0001,0.0864290039 8.0001,3.5571 C8.0001,6.0091 6.4751,6 6.1701,6 C5.67331784,5.97 5.31431784,5.7737 5.0931,5.4111 C4.68260397,5.8037 4.28127064,6 3.8891,6 C3.0796519,6 2.0001,5.9211 2.0001,4.0001 C2.0001,2.32043457 3.45593262,2.0001 4.0001,2.0001 C4.1531,2.0001 5.7451,2.0551 5.8241,2.0791 L5.7441,4.1881 C5.6361,4.89276667 5.7991,5.2451 6.2331,5.2451 C6.95605469,5.2451 7.0601,3.7831 7.0601,3.5471 C7.0601,0.907409668 4.7081,0.7451 4.3161,0.7451 C3.7711,0.7451 0.94354248,0.850891113 0.94354248,4.0006 C0.94354248,4.58402311 0.94354248,7.2461 3.8891,7.2461 C4.0901,7.2461 5.7441,7.04302979 6.1621,6.8281 L6.1621,7.5781 C5.8551,7.7031 5.0931,8.0001 3.8981,8.0001 C3.15576172,8.0001 0.0021,8.0001 0.0021,4.0006 Z" transform="translate(4 4)"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<polygon fill="#9AA7B0" fill-opacity=".8" points="7 1 3 5 7 5"/>
|
||||||
|
<polygon fill="#9AA7B0" fill-opacity=".8" points="8 1 8 6 3 6 3 8 13 8 13 1"/>
|
||||||
|
<polygon fill="#40B6E0" fill-opacity=".7" points="1 16 16 16 16 9 1 9"/>
|
||||||
|
<path fill="#231F20" fill-opacity=".7" d="M0,2.501 C0,1 0.931,2.02832126e-16 2.256,0 C3.20239258,0 3.55,0.311 3.969,0.753 L3.42669678,1.42712402 C3.07669678,1.06812402 2.75,1 2.25,1 C1.418,1 1,1.73791504 1,2.487 C1,3.23608496 1.412,4 2.25,4 C2.787,4 3.05169678,3.89340869 3.42669678,3.50640869 L4,4.144 C3.544,4.669 3.19732666,5 2.225,5 C0.949,5 7.35277938e-17,4.002 0,2.501 Z" transform="translate(2 10)"/>
|
||||||
|
<path fill="#231F20" fill-opacity=".7" d="M0.972767969,1.50152588 C0.972767969,1.13305664 1.284,1 1.845,1 C1.85033333,1 2.23533333,1 3,1 L3,0 C2.26266667,0 1.88266667,0 1.86,0 C0.778,0 0,0.45916748 0,1.45 C0,2.31452637 0.419555664,2.69049072 1.47125244,2.91607666 C2.24158869,3.08131157 2.496155,3.22862939 2.496155,3.548 C2.496155,3.86737061 2.13842773,4 1.47125244,4 C1.46058577,4 1.07016829,4 0.3,4 L0.3,5 C1.07550163,5 1.46591911,5 1.47125244,5 C3.5,5 3.5,4 3.5,3.548 C3.5,2.91607666 3.02026367,2.42071533 2.15869141,2.14685059 C1.29711914,1.87298584 0.972767969,1.86999512 0.972767969,1.50152588 Z" transform="translate(7 10)"/>
|
||||||
|
<path fill="#231F20" fill-opacity=".7" d="M0.972767969,1.50152588 C0.972767969,1.13305664 1.284,1 1.845,1 C1.85033333,1 2.23533333,1 3,1 L3,0 C2.26266667,0 1.88266667,0 1.86,0 C0.778,0 0,0.45916748 0,1.45 C0,2.31452637 0.419555664,2.69049072 1.47125244,2.91607666 C2.24158869,3.08131157 2.496155,3.22862939 2.496155,3.548 C2.496155,3.86737061 2.13842773,4 1.47125244,4 C1.46058577,4 1.07016829,4 0.3,4 L0.3,5 C1.07550163,5 1.46591911,5 1.47125244,5 C3.5,5 3.5,4 3.5,3.548 C3.5,2.91607666 3.02026367,2.42071533 2.15869141,2.14685059 C1.29711914,1.87298584 0.972767969,1.86999512 0.972767969,1.50152588 Z" transform="translate(11 10)"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
@@ -0,0 +1,9 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<polygon fill="#F4AF3D" fill-opacity=".7" points="1 16 16 16 16 9 1 9"/>
|
||||||
|
<polygon fill="#9AA7B0" fill-opacity=".8" points="7 1 3 5 7 5"/>
|
||||||
|
<polygon fill="#9AA7B0" fill-opacity=".8" points="8 1 8 6 3 6 3 8 13 8 13 1"/>
|
||||||
|
<path fill="#231F20" fill-opacity=".7" d="M1.39509277,3.58770752 C1.62440186,3.83789062 1.83782861,4 2.28682861,4 C2.81318359,4 3,3.58770752 3,3.29760742 L3,0 L4,0 L4,3.58770752 C4,4.31964111 3.32670898,5 2.45,5 C1.629,5 1.15,4.76264111 0.8,4.31964111 L1.39509277,3.58770752 Z" transform="translate(1 10)"/>
|
||||||
|
<path fill="#231F20" fill-opacity=".7" d="M0.972767969,1.50152588 C0.972767969,1.13305664 1.284,1 1.845,1 C1.85033333,1 2.23533333,1 3,1 L3,0 C2.26266667,0 1.88266667,0 1.86,0 C0.778,0 0,0.45916748 0,1.45 C0,2.31452637 0.419555664,2.69049072 1.47125244,2.91607666 C2.24158869,3.08131157 2.496155,3.22862939 2.496155,3.548 C2.496155,3.86737061 2.13842773,4 1.47125244,4 C1.46058577,4 1.07016829,4 0.3,4 L0.3,5 C1.07550163,5 1.46591911,5 1.47125244,5 C3.5,5 3.5,4 3.5,3.548 C3.5,2.91607666 3.02026367,2.42071533 2.15869141,2.14685059 C1.29711914,1.87298584 0.972767969,1.86999512 0.972767969,1.50152588 Z" transform="translate(6 10)"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,8 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<polygon fill="#F26522" fill-opacity=".7" points="1 16 16 16 16 9 1 9"/>
|
||||||
|
<polygon fill="#9AA7B0" fill-opacity=".8" points="7 1 3 5 7 5"/>
|
||||||
|
<polygon fill="#9AA7B0" fill-opacity=".8" points="8 1 8 6 3 6 3 8 13 8 13 1"/>
|
||||||
|
<polygon fill="#231F20" fill-opacity=".7" points="0 0 1 0 1 2 3 2 3 0 4 0 4 5 3 5 3 3 1 3 1 5 0 5" transform="translate(3 10)"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 498 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||||||
|
<path fill="#EDA200" fill-rule="evenodd" d="M16,2 L31,28 L1,28 L16,2 Z M18,25 L18,21 L14,21 L14,25 L18,25 Z M18,18 L18,10 L14,10 L14,18 L18,18 Z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 241 B |
@@ -1,9 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<g fill="#AFB1B3" fill-rule="evenodd" transform="translate(1 3)">
|
|
||||||
<rect width="11" height="2" x="2" y="4"/>
|
|
||||||
<g transform="translate(0 .02)">
|
|
||||||
<rect width="7" height="1.8" x="-.389" y="2.24" transform="rotate(-45 3.111 3.14)"/>
|
|
||||||
<rect width="1.8" height="7" x="2.211" y="3.317" transform="rotate(-45 3.111 6.817)"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 442 B |
@@ -1,6 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<g fill="none" fill-rule="evenodd">
|
|
||||||
<polygon fill="#AFB1B3" points="9 7 12 7 8 11 4 7 7 7 7 2 9 2" transform="matrix(-1 0 0 1 16 0)"/>
|
|
||||||
<rect width="12" height="2" x="2" y="12" fill="#AFB1B3"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 301 B |
@@ -1,9 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<g fill="#AFB1B3" fill-rule="evenodd" transform="matrix(-1 0 0 1 15 3)">
|
|
||||||
<rect width="12" height="2" x="1" y="4"/>
|
|
||||||
<g transform="translate(0 .02)">
|
|
||||||
<rect width="7" height="1.8" x="-.389" y="2.24" transform="rotate(-45 3.111 3.14)"/>
|
|
||||||
<rect width="1.8" height="7" x="2.211" y="3.317" transform="rotate(-45 3.111 6.817)"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 449 B |
|
After Width: | Height: | Size: 325 B |
|
After Width: | Height: | Size: 495 B |
@@ -1,3 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path fill="#AFB1B3" d="M6.53206047,5.10906 C6.68535547,4.77581 6.77200047,4.40923501 6.77200047,4.01600001 C6.77200047,2.54303502 5.57896548,1.35000002 4.10600049,1.35000002 C2.63303549,1.35000002 1.4400005,2.54303502 1.4400005,4.01600001 C1.4400005,5.488965 2.63303549,6.68199999 4.10600049,6.68199999 C4.49923548,6.68199999 4.86581048,6.59535499 5.19906048,6.44205999 L6.77200047,8.01499999 L5.19906048,9.58793998 C4.86581048,9.43464498 4.49923548,9.34799998 4.10600049,9.34799998 C2.63303549,9.34799998 1.4400005,10.541035 1.4400005,12.014 C1.4400005,13.486965 2.63303549,14.6799999 4.10600049,14.6799999 C5.57896548,14.6799999 6.77200047,13.486965 6.77200047,12.014 C6.77200047,11.620765 6.68535547,11.25419 6.53206047,10.92094 L8.10500046,9.34799998 L12.7705004,14 L14.7700004,14 L14.7700004,13.347 L6.53206047,5.10906 Z M4.1053342,5.33702364 C3.37236745,5.33702364 2.77266738,4.74383861 2.77266738,4.00402356 C2.77266738,3.26420851 3.37236745,2.67102348 4.1053342,2.67102348 C4.83830096,2.67102348 5.43800103,3.26420851 5.43800103,4.00402356 C5.43800103,4.74383861 4.83830096,5.33702364 4.1053342,5.33702364 Z M4.1053342,13.3350241 C3.37236745,13.3350241 2.77266738,12.7418391 2.77266738,12.0020241 C2.77266738,11.262209 3.37236745,10.669024 4.1053342,10.669024 C4.83830096,10.669024 5.43800103,11.262209 5.43800103,12.0020241 C5.43800103,12.7418391 4.83830096,13.3350241 4.1053342,13.3350241 Z M8.10333468,8.33627383 C7.91676132,8.33627383 7.77016797,8.18964382 7.77016797,8.00302381 C7.77016797,7.8164038 7.91676132,7.66977379 8.10333468,7.66977379 C8.28990803,7.66977379 8.43650138,7.8164038 8.43650138,8.00302381 C8.43650138,8.18964382 8.28990803,8.33627383 8.10333468,8.33627383 Z M12.7710002,2.00452344 L8.77299971,6.00352368 L10.1056665,7.33652377 L14.7700004,2.67102348 L14.7700004,2.00452344 L12.7710002,2.00452344 Z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.9 KiB |
@@ -1,3 +1,3 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
<path fill="#737373" fill-rule="evenodd" d="M3,1 L3,0 L7,0 L7,1 L10,1 L10,13 L0,13 L0,1 L3,1 Z M4,1 L4,2 L6,2 L6,1 L4,1 Z M2,4 L2,11 L8,11 L8,4 L2,4 Z" transform="translate(3 1)"/>
|
<path fill="#6E6E6E" fill-rule="evenodd" d="M3,1 L3,0 L7,0 L7,1 L10,1 L10,13 L0,13 L0,1 L3,1 Z M4,1 L4,2 L6,2 L6,1 L4,1 Z M2,4 L2,11 L8,11 L8,4 L2,4 Z" transform="translate(3 1)"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 274 B |
@@ -1,3 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path fill="#AFB1B3" fill-rule="evenodd" d="M3,1 L3,0 L7,0 L7,1 L10,1 L10,13 L0,13 L0,1 L3,1 Z M4,1 L4,2 L6,2 L6,1 L4,1 Z M2,4 L2,11 L8,11 L8,4 L2,4 Z" transform="translate(3 1)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 274 B |
@@ -1,3 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path fill="#AFB1B3" d="M8.35170965,4.66666667 C6.5846115,4.66666667 4.98422073,5.32666667 3.75058618,6.4 L1.35000002,4 L1.35000002,10 L7.35146542,10 L4.93754267,7.58666667 C5.86443566,6.81333333 7.04472385,6.33333333 8.35170965,6.33333333 C10.712286,6.33333333 12.7194428,7.87333333 13.4196138,10 L14.9999996,9.48 C14.0731067,6.68666667 11.4524668,4.66666667 8.35170965,4.66666667 Z" transform="matrix(-1 0 0 1 16.35 0)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 517 B |
@@ -1,3 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path fill="#AFB1B3" fill-rule="evenodd" d="M12.5747152,11.8852806 C11.4741474,13.1817355 9.83247882,14.0044386 7.99865879,14.0044386 C5.03907292,14.0044386 2.57997332,11.8615894 2.08820756,9.0427473 L3.94774327,9.10768372 C4.43372186,10.8898575 6.06393114,12.2000519 8.00015362,12.2000519 C9.30149237,12.2000519 10.4645985,11.6082097 11.2349873,10.6790094 L9.05000019,8.71167959 L14.0431479,8.44999981 L14.3048222,13.4430431 L12.5747152,11.8852806 Z M3.42785637,4.11741586 C4.52839138,2.82452748 6.16775464,2.00443857 7.99865879,2.00443857 C10.918604,2.00443857 13.3513802,4.09026967 13.8882946,6.8532307 L12.0226389,6.78808057 C11.5024872,5.05935553 9.89838095,3.8000774 8.00015362,3.8000774 C6.69867367,3.8000774 5.53545628,4.39204806 4.76506921,5.32142241 L6.95482203,7.29304326 L1.96167436,7.55472304 L1.70000005,2.56167973 L3.42785637,4.11741586 Z" transform="rotate(3 8.002 8.004)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 984 B |
@@ -1,3 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path fill="#AFB1B3" d="M8,3 C4.81818182,3 2.10090909,5.07333333 1,8 C2.10090909,10.9266667 4.81818182,13 8,13 C11.1818182,13 13.8990909,10.9266667 15,8 C13.8990909,5.07333333 11.1818182,3 8,3 Z M8,11.5 C6.068,11.5 4.5,9.932 4.5,8 C4.5,6.068 6.068,4.5 8,4.5 C9.932,4.5 11.5,6.068 11.5,8 C11.5,9.932 9.932,11.5 8,11.5 Z M8,6 C6.89333333,6 6,6.89333333 6,8 C6,9.10666667 6.89333333,10 8,10 C9.10666667,10 10,9.10666667 10,8 C10,6.89333333 9.10666667,6 8,6 Z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 552 B |
@@ -1,3 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path fill="#AFB1B3" d="M8.00170962,4.66666667 C6.23461148,4.66666667 4.63422071,5.32666667 3.40058616,6.4 L1,4 L1,10 L7.00146539,10 L4.58754265,7.58666667 C5.51443563,6.81333333 6.69472383,6.33333333 8.00170962,6.33333333 C10.362286,6.33333333 12.3694428,7.87333333 13.0696137,10 L14.6499996,9.48 C13.7231066,6.68666667 11.1024667,4.66666667 8.00170962,4.66666667 Z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 463 B |
@@ -1,322 +0,0 @@
|
|||||||
{
|
|
||||||
"author": "Vlad Volkov",
|
|
||||||
"colors": {
|
|
||||||
"accent": "#FFC83C",
|
|
||||||
"greyDot15": "#d8d8d8",
|
|
||||||
"greyDot25": "#bfbfbf",
|
|
||||||
"greyDot33": "#aaaaaa",
|
|
||||||
"greyDot50": "#7d7d7d",
|
|
||||||
"greyDot65": "#5a5a5a",
|
|
||||||
"greyDot70": "#4d4d4d",
|
|
||||||
"greyDot75": "#434343",
|
|
||||||
"greyDot80": "#323232",
|
|
||||||
"greyDot85": "#252525",
|
|
||||||
"greyDot90": "#191919",
|
|
||||||
"navyDot85": "#191d21",
|
|
||||||
"navyDot90": "#1f2021",
|
|
||||||
"lightBlue": "#90dae6",
|
|
||||||
"green": "#5B8021",
|
|
||||||
"red": "#800040",
|
|
||||||
"desaturatedBlue": "#1e282d",
|
|
||||||
"desaturatedOrange": "#8049117f",
|
|
||||||
"transparentGreen": "#5B80217f",
|
|
||||||
"transparentRed": "#8000407f",
|
|
||||||
"transparentYellow": "#8066357f",
|
|
||||||
"transparentViolet": "#9478F67f",
|
|
||||||
"yellow": "#806635"
|
|
||||||
},
|
|
||||||
"dark": true,
|
|
||||||
"editorScheme": "/Hiberbee.xml",
|
|
||||||
"icons": {
|
|
||||||
"ColorPalette": {
|
|
||||||
"Actions.Grey": "#afafaf",
|
|
||||||
"Actions.Red": "#ff0072",
|
|
||||||
"Actions.Yellow": "#f7cd46",
|
|
||||||
"Actions.Green": "#A6E22E",
|
|
||||||
"Actions.Blue": "#307bf6",
|
|
||||||
"Actions.GreyInline": "#afafaf",
|
|
||||||
"Actions.GreyInline.Dark": "#7d7d7d",
|
|
||||||
"Objects.Grey": "#c8c8c8",
|
|
||||||
"Objects.RedStatus": "#EC5F5D",
|
|
||||||
"Objects.Red": "#ff0072",
|
|
||||||
"Objects.Pink": "#ffa9ca",
|
|
||||||
"Objects.Yellow": "#f7cd46",
|
|
||||||
"Objects.Green": "#78b756",
|
|
||||||
"Objects.Purple": "#9478f6",
|
|
||||||
"Objects.BlackText": "#4d4d4d",
|
|
||||||
"Objects.Blue": "#49b0f1",
|
|
||||||
"Objects.YellowDark": "#fd971f",
|
|
||||||
"Objects.GreenAndroid": "#78c856"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"name": "Hiberbee",
|
|
||||||
"ui": {
|
|
||||||
"ActionButton.hoverBackground": "greyDot65",
|
|
||||||
"ActionButton.hoverBorderColor": "greyDot50",
|
|
||||||
"ActionButton.pressedBackground": "greyDot65",
|
|
||||||
"Borders.ContrastBorderColor": "greyDot65",
|
|
||||||
"ActionButton.pressedBorderColor": "lightBlue",
|
|
||||||
"Borders.color": "greyDot65",
|
|
||||||
"Button.arc": "5",
|
|
||||||
"Button.background": "greyDot80",
|
|
||||||
"Button.default.endBackground": "greyDot80",
|
|
||||||
"Button.default.endBorderColor": "greyDot65",
|
|
||||||
"Button.default.startBorderColor": "greyDot65",
|
|
||||||
"Button.default.focusColor": "greyDot50",
|
|
||||||
"Button.default.focusedBorderColor": "lightBlue",
|
|
||||||
"Button.default.foreground": "greyDot25",
|
|
||||||
"Button.default.shadowColor": "navyDot90",
|
|
||||||
"Button.default.startBackground": "greyDot80",
|
|
||||||
"Button.endBackground": "greyDot80",
|
|
||||||
"Button.startBorderColor": "greyDot65",
|
|
||||||
"Button.endBorderColor": "greyDot65",
|
|
||||||
"Button.focusedBorderColor": "accent",
|
|
||||||
"Button.foreground": "greyDot25",
|
|
||||||
"Button.shadowColor": "navyDot90",
|
|
||||||
"Button.shadowWidth": "0",
|
|
||||||
"Button.startBackground": "greyDot80",
|
|
||||||
"CheckBox.background": "greyDot80",
|
|
||||||
"CheckBoxMenuItem.background": "greyDot80",
|
|
||||||
"CheckBoxMenuItem.disabledBackground": "greyDot85",
|
|
||||||
"CheckBoxMenuItem.selectionForeground": "accent",
|
|
||||||
"ComboBox.ArrowButton.disabledIconColor": "greyDot50",
|
|
||||||
"ComboBox.ArrowButton.iconColor": "accent",
|
|
||||||
"ComboBox.ArrowButton.nonEditableBackground": "greyDot70",
|
|
||||||
"ComboBox.background": "greyDot80",
|
|
||||||
"ComboBox.modifiedItemForeground": "accent",
|
|
||||||
"ComboBox.nonEditableBackground": "greyDot75",
|
|
||||||
"ComboPopup.border": "1,1,1,1,5a5a5a",
|
|
||||||
"CompletionPopup.foreground": "greyDot25",
|
|
||||||
"CompletionPopup.matchForeground": "accent",
|
|
||||||
"CompletionPopup.selectionBackground": "navyDot85",
|
|
||||||
"CompletionPopup.selectionInactiveBackground": "greyDot80",
|
|
||||||
"Component.arc": "5",
|
|
||||||
"Component.borderColor": "greyDot65",
|
|
||||||
"Component.errorFocusColor": "red",
|
|
||||||
"Component.focusColor": "accent",
|
|
||||||
"Component.focusWidth": "0",
|
|
||||||
"Component.focusedBorderColor": "greyDot50",
|
|
||||||
"Component.hoverIconColor": "accent",
|
|
||||||
"Component.iconColor": "lightBlue",
|
|
||||||
"Component.inactiveErrorFocusColor": "transparentRed",
|
|
||||||
"Component.inactiveWarningFocusColor": "transparentYellow",
|
|
||||||
"Component.warningFocusColor": "yellow",
|
|
||||||
"Counter.background": "greyDot80",
|
|
||||||
"Counter.foreground": "greyDot25",
|
|
||||||
"Debugger.Variables.changedValueForeground": "accent",
|
|
||||||
"Debugger.Variables.evaluatingExpressionForeground": "lightBlue",
|
|
||||||
"DebuggerPopup.borderColor": "greyDot65",
|
|
||||||
"DefaultTabs.background": "greyDot80",
|
|
||||||
"DefaultTabs.borderColor": "greyDot65",
|
|
||||||
"DefaultTabs.hoverBackground": "navyDot85",
|
|
||||||
"DefaultTabs.underlineColor": "accent",
|
|
||||||
"DefaultTabs.underlineHeight": 1,
|
|
||||||
"DefaultTabs.underlinedTabBackground": "greyDot75",
|
|
||||||
"DefaultTabs.underlinedTabForeground": "lightBlue",
|
|
||||||
"DragAndDrop.areaBackground": "greyDot75",
|
|
||||||
"DragAndDrop.areaForeground": "greyDot25",
|
|
||||||
"Editor.background": "greyDot90",
|
|
||||||
"Editor.foreground": "greyDot25",
|
|
||||||
"EditorPane.background": "greyDot80",
|
|
||||||
"EditorPane.caretForeground": "accent",
|
|
||||||
"EditorPane.foreground": "greyDot25",
|
|
||||||
"EditorPane.inactiveBackground": "greyDot85",
|
|
||||||
"EditorPane.inactiveForeground": "greyDot50",
|
|
||||||
"EditorPane.selectionBackground": "navyDot85",
|
|
||||||
"EditorPane.selectionForeground": "accent",
|
|
||||||
"EditorTabs.underlineHeight": 1,
|
|
||||||
"FileColor.Blue": "#23282d",
|
|
||||||
"FileColor.Green": "#232d28",
|
|
||||||
"FileColor.Orange": "#2d2823",
|
|
||||||
"FileColor.Rose": "#2d2323",
|
|
||||||
"FileColor.Violet": "#2D232D",
|
|
||||||
"FileColor.Yellow": "#2d2d23",
|
|
||||||
"GutterTooltip.infoForeground": "greyDot50",
|
|
||||||
"InplaceRefactoringPopup.borderColor": "lightBlue",
|
|
||||||
"Label.background": "greyDot80",
|
|
||||||
"Link.activeForeground": "lightBlue",
|
|
||||||
"Link.hoverForeground": "accent",
|
|
||||||
"Link.pressedForeground": "lightBlue",
|
|
||||||
"Link.visitedForeground": "greyDot25",
|
|
||||||
"List.background": "greyDot80",
|
|
||||||
"List.selectionBackground": "navyDot85",
|
|
||||||
"List.selectionForeground": "accent",
|
|
||||||
"MemoryIndicator.allocatedBackground": "green",
|
|
||||||
"MemoryIndicator.usedBackground": "red",
|
|
||||||
"Menu.acceleratorForeground": "greyDot25",
|
|
||||||
"Menu.acceleratorSelectionForeground": "accent",
|
|
||||||
"Menu.background": "greyDot80",
|
|
||||||
"Menu.borderColor": "greyDot65",
|
|
||||||
"Menu.foreground": "greyDot25",
|
|
||||||
"Menu.selectionForeground": "accent",
|
|
||||||
"Menu.separatorColor": "greyDot65",
|
|
||||||
"MenuBar.borderColor": "greyDot65",
|
|
||||||
"MenuBar.selectionBackground": "navyDot85",
|
|
||||||
"MenuBar.shadow": "navyDot90",
|
|
||||||
"MenuItem.selectionForeground": "accent",
|
|
||||||
"Notification.MoreButton.background": "greyDot85",
|
|
||||||
"Notification.MoreButton.innerBorderColor": "greyDot65",
|
|
||||||
"Notification.ToolWindow.errorBackground": "red",
|
|
||||||
"Notification.ToolWindow.errorBorderColor": "greyDot50",
|
|
||||||
"Notification.ToolWindow.errorForeground": "greyDot15",
|
|
||||||
"Notification.ToolWindow.informativeBackground": "#304000",
|
|
||||||
"Notification.ToolWindow.informativeBorderColor": "greyDot65",
|
|
||||||
"Notification.ToolWindow.informativeForeground": "greyDot15",
|
|
||||||
"Notification.ToolWindow.warningBackground": "yellow",
|
|
||||||
"Notification.ToolWindow.warningBorderColor": "greyDot65",
|
|
||||||
"Notification.ToolWindow.warningForeground": "greyDot15",
|
|
||||||
"Notification.background": "greyDot85",
|
|
||||||
"Notification.errorBackground": "red",
|
|
||||||
"Notification.errorBorderColor": "greyDot65",
|
|
||||||
"Notification.errorForeground": "greyDot15",
|
|
||||||
"Notification.foreground": "greyDot25",
|
|
||||||
"OptionPane.background": "greyDot80",
|
|
||||||
"OptionPane.foreground": "greyDot25",
|
|
||||||
"Panel.background": "greyDot80",
|
|
||||||
"Panel.foreground": "greyDot25",
|
|
||||||
"ParameterInfo.background": "greyDot85",
|
|
||||||
"ParameterInfo.currentOverloadBackground": "lightBlue",
|
|
||||||
"ParameterInfo.currentParameterForeground": "accent",
|
|
||||||
"ParameterInfo.foreground": "greyDot25",
|
|
||||||
"ParameterInfo.infoForeground": "greyDot33",
|
|
||||||
"ParameterInfo.lineSeparatorColor": "greyDot70",
|
|
||||||
"Plugins.Button.installBackground": "greyDot80",
|
|
||||||
"Plugins.Button.installBorderColor": "greyDot65",
|
|
||||||
"Plugins.Button.installFillBackground": "greyDot80",
|
|
||||||
"Plugins.Button.installFillForeground": "greyDot25",
|
|
||||||
"Plugins.Button.installForeground": "accent",
|
|
||||||
"Plugins.SearchField.background": "greyDot75",
|
|
||||||
"Plugins.SectionHeader.background": "greyDot75",
|
|
||||||
"Plugins.SectionHeader.foreground": "greyDot25",
|
|
||||||
"Plugins.Tab.hoverBackground": "navyDot85",
|
|
||||||
"Plugins.Tab.selectedBackground": "greyDot85",
|
|
||||||
"Plugins.background": "greyDot80",
|
|
||||||
"Plugins.disabledForeground": "greyDot50",
|
|
||||||
"Plugins.lightSelectionBackground": "greyDot70",
|
|
||||||
"Plugins.tagBackground": "greyDot85",
|
|
||||||
"Plugins.tagForeground": "greyDot25",
|
|
||||||
"Popup.Advertiser.background": "greyDot85",
|
|
||||||
"Popup.Advertiser.foreground": "greyDot50",
|
|
||||||
"Popup.Header.activeBackground": "greyDot75",
|
|
||||||
"Popup.Header.inactiveBackground": "greyDot85",
|
|
||||||
"Popup.paintBorder": true,
|
|
||||||
"PopupMenu.background": "greyDot80",
|
|
||||||
"PopupMenu.foreground": "greyDot25",
|
|
||||||
"PopupMenu.selectionBackground": "navyDot85",
|
|
||||||
"PopupMenu.selectionForeground": "lightBlue",
|
|
||||||
"PopupMenuSeparator.stripeWidth": 1,
|
|
||||||
"ProgressBar.failedColor": "red",
|
|
||||||
"ProgressBar.failedEndColor": "greyDot65",
|
|
||||||
"ProgressBar.indeterminateEndColor": "greyDot25",
|
|
||||||
"ProgressBar.indeterminateStartColor": "accent",
|
|
||||||
"ProgressBar.passedColor": "green",
|
|
||||||
"ProgressBar.passedEndColor": "greyDot65",
|
|
||||||
"ProgressBar.progressColor": "accent",
|
|
||||||
"ProgressBar.trackColor": "greyDot75",
|
|
||||||
"RadioButton.background": "greyDot75",
|
|
||||||
"ScrollBar.Mac.hoverTrackColor": "greyDot75",
|
|
||||||
"ScrollBar.Mac.trackColor": "greyDot75",
|
|
||||||
"ScrollPane.background": "greyDot85",
|
|
||||||
"ScrollPane.foreground": "greyDot25",
|
|
||||||
"SearchEverywhere.Advertiser.background": "greyDot85",
|
|
||||||
"SearchEverywhere.Advertiser.foreground": "greyDot33",
|
|
||||||
"SearchEverywhere.Header.background": "greyDot85",
|
|
||||||
"SearchEverywhere.List.separatorColor": "greyDot70",
|
|
||||||
"SearchEverywhere.List.separatorForeground": "greyDot70",
|
|
||||||
"SearchEverywhere.SearchField.background": "greyDot75",
|
|
||||||
"SearchEverywhere.SearchField.borderColor": "greyDot70",
|
|
||||||
"SearchEverywhere.SearchField.infoForeground": "greyDot50",
|
|
||||||
"SearchEverywhere.Tab.selectedBackground": "greyDot70",
|
|
||||||
"SearchEverywhere.Tab.selectedForeground": "accent",
|
|
||||||
"SearchMatch.endBackground": "accent",
|
|
||||||
"SearchMatch.startBackground": "accent",
|
|
||||||
"Separator.separatorColor": "greyDot70",
|
|
||||||
"SidePanel.background": "greyDot85",
|
|
||||||
"Slider.background": "greyDot80",
|
|
||||||
"Slider.focus": "greyDot65",
|
|
||||||
"SpeedSearch.background": "greyDot80",
|
|
||||||
"SpeedSearch.borderColor": "greyDot70",
|
|
||||||
"SpeedSearch.errorForeground": "red",
|
|
||||||
"SpeedSearch.foreground": "accent",
|
|
||||||
"SplitPane.background": "greyDot80",
|
|
||||||
"SplitPane.darkShadow": "navyDot90",
|
|
||||||
"SplitPane.highlight": "accent",
|
|
||||||
"SplitPane.shadow": "navyDot90",
|
|
||||||
"TabbedPane.background": "greyDot80",
|
|
||||||
"TabbedPane.contentAreaColor": "greyDot80",
|
|
||||||
"TabbedPane.disabledUnderlineColor": "greyDot75",
|
|
||||||
"TabbedPane.focusColor": "greyDot65",
|
|
||||||
"TabbedPane.foreground": "greyDot25",
|
|
||||||
"TabbedPane.hoverColor": "navyDot85",
|
|
||||||
"TabbedPane.tabSelectionHeight": 1,
|
|
||||||
"TabbedPane.underlineColor": "accent",
|
|
||||||
"Table.background": "greyDot80",
|
|
||||||
"Table.dropLineColor": "greyDot75",
|
|
||||||
"Table.dropLineShortColor": "greyDot70",
|
|
||||||
"Table.focusCellForeground": "accent",
|
|
||||||
"Table.selectionBackground": "navyDot85",
|
|
||||||
"Table.selectionForeground": "accent",
|
|
||||||
"Table.sortIconColor": "accent",
|
|
||||||
"Table.stripeColor": "greyDot75",
|
|
||||||
"TableHeader.background": "greyDot85",
|
|
||||||
"TableHeader.bottomSeparatorColor": "greyDot75",
|
|
||||||
"TableHeader.separatorColor": "greyDot70",
|
|
||||||
"TextArea.background": "greyDot85",
|
|
||||||
"TextArea.caretForeground": "accent",
|
|
||||||
"TextArea.foreground": "greyDot25",
|
|
||||||
"TextArea.selectionBackground": "navyDot85",
|
|
||||||
"TextField.background": "greyDot75",
|
|
||||||
"TextField.caretForeground": "accent",
|
|
||||||
"TextField.darkShadow": "navyDot90",
|
|
||||||
"TextField.foreground": "greyDot25",
|
|
||||||
"TextField.highlight": "greyDot15",
|
|
||||||
"TextField.selectionBackground": "navyDot85",
|
|
||||||
"TextPane.background": "greyDot80",
|
|
||||||
"TitlePane.background": "greyDot85",
|
|
||||||
"ToggleButton.borderColor": "greyDot70",
|
|
||||||
"ToggleButton.buttonColor": "greyDot75",
|
|
||||||
"ToggleButton.offBackground": "greyDot75",
|
|
||||||
"ToggleButton.offForeground": "greyDot25",
|
|
||||||
"ToggleButton.onBackground": "greyDot50",
|
|
||||||
"ToggleButton.onForeground": "accent",
|
|
||||||
"ToolBar.background": "greyDot80",
|
|
||||||
"ToolBar.borderHandleColor": "greyDot70",
|
|
||||||
"ToolBar.darkShadow": "navyDot90",
|
|
||||||
"ToolBar.shadow": "navyDot90",
|
|
||||||
"ToolTip.Actions.background": "greyDot80",
|
|
||||||
"ToolTip.Actions.infoForeground": "greyDot50",
|
|
||||||
"ToolTip.background": "greyDot75",
|
|
||||||
"ToolTip.foreground": "greyDot25",
|
|
||||||
"ToolTip.infoForeground": "greyDot50",
|
|
||||||
"ToolWindow.Button.hoverBackground": "navyDot85",
|
|
||||||
"ToolWindow.Button.selectedBackground": "greyDot70",
|
|
||||||
"ToolWindow.Button.selectedForeground": "accent",
|
|
||||||
"ToolWindow.Header.background": "greyDot85",
|
|
||||||
"ToolWindow.Header.inactiveBackground": "greyDot80",
|
|
||||||
"ToolWindow.HeaderTab.hoverBackground": "navyDot85",
|
|
||||||
"ToolWindow.HeaderTab.hoverInactiveBackground": "navyDot90",
|
|
||||||
"ToolWindow.HeaderTab.inactiveUnderlineColor": "greyDot75",
|
|
||||||
"ToolWindow.HeaderTab.selectedInactiveBackground": "greyDot80",
|
|
||||||
"ToolWindow.HeaderTab.underlineColor": "accent",
|
|
||||||
"ToolWindow.HeaderTab.underlineHeight": 1,
|
|
||||||
"ToolWindow.HeaderTab.underlinedTabInactiveBackground": "greyDot75",
|
|
||||||
"Tree.background": "greyDot85",
|
|
||||||
"Tree.modifiedItemForeground": "accent",
|
|
||||||
"Tree.paintLines": 0,
|
|
||||||
"Tree.rowHeight": 20,
|
|
||||||
"Tree.selectionBackground": "navyDot85",
|
|
||||||
"Tree.selectionForeground": "accent",
|
|
||||||
"Tree.selectionInactiveBackground": "navyDot90",
|
|
||||||
"ValidationTooltip.errorBackground": "red",
|
|
||||||
"ValidationTooltip.errorBorderColor": "greyDot65",
|
|
||||||
"ValidationTooltip.warningBackground": "#805e00",
|
|
||||||
"ValidationTooltip.warningBorderColor": "greyDot65",
|
|
||||||
"VersionControl.FileHistory.Commit.selectedBranchBackground": "greyDot70",
|
|
||||||
"VersionControl.Log.Commit.currentBranchBackground": "greyDot85",
|
|
||||||
"VersionControl.Log.Commit.unmatchedForeground": "greyDot25",
|
|
||||||
"WelcomeScreen.Projects.selectionBackground": "navyDot85",
|
|
||||||
"WelcomeScreen.Projects.selectionInactiveBackground": "navyDot90",
|
|
||||||
"WelcomeScreen.separatorColor": "greyDot65",
|
|
||||||
"Window.border": "0,0,0,0,5a5a5a"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2016 CloudCannon
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "IntelliJ Light Preview",
|
|
||||||
"dark": false,
|
|
||||||
"author": "",
|
|
||||||
"editorScheme": "/Light.xml",
|
|
||||||
|
|
||||||
"ui": {
|
|
||||||
"*": {
|
|
||||||
"selectionBackground": "#2675BF",
|
|
||||||
"selectionBackgroundInactive": "#D5D5D5",
|
|
||||||
"selectionInactiveBackground": "#D5D5D5",
|
|
||||||
|
|
||||||
"disabledForeground": "#8C8C8C",
|
|
||||||
"disabledText": "#8C8C8C",
|
|
||||||
"inactiveForeground": "#8C8C8C",
|
|
||||||
|
|
||||||
"infoForeground": "#808080",
|
|
||||||
"modifiedItemForeground": "#005ad9",
|
|
||||||
|
|
||||||
"acceleratorSelectionForeground": "#FFFFFF",
|
|
||||||
|
|
||||||
"separatorColor": "#d1d1d1",
|
|
||||||
"separatorForeground": "#999999"
|
|
||||||
},
|
|
||||||
|
|
||||||
"Borders": {
|
|
||||||
"color": "#D1D1D1",
|
|
||||||
"ContrastBorderColor": "#D1D1D1"
|
|
||||||
},
|
|
||||||
|
|
||||||
"Button": {
|
|
||||||
"shadowColor": "#A6A6A620",
|
|
||||||
"startBorderColor": "#C4C4C4",
|
|
||||||
"endBorderColor": "#C4C4C4",
|
|
||||||
"default": {
|
|
||||||
"foreground": "#FFFFFF",
|
|
||||||
"startBackground": "#528CC7",
|
|
||||||
"endBackground": "#4989CC",
|
|
||||||
"startBorderColor": "#487EB8",
|
|
||||||
"endBorderColor": "#346DAD",
|
|
||||||
"shadowColor": "#A6A6A650",
|
|
||||||
"focusedBorderColor": "#A9C9F5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"ComboBox": {
|
|
||||||
"background": "#FFFFFF",
|
|
||||||
"nonEditableBackground": "#FFFFFF",
|
|
||||||
"ArrowButton.background": "#fafafa"
|
|
||||||
},
|
|
||||||
|
|
||||||
"ComboBoxButton.background": "#FFFFFF",
|
|
||||||
|
|
||||||
"CompletionPopup": {
|
|
||||||
"selectionBackground": "#c5dffc",
|
|
||||||
"selectionInactiveBackground": "#e0e0e0"
|
|
||||||
},
|
|
||||||
|
|
||||||
"Component.borderColor": "#C4C4C4",
|
|
||||||
|
|
||||||
"DefaultTabs.background": "#F2F2F2",
|
|
||||||
|
|
||||||
"EditorTabs.underlinedTabBackground": "#ffffff",
|
|
||||||
|
|
||||||
"Editor": {
|
|
||||||
"background": "#cccccc",
|
|
||||||
"foreground": "#737373",
|
|
||||||
"shortcutForeground": "#4274A6"
|
|
||||||
},
|
|
||||||
|
|
||||||
"Label.errorForeground": "#C7222D",
|
|
||||||
|
|
||||||
"Link": {
|
|
||||||
"activeForeground": "#2470B3",
|
|
||||||
"hoverForeground": "#2470B3",
|
|
||||||
"pressedForeground": "#2470B3",
|
|
||||||
"visitedForeground": "#2470B3",
|
|
||||||
"secondaryForeground": "#77a8d9"
|
|
||||||
},
|
|
||||||
|
|
||||||
"Notification": {
|
|
||||||
"borderColor": "#D1D1D1"
|
|
||||||
},
|
|
||||||
|
|
||||||
"Menu.borderColor": "#d9d9d9",
|
|
||||||
|
|
||||||
"Panel.background": "#F2F2F2",
|
|
||||||
|
|
||||||
"PasswordField.background": "#FFFFFF",
|
|
||||||
|
|
||||||
"Popup": {
|
|
||||||
"separatorColor": "#d9d9d9",
|
|
||||||
"Advertiser.borderColor": "#D1D1D1",
|
|
||||||
"borderColor": "#adadad"
|
|
||||||
},
|
|
||||||
|
|
||||||
"ProgressBar": {
|
|
||||||
"trackColor": "#D1D1D1",
|
|
||||||
"progressColor": "#1E82E6",
|
|
||||||
"indeterminateStartColor": "#91C5F2",
|
|
||||||
"indeterminateEndColor": "#1E82E6"
|
|
||||||
},
|
|
||||||
|
|
||||||
"StatusBar.borderColor": "#D1D1D1",
|
|
||||||
|
|
||||||
"ToolWindow.Header.inactiveBackground": "#F2F2F2",
|
|
||||||
|
|
||||||
"Tree.rowHeight": 20
|
|
||||||
},
|
|
||||||
|
|
||||||
"icons": {
|
|
||||||
|
|
||||||
"ColorPalette": {
|
|
||||||
"Checkbox.Border.Default": "#b0b0b0",
|
|
||||||
"Checkbox.Background.Selected": "#4F9EE3",
|
|
||||||
"Checkbox.Border.Selected": "#4B97D9"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "gruvbox-theme",
|
|
||||||
"dark": true,
|
|
||||||
"author": "Vincent Parizet",
|
|
||||||
"editorScheme": "/gruvbox_theme.xml",
|
|
||||||
"ui": {
|
|
||||||
"*": {
|
|
||||||
"background": "#282828",
|
|
||||||
"foreground": "#fbf1c7",
|
|
||||||
|
|
||||||
"infoForeground": "#ebdbb2",
|
|
||||||
|
|
||||||
"lightSelectionBackground": "#3c3836",
|
|
||||||
"selectionBackground": "#4F4945",
|
|
||||||
"selectionForeground": "#fbf1c7",
|
|
||||||
|
|
||||||
"selectionBackgroundInactive": "#3c3836",
|
|
||||||
|
|
||||||
"selectedBackground": "#1d2021",
|
|
||||||
"selectedForeground": "#fbf1c7",
|
|
||||||
"selectedInactiveBackground": "#3c3836",
|
|
||||||
"selectedBackgroundInactive": "#3c3836",
|
|
||||||
|
|
||||||
"hoverBackground": "#28282866",
|
|
||||||
|
|
||||||
"borderColor": "#3c3836",
|
|
||||||
"disabledBorderColor": "#1d2021",
|
|
||||||
|
|
||||||
"separatorColor": "#3c3836"
|
|
||||||
},
|
|
||||||
"ActionButton": {
|
|
||||||
"hoverBackground": "#504945"
|
|
||||||
},
|
|
||||||
"Button": {
|
|
||||||
"startBackground": "#282828",
|
|
||||||
"endBackground": "#282828",
|
|
||||||
"startBorderColor": "#504945",
|
|
||||||
"endBorderColor": "#504945",
|
|
||||||
|
|
||||||
"default": {
|
|
||||||
"foreground": "#fbf1c7",
|
|
||||||
"startBackground": "#32302F",
|
|
||||||
"endBackground": "#32302F",
|
|
||||||
"startBorderColor": "#4F4945",
|
|
||||||
"endBorderColor": "#4F4945",
|
|
||||||
"focusedBorderColor": "#282828"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ComboBox": {
|
|
||||||
"nonEditableBackground": "#282828",
|
|
||||||
"ArrowButton": {
|
|
||||||
"iconColor": "#fbf1c7",
|
|
||||||
"disabledIconColor": "#fbf1c7",
|
|
||||||
"nonEditableBackground": "#282828"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"EditorTabs": {
|
|
||||||
"selectedBackground": "#3c3836",
|
|
||||||
"underlineColor": "#83a598",
|
|
||||||
"inactiveMaskColor": "#28282866"
|
|
||||||
},
|
|
||||||
"ToolWindow": {
|
|
||||||
"Header": {
|
|
||||||
"background": "#3c3836",
|
|
||||||
"inactiveBackground": "#282828"
|
|
||||||
},
|
|
||||||
|
|
||||||
"HeaderTab": {
|
|
||||||
"selectedInactiveBackground": "#1d2021",
|
|
||||||
"hoverInactiveBackground": "#1d2021"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Table": {
|
|
||||||
"stripeColor": "#3c3836",
|
|
||||||
"lightSelectionForeground": "#fbf1c7",
|
|
||||||
"lightSelectionInactiveForeground":"#a89984",
|
|
||||||
"lightSelectionBackground": "#504945",
|
|
||||||
"lightSelectionInactiveBackground":"#282828"
|
|
||||||
},
|
|
||||||
"FileColor": {
|
|
||||||
"Yellow": "#fabd2f22",
|
|
||||||
"Green": "#b8bb2622",
|
|
||||||
"Blue": "#83a59822",
|
|
||||||
"Violet": "#d3869b22",
|
|
||||||
"Orange": "#fe801922",
|
|
||||||
"Rose": "#cc241d22"
|
|
||||||
},
|
|
||||||
"Link": {
|
|
||||||
"activeForeground": "#83a598",
|
|
||||||
"hoverForeground": "#83a598",
|
|
||||||
"pressedForeground": "#83a598",
|
|
||||||
"visitedForeground": "#83a598"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"icons": {
|
|
||||||
"ColorPalette": {
|
|
||||||
"Actions.Grey": "#928374",
|
|
||||||
"Actions.Red": "#fb4934",
|
|
||||||
"Actions.Yellow": "#fabd2f",
|
|
||||||
"Actions.Green": "#98971a",
|
|
||||||
"Actions.Blue": "#458588",
|
|
||||||
"Actions.GreyInline.Dark": "#fbf1c7",
|
|
||||||
|
|
||||||
"Objects.Grey": "#928374FF",
|
|
||||||
"Objects.RedStatus": "#fb4934FF",
|
|
||||||
"Objects.Red": "#fb4934FF",
|
|
||||||
"Objects.Pink": "#d3869bFF",
|
|
||||||
"Objects.Yellow": "#fabd2fFF",
|
|
||||||
"Objects.Green": "#98971aFF",
|
|
||||||
"Objects.Blue": "#458588FF",
|
|
||||||
"Objects.Purple": "#b16286FF",
|
|
||||||
"Objects.BlackText": "#000000FF",
|
|
||||||
"Objects.YellowDark": "#d79921FF",
|
|
||||||
"Objects.GreenAndroid": "#b8bb26FF",
|
|
||||||
|
|
||||||
"Checkbox.Background.Default.Dark": "#282828",
|
|
||||||
"Checkbox.Border.Default.Dark": "#fbf1c7",
|
|
||||||
"Checkbox.Foreground.Selected.Dark": "#fbf1c7",
|
|
||||||
"Checkbox.Focus.Wide.Dark": "#458588",
|
|
||||||
"Checkbox.Focus.Thin.Default.Dark": "#458588",
|
|
||||||
"Checkbox.Focus.Thin.Selected.Dark": "#458588",
|
|
||||||
"Checkbox.Background.Disabled.Dark": "#282828",
|
|
||||||
"Checkbox.Border.Disabled.Dark": "#a89984",
|
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#a89984"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||