mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-07 22:40:53 +03:00
Compare commits
80 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
025f6564dc | ||
|
|
35f97368fa | ||
|
|
09e5c86488 | ||
|
|
8998371cae | ||
|
|
29e1dc6b55 | ||
|
|
439e63b52f | ||
|
|
eea341fb33 | ||
|
|
359eedf773 | ||
|
|
866751ffc1 | ||
|
|
38a3a0768d | ||
|
|
03b42749cd | ||
|
|
60fd78e082 | ||
|
|
9edaf58929 | ||
|
|
5000186f85 | ||
|
|
cacf0ea987 | ||
|
|
067501cbe7 | ||
|
|
9fe0cf496b | ||
|
|
9d0823038e | ||
|
|
5a05efefdd | ||
|
|
988d171bdd | ||
|
|
e6f72bf343 | ||
|
|
89c5a0c57b | ||
|
|
d97146393c | ||
|
|
1c52f1f76c | ||
|
|
9bd3a68115 | ||
|
|
f58780d36b | ||
|
|
6eb15ab437 | ||
|
|
00dc7004f5 | ||
|
|
8ec0e57235 | ||
|
|
d75dc9e70c | ||
|
|
ec2fccbb0e | ||
|
|
34861166e8 | ||
|
|
584fa0a26e | ||
|
|
6c48489d89 | ||
|
|
ba9c884a0c | ||
|
|
360f0bafe0 | ||
|
|
4327c13dca | ||
|
|
4f2256f713 | ||
|
|
5167cd368f | ||
|
|
ef7289d11a | ||
|
|
cb11d98bf7 | ||
|
|
992349da8c | ||
|
|
2e7637f274 | ||
|
|
1f8eaf4a64 | ||
|
|
46ac7a9dc7 | ||
|
|
0d86d39217 | ||
|
|
1f591f3d1b | ||
|
|
30c6ddba37 | ||
|
|
406eeaec96 | ||
|
|
2fe5652bc6 | ||
|
|
39bf68a6bd | ||
|
|
a7a4a19824 | ||
|
|
7f906ba0ea | ||
|
|
07bf6e4506 | ||
|
|
a331760321 | ||
|
|
d9c240d729 | ||
|
|
d9526c19e7 | ||
|
|
1798ccd284 | ||
|
|
ab1ce7fab1 | ||
|
|
e9b2f17171 | ||
|
|
d3bf4433b7 | ||
|
|
ba0f43455b | ||
|
|
638af4bcd7 | ||
|
|
5eab843d97 | ||
|
|
c55f0e239e | ||
|
|
32d9381745 | ||
|
|
77fc564e70 | ||
|
|
3b84314c45 | ||
|
|
6db39d1860 | ||
|
|
1762ead89f | ||
|
|
98a3c4b0f5 | ||
|
|
6e990a7e31 | ||
|
|
8e49904f8d | ||
|
|
69f52c8abd | ||
|
|
d7b0754327 | ||
|
|
2a00de11f1 | ||
|
|
923cc51f3e | ||
|
|
c8f7478170 | ||
|
|
bffac60bf8 | ||
|
|
ae8323e2f8 |
71
CHANGELOG.md
71
CHANGELOG.md
@@ -1,6 +1,75 @@
|
||||
FlatLaf Change Log
|
||||
==================
|
||||
|
||||
## 1.2
|
||||
|
||||
#### New features and improvements
|
||||
|
||||
- Renamed `Flat*Laf.install()` methods to `Flat*Laf.setup()` to avoid confusion
|
||||
with `UIManager.installLookAndFeel(LookAndFeelInfo info)`. The old
|
||||
`Flat*Laf.install()` methods are still there, but marked as deprecated. They
|
||||
will be removed in a future version.
|
||||
- Button and ToggleButton: Support borderless button style (set client property
|
||||
`JButton.buttonType` to `borderless`). (PR #276)
|
||||
- ComboBox: Support using as cell renderer (e.g. in `JTable`).
|
||||
- DesktopPane: Improved layout of iconified internal frames in dock:
|
||||
- Always placed at bottom-left in desktop pane.
|
||||
- Newly iconified frames are added to the right side of the dock.
|
||||
- If frame is deiconified, dock is compacted (icons move to the left).
|
||||
- If dock is wider than desktop width, additional rows are used.
|
||||
- If desktop pane is resized, layout of dock is updated.
|
||||
- TableHeader: Moved table header column border painting from
|
||||
`FlatTableHeaderUI` to new border `FlatTableHeaderBorder` to improve
|
||||
compatibility with custom table header implementations. (issue #228)
|
||||
- Linux: Enable text anti-aliasing if no Gnome or KDE Desktop properties are
|
||||
available. (issue #218)
|
||||
- IntelliJ Themes: Added "Material Theme UI Lite / GitHub Dark" theme.
|
||||
- JIDE Common Layer: Improved support for `JideTabbedPane`. (PR #306)
|
||||
- Extras: `FlatSVGIcon` improvements:
|
||||
- Each icon can now have its own color filter. (PR #303)
|
||||
- Use mapper function in color filter to dynamically map colors. (PR #303)
|
||||
- Color filter supports light and dark themes.
|
||||
- Getters for icon name, classloader, etc.
|
||||
- Extras: UI Inspector: Show class hierarchies when pressing <kbd>Alt</kbd> key
|
||||
and prettified class names (dimmed package name).
|
||||
- Extras: `FlatSVGUtils.createWindowIconImages()` now returns a single
|
||||
multi-resolution image that creates requested image sizes on demand from SVG
|
||||
(only on Windows with Java 9+).
|
||||
|
||||
#### Fixed bugs
|
||||
|
||||
- CheckBox and RadioButton: Do not fill background if used as cell renderer,
|
||||
except if cell is selected or has different background color. (issue #311)
|
||||
- DesktopPane:
|
||||
- Fixed missing preview of iconified internal frames in dock when using a
|
||||
custom desktop manager. (PR #294)
|
||||
- Fixed incomplete preview of iconified internal frames in dock when switching
|
||||
LaF.
|
||||
- On HiDPI screens, use high-resolution images for preview of iconified
|
||||
internal frames in dock.
|
||||
- PopupFactory: Fixed occasional `NullPointerException` in
|
||||
`FlatPopupFactory.fixToolTipLocation()`. (issue #305)
|
||||
- Tree: Fill cell background if
|
||||
`DefaultTreeCellRenderer.setBackgroundNonSelectionColor(Color)` was used.
|
||||
(issue #322)
|
||||
- IntelliJ Themes: Fixed background colors of DesktopPane and DesktopIcon in all
|
||||
themes.
|
||||
- Native window decorations:
|
||||
- Fixed slow application startup under particular conditions. (e.g. incomplete
|
||||
custom JRE) (issue #319)
|
||||
- Fixed occasional double window title bar when creating many frames or
|
||||
dialogs. (issue #315)
|
||||
- Fixed broken maximizing window (under special conditions) when restoring
|
||||
frame state at startup.
|
||||
- Title icon: For multi-resolution images now use `getResolutionVariant(width,
|
||||
height)` (instead of `getResolutionVariants()`) to allow creation of
|
||||
requested size on demand. This also avoids creation of all resolution
|
||||
variants.
|
||||
- Double-click at upper-left corner of maximized frame did not close window.
|
||||
(issue #326)
|
||||
- Linux: Fixed/improved detection of user font settings. (issue #309)
|
||||
|
||||
|
||||
## 1.1.2
|
||||
|
||||
#### New features and improvements
|
||||
@@ -164,7 +233,7 @@ FlatLaf Change Log
|
||||
- CheckBox and RadioButton: Fill component background as soon as background
|
||||
color is different to default background color, even if component is not
|
||||
opaque (which is the default). This paints selection if using the component as
|
||||
cell renderer a Table, Tree or List.
|
||||
cell renderer in Table, Tree or List.
|
||||
- TextComponents: Border of focused non-editable text components had wrong
|
||||
color.
|
||||
- Custom window decorations: Fixed top window border in dark themes when running
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
val releaseVersion = "1.1.2"
|
||||
val developmentVersion = "1.2-SNAPSHOT"
|
||||
val releaseVersion = "1.2"
|
||||
val developmentVersion = "1.3-SNAPSHOT"
|
||||
|
||||
version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion
|
||||
|
||||
@@ -47,19 +47,35 @@ allprojects {
|
||||
targetCompatibility = "1.8"
|
||||
|
||||
options.encoding = "ISO-8859-1"
|
||||
options.isDeprecation = false
|
||||
}
|
||||
|
||||
withType<Jar>().configureEach {
|
||||
// manifest for all created JARs
|
||||
manifest.attributes(mapOf(
|
||||
manifest.attributes(
|
||||
"Implementation-Vendor" to "FormDev Software GmbH",
|
||||
"Implementation-Copyright" to "Copyright (C) 2019-${java.time.LocalDate.now().year} FormDev Software GmbH. All rights reserved.",
|
||||
"Implementation-Version" to project.version))
|
||||
"Implementation-Version" to project.version
|
||||
)
|
||||
|
||||
// add META-INF/LICENSE to all created JARs
|
||||
from("${rootDir}/LICENSE") {
|
||||
into("META-INF")
|
||||
from( "${rootDir}/LICENSE" ) {
|
||||
into( "META-INF" )
|
||||
}
|
||||
}
|
||||
|
||||
withType<Javadoc>().configureEach {
|
||||
options {
|
||||
this as StandardJavadocDocletOptions
|
||||
|
||||
title = "${project.name} $version"
|
||||
header = title
|
||||
isUse = true
|
||||
tags = listOf( "uiDefault", "clientProperty" )
|
||||
addStringOption( "Xdoclint:all,-missing", "-Xdoclint:all,-missing" )
|
||||
links( "https://docs.oracle.com/en/java/javase/11/docs/api/" )
|
||||
}
|
||||
isFailOnError = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,21 +45,11 @@ tasks {
|
||||
}
|
||||
}
|
||||
|
||||
javadoc {
|
||||
options {
|
||||
this as StandardJavadocDocletOptions
|
||||
use( true )
|
||||
tags = listOf( "uiDefault", "clientProperty" )
|
||||
addStringOption( "Xdoclint:all,-missing", "-Xdoclint:all,-missing" )
|
||||
}
|
||||
isFailOnError = false
|
||||
}
|
||||
|
||||
named<Jar>("sourcesJar" ) {
|
||||
named<Jar>( "sourcesJar" ) {
|
||||
archiveBaseName.set( "flatlaf" )
|
||||
}
|
||||
|
||||
named<Jar>("javadocJar" ) {
|
||||
named<Jar>( "javadocJar" ) {
|
||||
archiveBaseName.set( "flatlaf" )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,8 +39,9 @@ public interface FlatClientProperties
|
||||
* {@link #BUTTON_TYPE_SQUARE},
|
||||
* {@link #BUTTON_TYPE_ROUND_RECT},
|
||||
* {@link #BUTTON_TYPE_TAB},
|
||||
* {@link #BUTTON_TYPE_HELP} or
|
||||
* {@link BUTTON_TYPE_TOOLBAR_BUTTON}
|
||||
* {@link #BUTTON_TYPE_HELP},
|
||||
* {@link #BUTTON_TYPE_TOOLBAR_BUTTON} or
|
||||
* {@link #BUTTON_TYPE_BORDERLESS}
|
||||
*/
|
||||
String BUTTON_TYPE = "JButton.buttonType";
|
||||
|
||||
@@ -89,6 +90,16 @@ public interface FlatClientProperties
|
||||
*/
|
||||
String BUTTON_TYPE_TOOLBAR_BUTTON = "toolBarButton";
|
||||
|
||||
/**
|
||||
* Paint the button without a border in the unfocused state.
|
||||
* <p>
|
||||
* <strong>Components</strong> {@link javax.swing.JButton} and {@link javax.swing.JToggleButton}
|
||||
*
|
||||
* @see #BUTTON_TYPE
|
||||
* @since 1.2
|
||||
*/
|
||||
String BUTTON_TYPE_BORDERLESS = "borderless";
|
||||
|
||||
/**
|
||||
* Specifies selected state of a checkbox.
|
||||
* <p>
|
||||
@@ -272,6 +283,8 @@ public interface FlatClientProperties
|
||||
/**
|
||||
* Background color of window title bar (requires enabled window decorations).
|
||||
* <p>
|
||||
* (requires Window 10)
|
||||
* <p>
|
||||
* <strong>Component</strong> {@link javax.swing.JRootPane}<br>
|
||||
* <strong>Value type</strong> {@link java.awt.Color}
|
||||
*
|
||||
@@ -282,6 +295,8 @@ public interface FlatClientProperties
|
||||
/**
|
||||
* Foreground color of window title bar (requires enabled window decorations).
|
||||
* <p>
|
||||
* (requires Window 10)
|
||||
* <p>
|
||||
* <strong>Component</strong> {@link javax.swing.JRootPane}<br>
|
||||
* <strong>Value type</strong> {@link java.awt.Color}
|
||||
*
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.formdev.flatlaf;
|
||||
|
||||
import javax.swing.UIManager;
|
||||
|
||||
/**
|
||||
* A Flat LaF that has a dark color scheme and looks like Darcula LaF.
|
||||
* <p>
|
||||
@@ -29,10 +31,28 @@ public class FlatDarculaLaf
|
||||
{
|
||||
public static final String NAME = "FlatLaf Darcula";
|
||||
|
||||
public static boolean install() {
|
||||
return install( new FlatDarculaLaf() );
|
||||
/**
|
||||
* Sets the application look and feel to this LaF
|
||||
* using {@link UIManager#setLookAndFeel(javax.swing.LookAndFeel)}.
|
||||
*/
|
||||
public static boolean setup() {
|
||||
return setup( new FlatDarculaLaf() );
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds this look and feel to the set of available look and feels.
|
||||
* <p>
|
||||
* Useful if your application uses {@link UIManager#getInstalledLookAndFeels()}
|
||||
* to query available LaFs and display them to the user in a combobox.
|
||||
*/
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatDarculaLaf.class );
|
||||
}
|
||||
|
||||
@@ -34,8 +34,16 @@ public class FlatDarkLaf
|
||||
* Sets the application look and feel to this LaF
|
||||
* using {@link UIManager#setLookAndFeel(javax.swing.LookAndFeel)}.
|
||||
*/
|
||||
public static boolean setup() {
|
||||
return setup( new FlatDarkLaf() );
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return install( new FlatDarkLaf() );
|
||||
return setup();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.formdev.flatlaf;
|
||||
|
||||
import javax.swing.UIManager;
|
||||
|
||||
/**
|
||||
* A Flat LaF that has a light color scheme and looks like IntelliJ LaF.
|
||||
* <p>
|
||||
@@ -29,10 +31,28 @@ public class FlatIntelliJLaf
|
||||
{
|
||||
public static final String NAME = "FlatLaf IntelliJ";
|
||||
|
||||
public static boolean install() {
|
||||
return install( new FlatIntelliJLaf() );
|
||||
/**
|
||||
* Sets the application look and feel to this LaF
|
||||
* using {@link UIManager#setLookAndFeel(javax.swing.LookAndFeel)}.
|
||||
*/
|
||||
public static boolean setup() {
|
||||
return setup( new FlatIntelliJLaf() );
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds this look and feel to the set of available look and feels.
|
||||
* <p>
|
||||
* Useful if your application uses {@link UIManager#getInstalledLookAndFeels()}
|
||||
* to query available LaFs and display them to the user in a combobox.
|
||||
*/
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatIntelliJLaf.class );
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ import java.beans.PropertyChangeListener;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
@@ -54,6 +55,7 @@ import javax.swing.UIManager;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
import javax.swing.plaf.ColorUIResource;
|
||||
import javax.swing.plaf.FontUIResource;
|
||||
import javax.swing.plaf.IconUIResource;
|
||||
import javax.swing.plaf.UIResource;
|
||||
import javax.swing.plaf.basic.BasicLookAndFeel;
|
||||
import javax.swing.text.StyleContext;
|
||||
@@ -95,16 +97,24 @@ public abstract class FlatLaf
|
||||
* Sets the application look and feel to the given LaF
|
||||
* using {@link UIManager#setLookAndFeel(javax.swing.LookAndFeel)}.
|
||||
*/
|
||||
public static boolean install( LookAndFeel newLookAndFeel ) {
|
||||
public static boolean setup( LookAndFeel newLookAndFeel ) {
|
||||
try {
|
||||
UIManager.setLookAndFeel( newLookAndFeel );
|
||||
return true;
|
||||
} catch( Exception ex ) {
|
||||
LoggingFacade.INSTANCE.logSevere( "FlatLaf: Failed to initialize look and feel '" + newLookAndFeel.getClass().getName() + "'.", ex );
|
||||
LoggingFacade.INSTANCE.logSevere( "FlatLaf: Failed to setup look and feel '" + newLookAndFeel.getClass().getName() + "'.", ex );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup(LookAndFeel)} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install( LookAndFeel newLookAndFeel ) {
|
||||
return setup( newLookAndFeel );
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the given look and feel to the set of available look and feels.
|
||||
* <p>
|
||||
@@ -181,8 +191,10 @@ public abstract class FlatLaf
|
||||
|
||||
@Override
|
||||
public Icon getDisabledIcon( JComponent component, Icon icon ) {
|
||||
if( icon instanceof DisabledIconProvider )
|
||||
return ((DisabledIconProvider)icon).getDisabledIcon();
|
||||
if( icon instanceof DisabledIconProvider ) {
|
||||
Icon disabledIcon = ((DisabledIconProvider)icon).getDisabledIcon();
|
||||
return !(disabledIcon instanceof UIResource) ? new IconUIResource( disabledIcon ) : disabledIcon;
|
||||
}
|
||||
|
||||
if( icon instanceof ImageIcon ) {
|
||||
Object grayFilter = UIManager.get( "Component.grayFilter" );
|
||||
@@ -318,7 +330,7 @@ public abstract class FlatLaf
|
||||
Method m = UIManager.class.getMethod( "createLookAndFeel", String.class );
|
||||
aquaLaf = (BasicLookAndFeel) m.invoke( null, "Mac OS X" );
|
||||
} else
|
||||
aquaLaf = (BasicLookAndFeel) Class.forName( aquaLafClassName ).newInstance();
|
||||
aquaLaf = (BasicLookAndFeel) Class.forName( aquaLafClassName ).getDeclaredConstructor().newInstance();
|
||||
} catch( Exception ex ) {
|
||||
LoggingFacade.INSTANCE.logSevere( "FlatLaf: Failed to initialize Aqua look and feel '" + aquaLafClassName + "'.", ex );
|
||||
throw new IllegalStateException();
|
||||
@@ -553,6 +565,8 @@ public abstract class FlatLaf
|
||||
defaults.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );
|
||||
} else if( SystemInfo.isJava_9_orLater ) {
|
||||
Object desktopHints = Toolkit.getDefaultToolkit().getDesktopProperty( DESKTOPFONTHINTS );
|
||||
if( desktopHints == null )
|
||||
desktopHints = fallbackAATextInfo();
|
||||
if( desktopHints instanceof Map ) {
|
||||
@SuppressWarnings( "unchecked" )
|
||||
Map<Object, Object> hints = (Map<Object, Object>) desktopHints;
|
||||
@@ -575,6 +589,8 @@ public abstract class FlatLaf
|
||||
Object value = Class.forName( "sun.swing.SwingUtilities2$AATextInfo" )
|
||||
.getMethod( "getAATextInfo", boolean.class )
|
||||
.invoke( null, true );
|
||||
if( value == null )
|
||||
value = fallbackAATextInfo();
|
||||
defaults.put( key, value );
|
||||
} catch( Exception ex ) {
|
||||
LoggingFacade.INSTANCE.logSevere( null, ex );
|
||||
@@ -583,6 +599,47 @@ public abstract class FlatLaf
|
||||
}
|
||||
}
|
||||
|
||||
private Object fallbackAATextInfo() {
|
||||
// do nothing if explicitly overridden
|
||||
if( System.getProperty( "awt.useSystemAAFontSettings" ) != null )
|
||||
return null;
|
||||
|
||||
Object aaHint = null;
|
||||
Integer lcdContrastHint = null;
|
||||
|
||||
if( SystemInfo.isLinux ) {
|
||||
// see sun.awt.UNIXToolkit.getDesktopAAHints()
|
||||
Toolkit toolkit = Toolkit.getDefaultToolkit();
|
||||
if( toolkit.getDesktopProperty( "gnome.Xft/Antialias" ) == null &&
|
||||
toolkit.getDesktopProperty( "fontconfig/Antialias" ) == null )
|
||||
{
|
||||
// no Gnome or KDE Desktop properties available
|
||||
// --> enable antialiasing
|
||||
aaHint = RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
|
||||
}
|
||||
}
|
||||
|
||||
if( aaHint == null )
|
||||
return null;
|
||||
|
||||
if( SystemInfo.isJava_9_orLater ) {
|
||||
Map<Object, Object> hints = new HashMap<>();
|
||||
hints.put( RenderingHints.KEY_TEXT_ANTIALIASING, aaHint );
|
||||
hints.put( RenderingHints.KEY_TEXT_LCD_CONTRAST, lcdContrastHint );
|
||||
return hints;
|
||||
} else {
|
||||
// Java 8
|
||||
try {
|
||||
return Class.forName( "sun.swing.SwingUtilities2$AATextInfo" )
|
||||
.getConstructor( Object.class, Integer.class )
|
||||
.newInstance( aaHint, lcdContrastHint );
|
||||
} catch( Exception ex ) {
|
||||
LoggingFacade.INSTANCE.logSevere( null, ex );
|
||||
throw new RuntimeException( ex );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void putDefaults( UIDefaults defaults, Object value, String... keys ) {
|
||||
for( String key : keys )
|
||||
defaults.put( key, value );
|
||||
|
||||
@@ -34,8 +34,16 @@ public class FlatLightLaf
|
||||
* Sets the application look and feel to this LaF
|
||||
* using {@link UIManager#setLookAndFeel(javax.swing.LookAndFeel)}.
|
||||
*/
|
||||
public static boolean setup() {
|
||||
return setup( new FlatLightLaf() );
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return install( new FlatLightLaf() );
|
||||
return setup();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -101,7 +101,7 @@ public interface FlatSystemProperties
|
||||
* (requires Window 10)
|
||||
* <p>
|
||||
* <strong>Allowed Values</strong> {@code false} and {@code true}<br>
|
||||
* <strong>Default</strong> true
|
||||
* <strong>Default</strong> {@code true}
|
||||
*/
|
||||
String USE_JETBRAINS_CUSTOM_DECORATIONS = "flatlaf.useJetBrainsCustomDecorations";
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ import javax.swing.UIDefaults;
|
||||
import javax.swing.plaf.ColorUIResource;
|
||||
import com.formdev.flatlaf.json.Json;
|
||||
import com.formdev.flatlaf.json.ParseException;
|
||||
import com.formdev.flatlaf.util.ColorFunctions;
|
||||
import com.formdev.flatlaf.util.LoggingFacade;
|
||||
import com.formdev.flatlaf.util.StringUtils;
|
||||
|
||||
@@ -67,20 +68,28 @@ public class IntelliJTheme
|
||||
|
||||
/**
|
||||
* Loads a IntelliJ .theme.json file from the given input stream,
|
||||
* creates a Laf instance for it and installs it.
|
||||
* creates a Laf instance for it and sets it up.
|
||||
*
|
||||
* The input stream is automatically closed.
|
||||
* Using a buffered input stream is not necessary.
|
||||
*/
|
||||
public static boolean install( InputStream in ) {
|
||||
public static boolean setup( InputStream in ) {
|
||||
try {
|
||||
return FlatLaf.install( createLaf( in ) );
|
||||
return FlatLaf.setup( createLaf( in ) );
|
||||
} catch( Exception ex ) {
|
||||
LoggingFacade.INSTANCE.logSevere( "FlatLaf: Failed to load IntelliJ theme", ex );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup(InputStream)} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install( InputStream in ) {
|
||||
return setup( in );
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a IntelliJ .theme.json file from the given input stream and
|
||||
* creates a Laf instance for it.
|
||||
@@ -215,6 +224,12 @@ public class IntelliJTheme
|
||||
if( !uiKeys.contains( "ToggleButton.foreground" ) && uiKeys.contains( "Button.foreground" ) )
|
||||
defaults.put( "ToggleButton.foreground", defaults.get( "Button.foreground" ) );
|
||||
|
||||
// fix DesktopPane background (use Panel.background and make it 5% darker/lighter)
|
||||
Color desktopBackgroundBase = defaults.getColor( "Panel.background" );
|
||||
Color desktopBackground = ColorFunctions.applyFunctions( desktopBackgroundBase,
|
||||
new ColorFunctions.HSLIncreaseDecrease( 2, dark, 5, false, true ) );
|
||||
defaults.put( "Desktop.background", new ColorUIResource( desktopBackground ) );
|
||||
|
||||
// fix List and Table background colors in Material UI Lite themes
|
||||
if( isMaterialUILite ) {
|
||||
defaults.put( "List.background", defaults.get( "Tree.background" ) );
|
||||
@@ -241,9 +256,10 @@ public class IntelliJTheme
|
||||
// remove theme specific UI defaults and remember only those for current theme
|
||||
Map<Object, Object> themeSpecificDefaults = new HashMap<>();
|
||||
String currentThemePrefix = '[' + name.replace( ' ', '_' ) + ']';
|
||||
String currentThemeAndAuthorPrefix = '[' + name.replace( ' ', '_' ) + "---" + author.replace( ' ', '_' ) + ']';
|
||||
String currentAuthorPrefix = "[author-" + author.replace( ' ', '_' ) + ']';
|
||||
String allThemesPrefix = "[*]";
|
||||
String[] prefixes = { currentThemePrefix, currentAuthorPrefix, allThemesPrefix };
|
||||
String[] prefixes = { currentThemePrefix, currentThemeAndAuthorPrefix, currentAuthorPrefix, allThemesPrefix };
|
||||
for( String key : themeSpecificKeys ) {
|
||||
Object value = defaults.remove( key );
|
||||
for( String prefix : prefixes ) {
|
||||
@@ -344,6 +360,10 @@ public class IntelliJTheme
|
||||
|
||||
// replace all values in UI defaults that match the wildcard key
|
||||
for( Object k : defaultsKeysCache ) {
|
||||
if( k.equals( "Desktop.background" ) ||
|
||||
k.equals( "DesktopIcon.background" ) )
|
||||
continue;
|
||||
|
||||
if( k instanceof String ) {
|
||||
// support replacing of mapped keys
|
||||
// (e.g. set ComboBox.buttonEditableBackground to *.background
|
||||
|
||||
@@ -55,24 +55,38 @@ class LinuxFontPolicy
|
||||
|
||||
String family = "";
|
||||
int style = Font.PLAIN;
|
||||
int size = 10;
|
||||
double dsize = 10;
|
||||
|
||||
// parse pango font description
|
||||
// see https://developer.gnome.org/pango/1.46/pango-Fonts.html#pango-font-description-from-string
|
||||
StringTokenizer st = new StringTokenizer( (String) fontName );
|
||||
while( st.hasMoreTokens() ) {
|
||||
String word = st.nextToken();
|
||||
|
||||
if( word.equalsIgnoreCase( "italic" ) )
|
||||
// remove trailing ',' (e.g. in "Ubuntu Condensed, 11" or "Ubuntu Condensed, Bold 11")
|
||||
if( word.endsWith( "," ) )
|
||||
word = word.substring( 0, word.length() - 1 ).trim();
|
||||
|
||||
String lword = word.toLowerCase();
|
||||
if( lword.equals( "italic" ) || lword.equals( "oblique" ) )
|
||||
style |= Font.ITALIC;
|
||||
else if( word.equalsIgnoreCase( "bold" ) )
|
||||
else if( lword.equals( "bold" ) )
|
||||
style |= Font.BOLD;
|
||||
else if( Character.isDigit( word.charAt( 0 ) ) ) {
|
||||
try {
|
||||
size = Integer.parseInt( word );
|
||||
dsize = Double.parseDouble( word );
|
||||
} catch( NumberFormatException ex ) {
|
||||
// ignore
|
||||
}
|
||||
} else
|
||||
} else {
|
||||
// remove '-' from "Semi-Bold", "Extra-Light", etc
|
||||
if( lword.startsWith( "semi-" ) || lword.startsWith( "demi-" ) )
|
||||
word = word.substring( 0, 4 ) + word.substring( 5 );
|
||||
else if( lword.startsWith( "extra-" ) || lword.startsWith( "ultra-" ) )
|
||||
word = word.substring( 0, 5 ) + word.substring( 6 );
|
||||
|
||||
family = family.isEmpty() ? word : (family + ' ' + word);
|
||||
}
|
||||
}
|
||||
|
||||
// Ubuntu font is rendered poorly (except if running in JetBrains VM)
|
||||
@@ -83,8 +97,8 @@ class LinuxFontPolicy
|
||||
family = "Liberation Sans";
|
||||
|
||||
// scale font size
|
||||
double dsize = size * getGnomeFontScale();
|
||||
size = (int) (dsize + 0.5);
|
||||
dsize *= getGnomeFontScale();
|
||||
int size = (int) (dsize + 0.5);
|
||||
if( size < 1 )
|
||||
size = 1;
|
||||
|
||||
@@ -93,7 +107,37 @@ class LinuxFontPolicy
|
||||
if( logicalFamily != null )
|
||||
family = logicalFamily;
|
||||
|
||||
return createFont( family, style, size, dsize );
|
||||
return createFontEx( family, style, size, dsize );
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a font for the given family, style and size.
|
||||
* If the font family does not match any font on the system,
|
||||
* then the last word (usually a font weight) from the family name is removed and tried again.
|
||||
* E.g. family 'URW Bookman Light' is not found, but 'URW Bookman' is found.
|
||||
* If still not found, then font of family 'Dialog' is returned.
|
||||
*/
|
||||
private static Font createFontEx( String family, int style, int size, double dsize ) {
|
||||
for(;;) {
|
||||
Font font = createFont( family, style, size, dsize );
|
||||
|
||||
// if the font family does not match any font on the system, "Dialog" family is returned
|
||||
if( !"Dialog".equals( font.getFamily() ) || "Dialog".equals( family ) )
|
||||
return font;
|
||||
|
||||
// find last word in family
|
||||
int index = family.lastIndexOf( ' ' );
|
||||
if( index < 0 )
|
||||
return createFont( "Dialog", style, size, dsize );;
|
||||
|
||||
// check whether last work contains some font weight (e.g. Ultra-Bold or Heavy)
|
||||
String lastWord = family.substring( index + 1 ).toLowerCase();
|
||||
if( lastWord.contains( "bold" ) || lastWord.contains( "heavy" ) || lastWord.contains( "black" ) )
|
||||
style |= Font.BOLD;
|
||||
|
||||
// remove last word from family and try again
|
||||
family = family.substring( 0, index );
|
||||
}
|
||||
}
|
||||
|
||||
private static Font createFont( String family, int style, int size, double dsize ) {
|
||||
|
||||
@@ -442,8 +442,8 @@ class UIDefaultsLoader
|
||||
private static Object parseInstance( String value, List<ClassLoader> addonClassLoaders ) {
|
||||
return (LazyValue) t -> {
|
||||
try {
|
||||
return findClass( value, addonClassLoaders ).newInstance();
|
||||
} catch( InstantiationException | IllegalAccessException | ClassNotFoundException ex ) {
|
||||
return findClass( value, addonClassLoaders ).getDeclaredConstructor().newInstance();
|
||||
} catch( Exception ex ) {
|
||||
LoggingFacade.INSTANCE.logSevere( "FlatLaf: Failed to instantiate '" + value + "'.", ex );
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -141,6 +141,21 @@ public class FlatArrowButton
|
||||
return FlatUIUtils.deriveColor( foreground, this.foreground );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the color used to paint the arrow.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
protected Color getArrowColor() {
|
||||
return isEnabled()
|
||||
? (pressedForeground != null && isPressed()
|
||||
? pressedForeground
|
||||
: (hoverForeground != null && isHover()
|
||||
? hoverForeground
|
||||
: foreground))
|
||||
: disabledForeground;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dimension getPreferredSize() {
|
||||
return scale( super.getPreferredSize() );
|
||||
@@ -170,13 +185,7 @@ public class FlatArrowButton
|
||||
}
|
||||
|
||||
// paint arrow
|
||||
g.setColor( deriveForeground( isEnabled()
|
||||
? (pressedForeground != null && isPressed()
|
||||
? pressedForeground
|
||||
: (hoverForeground != null && isHover()
|
||||
? hoverForeground
|
||||
: foreground))
|
||||
: disabledForeground ) );
|
||||
g.setColor( deriveForeground( getArrowColor() ) );
|
||||
paintArrow( (Graphics2D) g );
|
||||
|
||||
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
|
||||
|
||||
@@ -75,6 +75,7 @@ public class FlatButtonBorder
|
||||
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
||||
if( FlatButtonUI.isContentAreaFilled( c ) &&
|
||||
!FlatButtonUI.isToolBarButton( c ) &&
|
||||
(!FlatButtonUI.isBorderlessButton( c ) || FlatUIUtils.isPermanentFocusOwner( c )) &&
|
||||
!FlatButtonUI.isHelpButton( c ) &&
|
||||
!FlatToggleButtonUI.isTabButton( c ) )
|
||||
super.paintBorder( c, g, x, y, width, height );
|
||||
|
||||
@@ -285,6 +285,10 @@ public class FlatButtonUI
|
||||
(c instanceof AbstractButton && clientPropertyEquals( (AbstractButton) c, BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON ));
|
||||
}
|
||||
|
||||
static boolean isBorderlessButton( Component c ) {
|
||||
return c instanceof AbstractButton && clientPropertyEquals( (AbstractButton) c, BUTTON_TYPE, BUTTON_TYPE_BORDERLESS );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update( Graphics g, JComponent c ) {
|
||||
// fill background if opaque to avoid garbage if user sets opaque to true
|
||||
@@ -332,8 +336,9 @@ public class FlatButtonUI
|
||||
|
||||
// paint shadow
|
||||
Color shadowColor = def ? defaultShadowColor : this.shadowColor;
|
||||
if( !isToolBarButton && shadowColor != null && shadowWidth > 0 && focusWidth > 0 &&
|
||||
!(isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c )) && c.isEnabled() )
|
||||
if( shadowColor != null && shadowWidth > 0 && focusWidth > 0 && c.isEnabled() &&
|
||||
!isToolBarButton && !isBorderlessButton( c ) &&
|
||||
!(isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c )) )
|
||||
{
|
||||
g2.setColor( shadowColor );
|
||||
g2.fill( new RoundRectangle2D.Float( focusWidth, focusWidth + UIScale.scale( (float) shadowWidth ),
|
||||
@@ -388,7 +393,7 @@ public class FlatButtonUI
|
||||
}
|
||||
|
||||
protected Color getBackground( JComponent c ) {
|
||||
boolean toolBarButton = isToolBarButton( c );
|
||||
boolean toolBarButton = isToolBarButton( c ) || isBorderlessButton( c );
|
||||
|
||||
// selected state
|
||||
if( ((AbstractButton)c).isSelected() ) {
|
||||
@@ -461,7 +466,7 @@ public class FlatButtonUI
|
||||
if( !c.isEnabled() )
|
||||
return disabledText;
|
||||
|
||||
if( ((AbstractButton)c).isSelected() && !isToolBarButton( c ) )
|
||||
if( ((AbstractButton)c).isSelected() && !(isToolBarButton( c ) || isBorderlessButton( c )) )
|
||||
return selectedForeground;
|
||||
|
||||
// use component foreground if explicitly set
|
||||
|
||||
@@ -42,6 +42,7 @@ import java.beans.PropertyChangeListener;
|
||||
import java.lang.ref.WeakReference;
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.CellRendererPane;
|
||||
import javax.swing.ComboBoxEditor;
|
||||
import javax.swing.DefaultListCellRenderer;
|
||||
import javax.swing.InputMap;
|
||||
@@ -390,6 +391,15 @@ public class FlatComboBoxUI
|
||||
public void update( Graphics g, JComponent c ) {
|
||||
float focusWidth = FlatUIUtils.getBorderFocusWidth( c );
|
||||
float arc = FlatUIUtils.getBorderArc( c );
|
||||
boolean paintBackground = true;
|
||||
|
||||
// check whether used as cell renderer
|
||||
boolean isCellRenderer = c.getParent() instanceof CellRendererPane;
|
||||
if( isCellRenderer ) {
|
||||
focusWidth = 0;
|
||||
arc = 0;
|
||||
paintBackground = isCellRendererBackgroundChanged();
|
||||
}
|
||||
|
||||
// fill background if opaque to avoid garbage if user sets opaque to true
|
||||
if( c.isOpaque() && (focusWidth > 0 || arc > 0) )
|
||||
@@ -407,27 +417,29 @@ public class FlatComboBoxUI
|
||||
boolean isLeftToRight = comboBox.getComponentOrientation().isLeftToRight();
|
||||
|
||||
// paint background
|
||||
g2.setColor( getBackground( enabled ) );
|
||||
FlatUIUtils.paintComponentBackground( g2, 0, 0, width, height, focusWidth, arc );
|
||||
|
||||
// paint arrow button background
|
||||
if( enabled ) {
|
||||
g2.setColor( paintButton ? buttonEditableBackground : buttonBackground );
|
||||
Shape oldClip = g2.getClip();
|
||||
if( isLeftToRight )
|
||||
g2.clipRect( arrowX, 0, width - arrowX, height );
|
||||
else
|
||||
g2.clipRect( 0, 0, arrowX + arrowWidth, height );
|
||||
if( paintBackground || c.isOpaque() ) {
|
||||
g2.setColor( getBackground( enabled ) );
|
||||
FlatUIUtils.paintComponentBackground( g2, 0, 0, width, height, focusWidth, arc );
|
||||
g2.setClip( oldClip );
|
||||
}
|
||||
|
||||
// paint vertical line between value and arrow button
|
||||
if( paintButton ) {
|
||||
g2.setColor( enabled ? borderColor : disabledBorderColor );
|
||||
float lw = scale( 1f );
|
||||
float lx = isLeftToRight ? arrowX : arrowX + arrowWidth - lw;
|
||||
g2.fill( new Rectangle2D.Float( lx, focusWidth, lw, height - 1 - (focusWidth * 2)) );
|
||||
// paint arrow button background
|
||||
if( enabled && !isCellRenderer ) {
|
||||
g2.setColor( paintButton ? buttonEditableBackground : buttonBackground );
|
||||
Shape oldClip = g2.getClip();
|
||||
if( isLeftToRight )
|
||||
g2.clipRect( arrowX, 0, width - arrowX, height );
|
||||
else
|
||||
g2.clipRect( 0, 0, arrowX + arrowWidth, height );
|
||||
FlatUIUtils.paintComponentBackground( g2, 0, 0, width, height, focusWidth, arc );
|
||||
g2.setClip( oldClip );
|
||||
}
|
||||
|
||||
// paint vertical line between value and arrow button
|
||||
if( paintButton ) {
|
||||
g2.setColor( enabled ? borderColor : disabledBorderColor );
|
||||
float lw = scale( 1f );
|
||||
float lx = isLeftToRight ? arrowX : arrowX + arrowWidth - lw;
|
||||
g2.fill( new Rectangle2D.Float( lx, focusWidth, lw, height - 1 - (focusWidth * 2)) );
|
||||
}
|
||||
}
|
||||
|
||||
// avoid that the "current value" renderer is invoked with enabled antialiasing
|
||||
@@ -554,6 +566,16 @@ public class FlatComboBoxUI
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isCellRenderer() {
|
||||
return comboBox.getParent() instanceof CellRendererPane;
|
||||
}
|
||||
|
||||
private boolean isCellRendererBackgroundChanged() {
|
||||
// parent is a CellRendererPane, parentParent is e.g. a JTable
|
||||
Container parentParent = comboBox.getParent().getParent();
|
||||
return parentParent != null && !comboBox.getBackground().equals( parentParent.getBackground() );
|
||||
}
|
||||
|
||||
//---- class FlatComboBoxButton -------------------------------------------
|
||||
|
||||
protected class FlatComboBoxButton
|
||||
@@ -580,6 +602,14 @@ public class FlatComboBoxUI
|
||||
protected boolean isPressed() {
|
||||
return super.isPressed() || (!comboBox.isEditable() ? pressed : false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Color getArrowColor() {
|
||||
if( isCellRenderer() && isCellRendererBackgroundChanged() )
|
||||
return comboBox.getForeground();
|
||||
|
||||
return super.getArrowColor();
|
||||
}
|
||||
}
|
||||
|
||||
//---- class FlatComboPopup -----------------------------------------------
|
||||
|
||||
@@ -16,10 +16,12 @@
|
||||
|
||||
package com.formdev.flatlaf.ui;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Image;
|
||||
import java.awt.Insets;
|
||||
@@ -28,11 +30,13 @@ import java.awt.Point;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.beans.PropertyVetoException;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JDesktopPane;
|
||||
import javax.swing.event.MouseInputAdapter;
|
||||
import javax.swing.event.MouseInputListener;
|
||||
import javax.swing.JLabel;
|
||||
@@ -45,6 +49,7 @@ import javax.swing.SwingUtilities;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.plaf.ComponentUI;
|
||||
import javax.swing.plaf.basic.BasicDesktopIconUI;
|
||||
import com.formdev.flatlaf.util.MultiResolutionImageSupport;
|
||||
import com.formdev.flatlaf.util.UIScale;
|
||||
|
||||
/**
|
||||
@@ -75,11 +80,21 @@ public class FlatDesktopIconUI
|
||||
private JToolTip titleTip;
|
||||
private ActionListener closeListener;
|
||||
private MouseInputListener mouseInputListener;
|
||||
private PropertyChangeListener ancestorListener;
|
||||
|
||||
public static ComponentUI createUI( JComponent c ) {
|
||||
return new FlatDesktopIconUI();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void installUI( JComponent c ) {
|
||||
super.installUI( c );
|
||||
|
||||
// update dock icon preview if already iconified
|
||||
if( c.isDisplayable() )
|
||||
updateDockIconPreviewLater();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void uninstallUI( JComponent c ) {
|
||||
super.uninstallUI( c );
|
||||
@@ -136,6 +151,17 @@ public class FlatDesktopIconUI
|
||||
};
|
||||
closeButton.addActionListener( closeListener );
|
||||
closeButton.addMouseListener( mouseInputListener );
|
||||
|
||||
ancestorListener = e -> {
|
||||
if( e.getNewValue() != null ) {
|
||||
// update dock icon preview if desktopIcon is added to desktop (internal frame was iconified)
|
||||
updateDockIconPreviewLater();
|
||||
} else {
|
||||
// remove preview icon to release memory
|
||||
dockIcon.setIcon( null );
|
||||
}
|
||||
};
|
||||
desktopIcon.addPropertyChangeListener( "ancestor", ancestorListener );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -146,6 +172,9 @@ public class FlatDesktopIconUI
|
||||
closeButton.removeMouseListener( mouseInputListener );
|
||||
closeListener = null;
|
||||
mouseInputListener = null;
|
||||
|
||||
desktopIcon.removePropertyChangeListener( "ancestor", ancestorListener );
|
||||
ancestorListener = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -228,15 +257,30 @@ public class FlatDesktopIconUI
|
||||
return getPreferredSize( c );
|
||||
}
|
||||
|
||||
void updateDockIcon() {
|
||||
@Override
|
||||
public void update( Graphics g, JComponent c ) {
|
||||
if( c.isOpaque() ) {
|
||||
// fill background with color derived from desktop pane
|
||||
Color background = c.getBackground();
|
||||
JDesktopPane desktopPane = desktopIcon.getDesktopPane();
|
||||
g.setColor( (desktopPane != null)
|
||||
? FlatUIUtils.deriveColor( background, desktopPane.getBackground() )
|
||||
: background );
|
||||
g.fillRect( 0, 0, c.getWidth(), c.getHeight() );
|
||||
}
|
||||
|
||||
paint( g, c );
|
||||
}
|
||||
|
||||
private void updateDockIconPreviewLater() {
|
||||
// use invoke later to make sure that components are updated when switching LaF
|
||||
EventQueue.invokeLater( () -> {
|
||||
if( dockIcon != null )
|
||||
updateDockIconLater();
|
||||
updateDockIconPreview();
|
||||
} );
|
||||
}
|
||||
|
||||
private void updateDockIconLater() {
|
||||
protected void updateDockIconPreview() {
|
||||
// make sure that frame is not selected
|
||||
if( frame.isSelected() ) {
|
||||
try {
|
||||
@@ -246,13 +290,22 @@ public class FlatDesktopIconUI
|
||||
}
|
||||
}
|
||||
|
||||
// layout internal frame title pane, which was recreated when switching Laf
|
||||
// (directly invoke doLayout() because frame.validate() does not work here
|
||||
// because frame is not displayable)
|
||||
if( !frame.isValid() )
|
||||
frame.doLayout();
|
||||
for( Component c : frame.getComponents() ) {
|
||||
if( !c.isValid() )
|
||||
c.doLayout();
|
||||
}
|
||||
|
||||
// paint internal frame to buffered image
|
||||
int frameWidth = Math.max( frame.getWidth(), 1 );
|
||||
int frameHeight = Math.max( frame.getHeight(), 1 );
|
||||
BufferedImage frameImage = new BufferedImage( frameWidth, frameHeight, BufferedImage.TYPE_INT_ARGB );
|
||||
Graphics2D g = frameImage.createGraphics();
|
||||
try {
|
||||
//TODO fix missing internal frame header when switching LaF
|
||||
frame.paint( g );
|
||||
} finally {
|
||||
g.dispose();
|
||||
@@ -270,6 +323,27 @@ public class FlatDesktopIconUI
|
||||
|
||||
// scale preview
|
||||
Image previewImage = frameImage.getScaledInstance( previewWidth, previewHeight, Image.SCALE_SMOOTH );
|
||||
if( MultiResolutionImageSupport.isAvailable() ) {
|
||||
// On HiDPI screens, create preview images for 1x, 2x and current scale factor.
|
||||
// The icon then chooses the best resolution for painting, which is usually
|
||||
// the one for the current scale factor. But if changing scale factor or
|
||||
// moving window to another screen with different scale factor, then another
|
||||
// resolution may be used because the preview icon is not updated.
|
||||
Image previewImage2x = frameImage.getScaledInstance( previewWidth * 2, previewHeight * 2, Image.SCALE_SMOOTH );
|
||||
double scaleFactor = UIScale.getSystemScaleFactor( desktopIcon.getGraphicsConfiguration() );
|
||||
if( scaleFactor != 1 && scaleFactor != 2 ) {
|
||||
Image previewImageCurrent = frameImage.getScaledInstance(
|
||||
(int) Math.round( previewWidth * scaleFactor ),
|
||||
(int) Math.round( previewHeight * scaleFactor ),
|
||||
Image.SCALE_SMOOTH );
|
||||
|
||||
// the images must be ordered by resolution
|
||||
previewImage = (scaleFactor < 2)
|
||||
? MultiResolutionImageSupport.create( 0, previewImage, previewImageCurrent, previewImage2x )
|
||||
: MultiResolutionImageSupport.create( 0, previewImage, previewImage2x, previewImageCurrent );
|
||||
} else
|
||||
previewImage = MultiResolutionImageSupport.create( 0, previewImage, previewImage2x );
|
||||
}
|
||||
dockIcon.setIcon( new ImageIcon( previewImage ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -16,11 +16,16 @@
|
||||
|
||||
package com.formdev.flatlaf.ui;
|
||||
|
||||
import javax.swing.DefaultDesktopManager;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.ContainerEvent;
|
||||
import java.awt.event.ContainerListener;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JInternalFrame;
|
||||
import javax.swing.JInternalFrame.JDesktopIcon;
|
||||
import javax.swing.plaf.ComponentUI;
|
||||
import javax.swing.plaf.UIResource;
|
||||
import javax.swing.plaf.basic.BasicDesktopPaneUI;
|
||||
|
||||
/**
|
||||
@@ -36,30 +41,96 @@ import javax.swing.plaf.basic.BasicDesktopPaneUI;
|
||||
public class FlatDesktopPaneUI
|
||||
extends BasicDesktopPaneUI
|
||||
{
|
||||
private LayoutDockListener layoutDockListener;
|
||||
private boolean layoutDockPending;
|
||||
|
||||
public static ComponentUI createUI( JComponent c ) {
|
||||
return new FlatDesktopPaneUI();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void installDesktopManager() {
|
||||
desktopManager = desktop.getDesktopManager();
|
||||
if( desktopManager == null ) {
|
||||
desktopManager = new FlatDesktopManager();
|
||||
desktop.setDesktopManager( desktopManager );
|
||||
public void installUI( JComponent c ) {
|
||||
super.installUI( c );
|
||||
|
||||
layoutDockLaterOnce();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void installListeners() {
|
||||
super.installListeners();
|
||||
|
||||
layoutDockListener = new LayoutDockListener();
|
||||
desktop.addContainerListener( layoutDockListener );
|
||||
desktop.addComponentListener( layoutDockListener );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void uninstallListeners() {
|
||||
super.uninstallListeners();
|
||||
|
||||
desktop.removeContainerListener( layoutDockListener );
|
||||
desktop.removeComponentListener( layoutDockListener );
|
||||
layoutDockListener = null;
|
||||
}
|
||||
|
||||
private void layoutDockLaterOnce() {
|
||||
if( layoutDockPending )
|
||||
return;
|
||||
layoutDockPending = true;
|
||||
|
||||
EventQueue.invokeLater( () -> {
|
||||
layoutDockPending = false;
|
||||
if( desktop != null )
|
||||
layoutDock();
|
||||
} );
|
||||
}
|
||||
|
||||
protected void layoutDock() {
|
||||
Dimension desktopSize = desktop.getSize();
|
||||
int x = 0;
|
||||
int y = desktopSize.height;
|
||||
int rowHeight = 0;
|
||||
|
||||
for( Component c : desktop.getComponents() ) {
|
||||
if( !(c instanceof JDesktopIcon) )
|
||||
continue;
|
||||
|
||||
JDesktopIcon icon = (JDesktopIcon) c;
|
||||
Dimension iconSize = icon.getPreferredSize();
|
||||
|
||||
if( x + iconSize.width > desktopSize.width ) {
|
||||
// new row
|
||||
x = 0;
|
||||
y -= rowHeight;
|
||||
rowHeight = 0;
|
||||
}
|
||||
|
||||
icon.setLocation( x, y - iconSize.height );
|
||||
|
||||
x += iconSize.width;
|
||||
rowHeight = Math.max( iconSize.height, rowHeight );
|
||||
}
|
||||
}
|
||||
|
||||
//---- class FlatDesktopManager -------------------------------------------
|
||||
//---- class LayoutDockListener -------------------------------------------
|
||||
|
||||
private class FlatDesktopManager
|
||||
extends DefaultDesktopManager
|
||||
implements UIResource
|
||||
private class LayoutDockListener
|
||||
extends ComponentAdapter
|
||||
implements ContainerListener
|
||||
{
|
||||
@Override
|
||||
public void iconifyFrame( JInternalFrame f ) {
|
||||
super.iconifyFrame( f );
|
||||
public void componentAdded( ContainerEvent e ) {
|
||||
layoutDockLaterOnce();
|
||||
}
|
||||
|
||||
((FlatDesktopIconUI)f.getDesktopIcon().getUI()).updateDockIcon();
|
||||
@Override
|
||||
public void componentRemoved( ContainerEvent e ) {
|
||||
layoutDockLaterOnce();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentResized( ComponentEvent e ) {
|
||||
layoutDockLaterOnce();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,6 +125,10 @@ public class FlatNativeWindowBorder
|
||||
// enable native window border for window
|
||||
setHasCustomDecoration( frame, true );
|
||||
|
||||
// avoid double window title bar if enabling native window border failed
|
||||
if( !hasCustomDecoration( frame ) )
|
||||
return;
|
||||
|
||||
// enable Swing window decoration
|
||||
rootPane.setWindowDecorationStyle( JRootPane.FRAME );
|
||||
|
||||
@@ -143,6 +147,10 @@ public class FlatNativeWindowBorder
|
||||
// enable native window border for window
|
||||
setHasCustomDecoration( dialog, true );
|
||||
|
||||
// avoid double window title bar if enabling native window border failed
|
||||
if( !hasCustomDecoration( dialog ) )
|
||||
return;
|
||||
|
||||
// enable Swing window decoration
|
||||
rootPane.setWindowDecorationStyle( JRootPane.PLAIN_DIALOG );
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import java.awt.Insets;
|
||||
import java.awt.MouseInfo;
|
||||
import java.awt.Panel;
|
||||
import java.awt.Point;
|
||||
import java.awt.PointerInfo;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.ComponentEvent;
|
||||
@@ -216,7 +217,11 @@ public class FlatPopupFactory
|
||||
if( !(contents instanceof JToolTip) || !wasInvokedFromToolTipManager() )
|
||||
return null;
|
||||
|
||||
Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
|
||||
PointerInfo pointerInfo = MouseInfo.getPointerInfo();
|
||||
if( pointerInfo == null )
|
||||
return null;
|
||||
|
||||
Point mouseLocation = pointerInfo.getLocation();
|
||||
Dimension tipSize = contents.getPreferredSize();
|
||||
|
||||
// check whether mouse location is within tooltip bounds
|
||||
|
||||
@@ -18,11 +18,14 @@ package com.formdev.flatlaf.ui;
|
||||
|
||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||
import java.awt.Color;
|
||||
import java.awt.Container;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Insets;
|
||||
import java.awt.Rectangle;
|
||||
import java.util.Objects;
|
||||
import javax.swing.AbstractButton;
|
||||
import javax.swing.CellRendererPane;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.LookAndFeel;
|
||||
import javax.swing.UIManager;
|
||||
@@ -120,10 +123,11 @@ public class FlatRadioButtonUI
|
||||
public void paint( Graphics g, JComponent c ) {
|
||||
// fill background even if not opaque if
|
||||
// - contentAreaFilled is true and
|
||||
// - if background was explicitly set to a non-UIResource color
|
||||
// - if background color is different to default background color
|
||||
// (this paints selection if using the component as cell renderer)
|
||||
if( !c.isOpaque() &&
|
||||
((AbstractButton)c).isContentAreaFilled() &&
|
||||
!defaultBackground.equals( c.getBackground() ) )
|
||||
!Objects.equals( c.getBackground(), getDefaultBackground( c ) ) )
|
||||
{
|
||||
g.setColor( c.getBackground() );
|
||||
g.fillRect( 0, 0, c.getWidth(), c.getHeight() );
|
||||
@@ -160,6 +164,18 @@ public class FlatRadioButtonUI
|
||||
FlatButtonUI.paintText( g, b, textRect, text, b.isEnabled() ? b.getForeground() : disabledText );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default background color of the component.
|
||||
* If the component is used as cell renderer (e.g. in JTable),
|
||||
* then the background color of the renderer container is returned.
|
||||
*/
|
||||
private Color getDefaultBackground( JComponent c ) {
|
||||
Container parent = c.getParent();
|
||||
return (parent instanceof CellRendererPane && parent.getParent() != null)
|
||||
? parent.getParent().getBackground()
|
||||
: defaultBackground;
|
||||
}
|
||||
|
||||
private int getIconFocusWidth( JComponent c ) {
|
||||
AbstractButton b = (AbstractButton) c;
|
||||
return (b.getIcon() == null && getDefaultIcon() instanceof FlatCheckBoxIcon)
|
||||
|
||||
@@ -58,6 +58,8 @@ import java.util.function.BiConsumer;
|
||||
import java.util.function.IntConsumer;
|
||||
import javax.accessibility.Accessible;
|
||||
import javax.accessibility.AccessibleContext;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.ActionMap;
|
||||
import javax.swing.ButtonModel;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JButton;
|
||||
@@ -325,7 +327,7 @@ public class FlatTabbedPaneUI
|
||||
// the default also includes Ctrl+TAB/Ctrl+Shift+TAB, which we need to switch tabs
|
||||
if( focusForwardTraversalKeys == null ) {
|
||||
focusForwardTraversalKeys = Collections.singleton( KeyStroke.getKeyStroke( KeyEvent.VK_TAB, 0 ) );
|
||||
focusBackwardTraversalKeys = Collections.singleton( KeyStroke.getKeyStroke( KeyEvent.VK_TAB, InputEvent.SHIFT_MASK ) );
|
||||
focusBackwardTraversalKeys = Collections.singleton( KeyStroke.getKeyStroke( KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK ) );
|
||||
}
|
||||
// Ideally we should use `LookAndFeel.installProperty( tabPane, "focusTraversalKeysForward", keys )` here
|
||||
// instead of `tabPane.setFocusTraversalKeys()`, but WindowsTabbedPaneUI also uses later method
|
||||
@@ -490,6 +492,20 @@ public class FlatTabbedPaneUI
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void installKeyboardActions() {
|
||||
super.installKeyboardActions();
|
||||
|
||||
// get shared action map, used for all tabbed panes
|
||||
ActionMap map = SwingUtilities.getUIActionMap( tabPane );
|
||||
if( map != null ) {
|
||||
// this is required for the case that those actions are used from outside
|
||||
// (e.g. wheel tab scroller in NetBeans)
|
||||
RunWithOriginalLayoutManagerDelegateAction.install( map, "scrollTabsForwardAction" );
|
||||
RunWithOriginalLayoutManagerDelegateAction.install( map, "scrollTabsBackwardAction" );
|
||||
}
|
||||
}
|
||||
|
||||
private Handler getHandler() {
|
||||
if( handler == null )
|
||||
handler = new Handler();
|
||||
@@ -2959,4 +2975,51 @@ public class FlatTabbedPaneUI
|
||||
scrollBackwardButtonPrefSize = backwardButton.getPreferredSize();
|
||||
}
|
||||
}
|
||||
|
||||
//---- class RunWithOriginalLayoutManagerDelegateAction -------------------
|
||||
|
||||
private static class RunWithOriginalLayoutManagerDelegateAction
|
||||
implements Action
|
||||
{
|
||||
private final Action delegate;
|
||||
|
||||
static void install( ActionMap map, String key ) {
|
||||
Action oldAction = map.get( key );
|
||||
if( oldAction == null || oldAction instanceof RunWithOriginalLayoutManagerDelegateAction )
|
||||
return; // not found or already installed
|
||||
|
||||
map.put( key, new RunWithOriginalLayoutManagerDelegateAction( oldAction ) );
|
||||
}
|
||||
|
||||
private RunWithOriginalLayoutManagerDelegateAction( Action delegate ) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getValue( String key ) {
|
||||
return delegate.getValue( key );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return delegate.isEnabled();
|
||||
}
|
||||
|
||||
@Override public void putValue( String key, Object value ) {}
|
||||
@Override public void setEnabled( boolean b ) {}
|
||||
@Override public void addPropertyChangeListener( PropertyChangeListener listener ) {}
|
||||
@Override public void removePropertyChangeListener( PropertyChangeListener listener ) {}
|
||||
|
||||
@Override
|
||||
public void actionPerformed( ActionEvent e ) {
|
||||
JTabbedPane tabbedPane = (JTabbedPane) e.getSource();
|
||||
ComponentUI ui = tabbedPane.getUI();
|
||||
if( ui instanceof FlatTabbedPaneUI ) {
|
||||
((FlatTabbedPaneUI)ui).runWithOriginalLayoutManager( () -> {
|
||||
delegate.actionPerformed( e );
|
||||
} );
|
||||
} else
|
||||
delegate.actionPerformed( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright 2021 FormDev Software GmbH
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.formdev.flatlaf.ui;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import javax.swing.JScrollBar;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.table.JTableHeader;
|
||||
import javax.swing.table.TableColumn;
|
||||
import com.formdev.flatlaf.util.UIScale;
|
||||
|
||||
/**
|
||||
* Cell border for {@code sun.swing.table.DefaultTableCellHeaderRenderer}
|
||||
* (used by {@link javax.swing.table.JTableHeader}).
|
||||
* <p>
|
||||
* Uses separate cell margins from UI defaults to allow easy customizing.
|
||||
*
|
||||
* @author Karl Tauber
|
||||
* @since 1.2
|
||||
*/
|
||||
public class FlatTableHeaderBorder
|
||||
extends FlatEmptyBorder
|
||||
{
|
||||
protected Color separatorColor = UIManager.getColor( "TableHeader.separatorColor" );
|
||||
protected Color bottomSeparatorColor = UIManager.getColor( "TableHeader.bottomSeparatorColor" );
|
||||
|
||||
public FlatTableHeaderBorder() {
|
||||
super( UIManager.getInsets( "TableHeader.cellMargins" ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
||||
JTableHeader header = (JTableHeader) SwingUtilities.getAncestorOfClass( JTableHeader.class, c );
|
||||
boolean leftToRight = (header != null ? header : c).getComponentOrientation().isLeftToRight();
|
||||
boolean paintLeft = !leftToRight;
|
||||
boolean paintRight = leftToRight;
|
||||
|
||||
if( header != null ) {
|
||||
int hx = SwingUtilities.convertPoint( c, x, y, header ).x;
|
||||
if( isDraggedColumn( header, hx ) )
|
||||
paintLeft = paintRight = true;
|
||||
else {
|
||||
if( hx <= 0 && !leftToRight && hideTrailingVerticalLine( header ) )
|
||||
paintLeft = false;
|
||||
if( hx + width >= header.getWidth() && leftToRight && hideTrailingVerticalLine( header ) )
|
||||
paintRight = false;
|
||||
}
|
||||
}
|
||||
|
||||
float lineWidth = UIScale.scale( 1f );
|
||||
|
||||
Graphics2D g2 = (Graphics2D) g.create();
|
||||
try {
|
||||
FlatUIUtils.setRenderingHints( g2 );
|
||||
|
||||
// paint column separator lines
|
||||
g2.setColor( separatorColor );
|
||||
if( paintLeft )
|
||||
g2.fill( new Rectangle2D.Float( x, y, lineWidth, height - lineWidth ) );
|
||||
if( paintRight )
|
||||
g2.fill( new Rectangle2D.Float( x + width - lineWidth, y, lineWidth, height - lineWidth ) );
|
||||
|
||||
// paint bottom line
|
||||
g2.setColor( bottomSeparatorColor );
|
||||
g2.fill( new Rectangle2D.Float( x, y + height - lineWidth, width, lineWidth ) );
|
||||
} finally {
|
||||
g2.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean isDraggedColumn( JTableHeader header, int x ) {
|
||||
TableColumn draggedColumn = header.getDraggedColumn();
|
||||
if( draggedColumn == null )
|
||||
return false;
|
||||
|
||||
int draggedDistance = header.getDraggedDistance();
|
||||
if( draggedDistance == 0 )
|
||||
return false;
|
||||
|
||||
int columnCount = header.getColumnModel().getColumnCount();
|
||||
for( int i = 0; i < columnCount; i++ ) {
|
||||
if( header.getHeaderRect( i ).x + draggedDistance == x )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean hideTrailingVerticalLine( JTableHeader header ) {
|
||||
Container viewport = header.getParent();
|
||||
Container viewportParent = (viewport != null) ? viewport.getParent() : null;
|
||||
if( !(viewportParent instanceof JScrollPane) )
|
||||
return true;
|
||||
|
||||
JScrollBar vsb = ((JScrollPane)viewportParent).getVerticalScrollBar();
|
||||
if( vsb == null || !vsb.isVisible() )
|
||||
return true;
|
||||
|
||||
// if "ScrollPane.fillUpperCorner" is true, then javax.swing.ScrollPaneLayout
|
||||
// extends the vertical scrollbar into the upper right/left corner
|
||||
return vsb.getY() == viewport.getY();
|
||||
}
|
||||
}
|
||||
@@ -18,20 +18,16 @@ package com.formdev.flatlaf.ui;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Insets;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.util.Objects;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.Border;
|
||||
@@ -39,7 +35,6 @@ import javax.swing.plaf.ComponentUI;
|
||||
import javax.swing.plaf.UIResource;
|
||||
import javax.swing.plaf.basic.BasicTableHeaderUI;
|
||||
import javax.swing.table.TableCellRenderer;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
import com.formdev.flatlaf.util.UIScale;
|
||||
|
||||
@@ -54,17 +49,21 @@ import com.formdev.flatlaf.util.UIScale;
|
||||
*
|
||||
* <!-- FlatTableHeaderUI -->
|
||||
*
|
||||
* @uiDefault TableHeader.separatorColor Color
|
||||
* @uiDefault TableHeader.bottomSeparatorColor Color
|
||||
* @uiDefault TableHeader.height int
|
||||
* @uiDefault TableHeader.sortIconPosition String right (default), left, top or bottom
|
||||
*
|
||||
* <!-- FlatTableHeaderBorder -->
|
||||
*
|
||||
* @uiDefault TableHeader.cellMargins Insets
|
||||
* @uiDefault TableHeader.separatorColor Color
|
||||
* @uiDefault TableHeader.bottomSeparatorColor Color
|
||||
*
|
||||
* @author Karl Tauber
|
||||
*/
|
||||
public class FlatTableHeaderUI
|
||||
extends BasicTableHeaderUI
|
||||
{
|
||||
protected Color separatorColor;
|
||||
protected Color bottomSeparatorColor;
|
||||
protected int height;
|
||||
protected int sortIconPosition;
|
||||
@@ -77,7 +76,6 @@ public class FlatTableHeaderUI
|
||||
protected void installDefaults() {
|
||||
super.installDefaults();
|
||||
|
||||
separatorColor = UIManager.getColor( "TableHeader.separatorColor" );
|
||||
bottomSeparatorColor = UIManager.getColor( "TableHeader.bottomSeparatorColor" );
|
||||
height = UIManager.getInt( "TableHeader.height" );
|
||||
switch( Objects.toString( UIManager.getString( "TableHeader.sortIconPosition" ), "right" ) ) {
|
||||
@@ -93,27 +91,38 @@ public class FlatTableHeaderUI
|
||||
protected void uninstallDefaults() {
|
||||
super.uninstallDefaults();
|
||||
|
||||
separatorColor = null;
|
||||
bottomSeparatorColor = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paint( Graphics g, JComponent c ) {
|
||||
if( header.getColumnModel().getColumnCount() <= 0 )
|
||||
TableColumnModel columnModel = header.getColumnModel();
|
||||
if( columnModel.getColumnCount() <= 0 )
|
||||
return;
|
||||
|
||||
// do not paint borders if JTableHeader.setDefaultRenderer() was used
|
||||
TableCellRenderer defaultRenderer = header.getDefaultRenderer();
|
||||
boolean paintBorders = isSystemDefaultRenderer( defaultRenderer );
|
||||
if( !paintBorders ) {
|
||||
// check whether the renderer delegates to the system default renderer
|
||||
Component rendererComponent = defaultRenderer.getTableCellRendererComponent(
|
||||
header.getTable(), "", false, false, -1, 0 );
|
||||
paintBorders = isSystemDefaultRenderer( rendererComponent );
|
||||
}
|
||||
// compute total width of all columns
|
||||
int columnCount = columnModel.getColumnCount();
|
||||
int totalWidth = 0;
|
||||
for( int i = 0; i < columnCount; i++ )
|
||||
totalWidth += columnModel.getColumn( i ).getWidth();
|
||||
|
||||
if( paintBorders )
|
||||
paintColumnBorders( g, c );
|
||||
if( totalWidth < header.getWidth() ) {
|
||||
// do not paint bottom separator if JTableHeader.setDefaultRenderer() was used
|
||||
TableCellRenderer defaultRenderer = header.getDefaultRenderer();
|
||||
boolean paintBottomSeparator = isSystemDefaultRenderer( defaultRenderer );
|
||||
if( !paintBottomSeparator && header.getTable() != null ) {
|
||||
// check whether the renderer delegates to the system default renderer
|
||||
Component rendererComponent = defaultRenderer.getTableCellRendererComponent(
|
||||
header.getTable(), "", false, false, -1, 0 );
|
||||
paintBottomSeparator = isSystemDefaultRenderer( rendererComponent );
|
||||
}
|
||||
|
||||
if( paintBottomSeparator ) {
|
||||
int w = c.getWidth() - totalWidth;
|
||||
int x = header.getComponentOrientation().isLeftToRight() ? c.getWidth() - w : 0;
|
||||
paintBottomSeparator( g, c, x, w );
|
||||
}
|
||||
}
|
||||
|
||||
// temporary use own default renderer if necessary
|
||||
FlatTableCellHeaderRenderer sortIconRenderer = null;
|
||||
@@ -130,9 +139,6 @@ public class FlatTableHeaderUI
|
||||
sortIconRenderer.reset();
|
||||
header.setDefaultRenderer( sortIconRenderer.delegate );
|
||||
}
|
||||
|
||||
if( paintBorders )
|
||||
paintDraggedColumnBorders( g, c );
|
||||
}
|
||||
|
||||
private boolean isSystemDefaultRenderer( Object headerRenderer ) {
|
||||
@@ -141,17 +147,8 @@ public class FlatTableHeaderUI
|
||||
rendererClassName.equals( "sun.swing.FilePane$AlignableTableHeaderRenderer" );
|
||||
}
|
||||
|
||||
protected void paintColumnBorders( Graphics g, JComponent c ) {
|
||||
int width = c.getWidth();
|
||||
int height = c.getHeight();
|
||||
protected void paintBottomSeparator( Graphics g, JComponent c, int x, int w ) {
|
||||
float lineWidth = UIScale.scale( 1f );
|
||||
float topLineIndent = lineWidth;
|
||||
float bottomLineIndent = lineWidth * 3;
|
||||
TableColumnModel columnModel = header.getColumnModel();
|
||||
int columnCount = columnModel.getColumnCount();
|
||||
int sepCount = columnCount;
|
||||
if( hideLastVerticalLine() )
|
||||
sepCount--;
|
||||
|
||||
Graphics2D g2 = (Graphics2D) g.create();
|
||||
try {
|
||||
@@ -159,78 +156,7 @@ public class FlatTableHeaderUI
|
||||
|
||||
// paint bottom line
|
||||
g2.setColor( bottomSeparatorColor );
|
||||
g2.fill( new Rectangle2D.Float( 0, height - lineWidth, width, lineWidth ) );
|
||||
|
||||
// paint column separator lines
|
||||
g2.setColor( separatorColor );
|
||||
|
||||
float y = topLineIndent;
|
||||
float h = height - bottomLineIndent;
|
||||
|
||||
if( header.getComponentOrientation().isLeftToRight() ) {
|
||||
int x = 0;
|
||||
for( int i = 0; i < sepCount; i++ ) {
|
||||
x += columnModel.getColumn( i ).getWidth();
|
||||
g2.fill( new Rectangle2D.Float( x - lineWidth, y, lineWidth, h ) );
|
||||
}
|
||||
|
||||
// paint trailing separator (on right side)
|
||||
if( !hideTrailingVerticalLine() )
|
||||
g2.fill( new Rectangle2D.Float( header.getWidth() - lineWidth, y, lineWidth, h ) );
|
||||
} else {
|
||||
Rectangle cellRect = header.getHeaderRect( 0 );
|
||||
int x = cellRect.x + cellRect.width;
|
||||
for( int i = 0; i < sepCount; i++ ) {
|
||||
x -= columnModel.getColumn( i ).getWidth();
|
||||
g2.fill( new Rectangle2D.Float( x - (i < sepCount - 1 ? lineWidth : 0), y, lineWidth, h ) );
|
||||
}
|
||||
|
||||
// paint trailing separator (on left side)
|
||||
if( !hideTrailingVerticalLine() )
|
||||
g2.fill( new Rectangle2D.Float( 0, y, lineWidth, h ) );
|
||||
}
|
||||
} finally {
|
||||
g2.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
private void paintDraggedColumnBorders( Graphics g, JComponent c ) {
|
||||
TableColumn draggedColumn = header.getDraggedColumn();
|
||||
if( draggedColumn == null )
|
||||
return;
|
||||
|
||||
// find index of dragged column
|
||||
TableColumnModel columnModel = header.getColumnModel();
|
||||
int columnCount = columnModel.getColumnCount();
|
||||
int draggedColumnIndex = -1;
|
||||
for( int i = 0; i < columnCount; i++ ) {
|
||||
if( columnModel.getColumn( i ) == draggedColumn ) {
|
||||
draggedColumnIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( draggedColumnIndex < 0 )
|
||||
return;
|
||||
|
||||
float lineWidth = UIScale.scale( 1f );
|
||||
float topLineIndent = lineWidth;
|
||||
float bottomLineIndent = lineWidth * 3;
|
||||
Rectangle r = header.getHeaderRect( draggedColumnIndex );
|
||||
r.x += header.getDraggedDistance();
|
||||
|
||||
Graphics2D g2 = (Graphics2D) g.create();
|
||||
try {
|
||||
FlatUIUtils.setRenderingHints( g2 );
|
||||
|
||||
// paint dragged bottom line
|
||||
g2.setColor( bottomSeparatorColor );
|
||||
g2.fill( new Rectangle2D.Float( r.x, r.y + r.height - lineWidth, r.width, lineWidth ) );
|
||||
|
||||
// paint dragged column separator lines
|
||||
g2.setColor( separatorColor );
|
||||
g2.fill( new Rectangle2D.Float( r.x, topLineIndent, lineWidth, r.height - bottomLineIndent ) );
|
||||
g2.fill( new Rectangle2D.Float( r.x + r.width - lineWidth, r.y + topLineIndent, lineWidth, r.height - bottomLineIndent ) );
|
||||
g2.fill( new Rectangle2D.Float( x, c.getHeight() - lineWidth, w, lineWidth ) );
|
||||
} finally {
|
||||
g2.dispose();
|
||||
}
|
||||
@@ -244,32 +170,6 @@ public class FlatTableHeaderUI
|
||||
return size;
|
||||
}
|
||||
|
||||
protected boolean hideLastVerticalLine() {
|
||||
Container viewport = header.getParent();
|
||||
Container viewportParent = (viewport != null) ? viewport.getParent() : null;
|
||||
if( !(viewportParent instanceof JScrollPane) )
|
||||
return false;
|
||||
|
||||
Rectangle cellRect = header.getHeaderRect( header.getColumnModel().getColumnCount() - 1 );
|
||||
|
||||
// using component orientation of scroll pane here because it is also used in FlatTableUI
|
||||
JScrollPane scrollPane = (JScrollPane) viewportParent;
|
||||
return scrollPane.getComponentOrientation().isLeftToRight()
|
||||
? cellRect.x + cellRect.width >= viewport.getWidth()
|
||||
: cellRect.x <= 0;
|
||||
}
|
||||
|
||||
protected boolean hideTrailingVerticalLine() {
|
||||
Container viewport = header.getParent();
|
||||
Container viewportParent = (viewport != null) ? viewport.getParent() : null;
|
||||
if( !(viewportParent instanceof JScrollPane) )
|
||||
return false;
|
||||
|
||||
JScrollPane scrollPane = (JScrollPane) viewportParent;
|
||||
return viewport == scrollPane.getColumnHeader() &&
|
||||
scrollPane.getCorner( ScrollPaneConstants.UPPER_TRAILING_CORNER ) == null;
|
||||
}
|
||||
|
||||
//---- class FlatTableCellHeaderRenderer ----------------------------------
|
||||
|
||||
/**
|
||||
|
||||
@@ -351,7 +351,7 @@ public class FlatTitlePane
|
||||
|
||||
// set icon
|
||||
if( !images.isEmpty() )
|
||||
iconLabel.setIcon( FlatTitlePaneIcon.create( images, iconSize ) );
|
||||
iconLabel.setIcon( new FlatTitlePaneIcon( images, iconSize ) );
|
||||
else {
|
||||
// no icon set on window --> use default icon
|
||||
Icon defaultIcon = UIManager.getIcon( "TitlePane.icon" );
|
||||
@@ -521,13 +521,13 @@ public class FlatTitlePane
|
||||
g.drawLine( 0, debugTitleBarHeight, getWidth(), debugTitleBarHeight );
|
||||
}
|
||||
if( debugHitTestSpots != null ) {
|
||||
g.setColor( Color.blue );
|
||||
g.setColor( Color.red );
|
||||
Point offset = SwingUtilities.convertPoint( this, 0, 0, window );
|
||||
for( Rectangle r : debugHitTestSpots )
|
||||
g.drawRect( r.x - offset.x, r.y - offset.y, r.width - 1, r.height - 1 );
|
||||
}
|
||||
if( debugAppIconBounds != null ) {
|
||||
g.setColor( Color.red );
|
||||
g.setColor( Color.blue);
|
||||
Point offset = SwingUtilities.convertPoint( this, 0, 0, window );
|
||||
Rectangle r = debugAppIconBounds;
|
||||
g.drawRect( r.x - offset.x, r.y - offset.y, r.width - 1, r.height - 1 );
|
||||
@@ -723,14 +723,29 @@ debug*/
|
||||
List<Rectangle> hitTestSpots = new ArrayList<>();
|
||||
Rectangle appIconBounds = null;
|
||||
if( iconLabel.isVisible() ) {
|
||||
// compute real icon size (without insets)
|
||||
// compute real icon size (without insets; 1px wider for easier hitting)
|
||||
Point location = SwingUtilities.convertPoint( iconLabel, 0, 0, window );
|
||||
Insets iconInsets = iconLabel.getInsets();
|
||||
Rectangle iconBounds = new Rectangle(
|
||||
location.x + iconInsets.left,
|
||||
location.y + iconInsets.top,
|
||||
iconLabel.getWidth() - iconInsets.left - iconInsets.right,
|
||||
iconLabel.getHeight() - iconInsets.top - iconInsets.bottom );
|
||||
location.x + iconInsets.left - 1,
|
||||
location.y + iconInsets.top - 1,
|
||||
iconLabel.getWidth() - iconInsets.left - iconInsets.right + 2,
|
||||
iconLabel.getHeight() - iconInsets.top - iconInsets.bottom + 2 );
|
||||
|
||||
// if frame is maximized, increase icon bounds to upper-left corner
|
||||
// of window to allow closing window via double-click in upper-left corner
|
||||
if( window instanceof Frame &&
|
||||
(((Frame)window).getExtendedState() & Frame.MAXIMIZED_BOTH) != 0 )
|
||||
{
|
||||
iconBounds.height += iconBounds.y;
|
||||
iconBounds.y = 0;
|
||||
|
||||
if( window.getComponentOrientation().isLeftToRight() ) {
|
||||
iconBounds.width += iconBounds.x;
|
||||
iconBounds.x = 0;
|
||||
} else
|
||||
iconBounds.width += iconInsets.right;
|
||||
}
|
||||
|
||||
if( hasJBRCustomDecoration() )
|
||||
hitTestSpots.add( iconBounds );
|
||||
|
||||
@@ -20,8 +20,6 @@ import java.awt.Dimension;
|
||||
import java.awt.Image;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.ImageIcon;
|
||||
import com.formdev.flatlaf.util.MultiResolutionImageSupport;
|
||||
import com.formdev.flatlaf.util.ScaledImageIcon;
|
||||
|
||||
@@ -31,40 +29,43 @@ import com.formdev.flatlaf.util.ScaledImageIcon;
|
||||
public class FlatTitlePaneIcon
|
||||
extends ScaledImageIcon
|
||||
{
|
||||
public static Icon create( List<Image> images, Dimension size ) {
|
||||
// collect all images including multi-resolution variants
|
||||
private final List<Image> images;
|
||||
|
||||
/**
|
||||
* @since 1.2
|
||||
*/
|
||||
public FlatTitlePaneIcon( List<Image> images, Dimension size ) {
|
||||
super( null, size.width, size.height );
|
||||
this.images = images;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Image getResolutionVariant( int destImageWidth, int destImageHeight ) {
|
||||
// collect all images including multi-resolution variants for requested size
|
||||
List<Image> allImages = new ArrayList<>();
|
||||
for( Image image : images ) {
|
||||
if( MultiResolutionImageSupport.isMultiResolutionImage( image ) )
|
||||
allImages.addAll( MultiResolutionImageSupport.getResolutionVariants( image ) );
|
||||
allImages.add( MultiResolutionImageSupport.getResolutionVariant( image, destImageWidth, destImageHeight ) );
|
||||
else
|
||||
allImages.add( image );
|
||||
}
|
||||
|
||||
if( allImages.size() == 1 )
|
||||
return allImages.get( 0 );
|
||||
|
||||
// sort images by size
|
||||
allImages.sort( (image1, image2) -> {
|
||||
return image1.getWidth( null ) - image2.getWidth( null );
|
||||
} );
|
||||
|
||||
// create icon
|
||||
return new FlatTitlePaneIcon( allImages, size );
|
||||
}
|
||||
|
||||
private final List<Image> images;
|
||||
|
||||
private FlatTitlePaneIcon( List<Image> images, Dimension size ) {
|
||||
super( new ImageIcon( images.get( 0 ) ), size.width, size.height );
|
||||
this.images = images;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Image getResolutionVariant( int destImageWidth, int destImageHeight ) {
|
||||
for( Image image : images ) {
|
||||
// search for optimal image size
|
||||
for( Image image : allImages ) {
|
||||
if( destImageWidth <= image.getWidth( null ) &&
|
||||
destImageHeight <= image.getHeight( null ) )
|
||||
return image;
|
||||
}
|
||||
|
||||
return images.get( images.size() - 1 );
|
||||
// use largest image
|
||||
return allImages.get( allImages.size() - 1 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,6 +107,8 @@ public class FlatTreeUI
|
||||
protected boolean wideSelection;
|
||||
protected boolean showCellFocusIndicator;
|
||||
|
||||
private Color defaultCellNonSelectionBackground;
|
||||
|
||||
public static ComponentUI createUI( JComponent c ) {
|
||||
return new FlatTreeUI();
|
||||
}
|
||||
@@ -125,6 +127,8 @@ public class FlatTreeUI
|
||||
wideSelection = UIManager.getBoolean( "Tree.wideSelection" );
|
||||
showCellFocusIndicator = UIManager.getBoolean( "Tree.showCellFocusIndicator" );
|
||||
|
||||
defaultCellNonSelectionBackground = UIManager.getColor( "Tree.textBackground" );
|
||||
|
||||
// scale
|
||||
int rowHeight = FlatUIUtils.getUIInt( "Tree.rowHeight", 16 );
|
||||
if( rowHeight > 0 )
|
||||
@@ -144,6 +148,8 @@ public class FlatTreeUI
|
||||
selectionInactiveBackground = null;
|
||||
selectionInactiveForeground = null;
|
||||
selectionBorderColor = null;
|
||||
|
||||
defaultCellNonSelectionBackground = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -306,24 +312,24 @@ public class FlatTreeUI
|
||||
}
|
||||
} else {
|
||||
// non-wide selection
|
||||
int xOffset = 0;
|
||||
int imageOffset = 0;
|
||||
|
||||
if( rendererComponent instanceof JLabel ) {
|
||||
JLabel label = (JLabel) rendererComponent;
|
||||
Icon icon = label.getIcon();
|
||||
imageOffset = (icon != null && label.getText() != null)
|
||||
? icon.getIconWidth() + Math.max( label.getIconTextGap() - 1, 0 )
|
||||
: 0;
|
||||
xOffset = label.getComponentOrientation().isLeftToRight() ? imageOffset : 0;
|
||||
}
|
||||
|
||||
g.fillRect( bounds.x + xOffset, bounds.y, bounds.width - imageOffset, bounds.height );
|
||||
paintCellBackground( g, rendererComponent, bounds );
|
||||
}
|
||||
|
||||
// this is actually not necessary because renderer should always set color
|
||||
// before painting, but doing anyway to avoid any side effect (in bad renderers)
|
||||
g.setColor( oldColor );
|
||||
} else {
|
||||
// paint cell background if DefaultTreeCellRenderer.getBackgroundNonSelectionColor() is set
|
||||
if( rendererComponent instanceof DefaultTreeCellRenderer ) {
|
||||
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) rendererComponent;
|
||||
Color bg = renderer.getBackgroundNonSelectionColor();
|
||||
if( bg != null && !bg.equals( defaultCellNonSelectionBackground ) ) {
|
||||
Color oldColor = g.getColor();
|
||||
g.setColor( bg );
|
||||
paintCellBackground( g, rendererComponent, bounds );
|
||||
g.setColor( oldColor );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// paint renderer
|
||||
@@ -337,6 +343,22 @@ public class FlatTreeUI
|
||||
((DefaultTreeCellRenderer)rendererComponent).setBorderSelectionColor( oldBorderSelectionColor );
|
||||
}
|
||||
|
||||
private void paintCellBackground( Graphics g, Component rendererComponent, Rectangle bounds ) {
|
||||
int xOffset = 0;
|
||||
int imageOffset = 0;
|
||||
|
||||
if( rendererComponent instanceof JLabel ) {
|
||||
JLabel label = (JLabel) rendererComponent;
|
||||
Icon icon = label.getIcon();
|
||||
imageOffset = (icon != null && label.getText() != null)
|
||||
? icon.getIconWidth() + Math.max( label.getIconTextGap() - 1, 0 )
|
||||
: 0;
|
||||
xOffset = label.getComponentOrientation().isLeftToRight() ? imageOffset : 0;
|
||||
}
|
||||
|
||||
g.fillRect( bounds.x + xOffset, bounds.y, bounds.width - imageOffset, bounds.height );
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether dropping on a row.
|
||||
* See DefaultTreeCellRenderer.getTreeCellRendererComponent().
|
||||
|
||||
@@ -308,18 +308,11 @@ class FlatWindowsNativeWindowBorder
|
||||
this.window = window;
|
||||
|
||||
hwnd = installImpl( window );
|
||||
if( hwnd == 0 )
|
||||
return;
|
||||
|
||||
// remove the OS window title bar
|
||||
if( window instanceof JFrame && ((JFrame)window).getExtendedState() != 0 ) {
|
||||
// In case that the frame should be maximized or minimized immediately
|
||||
// when showing, then it is necessary to defer ::SetWindowPos() invocation.
|
||||
// Otherwise the frame will not be maximized or minimized.
|
||||
// This occurs only if frame.pack() was no invoked.
|
||||
EventQueue.invokeLater( () -> {
|
||||
updateFrame( hwnd );
|
||||
});
|
||||
} else
|
||||
updateFrame( hwnd );
|
||||
updateFrame( hwnd, (window instanceof JFrame) ? ((JFrame)window).getExtendedState() : 0 );
|
||||
}
|
||||
|
||||
void uninstall() {
|
||||
@@ -331,7 +324,7 @@ class FlatWindowsNativeWindowBorder
|
||||
|
||||
private native long installImpl( Window window );
|
||||
private native void uninstallImpl( long hwnd );
|
||||
private native void updateFrame( long hwnd );
|
||||
private native void updateFrame( long hwnd, int state );
|
||||
private native void showWindow( long hwnd, int cmd );
|
||||
|
||||
// invoked from native code
|
||||
|
||||
@@ -256,11 +256,6 @@ public class Graphics2DProxy
|
||||
delegate.dispose();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finalize() {
|
||||
delegate.finalize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return delegate.toString();
|
||||
|
||||
@@ -20,6 +20,7 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.nio.file.FileAlreadyExistsException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
@@ -144,26 +145,46 @@ public class NativeLibrary
|
||||
String suffix = (dot >= 0) ? name.substring( dot ) : "";
|
||||
|
||||
Path tempDir = getTempDir();
|
||||
if( tempDir != null ) {
|
||||
deleteTemporaryFiles( tempDir );
|
||||
|
||||
return Files.createTempFile( tempDir, prefix, suffix );
|
||||
} else
|
||||
return Files.createTempFile( prefix, suffix );
|
||||
// Note:
|
||||
// Not using Files.createTempFile() here because it uses random number generator SecureRandom,
|
||||
// which may take 5-10 seconds to initialize under particular conditions.
|
||||
|
||||
// Use current time in nanoseconds instead of a random number.
|
||||
// To avoid (theoretical) collisions, append a counter.
|
||||
long nanoTime = System.nanoTime();
|
||||
for( int i = 0;; i++ ) {
|
||||
String s = prefix + Long.toUnsignedString( nanoTime ) + i + suffix;
|
||||
try {
|
||||
return Files.createFile( tempDir.resolve( s ) );
|
||||
} catch( FileAlreadyExistsException ex ) {
|
||||
// ignore --> increment counter and try again
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static Path getTempDir() throws IOException {
|
||||
// get standard temporary directory
|
||||
String tmpdir = System.getProperty( "java.io.tmpdir" );
|
||||
|
||||
if( SystemInfo.isWindows ) {
|
||||
// On Windows, where File.delete() and File.deleteOnExit() does not work
|
||||
// for loaded native libraries, they will be deleted on next application startup.
|
||||
// The default temporary directory may contain hundreds or thousands of files.
|
||||
// To make searching for "marked for deletion" files as fast as possible,
|
||||
// use a sub directory that contains only our temporary native libraries.
|
||||
Path tempDir = Paths.get( System.getProperty( "java.io.tmpdir" ) + "/flatlaf.temp" );
|
||||
Files.createDirectories( tempDir );
|
||||
return tempDir;
|
||||
} else
|
||||
return null; // use standard temporary directory
|
||||
tmpdir += "\\flatlaf.temp";
|
||||
}
|
||||
|
||||
// create temporary directory
|
||||
Path tempDir = Paths.get( tmpdir );
|
||||
Files.createDirectories( tempDir );
|
||||
|
||||
// delete no longer needed temporary files (from already exited applications)
|
||||
if( SystemInfo.isWindows )
|
||||
deleteTemporaryFiles( tempDir );
|
||||
|
||||
return tempDir;
|
||||
}
|
||||
|
||||
private static void deleteTemporaryFiles( Path tempDir ) {
|
||||
|
||||
@@ -77,7 +77,7 @@ debug*/
|
||||
double scaleFactor = systemScaleFactor * userScaleFactor;
|
||||
|
||||
// paint input image icon if not necessary to scale
|
||||
if( scaleFactor == 1 && iconWidth == imageIcon.getIconWidth() && iconHeight == imageIcon.getIconHeight() ) {
|
||||
if( scaleFactor == 1 && imageIcon != null && iconWidth == imageIcon.getIconWidth() && iconHeight == imageIcon.getIconHeight() ) {
|
||||
imageIcon.paintIcon( c, g, x, y );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ import com.formdev.flatlaf.FlatSystemProperties;
|
||||
* <p>
|
||||
* Two scaling modes are supported by FlatLaf for HiDPI displays:
|
||||
*
|
||||
* <h3>1) system scaling mode</h3>
|
||||
* <h2>1) system scaling mode</h2>
|
||||
*
|
||||
* This mode is supported since Java 9 on all platforms and in some Java 8 VMs
|
||||
* (e.g. Apple and JetBrains). The JRE determines the scale factor per-display and
|
||||
@@ -54,7 +54,7 @@ import com.formdev.flatlaf.FlatSystemProperties;
|
||||
* The scale factor may be different for each connected display.
|
||||
* The scale factor may change for a window when moving the window from one display to another one.
|
||||
*
|
||||
* <h3>2) user scaling mode</h3>
|
||||
* <h2>2) user scaling mode</h2>
|
||||
*
|
||||
* This mode is mainly for Java 8 compatibility, but is also used on Linux
|
||||
* or if the default font is changed.
|
||||
|
||||
@@ -166,7 +166,7 @@ Desktop.background = #3E434C
|
||||
|
||||
#---- DesktopIcon ----
|
||||
|
||||
DesktopIcon.background = lighten($Desktop.background,10%)
|
||||
DesktopIcon.background = lighten($Desktop.background,10%,derived)
|
||||
|
||||
|
||||
#---- InternalFrame ----
|
||||
|
||||
@@ -642,7 +642,8 @@ Table.dropLineShortColor = @dropLineShortColor
|
||||
#---- TableHeader ----
|
||||
|
||||
TableHeader.height = 25
|
||||
TableHeader.cellBorder = 2,3,2,3
|
||||
TableHeader.cellBorder = com.formdev.flatlaf.ui.FlatTableHeaderBorder
|
||||
TableHeader.cellMargins = 2,3,2,3
|
||||
TableHeader.focusCellBackground = $TableHeader.background
|
||||
TableHeader.background = @textComponentBackground
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@ Desktop.background = #E6EBF0
|
||||
|
||||
#---- DesktopIcon ----
|
||||
|
||||
DesktopIcon.background = darken($Desktop.background,10%)
|
||||
DesktopIcon.background = darken($Desktop.background,10%,derived)
|
||||
|
||||
|
||||
#---- HelpButton ----
|
||||
|
||||
@@ -133,8 +133,8 @@ ToggleButton.endBackground = $ToggleButton.background
|
||||
|
||||
[Dark_purple]Slider.focusedColor = fade($Component.focusColor,70%,derived)
|
||||
|
||||
[Dracula]ProgressBar.selectionBackground = #fff
|
||||
[Dracula]ProgressBar.selectionForeground = #fff
|
||||
[Dracula---Zihan_Ma]ProgressBar.selectionBackground = #fff
|
||||
[Dracula---Zihan_Ma]ProgressBar.selectionForeground = #fff
|
||||
|
||||
[Gradianto_Dark_Fuchsia]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
|
||||
[Gradianto_Dark_Fuchsia]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
|
||||
@@ -181,7 +181,7 @@ ToggleButton.endBackground = $ToggleButton.background
|
||||
[One_Dark]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
|
||||
[One_Dark]Slider.focusedColor = fade(#568af2,40%)
|
||||
|
||||
[Solarized_Dark]Slider.focusedColor = fade($Component.focusColor,80%,derived)
|
||||
[Solarized_Dark---4lex4]Slider.focusedColor = fade($Component.focusColor,80%,derived)
|
||||
|
||||
[vuesion-theme]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
|
||||
[vuesion-theme]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
|
||||
@@ -198,6 +198,9 @@ ToggleButton.endBackground = $ToggleButton.background
|
||||
[dark][author-Mallowigi]MenuItem.checkBackground = @ijMenuCheckBackgroundL20
|
||||
[dark][author-Mallowigi]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL20
|
||||
|
||||
[Dracula---Mallowigi]ProgressBar.selectionBackground = #fff
|
||||
[Dracula---Mallowigi]ProgressBar.selectionForeground = #fff
|
||||
|
||||
[Dracula_Contrast]ProgressBar.selectionBackground = #fff
|
||||
[Dracula_Contrast]ProgressBar.selectionForeground = #fff
|
||||
|
||||
@@ -237,14 +240,14 @@ ToggleButton.endBackground = $ToggleButton.background
|
||||
[Night_Owl_Contrast]ProgressBar.selectionBackground = #ddd
|
||||
[Night_Owl_Contrast]ProgressBar.selectionForeground = #ddd
|
||||
|
||||
[Solarized_Dark]ProgressBar.selectionBackground = #ccc
|
||||
[Solarized_Dark]ProgressBar.selectionForeground = #ccc
|
||||
[Solarized_Dark---Mallowigi]ProgressBar.selectionBackground = #ccc
|
||||
[Solarized_Dark---Mallowigi]ProgressBar.selectionForeground = #ccc
|
||||
|
||||
[Material_Solarized_Dark_Contrast]ProgressBar.selectionBackground = #ccc
|
||||
[Material_Solarized_Dark_Contrast]ProgressBar.selectionForeground = #ccc
|
||||
[Solarized_Dark_Contrast]ProgressBar.selectionBackground = #ccc
|
||||
[Solarized_Dark_Contrast]ProgressBar.selectionForeground = #ccc
|
||||
|
||||
[Solarized_Light]ProgressBar.selectionBackground = #222
|
||||
[Solarized_Light]ProgressBar.selectionForeground = #fff
|
||||
[Solarized_Light---Mallowigi]ProgressBar.selectionBackground = #222
|
||||
[Solarized_Light---Mallowigi]ProgressBar.selectionForeground = #fff
|
||||
|
||||
[Material_Solarized_Light_Contrast]ProgressBar.selectionBackground = #222
|
||||
[Material_Solarized_Light_Contrast]ProgressBar.selectionForeground = #fff
|
||||
[Solarized_Light_Contrast]ProgressBar.selectionBackground = #222
|
||||
[Solarized_Light_Contrast]ProgressBar.selectionForeground = #fff
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -18,18 +18,11 @@ plugins {
|
||||
`java-library`
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
// for using MigLayout snapshot
|
||||
url = uri( "https://oss.sonatype.org/content/repositories/snapshots/" )
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation( project( ":flatlaf-core" ) )
|
||||
implementation( project( ":flatlaf-extras" ) )
|
||||
implementation( project( ":flatlaf-intellij-themes" ) )
|
||||
implementation( "com.miglayout:miglayout-swing:5.3-SNAPSHOT" )
|
||||
implementation( "com.miglayout:miglayout-swing:5.3" )
|
||||
implementation( "com.jgoodies:jgoodies-forms:1.9.0" )
|
||||
// implementation( project( ":flatlaf-natives-jna" ) )
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ public class DemoPrefs
|
||||
state = Preferences.userRoot().node( rootPath );
|
||||
}
|
||||
|
||||
public static void initLaf( String[] args ) {
|
||||
public static void setupLaf( String[] args ) {
|
||||
// set look and feel
|
||||
try {
|
||||
if( args.length > 0 )
|
||||
@@ -60,11 +60,11 @@ public class DemoPrefs
|
||||
if( IntelliJTheme.ThemeLaf.class.getName().equals( lafClassName ) ) {
|
||||
String theme = state.get( KEY_LAF_THEME, "" );
|
||||
if( theme.startsWith( RESOURCE_PREFIX ) )
|
||||
IntelliJTheme.install( IJThemesPanel.class.getResourceAsStream( IJThemesPanel.THEMES_PACKAGE + theme.substring( RESOURCE_PREFIX.length() ) ) );
|
||||
IntelliJTheme.setup( IJThemesPanel.class.getResourceAsStream( IJThemesPanel.THEMES_PACKAGE + theme.substring( RESOURCE_PREFIX.length() ) ) );
|
||||
else if( theme.startsWith( FILE_PREFIX ) )
|
||||
FlatLaf.install( IntelliJTheme.createLaf( new FileInputStream( theme.substring( FILE_PREFIX.length() ) ) ) );
|
||||
FlatLaf.setup( IntelliJTheme.createLaf( new FileInputStream( theme.substring( FILE_PREFIX.length() ) ) ) );
|
||||
else
|
||||
FlatLightLaf.install();
|
||||
FlatLightLaf.setup();
|
||||
|
||||
if( !theme.isEmpty() )
|
||||
UIManager.getLookAndFeelDefaults().put( THEME_UI_KEY, theme );
|
||||
@@ -73,9 +73,9 @@ public class DemoPrefs
|
||||
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 ) );
|
||||
FlatLaf.setup( new FlatPropertiesLaf( themeName, themeFile ) );
|
||||
} else
|
||||
FlatLightLaf.install();
|
||||
FlatLightLaf.setup();
|
||||
|
||||
if( !theme.isEmpty() )
|
||||
UIManager.getLookAndFeelDefaults().put( THEME_UI_KEY, theme );
|
||||
@@ -86,7 +86,7 @@ public class DemoPrefs
|
||||
ex.printStackTrace();
|
||||
|
||||
// fallback
|
||||
FlatLightLaf.install();
|
||||
FlatLightLaf.setup();
|
||||
}
|
||||
|
||||
// remember active look and feel
|
||||
|
||||
@@ -48,7 +48,7 @@ public class FlatLafDemo
|
||||
FlatLaf.registerCustomDefaultsSource( "com.formdev.flatlaf.demo" );
|
||||
|
||||
// set look and feel
|
||||
DemoPrefs.initLaf( args );
|
||||
DemoPrefs.setupLaf( args );
|
||||
|
||||
// install inspectors
|
||||
FlatInspector.install( "ctrl shift alt X" );
|
||||
|
||||
@@ -18,8 +18,13 @@ package com.formdev.flatlaf.demo.extras;
|
||||
|
||||
import javax.swing.*;
|
||||
import com.formdev.flatlaf.extras.*;
|
||||
import com.formdev.flatlaf.extras.FlatSVGIcon.ColorFilter;
|
||||
import com.formdev.flatlaf.extras.components.FlatTriStateCheckBox;
|
||||
import com.formdev.flatlaf.util.HSLColor;
|
||||
import net.miginfocom.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.HierarchyEvent;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* @author Karl Tauber
|
||||
@@ -27,6 +32,9 @@ import net.miginfocom.swing.*;
|
||||
public class ExtrasPanel
|
||||
extends JPanel
|
||||
{
|
||||
private Timer rainbowIconTimer;
|
||||
private int rainbowCounter = 0;
|
||||
|
||||
public ExtrasPanel() {
|
||||
initComponents();
|
||||
|
||||
@@ -50,6 +58,34 @@ public class ExtrasPanel
|
||||
addSVGIcon( "errorDialog.svg" );
|
||||
addSVGIcon( "informationDialog.svg" );
|
||||
addSVGIcon( "warningDialog.svg" );
|
||||
|
||||
initRainbowIcon();
|
||||
}
|
||||
|
||||
private void initRainbowIcon() {
|
||||
FlatSVGIcon icon = new FlatSVGIcon( "com/formdev/flatlaf/demo/extras/svg/informationDialog.svg" );
|
||||
icon.setColorFilter( new ColorFilter( color -> {
|
||||
rainbowCounter += 1;
|
||||
rainbowCounter %= 255;
|
||||
return Color.getHSBColor( rainbowCounter / 255f, 1, 1 );
|
||||
} ) );
|
||||
rainbowIcon.setIcon( icon );
|
||||
|
||||
rainbowIconTimer = new Timer( 30, e -> {
|
||||
rainbowIcon.repaint();
|
||||
} );
|
||||
|
||||
// start rainbow timer only if panel is shown ("Extras" tab is active)
|
||||
addHierarchyListener( e -> {
|
||||
if( e.getID() == HierarchyEvent.HIERARCHY_CHANGED &&
|
||||
(e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0 )
|
||||
{
|
||||
if( isShowing() )
|
||||
rainbowIconTimer.start();
|
||||
else
|
||||
rainbowIconTimer.stop();
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
private void addSVGIcon( String name ) {
|
||||
@@ -60,6 +96,36 @@ public class ExtrasPanel
|
||||
triStateLabel1.setText( triStateCheckBox1.getState().toString() );
|
||||
}
|
||||
|
||||
private void redChanged() {
|
||||
brighterToggleButton.setSelected( false );
|
||||
|
||||
Function<Color, Color> mapper = null;
|
||||
if( redToggleButton.isSelected() ) {
|
||||
float[] redHSL = HSLColor.fromRGB( Color.red );
|
||||
mapper = color -> {
|
||||
float[] hsl = HSLColor.fromRGB( color );
|
||||
return HSLColor.toRGB( redHSL[0], 70, hsl[2] );
|
||||
};
|
||||
}
|
||||
FlatSVGIcon.ColorFilter.getInstance().setMapper( mapper );
|
||||
|
||||
// repaint whole application window because global color filter also affects
|
||||
// icons in menubar, toolbar, etc.
|
||||
SwingUtilities.windowForComponent( this ).repaint();
|
||||
}
|
||||
|
||||
private void brighterChanged() {
|
||||
redToggleButton.setSelected( false );
|
||||
|
||||
FlatSVGIcon.ColorFilter.getInstance().setMapper( brighterToggleButton.isSelected()
|
||||
? color -> color.brighter().brighter()
|
||||
: null );
|
||||
|
||||
// repaint whole application window because global color filter also affects
|
||||
// icons in menubar, toolbar, etc.
|
||||
SwingUtilities.windowForComponent( this ).repaint();
|
||||
}
|
||||
|
||||
private void initComponents() {
|
||||
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
||||
label4 = new JLabel();
|
||||
@@ -69,6 +135,13 @@ public class ExtrasPanel
|
||||
label2 = new JLabel();
|
||||
svgIconsPanel = new JPanel();
|
||||
label3 = new JLabel();
|
||||
separator1 = new JSeparator();
|
||||
label5 = new JLabel();
|
||||
label6 = new JLabel();
|
||||
rainbowIcon = new JLabel();
|
||||
label7 = new JLabel();
|
||||
redToggleButton = new JToggleButton();
|
||||
brighterToggleButton = new JToggleButton();
|
||||
|
||||
//======== this ========
|
||||
setLayout(new MigLayout(
|
||||
@@ -81,6 +154,10 @@ public class ExtrasPanel
|
||||
"[]para" +
|
||||
"[]" +
|
||||
"[]" +
|
||||
"[]" +
|
||||
"[]" +
|
||||
"[]" +
|
||||
"[]" +
|
||||
"[]"));
|
||||
|
||||
//---- label4 ----
|
||||
@@ -119,6 +196,30 @@ public class ExtrasPanel
|
||||
//---- label3 ----
|
||||
label3.setText("The icons may change colors when switching to another theme.");
|
||||
add(label3, "cell 1 3 2 1");
|
||||
add(separator1, "cell 1 4 2 1,growx");
|
||||
|
||||
//---- label5 ----
|
||||
label5.setText("Color filters can be also applied to icons. Globally or for each instance.");
|
||||
add(label5, "cell 1 5 2 1");
|
||||
|
||||
//---- label6 ----
|
||||
label6.setText("Rainbow color filter");
|
||||
add(label6, "cell 1 6 2 1");
|
||||
add(rainbowIcon, "cell 1 6 2 1");
|
||||
|
||||
//---- label7 ----
|
||||
label7.setText("Global icon color filter");
|
||||
add(label7, "cell 1 7 2 1");
|
||||
|
||||
//---- redToggleButton ----
|
||||
redToggleButton.setText("Toggle RED");
|
||||
redToggleButton.addActionListener(e -> redChanged());
|
||||
add(redToggleButton, "cell 1 7 2 1");
|
||||
|
||||
//---- brighterToggleButton ----
|
||||
brighterToggleButton.setText("Toggle brighter");
|
||||
brighterToggleButton.addActionListener(e -> brighterChanged());
|
||||
add(brighterToggleButton, "cell 1 7 2 1");
|
||||
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
||||
}
|
||||
|
||||
@@ -130,5 +231,12 @@ public class ExtrasPanel
|
||||
private JLabel label2;
|
||||
private JPanel svgIconsPanel;
|
||||
private JLabel label3;
|
||||
private JSeparator separator1;
|
||||
private JLabel label5;
|
||||
private JLabel label6;
|
||||
private JLabel rainbowIcon;
|
||||
private JLabel label7;
|
||||
private JToggleButton redToggleButton;
|
||||
private JToggleButton brighterToggleButton;
|
||||
// JFormDesigner - End of variables declaration //GEN-END:variables
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
|
||||
JFDML JFormDesigner: "7.0.3.1.342" Java: "16" encoding: "UTF-8"
|
||||
|
||||
new FormModel {
|
||||
contentType: "form/swing"
|
||||
@@ -6,7 +6,7 @@ new FormModel {
|
||||
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
|
||||
"$layoutConstraints": "insets dialog,hidemode 3"
|
||||
"$columnConstraints": "[][][left]"
|
||||
"$rowConstraints": "[]para[][][]"
|
||||
"$rowConstraints": "[]para[][][][][][][]"
|
||||
} ) {
|
||||
name: "this"
|
||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||
@@ -56,6 +56,48 @@ new FormModel {
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 1 3 2 1"
|
||||
} )
|
||||
add( new FormComponent( "javax.swing.JSeparator" ) {
|
||||
name: "separator1"
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 1 4 2 1,growx"
|
||||
} )
|
||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||
name: "label5"
|
||||
"text": "Color filters can be also applied to icons. Globally or for each instance."
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 1 5 2 1"
|
||||
} )
|
||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||
name: "label6"
|
||||
"text": "Rainbow color filter"
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 1 6 2 1"
|
||||
} )
|
||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||
name: "rainbowIcon"
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 1 6 2 1"
|
||||
} )
|
||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||
name: "label7"
|
||||
"text": "Global icon color filter"
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 1 7 2 1"
|
||||
} )
|
||||
add( new FormComponent( "javax.swing.JToggleButton" ) {
|
||||
name: "redToggleButton"
|
||||
"text": "Toggle RED"
|
||||
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "redChanged", false ) )
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 1 7 2 1"
|
||||
} )
|
||||
add( new FormComponent( "javax.swing.JToggleButton" ) {
|
||||
name: "brighterToggleButton"
|
||||
"text": "Toggle brighter"
|
||||
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "brighterChanged", false ) )
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 1 7 2 1"
|
||||
} )
|
||||
}, new FormLayoutConstraints( null ) {
|
||||
"location": new java.awt.Point( 0, 0 )
|
||||
"size": new java.awt.Dimension( 500, 300 )
|
||||
|
||||
@@ -160,14 +160,22 @@ public class IJThemesClassGenerator
|
||||
"{\n" +
|
||||
" public static final String NAME = \"${themeName}\";\n" +
|
||||
"\n" +
|
||||
" public static boolean install() {\n" +
|
||||
" public static boolean setup() {\n" +
|
||||
" try {\n" +
|
||||
" return install( new ${themeClass}() );\n" +
|
||||
" return setup( new ${themeClass}() );\n" +
|
||||
" } catch( RuntimeException ex ) {\n" +
|
||||
" return false;\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" /**\n" +
|
||||
" * @deprecated use {@link #setup()} instead; this method will be removed in a future version\n" +
|
||||
" */\n" +
|
||||
" @Deprecated\n" +
|
||||
" public static boolean install() {\n" +
|
||||
" return setup();\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" public static void installLafInfo() {\n" +
|
||||
" installLafInfo( NAME, ${themeClass}.class );\n" +
|
||||
" }\n" +
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright 2021 FormDev Software GmbH
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.formdev.flatlaf.demo.intellijthemes;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import com.formdev.flatlaf.json.Json;
|
||||
import com.formdev.flatlaf.json.ParseException;
|
||||
|
||||
/**
|
||||
* This tool checks whether there are duplicate name fields in all theme .json files.
|
||||
*
|
||||
* This is important for following file, where the name is used for theme specific UI defaults:
|
||||
* flatlaf-core/src/main/resources/com/formdev/flatlaf/IntelliJTheme$ThemeLaf.properties
|
||||
*
|
||||
* @author Karl Tauber
|
||||
*/
|
||||
public class IJThemesDuplicateNameChecker
|
||||
{
|
||||
public static void main( String[] args ) {
|
||||
IJThemesManager themesManager = new IJThemesManager();
|
||||
themesManager.loadBundledThemes();
|
||||
|
||||
HashSet<String> names = new HashSet<>();
|
||||
for( IJThemeInfo ti : themesManager.bundledThemes ) {
|
||||
if( ti.sourceCodeUrl == null || ti.sourceCodePath == null )
|
||||
continue;
|
||||
|
||||
String jsonPath = "../flatlaf-intellij-themes/src/main/resources" + IJThemesPanel.THEMES_PACKAGE + ti.resourceName;
|
||||
String name;
|
||||
try {
|
||||
name = readNameFromJson( jsonPath );
|
||||
} catch( IOException ex ) {
|
||||
System.err.println( "Failed to read '" + jsonPath + "'" );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( names.contains( name ) )
|
||||
System.out.println( "Duplicate name '" + name + "'" );
|
||||
names.add( name );
|
||||
}
|
||||
}
|
||||
|
||||
private static String readNameFromJson( String jsonPath ) throws IOException {
|
||||
try( Reader reader = new InputStreamReader( new FileInputStream( jsonPath ), StandardCharsets.UTF_8 ) ) {
|
||||
@SuppressWarnings( "unchecked" )
|
||||
Map<String, Object> json = (Map<String, Object>) Json.parse( reader );
|
||||
return (String) json.get( "name" );
|
||||
} catch( ParseException ex ) {
|
||||
throw new IOException( ex.getMessage(), ex );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -267,9 +267,9 @@ public class IJThemesPanel
|
||||
|
||||
try {
|
||||
if( themeInfo.themeFile.getName().endsWith( ".properties" ) ) {
|
||||
FlatLaf.install( new FlatPropertiesLaf( themeInfo.name, themeInfo.themeFile ) );
|
||||
FlatLaf.setup( new FlatPropertiesLaf( themeInfo.name, themeInfo.themeFile ) );
|
||||
} else
|
||||
FlatLaf.install( IntelliJTheme.createLaf( new FileInputStream( themeInfo.themeFile ) ) );
|
||||
FlatLaf.setup( IntelliJTheme.createLaf( new FileInputStream( themeInfo.themeFile ) ) );
|
||||
|
||||
DemoPrefs.getState().put( DemoPrefs.KEY_LAF_THEME, DemoPrefs.FILE_PREFIX + themeInfo.themeFile );
|
||||
} catch( Exception ex ) {
|
||||
@@ -279,7 +279,7 @@ public class IJThemesPanel
|
||||
} else {
|
||||
FlatAnimatedLafChange.showSnapshot();
|
||||
|
||||
IntelliJTheme.install( getClass().getResourceAsStream( THEMES_PACKAGE + themeInfo.resourceName ) );
|
||||
IntelliJTheme.setup( getClass().getResourceAsStream( THEMES_PACKAGE + themeInfo.resourceName ) );
|
||||
DemoPrefs.getState().put( DemoPrefs.KEY_LAF_THEME, DemoPrefs.RESOURCE_PREFIX + themeInfo.resourceName );
|
||||
}
|
||||
|
||||
|
||||
@@ -302,6 +302,22 @@
|
||||
"sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite",
|
||||
"sourceCodePath": "blob/master/src/main/resources/themes/GitHub Contrast.theme.json"
|
||||
},
|
||||
"material-theme-ui-lite/GitHub Dark.theme.json": {
|
||||
"name": "Material Theme UI Lite / GitHub Dark",
|
||||
"dark": true,
|
||||
"license": "MIT",
|
||||
"licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt",
|
||||
"sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite",
|
||||
"sourceCodePath": "blob/master/src/main/resources/themes/GitHub Dark.theme.json"
|
||||
},
|
||||
"material-theme-ui-lite/GitHub Dark Contrast.theme.json": {
|
||||
"name": "Material Theme UI Lite / GitHub Dark Contrast",
|
||||
"dark": true,
|
||||
"license": "MIT",
|
||||
"licenseFile": "material-theme-ui-lite/Material Theme UI Lite.LICENSE.txt",
|
||||
"sourceCodeUrl": "https://github.com/mallowigi/material-theme-ui-lite",
|
||||
"sourceCodePath": "blob/master/src/main/resources/themes/GitHub Dark Contrast.theme.json"
|
||||
},
|
||||
"material-theme-ui-lite/Light Owl.theme.json": {
|
||||
"name": "Material Theme UI Lite / Light Owl",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -34,18 +34,6 @@ java {
|
||||
withJavadocJar()
|
||||
}
|
||||
|
||||
tasks {
|
||||
javadoc {
|
||||
options {
|
||||
this as StandardJavadocDocletOptions
|
||||
use( true )
|
||||
tags = listOf( "uiDefault", "clientProperty" )
|
||||
addStringOption( "Xdoclint:all,-missing", "-Xdoclint:all,-missing" )
|
||||
}
|
||||
isFailOnError = false
|
||||
}
|
||||
}
|
||||
|
||||
flatlafPublish {
|
||||
artifactId = "flatlaf-extras"
|
||||
name = "FlatLaf Extras"
|
||||
|
||||
@@ -46,6 +46,7 @@ import java.beans.PropertyChangeSupport;
|
||||
import java.lang.reflect.Field;
|
||||
import javax.swing.AbstractButton;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLayeredPane;
|
||||
import javax.swing.JMenuBar;
|
||||
import javax.swing.JRootPane;
|
||||
import javax.swing.JToolBar;
|
||||
@@ -55,6 +56,7 @@ import javax.swing.Popup;
|
||||
import javax.swing.PopupFactory;
|
||||
import javax.swing.RootPaneContainer;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.border.LineBorder;
|
||||
@@ -87,9 +89,13 @@ import com.formdev.flatlaf.util.UIScale;
|
||||
*/
|
||||
public class FlatInspector
|
||||
{
|
||||
private static final Integer HIGHLIGHT_LAYER = 401;
|
||||
private static final Integer HIGHLIGHT_LAYER = JLayeredPane.POPUP_LAYER - 1;
|
||||
|
||||
private static final int KEY_MODIFIERS_MASK = InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_DOWN_MASK | InputEvent.META_DOWN_MASK;
|
||||
private static final int KEY_MODIFIERS_MASK =
|
||||
InputEvent.CTRL_DOWN_MASK |
|
||||
InputEvent.SHIFT_DOWN_MASK |
|
||||
InputEvent.ALT_DOWN_MASK |
|
||||
InputEvent.META_DOWN_MASK;
|
||||
|
||||
private final JRootPane rootPane;
|
||||
private final MouseMotionListener mouseMotionListener;
|
||||
@@ -103,7 +109,8 @@ public class FlatInspector
|
||||
private int lastX;
|
||||
private int lastY;
|
||||
private int inspectParentLevel;
|
||||
private boolean wasCtrlOrShiftKeyPressed;
|
||||
private boolean wasModifierKeyPressed;
|
||||
private boolean showClassHierarchy;
|
||||
|
||||
private JComponent highlightFigure;
|
||||
private Popup popup;
|
||||
@@ -160,9 +167,9 @@ public class FlatInspector
|
||||
if( id == KeyEvent.KEY_PRESSED ) {
|
||||
// this avoids that the inspection level is changed when UI inspector
|
||||
// is enabled with keyboard shortcut (e.g. Ctrl+Shift+Alt+X)
|
||||
if( keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_SHIFT )
|
||||
wasCtrlOrShiftKeyPressed = true;
|
||||
} else if( id == KeyEvent.KEY_RELEASED && wasCtrlOrShiftKeyPressed ) {
|
||||
if( keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_SHIFT || keyCode == KeyEvent.VK_ALT )
|
||||
wasModifierKeyPressed = true;
|
||||
} else if( id == KeyEvent.KEY_RELEASED && wasModifierKeyPressed ) {
|
||||
if( keyCode == KeyEvent.VK_CONTROL ) {
|
||||
inspectParentLevel++;
|
||||
int parentLevel = inspect( lastX, lastY );
|
||||
@@ -179,6 +186,9 @@ public class FlatInspector
|
||||
inspectParentLevel = Math.max( parentLevel - 1, 0 );
|
||||
inspect( lastX, lastY );
|
||||
}
|
||||
} else if( keyCode == KeyEvent.VK_ALT && lastComponent != null) {
|
||||
showClassHierarchy = !showClassHierarchy;
|
||||
showToolTip( lastComponent, lastX, lastY, inspectParentLevel );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -401,7 +411,7 @@ public class FlatInspector
|
||||
return;
|
||||
|
||||
JToolTip tip = new JToolTip();
|
||||
tip.setTipText( buildToolTipText( c, parentLevel ) );
|
||||
tip.setTipText( buildToolTipText( c, parentLevel, showClassHierarchy ) );
|
||||
tip.putClientProperty( FlatClientProperties.POPUP_FORCE_HEAVY_WEIGHT, true );
|
||||
|
||||
Point pt = new Point( x, y );
|
||||
@@ -427,16 +437,13 @@ public class FlatInspector
|
||||
popup.show();
|
||||
}
|
||||
|
||||
private static String buildToolTipText( Component c, int parentLevel ) {
|
||||
private static String buildToolTipText( Component c, int parentLevel, boolean classHierarchy ) {
|
||||
StringBuilder buf = new StringBuilder( 1500 );
|
||||
buf.append( "<html><style>" );
|
||||
buf.append( "td { padding: 0 10 0 0; }" );
|
||||
buf.append( "</style><table>" );
|
||||
|
||||
String name = c.getClass().getName();
|
||||
name = name.substring( name.lastIndexOf( '.' ) + 1 );
|
||||
Package pkg = c.getClass().getPackage();
|
||||
appendRow( buf, "Class", name + " (" + (pkg != null ? pkg.getName() : "-") + ")" );
|
||||
appendRow( buf, "Class", toString( c.getClass(), classHierarchy ) );
|
||||
appendRow( buf, "Size", c.getWidth() + ", " + c.getHeight() + " @ " + c.getX() + ", " + c.getY() );
|
||||
|
||||
if( c instanceof Container )
|
||||
@@ -463,7 +470,7 @@ public class FlatInspector
|
||||
appendRow( buf, "Max size", maxSize.width + ", " + maxSize.height );
|
||||
|
||||
if( c instanceof JComponent )
|
||||
appendRow( buf, "Border", toString( ((JComponent)c).getBorder() ) );
|
||||
appendRow( buf, "Border", toString( ((JComponent)c).getBorder(), classHierarchy ) );
|
||||
|
||||
appendRow( buf, "Background", toString( c.getBackground() ) );
|
||||
appendRow( buf, "Foreground", toString( c.getForeground() ) );
|
||||
@@ -474,7 +481,7 @@ public class FlatInspector
|
||||
Field f = JComponent.class.getDeclaredField( "ui" );
|
||||
f.setAccessible( true );
|
||||
Object ui = f.get( c );
|
||||
appendRow( buf, "UI", (ui != null ? ui.getClass().getName() : "null") );
|
||||
appendRow( buf, "UI", (ui != null ? toString( ui.getClass(), classHierarchy ) : "null") );
|
||||
} catch( Exception ex ) {
|
||||
// ignore
|
||||
}
|
||||
@@ -483,7 +490,7 @@ public class FlatInspector
|
||||
if( c instanceof Container ) {
|
||||
LayoutManager layout = ((Container)c).getLayout();
|
||||
if( layout != null )
|
||||
appendRow( buf, "Layout", layout.getClass().getName() );
|
||||
appendRow( buf, "Layout", toString( layout.getClass(), classHierarchy ) );
|
||||
}
|
||||
|
||||
appendRow( buf, "Enabled", String.valueOf( c.isEnabled() ) );
|
||||
@@ -493,16 +500,23 @@ public class FlatInspector
|
||||
appendRow( buf, "ContentAreaFilled", String.valueOf( ((AbstractButton)c).isContentAreaFilled() ) );
|
||||
appendRow( buf, "Focusable", String.valueOf( c.isFocusable() ) );
|
||||
appendRow( buf, "Left-to-right", String.valueOf( c.getComponentOrientation().isLeftToRight() ) );
|
||||
appendRow( buf, "Parent", (c.getParent() != null ? c.getParent().getClass().getName() : "null") );
|
||||
appendRow( buf, "Parent", (c.getParent() != null ? toString( c.getParent().getClass(), classHierarchy ) : "null") );
|
||||
|
||||
// append parent level
|
||||
buf.append( "<tr><td colspan=\"2\">" );
|
||||
if( parentLevel > 0 )
|
||||
buf.append( "<br>Parent level: " + parentLevel );
|
||||
|
||||
if( parentLevel > 0 )
|
||||
buf.append( "<br>(press Ctrl/Shift to increase/decrease level)" );
|
||||
else
|
||||
buf.append( "<br>(press Ctrl key to inspect parent)" );
|
||||
// append modifier keys hint
|
||||
buf.append( "<br>(" )
|
||||
.append( (parentLevel > 0)
|
||||
? "press <b>Ctrl/Shift</b> to increase/decrease level"
|
||||
: "press <b>Ctrl</b> key to inspect parent" )
|
||||
.append( "; " )
|
||||
.append( classHierarchy
|
||||
? "press <b>Alt</b> key to hide class hierarchy"
|
||||
: "press <b>Alt</b> key to show class hierarchy" )
|
||||
.append( ')' );
|
||||
|
||||
buf.append( "</td></tr>" );
|
||||
buf.append( "</table></html>" );
|
||||
@@ -511,13 +525,43 @@ public class FlatInspector
|
||||
}
|
||||
|
||||
private static void appendRow( StringBuilder buf, String key, String value ) {
|
||||
buf.append( "<tr><td>" )
|
||||
buf.append( "<tr><td valign=\"top\">" )
|
||||
.append( key )
|
||||
.append( ":</td><td>" )
|
||||
.append( value )
|
||||
.append( "</td></tr>" );
|
||||
}
|
||||
|
||||
private static String toString( Class<?> cls, boolean classHierarchy ) {
|
||||
StringBuilder buf = new StringBuilder( 100 );
|
||||
int level = 0;
|
||||
|
||||
while( cls != null ) {
|
||||
if( level > 0 ) {
|
||||
if( cls == Object.class )
|
||||
break;
|
||||
buf.append( "<br> " );
|
||||
for( int i = 1; i < level; i++ )
|
||||
buf.append( " " );
|
||||
buf.append( "\u2570 " );
|
||||
}
|
||||
level++;
|
||||
|
||||
String name = cls.getName();
|
||||
int dot = name.lastIndexOf( '.' );
|
||||
String pkg = (dot >= 0) ? name.substring( 0, dot ) : "-";
|
||||
String simpleName = (dot >= 0) ? name.substring( dot + 1 ) : name;
|
||||
buf.append( simpleName ).append( ' ' ).append( toDimmedText( "(" + pkg + ")" ) );
|
||||
|
||||
if( !classHierarchy )
|
||||
break;
|
||||
|
||||
cls = cls.getSuperclass();
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private static String toString( Insets insets ) {
|
||||
if( insets == null )
|
||||
return "null";
|
||||
@@ -563,11 +607,11 @@ public class FlatInspector
|
||||
+ (f instanceof UIResource ? " UI" : "");
|
||||
}
|
||||
|
||||
private static String toString( Border b ) {
|
||||
private static String toString( Border b, boolean classHierarchy ) {
|
||||
if( b == null )
|
||||
return "null";
|
||||
|
||||
String s = b.getClass().getName();
|
||||
String s = toString( b.getClass(), classHierarchy );
|
||||
|
||||
if( b instanceof EmptyBorder )
|
||||
s += '(' + toString( ((EmptyBorder)b).getBorderInsets() ) + ')';
|
||||
@@ -577,4 +621,14 @@ public class FlatInspector
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
private static String toDimmedText( String text ) {
|
||||
Color color = UIManager.getColor( "Label.disabledForeground" );
|
||||
if( color == null )
|
||||
color = UIManager.getColor( "Label.disabledText" );
|
||||
if( color == null )
|
||||
color = Color.GRAY;
|
||||
return String.format( "<span color=\"#%06x\">%s</span>",
|
||||
color.getRGB() & 0xffffff, text );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import java.awt.image.BufferedImage;
|
||||
import java.awt.image.RGBImageFilter;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
@@ -66,6 +67,8 @@ public class FlatSVGIcon
|
||||
private final boolean disabled;
|
||||
private final ClassLoader classLoader;
|
||||
|
||||
private ColorFilter colorFilter;
|
||||
|
||||
private SVGDiagram diagram;
|
||||
private boolean dark;
|
||||
|
||||
@@ -159,17 +162,82 @@ public class FlatSVGIcon
|
||||
this( name, -1, -1, scale, false, classLoader );
|
||||
}
|
||||
|
||||
private FlatSVGIcon( String name, int width, int height, float scale, boolean disabled, ClassLoader classLoader ) {
|
||||
protected FlatSVGIcon( String name, int width, int height, float scale, boolean disabled, ClassLoader classLoader ) {
|
||||
this.name = name;
|
||||
this.classLoader = classLoader;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.scale = scale;
|
||||
this.disabled = disabled;
|
||||
this.classLoader = classLoader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the SVG resource (a '/'-separated path).
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the custom icon width specified in {@link #FlatSVGIcon(String, int, int)},
|
||||
* {@link #FlatSVGIcon(String, int, int, ClassLoader)} or {@link #derive(int, int)}.
|
||||
* Otherwise {@code -1} is returned.
|
||||
* <p>
|
||||
* To get the painted icon width, use {@link #getIconWidth()}.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public int getWidth() {
|
||||
return width;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the custom icon height specified in {@link #FlatSVGIcon(String, int, int)},
|
||||
* {@link #FlatSVGIcon(String, int, int, ClassLoader)} or {@link #derive(int, int)}.
|
||||
* Otherwise {@code -1} is returned.
|
||||
* <p>
|
||||
* To get the painted icon height, use {@link #getIconHeight()}.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public int getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the amount by which the icon size is scaled. Usually {@code 1}.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public float getScale() {
|
||||
return scale;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the icon is pained in "disabled" state.
|
||||
*
|
||||
* @see #getDisabledIcon()
|
||||
* @since 1.2
|
||||
*/
|
||||
public boolean isDisabled() {
|
||||
return disabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the class loader used to load the SVG resource.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public ClassLoader getClassLoader() {
|
||||
return classLoader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new icon with given width and height, which is derived from this icon.
|
||||
* <p>
|
||||
* If the icon has a color filter, then it is shared with the new icon.
|
||||
*
|
||||
* @param width the width of the new icon
|
||||
* @param height the height of the new icon
|
||||
@@ -179,7 +247,8 @@ public class FlatSVGIcon
|
||||
if( width == this.width && height == this.height )
|
||||
return this;
|
||||
|
||||
FlatSVGIcon icon = new FlatSVGIcon( name, width, height, scale, false, classLoader );
|
||||
FlatSVGIcon icon = new FlatSVGIcon( name, width, height, scale, disabled, classLoader );
|
||||
icon.colorFilter = colorFilter;
|
||||
icon.diagram = diagram;
|
||||
icon.dark = dark;
|
||||
return icon;
|
||||
@@ -187,6 +256,8 @@ public class FlatSVGIcon
|
||||
|
||||
/**
|
||||
* Creates a new icon with given scaling, which is derived from this icon.
|
||||
* <p>
|
||||
* If the icon has a color filter, then it is shared with the new icon.
|
||||
*
|
||||
* @param scale the amount by which the icon size is scaled
|
||||
* @return a new icon
|
||||
@@ -195,7 +266,8 @@ public class FlatSVGIcon
|
||||
if( scale == this.scale )
|
||||
return this;
|
||||
|
||||
FlatSVGIcon icon = new FlatSVGIcon( name, width, height, scale, false, classLoader );
|
||||
FlatSVGIcon icon = new FlatSVGIcon( name, width, height, scale, disabled, classLoader );
|
||||
icon.colorFilter = colorFilter;
|
||||
icon.diagram = diagram;
|
||||
icon.dark = dark;
|
||||
return icon;
|
||||
@@ -203,6 +275,8 @@ public class FlatSVGIcon
|
||||
|
||||
/**
|
||||
* Creates a new icon with disabled appearance, which is derived from this icon.
|
||||
* <p>
|
||||
* If the icon has a color filter, then it is shared with the new icon.
|
||||
*
|
||||
* @return a new icon
|
||||
*/
|
||||
@@ -212,11 +286,42 @@ public class FlatSVGIcon
|
||||
return this;
|
||||
|
||||
FlatSVGIcon icon = new FlatSVGIcon( name, width, height, scale, true, classLoader );
|
||||
icon.colorFilter = colorFilter;
|
||||
icon.diagram = diagram;
|
||||
icon.dark = dark;
|
||||
return icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the currently active color filter or {@code null}.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public ColorFilter getColorFilter() {
|
||||
return colorFilter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a color filter that can freely modify colors of this icon during painting.
|
||||
* <p>
|
||||
* This method accepts a {@link ColorFilter}. Usually you would want to use a ColorFilter created using the
|
||||
* {@link ColorFilter#ColorFilter(Function)} constructor.
|
||||
* <p>
|
||||
* This can be used to brighten colors of the icon:
|
||||
* <pre>icon.setColorFilter( new FlatSVGIcon.ColorFilter( color -> color.brighter() ) );</pre>
|
||||
* <p>
|
||||
* Using a filter, icons can also be turned monochrome (painted with a single color):
|
||||
* <pre>icon.setColorFilter( new FlatSVGIcon.ColorFilter( color -> Color.RED ) );</pre>
|
||||
* <p>
|
||||
* Note: If a filter is already set, it will be replaced.
|
||||
*
|
||||
* @param colorFilter The color filter
|
||||
* @since 1.2
|
||||
*/
|
||||
public void setColorFilter( ColorFilter colorFilter ) {
|
||||
this.colorFilter = colorFilter;
|
||||
}
|
||||
|
||||
private void update() {
|
||||
if( dark == isDarkLaf() && diagram != null )
|
||||
return;
|
||||
@@ -303,7 +408,7 @@ public class FlatSVGIcon
|
||||
: GrayFilter.createDisabledIconFilter( dark );
|
||||
}
|
||||
|
||||
Graphics2D g2 = new GraphicsFilter( (Graphics2D) g.create(), ColorFilter.getInstance(), grayFilter );
|
||||
Graphics2D g2 = new GraphicsFilter( (Graphics2D) g.create(), colorFilter, ColorFilter.getInstance(), grayFilter );
|
||||
|
||||
try {
|
||||
FlatUIUtils.setRenderingHints( g2 );
|
||||
@@ -383,7 +488,14 @@ public class FlatSVGIcon
|
||||
|
||||
private static Boolean darkLaf;
|
||||
|
||||
private static boolean isDarkLaf() {
|
||||
/**
|
||||
* Checks whether the current look and feel is dark.
|
||||
* <p>
|
||||
* Uses {@link FlatLaf#isLafDark()} and caches the result.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public static boolean isDarkLaf() {
|
||||
if( darkLaf == null ) {
|
||||
lafChanged();
|
||||
|
||||
@@ -401,53 +513,253 @@ public class FlatSVGIcon
|
||||
|
||||
//---- class ColorFilter --------------------------------------------------
|
||||
|
||||
/**
|
||||
* A color filter that can modify colors of a painted {@link FlatSVGIcon}.
|
||||
* <p>
|
||||
* The ColorFilter modifies color in two ways.
|
||||
* Either using a color map, where specific colors are mapped to different ones.
|
||||
* And/or by modifying the colors in a mapper function.
|
||||
* <p>
|
||||
* When filtering a color, mappings are applied first, then the mapper function is applied.
|
||||
* <p>
|
||||
* Global {@link FlatSVGIcon} ColorFilter can be retrieved using the {@link ColorFilter#getInstance()} method.
|
||||
*/
|
||||
public static class ColorFilter
|
||||
{
|
||||
private static ColorFilter instance;
|
||||
|
||||
private final Map<Integer, String> rgb2keyMap = new HashMap<>();
|
||||
private final Map<Color, Color> color2colorMap = new HashMap<>();
|
||||
private Map<Integer, String> rgb2keyMap;
|
||||
private Map<Color, Color> colorMap;
|
||||
private Map<Color, Color> darkColorMap;
|
||||
private Function<Color, Color> mapper;
|
||||
|
||||
/**
|
||||
* Returns the global ColorFilter that is applied to all icons.
|
||||
*/
|
||||
public static ColorFilter getInstance() {
|
||||
if( instance == null )
|
||||
if( instance == null ) {
|
||||
instance = new ColorFilter();
|
||||
|
||||
// add default color palette
|
||||
instance.rgb2keyMap = new HashMap<>();
|
||||
for( FlatIconColors c : FlatIconColors.values() )
|
||||
instance.rgb2keyMap.put( c.rgb, c.key );
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an empty color filter.
|
||||
*/
|
||||
public ColorFilter() {
|
||||
for( FlatIconColors c : FlatIconColors.values() )
|
||||
rgb2keyMap.put( c.rgb, c.key );
|
||||
}
|
||||
|
||||
public void addAll( Map<Color, Color> from2toMap ) {
|
||||
color2colorMap.putAll( from2toMap );
|
||||
/**
|
||||
* Creates a color filter with a color modifying function that changes painted colors.
|
||||
* The {@link Function} gets passed the original color and returns a modified one.
|
||||
* <p>
|
||||
* Examples:
|
||||
* A ColorFilter can be used to brighten colors of the icon:
|
||||
* <pre>new ColorFilter( color -> color.brighter() );</pre>
|
||||
* <p>
|
||||
* Using a ColorFilter, icons can also be turned monochrome (painted with a single color):
|
||||
* <pre>new ColorFilter( color -> Color.RED );</pre>
|
||||
*
|
||||
* @param mapper The color mapper function
|
||||
* @since 1.2
|
||||
*/
|
||||
public ColorFilter( Function<Color, Color> mapper ) {
|
||||
setMapper( mapper );
|
||||
}
|
||||
|
||||
public void add( Color from, Color to ) {
|
||||
color2colorMap.put( from, to );
|
||||
/**
|
||||
* Returns a color modifying function or {@code null}
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public Function<Color, Color> getMapper() {
|
||||
return mapper;
|
||||
}
|
||||
|
||||
public void remove( Color from ) {
|
||||
color2colorMap.remove( from );
|
||||
/**
|
||||
* Sets a color modifying function that changes painted colors.
|
||||
* The {@link Function} gets passed the original color and returns a modified one.
|
||||
* <p>
|
||||
* Examples:
|
||||
* A ColorFilter can be used to brighten colors of the icon:
|
||||
* <pre>filter.setMapper( color -> color.brighter() );</pre>
|
||||
* <p>
|
||||
* Using a ColorFilter, icons can also be turned monochrome (painted with a single color):
|
||||
* <pre>filter.setMapper( color -> Color.RED );</pre>
|
||||
*
|
||||
* @param mapper The color mapper function
|
||||
* @since 1.2
|
||||
*/
|
||||
public void setMapper( Function<Color, Color> mapper ) {
|
||||
this.mapper = mapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the color mappings used for light themes.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public Map<Color, Color> getLightColorMap() {
|
||||
return (colorMap != null)
|
||||
? Collections.unmodifiableMap( colorMap )
|
||||
: Collections.emptyMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the color mappings used for dark themes.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public Map<Color, Color> getDarkColorMap() {
|
||||
return (darkColorMap != null)
|
||||
? Collections.unmodifiableMap( darkColorMap )
|
||||
: getLightColorMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds color mappings. Used for light and dark themes.
|
||||
*/
|
||||
public ColorFilter addAll( Map<Color, Color> from2toMap ) {
|
||||
ensureColorMap();
|
||||
|
||||
colorMap.putAll( from2toMap );
|
||||
if( darkColorMap != null )
|
||||
darkColorMap.putAll( from2toMap );
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a color mappings, which has different colors for light and dark themes.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public ColorFilter addAll( Map<Color, Color> from2toLightMap, Map<Color, Color> from2toDarkMap ) {
|
||||
ensureColorMap();
|
||||
ensureDarkColorMap();
|
||||
|
||||
colorMap.putAll( from2toLightMap );
|
||||
darkColorMap.putAll( from2toDarkMap );
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a color mapping. Used for light and dark themes.
|
||||
*/
|
||||
public ColorFilter add( Color from, Color to ) {
|
||||
ensureColorMap();
|
||||
|
||||
colorMap.put( from, to );
|
||||
if( darkColorMap != null )
|
||||
darkColorMap.put( from, to );
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a color mapping, which has different colors for light and dark themes.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public ColorFilter add( Color from, Color toLight, Color toDark ) {
|
||||
ensureColorMap();
|
||||
ensureDarkColorMap();
|
||||
|
||||
if( toLight != null )
|
||||
colorMap.put( from, toLight );
|
||||
if( toDark != null )
|
||||
darkColorMap.put( from, toDark );
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a specific color mapping.
|
||||
*/
|
||||
public ColorFilter remove( Color from ) {
|
||||
if( colorMap != null )
|
||||
colorMap.remove( from );
|
||||
if( darkColorMap != null )
|
||||
darkColorMap.remove( from );
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all color mappings.
|
||||
*
|
||||
* @since 1.2
|
||||
*/
|
||||
public ColorFilter removeAll() {
|
||||
colorMap = null;
|
||||
darkColorMap = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
private void ensureColorMap() {
|
||||
if( colorMap == null )
|
||||
colorMap = new HashMap<>();
|
||||
}
|
||||
|
||||
private void ensureDarkColorMap() {
|
||||
if( darkColorMap == null )
|
||||
darkColorMap = new HashMap<>( colorMap );
|
||||
}
|
||||
|
||||
public Color filter( Color color ) {
|
||||
Color newColor = color2colorMap.get( color );
|
||||
if( newColor != null )
|
||||
return newColor;
|
||||
// apply mappings
|
||||
color = applyMappings( color );
|
||||
|
||||
String colorKey = rgb2keyMap.get( color.getRGB() & 0xffffff );
|
||||
if( colorKey == null )
|
||||
return color;
|
||||
// apply mapper function
|
||||
if( mapper != null )
|
||||
color = mapper.apply( color );
|
||||
|
||||
newColor = UIManager.getColor( colorKey );
|
||||
if( newColor == null )
|
||||
return color;
|
||||
|
||||
return (newColor.getAlpha() != color.getAlpha())
|
||||
? new Color( (newColor.getRGB() & 0x00ffffff) | (color.getRGB() & 0xff000000) )
|
||||
: newColor;
|
||||
return color;
|
||||
};
|
||||
|
||||
private Color applyMappings( Color color ) {
|
||||
if( colorMap != null ) {
|
||||
Map<Color, Color> map = (darkColorMap != null && isDarkLaf()) ? darkColorMap : colorMap;
|
||||
Color newColor = map.get( color );
|
||||
if( newColor != null )
|
||||
return newColor;
|
||||
}
|
||||
|
||||
if( rgb2keyMap != null ) {
|
||||
// RGB is mapped to a key in UI defaults, which contains the real color.
|
||||
// IntelliJ themes define such theme specific icon colors in .theme.json files.
|
||||
String colorKey = rgb2keyMap.get( color.getRGB() & 0xffffff );
|
||||
if( colorKey == null )
|
||||
return color;
|
||||
|
||||
Color newColor = UIManager.getColor( colorKey );
|
||||
if( newColor == null )
|
||||
return color;
|
||||
|
||||
// preserve alpha of original color
|
||||
return (newColor.getAlpha() != color.getAlpha())
|
||||
? new Color( (newColor.getRGB() & 0x00ffffff) | (color.getRGB() & 0xff000000) )
|
||||
: newColor;
|
||||
}
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a color modifying function that uses {@link RGBImageFilter#filterRGB(int, int, int)}.
|
||||
* Can be set to a {@link ColorFilter} using {@link ColorFilter#setMapper(Function)}.
|
||||
*
|
||||
* @see GrayFilter
|
||||
* @since 1.2
|
||||
*/
|
||||
public static Function<Color, Color> createRGBImageFilterFunction( RGBImageFilter rgbImageFilter ) {
|
||||
return color -> {
|
||||
int oldRGB = color.getRGB();
|
||||
int newRGB = rgbImageFilter.filterRGB( 0, 0, oldRGB );
|
||||
return (newRGB != oldRGB) ? new Color( newRGB, true ) : color;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
//---- class GraphicsFilter -----------------------------------------------
|
||||
@@ -456,11 +768,15 @@ public class FlatSVGIcon
|
||||
extends Graphics2DProxy
|
||||
{
|
||||
private final ColorFilter colorFilter;
|
||||
private final ColorFilter globalColorFilter;
|
||||
private final RGBImageFilter grayFilter;
|
||||
|
||||
public GraphicsFilter( Graphics2D delegate, ColorFilter colorFilter, RGBImageFilter grayFilter ) {
|
||||
GraphicsFilter( Graphics2D delegate, ColorFilter colorFilter,
|
||||
ColorFilter globalColorFilter, RGBImageFilter grayFilter )
|
||||
{
|
||||
super( delegate );
|
||||
this.colorFilter = colorFilter;
|
||||
this.globalColorFilter = globalColorFilter;
|
||||
this.grayFilter = grayFilter;
|
||||
}
|
||||
|
||||
@@ -477,8 +793,14 @@ public class FlatSVGIcon
|
||||
}
|
||||
|
||||
private Color filterColor( Color color ) {
|
||||
if( colorFilter != null )
|
||||
color = colorFilter.filter( color );
|
||||
if( colorFilter != null ) {
|
||||
Color newColor = colorFilter.filter( color );
|
||||
color = (newColor != color)
|
||||
? newColor
|
||||
: globalColorFilter.filter( color );
|
||||
} else
|
||||
color = globalColorFilter.filter( color );
|
||||
|
||||
if( grayFilter != null ) {
|
||||
int oldRGB = color.getRGB();
|
||||
int newRGB = grayFilter.filterRGB( 0, 0, oldRGB );
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.formdev.flatlaf.extras;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Image;
|
||||
import java.awt.RenderingHints;
|
||||
@@ -23,8 +24,11 @@ import java.awt.image.BufferedImage;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import javax.swing.JWindow;
|
||||
import com.formdev.flatlaf.util.MultiResolutionImageSupport;
|
||||
import com.formdev.flatlaf.util.SystemInfo;
|
||||
import com.kitfox.svg.SVGCache;
|
||||
import com.kitfox.svg.SVGDiagram;
|
||||
import com.kitfox.svg.SVGException;
|
||||
@@ -40,22 +44,51 @@ public class FlatSVGUtils
|
||||
* Creates from the given SVG a list of icon images with different sizes that
|
||||
* can be used for windows headers. The SVG should have a size of 16x16,
|
||||
* otherwise it is scaled.
|
||||
* <p>
|
||||
* If running on Windows in Java 9 or later and multi-resolution image support is available,
|
||||
* then a single multi-resolution image is returned that creates images on demand
|
||||
* for requested sizes from SVG.
|
||||
* This has the advantage that only images for used sizes are created.
|
||||
* Also if unusual sizes are requested (e.g. 18x18), then they are created from SVG.
|
||||
*
|
||||
* @param svgName the name of the SVG resource (a '/'-separated path)
|
||||
* @return list of icon images with different sizes (16x16, 24x24, 32x32, 48x48 and 64x64)
|
||||
* @return list of icon images with different sizes (16x16, 20x20, 24x24, 28x28, 32x32, 48x48 and 64x64)
|
||||
* @throws RuntimeException if failed to load or render SVG file
|
||||
* @see JWindow#setIconImages(List)
|
||||
*/
|
||||
public static List<Image> createWindowIconImages( String svgName ) {
|
||||
SVGDiagram diagram = loadSVG( svgName );
|
||||
|
||||
return Arrays.asList(
|
||||
svg2image( diagram, 16, 16 ),
|
||||
svg2image( diagram, 24, 24 ),
|
||||
svg2image( diagram, 32, 32 ),
|
||||
svg2image( diagram, 48, 48 ),
|
||||
svg2image( diagram, 64, 64 )
|
||||
);
|
||||
if( SystemInfo.isWindows && MultiResolutionImageSupport.isAvailable() ) {
|
||||
// use a multi-resolution image that creates images on demand for requested sizes
|
||||
return Collections.singletonList( MultiResolutionImageSupport.create( 0,
|
||||
new Dimension[] {
|
||||
// Listing all these sizes here is actually not necessary because
|
||||
// any size is created on demand when
|
||||
// MultiResolutionImage.getResolutionVariant(double destImageWidth, double destImageHeight)
|
||||
// is invoked.
|
||||
// This sizes are only used by MultiResolutionImage.getResolutionVariants().
|
||||
new Dimension( 16, 16 ), // 100%
|
||||
new Dimension( 20, 20 ), // 125%
|
||||
new Dimension( 24, 24 ), // 150%
|
||||
new Dimension( 28, 28 ), // 175%
|
||||
new Dimension( 32, 32 ), // 200%
|
||||
new Dimension( 48, 48 ), // 300%
|
||||
new Dimension( 64, 64 ), // 400%
|
||||
}, dim -> {
|
||||
return svg2image( diagram, dim.width, dim.height );
|
||||
} ) );
|
||||
} else {
|
||||
return Arrays.asList(
|
||||
svg2image( diagram, 16, 16 ), // 100%
|
||||
svg2image( diagram, 20, 20 ), // 125%
|
||||
svg2image( diagram, 24, 24 ), // 150%
|
||||
svg2image( diagram, 28, 28 ), // 175%
|
||||
svg2image( diagram, 32, 32 ), // 200%
|
||||
svg2image( diagram, 48, 48 ), // 300%
|
||||
svg2image( diagram, 64, 64 ) // 400%
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -30,7 +30,7 @@ public class FlatButton
|
||||
implements FlatComponentExtension
|
||||
{
|
||||
// NOTE: enum names must be equal to allowed strings
|
||||
public enum ButtonType { none, square, roundRect, tab, help, toolBarButton };
|
||||
public enum ButtonType { none, square, roundRect, tab, help, toolBarButton, borderless }
|
||||
|
||||
/**
|
||||
* Returns type of a button.
|
||||
|
||||
@@ -88,6 +88,11 @@ ComboBox.buttonPressedArrowColor = ComboBox.buttonArrowColor
|
||||
Component.custom.borderColor = null
|
||||
|
||||
|
||||
#---- HelpButton ----
|
||||
|
||||
DesktopIcon.background = Desktop.background
|
||||
|
||||
|
||||
#---- HelpButton ----
|
||||
|
||||
HelpButton.disabledBackground = HelpButton.background
|
||||
|
||||
@@ -86,6 +86,8 @@ Name | Class
|
||||
[Dracula Contrast (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatDraculaContrastIJTheme`
|
||||
[GitHub (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubIJTheme`
|
||||
[GitHub Contrast (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubContrastIJTheme`
|
||||
[GitHub Dark (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubDarkIJTheme`
|
||||
[GitHub Dark Contrast (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubDarkContrastIJTheme`
|
||||
[Light Owl (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatLightOwlIJTheme`
|
||||
[Light Owl Contrast (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatLightOwlContrastIJTheme`
|
||||
[Material Darker (Material)](https://github.com/mallowigi/material-theme-ui-lite) | `com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDarkerIJTheme`
|
||||
|
||||
@@ -33,17 +33,6 @@ java {
|
||||
withJavadocJar()
|
||||
}
|
||||
|
||||
tasks {
|
||||
javadoc {
|
||||
options {
|
||||
this as StandardJavadocDocletOptions
|
||||
use( true )
|
||||
tags = listOf( "uiDefault", "clientProperty" )
|
||||
}
|
||||
isFailOnError = false
|
||||
}
|
||||
}
|
||||
|
||||
flatlafPublish {
|
||||
artifactId = "flatlaf-intellij-themes"
|
||||
name = "FlatLaf IntelliJ Themes Pack"
|
||||
|
||||
@@ -68,6 +68,8 @@ public class FlatAllIJThemes
|
||||
new FlatIJLookAndFeelInfo( "Dracula Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatDraculaContrastIJTheme", true ),
|
||||
new FlatIJLookAndFeelInfo( "GitHub (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubIJTheme", false ),
|
||||
new FlatIJLookAndFeelInfo( "GitHub Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubContrastIJTheme", false ),
|
||||
new FlatIJLookAndFeelInfo( "GitHub Dark (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubDarkIJTheme", true ),
|
||||
new FlatIJLookAndFeelInfo( "GitHub Dark Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatGitHubDarkContrastIJTheme", true ),
|
||||
new FlatIJLookAndFeelInfo( "Light Owl (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatLightOwlIJTheme", false ),
|
||||
new FlatIJLookAndFeelInfo( "Light Owl Contrast (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatLightOwlContrastIJTheme", false ),
|
||||
new FlatIJLookAndFeelInfo( "Material Darker (Material)", "com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMaterialDarkerIJTheme", true ),
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatArcDarkIJTheme
|
||||
{
|
||||
public static final String NAME = "Arc Dark";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatArcDarkIJTheme() );
|
||||
return setup( new FlatArcDarkIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatArcDarkIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatArcDarkOrangeIJTheme
|
||||
{
|
||||
public static final String NAME = "Arc Dark - Orange";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatArcDarkOrangeIJTheme() );
|
||||
return setup( new FlatArcDarkOrangeIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatArcDarkOrangeIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatArcIJTheme
|
||||
{
|
||||
public static final String NAME = "Arc";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatArcIJTheme() );
|
||||
return setup( new FlatArcIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatArcIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatArcOrangeIJTheme
|
||||
{
|
||||
public static final String NAME = "Arc - Orange";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatArcOrangeIJTheme() );
|
||||
return setup( new FlatArcOrangeIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatArcOrangeIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatCarbonIJTheme
|
||||
{
|
||||
public static final String NAME = "Carbon";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatCarbonIJTheme() );
|
||||
return setup( new FlatCarbonIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatCarbonIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatCobalt2IJTheme
|
||||
{
|
||||
public static final String NAME = "Cobalt 2";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatCobalt2IJTheme() );
|
||||
return setup( new FlatCobalt2IJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatCobalt2IJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatCyanLightIJTheme
|
||||
{
|
||||
public static final String NAME = "Cyan light";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatCyanLightIJTheme() );
|
||||
return setup( new FlatCyanLightIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatCyanLightIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatDarkFlatIJTheme
|
||||
{
|
||||
public static final String NAME = "Dark Flat";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatDarkFlatIJTheme() );
|
||||
return setup( new FlatDarkFlatIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatDarkFlatIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatDarkPurpleIJTheme
|
||||
{
|
||||
public static final String NAME = "Dark purple";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatDarkPurpleIJTheme() );
|
||||
return setup( new FlatDarkPurpleIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatDarkPurpleIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatDraculaIJTheme
|
||||
{
|
||||
public static final String NAME = "Dracula";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatDraculaIJTheme() );
|
||||
return setup( new FlatDraculaIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatDraculaIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatGradiantoDarkFuchsiaIJTheme
|
||||
{
|
||||
public static final String NAME = "Gradianto Dark Fuchsia";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGradiantoDarkFuchsiaIJTheme() );
|
||||
return setup( new FlatGradiantoDarkFuchsiaIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGradiantoDarkFuchsiaIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatGradiantoDeepOceanIJTheme
|
||||
{
|
||||
public static final String NAME = "Gradianto Deep Ocean";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGradiantoDeepOceanIJTheme() );
|
||||
return setup( new FlatGradiantoDeepOceanIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGradiantoDeepOceanIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatGradiantoMidnightBlueIJTheme
|
||||
{
|
||||
public static final String NAME = "Gradianto Midnight Blue";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGradiantoMidnightBlueIJTheme() );
|
||||
return setup( new FlatGradiantoMidnightBlueIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGradiantoMidnightBlueIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatGradiantoNatureGreenIJTheme
|
||||
{
|
||||
public static final String NAME = "Gradianto Nature Green";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGradiantoNatureGreenIJTheme() );
|
||||
return setup( new FlatGradiantoNatureGreenIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGradiantoNatureGreenIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatGrayIJTheme
|
||||
{
|
||||
public static final String NAME = "Gray";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGrayIJTheme() );
|
||||
return setup( new FlatGrayIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGrayIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatGruvboxDarkHardIJTheme
|
||||
{
|
||||
public static final String NAME = "Gruvbox Dark Hard";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGruvboxDarkHardIJTheme() );
|
||||
return setup( new FlatGruvboxDarkHardIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGruvboxDarkHardIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatGruvboxDarkMediumIJTheme
|
||||
{
|
||||
public static final String NAME = "Gruvbox Dark Medium";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGruvboxDarkMediumIJTheme() );
|
||||
return setup( new FlatGruvboxDarkMediumIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGruvboxDarkMediumIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatGruvboxDarkSoftIJTheme
|
||||
{
|
||||
public static final String NAME = "Gruvbox Dark Soft";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGruvboxDarkSoftIJTheme() );
|
||||
return setup( new FlatGruvboxDarkSoftIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGruvboxDarkSoftIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatHiberbeeDarkIJTheme
|
||||
{
|
||||
public static final String NAME = "Hiberbee Dark";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatHiberbeeDarkIJTheme() );
|
||||
return setup( new FlatHiberbeeDarkIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatHiberbeeDarkIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatHighContrastIJTheme
|
||||
{
|
||||
public static final String NAME = "High contrast";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatHighContrastIJTheme() );
|
||||
return setup( new FlatHighContrastIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatHighContrastIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatLightFlatIJTheme
|
||||
{
|
||||
public static final String NAME = "Light Flat";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatLightFlatIJTheme() );
|
||||
return setup( new FlatLightFlatIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatLightFlatIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatMaterialDesignDarkIJTheme
|
||||
{
|
||||
public static final String NAME = "Material Design Dark";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatMaterialDesignDarkIJTheme() );
|
||||
return setup( new FlatMaterialDesignDarkIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatMaterialDesignDarkIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatMonocaiIJTheme
|
||||
{
|
||||
public static final String NAME = "Monocai";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatMonocaiIJTheme() );
|
||||
return setup( new FlatMonocaiIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatMonocaiIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatNordIJTheme
|
||||
{
|
||||
public static final String NAME = "Nord";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatNordIJTheme() );
|
||||
return setup( new FlatNordIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatNordIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatOneDarkIJTheme
|
||||
{
|
||||
public static final String NAME = "One Dark";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatOneDarkIJTheme() );
|
||||
return setup( new FlatOneDarkIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatOneDarkIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatSolarizedDarkIJTheme
|
||||
{
|
||||
public static final String NAME = "Solarized Dark";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatSolarizedDarkIJTheme() );
|
||||
return setup( new FlatSolarizedDarkIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatSolarizedDarkIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatSolarizedLightIJTheme
|
||||
{
|
||||
public static final String NAME = "Solarized Light";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatSolarizedLightIJTheme() );
|
||||
return setup( new FlatSolarizedLightIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatSolarizedLightIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatSpacegrayIJTheme
|
||||
{
|
||||
public static final String NAME = "Spacegray";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatSpacegrayIJTheme() );
|
||||
return setup( new FlatSpacegrayIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatSpacegrayIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatVuesionIJTheme
|
||||
{
|
||||
public static final String NAME = "Vuesion";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatVuesionIJTheme() );
|
||||
return setup( new FlatVuesionIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatVuesionIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatArcDarkContrastIJTheme
|
||||
{
|
||||
public static final String NAME = "Arc Dark Contrast (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatArcDarkContrastIJTheme() );
|
||||
return setup( new FlatArcDarkContrastIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatArcDarkContrastIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatArcDarkIJTheme
|
||||
{
|
||||
public static final String NAME = "Arc Dark (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatArcDarkIJTheme() );
|
||||
return setup( new FlatArcDarkIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatArcDarkIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatAtomOneDarkContrastIJTheme
|
||||
{
|
||||
public static final String NAME = "Atom One Dark Contrast (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatAtomOneDarkContrastIJTheme() );
|
||||
return setup( new FlatAtomOneDarkContrastIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatAtomOneDarkContrastIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatAtomOneDarkIJTheme
|
||||
{
|
||||
public static final String NAME = "Atom One Dark (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatAtomOneDarkIJTheme() );
|
||||
return setup( new FlatAtomOneDarkIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatAtomOneDarkIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatAtomOneLightContrastIJTheme
|
||||
{
|
||||
public static final String NAME = "Atom One Light Contrast (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatAtomOneLightContrastIJTheme() );
|
||||
return setup( new FlatAtomOneLightContrastIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatAtomOneLightContrastIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatAtomOneLightIJTheme
|
||||
{
|
||||
public static final String NAME = "Atom One Light (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatAtomOneLightIJTheme() );
|
||||
return setup( new FlatAtomOneLightIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatAtomOneLightIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatDraculaContrastIJTheme
|
||||
{
|
||||
public static final String NAME = "Dracula Contrast (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatDraculaContrastIJTheme() );
|
||||
return setup( new FlatDraculaContrastIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatDraculaContrastIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatDraculaIJTheme
|
||||
{
|
||||
public static final String NAME = "Dracula (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatDraculaIJTheme() );
|
||||
return setup( new FlatDraculaIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatDraculaIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatGitHubContrastIJTheme
|
||||
{
|
||||
public static final String NAME = "GitHub Contrast (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGitHubContrastIJTheme() );
|
||||
return setup( new FlatGitHubContrastIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGitHubContrastIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright 2020 FormDev Software GmbH
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.formdev.flatlaf.intellijthemes.materialthemeuilite;
|
||||
|
||||
//
|
||||
// DO NOT MODIFY
|
||||
// Generated with com.formdev.flatlaf.demo.intellijthemes.IJThemesClassGenerator
|
||||
//
|
||||
|
||||
import com.formdev.flatlaf.IntelliJTheme;
|
||||
|
||||
/**
|
||||
* @author Karl Tauber
|
||||
*/
|
||||
public class FlatGitHubDarkContrastIJTheme
|
||||
extends IntelliJTheme.ThemeLaf
|
||||
{
|
||||
public static final String NAME = "GitHub Dark Contrast (Material)";
|
||||
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return setup( new FlatGitHubDarkContrastIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGitHubDarkContrastIJTheme.class );
|
||||
}
|
||||
|
||||
public FlatGitHubDarkContrastIJTheme() {
|
||||
super( Utils.loadTheme( "GitHub Dark Contrast.theme.json" ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return NAME;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright 2020 FormDev Software GmbH
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.formdev.flatlaf.intellijthemes.materialthemeuilite;
|
||||
|
||||
//
|
||||
// DO NOT MODIFY
|
||||
// Generated with com.formdev.flatlaf.demo.intellijthemes.IJThemesClassGenerator
|
||||
//
|
||||
|
||||
import com.formdev.flatlaf.IntelliJTheme;
|
||||
|
||||
/**
|
||||
* @author Karl Tauber
|
||||
*/
|
||||
public class FlatGitHubDarkIJTheme
|
||||
extends IntelliJTheme.ThemeLaf
|
||||
{
|
||||
public static final String NAME = "GitHub Dark (Material)";
|
||||
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return setup( new FlatGitHubDarkIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGitHubDarkIJTheme.class );
|
||||
}
|
||||
|
||||
public FlatGitHubDarkIJTheme() {
|
||||
super( Utils.loadTheme( "GitHub Dark.theme.json" ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return NAME;
|
||||
}
|
||||
}
|
||||
@@ -31,14 +31,22 @@ public class FlatGitHubIJTheme
|
||||
{
|
||||
public static final String NAME = "GitHub (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatGitHubIJTheme() );
|
||||
return setup( new FlatGitHubIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatGitHubIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatLightOwlContrastIJTheme
|
||||
{
|
||||
public static final String NAME = "Light Owl Contrast (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatLightOwlContrastIJTheme() );
|
||||
return setup( new FlatLightOwlContrastIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatLightOwlContrastIJTheme.class );
|
||||
}
|
||||
|
||||
@@ -31,14 +31,22 @@ public class FlatLightOwlIJTheme
|
||||
{
|
||||
public static final String NAME = "Light Owl (Material)";
|
||||
|
||||
public static boolean install() {
|
||||
public static boolean setup() {
|
||||
try {
|
||||
return install( new FlatLightOwlIJTheme() );
|
||||
return setup( new FlatLightOwlIJTheme() );
|
||||
} catch( RuntimeException ex ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #setup()} instead; this method will be removed in a future version
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean install() {
|
||||
return setup();
|
||||
}
|
||||
|
||||
public static void installLafInfo() {
|
||||
installLafInfo( NAME, FlatLightOwlIJTheme.class );
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user