Compare commits

..

74 Commits
0.24 ... 0.27

Author SHA1 Message Date
Karl Tauber
5f40ab130e build.gradle.kts:
- added version info to manifest
- added META-INF/LICENSE
- Java source/target compatibility now defined in single location
- defined source file encoding for java compiler
2020-02-16 16:58:01 +01:00
Karl Tauber
7489526eb7 build.gradle.kts:
- plugin versions now defined in single location (settings.gradle.kts)
- going back to Gradle 6.1.1
- using "extra" properties for bintray user and key
- allow easy enabling/disabling bintray upload dryMode and publishing
2020-02-16 12:18:08 +01:00
Karl Tauber
e439d91763 build.gradle.kts: fix bintray upload (broken since adding snapshot publishing) 2020-02-15 00:03:57 +01:00
Karl Tauber
793969e39b downgrade from Gradle 6.1.1 to 6.1 to check whether this fixes the broken bintray upload (worked in 0.26 with 6.1) 2020-02-14 16:30:46 +01:00
Karl Tauber
9f7ffe8d77 travis: changed condition for release stage again (because it did not start) 2020-02-14 16:04:53 +01:00
Karl Tauber
eecb867227 travis: changed condition for release stage (because it did not start) 2020-02-14 16:00:04 +01:00
Karl Tauber
bff9f135e6 release 0.27 2020-02-14 15:41:18 +01:00
Karl Tauber
03627281d7 ToolBar: added empty space around toolbar (issue #56) 2020-02-14 13:59:14 +01:00
Karl Tauber
c83b4093f0 ToolBar: added empty space around buttons in toolbar (issue #56) 2020-02-14 12:53:30 +01:00
Karl Tauber
7f9f22df3e merged PR #61 into master (with minor modifications)
Bug #60 Illegal reflective access operation on mac
2020-02-13 17:13:07 +01:00
Karl Tauber
fd48582a9f ToolBar: no longer use special rollover border for buttons in toolbar (issue #36) 2020-02-13 15:53:54 +01:00
Karl Tauber
e5761128f9 ToggleButton: make toggle button square if it has an icon but no text or text is "..." or a single character 2020-02-13 14:51:36 +01:00
Karl Tauber
87dd5a9ebb PasswordField: get echoChar from .properties files and no longer hard code it on macOS 2020-02-13 11:17:29 +01:00
smile atom
f2ddfadc9d fix: #60 should compile on JDK 8 2020-02-12 19:01:35 -08:00
smile atom
b1a7983f18 fix: #60 Illegal reflective access operation on mac 2020-02-12 18:46:39 -08:00
Karl Tauber
b319cb278b UI defaults: updated dumps on macOS 2020-02-12 18:47:22 +01:00
Karl Tauber
78e3d781fc UI defaults: changed dump format of characters and updated dumps on Windows 2020-02-12 18:43:35 +01:00
Karl Tauber
34834917b0 UI defaults:
- added macOS Java 8 - 13 dumps of AquaLookAndFeel
- added macOS Java 8 dumps of FlatLightLaf and FlatDarkLaf

used macOS Mojave 10.14.
2020-02-12 14:23:56 +01:00
Karl Tauber
9446c287e9 UI defaults:
- class UIDefaultsDump implemented to dump UI defaults to text files
- added Java 8 - 13 dumps of BasicLookAndFeel, MetalLookAndFeel, WindowsLookAndFeel
- added Java 8 dumps of FlatLightLaf and FlatDarkLaf
2020-02-12 10:42:07 +01:00
Bill Culp
31b0cf396e fix #60 fix typo 2020-02-11 15:10:58 -08:00
Bill Culp
00bb13c230 fix #60 just use getDeclaredConstructor() 2020-02-11 15:05:22 -08:00
Bill Culp
3bf09ee731 fix #60 Illegal reflective access operation on mac 2020-02-11 15:00:28 -08:00
Bill Culp
5b07941c4c Merge branch 'master' of https://github.com/JFormDesigner/FlatLaf into bug-60 2020-02-11 14:57:51 -08:00
Karl Tauber
23c30ec46d FlatComponentsTest: add checkbox to change contentAreaFilled of all buttons (for issue #58) 2020-02-11 18:44:35 +01:00
Karl Tauber
22c06300f1 merged PR #63 (for issue #58) into master (with modifications)
bug: AbstractButton's ContentAreaFilled=false not honored when parent is a CellRendererPane
2020-02-11 18:34:44 +01:00
Karl Tauber
37cca1b106 merged PR #62 into master (with minor modifications)
Feat 59 Option to allow tabbed pane separator to take full height
2020-02-11 16:48:27 +01:00
Karl Tauber
f0a49c806e DesktopPane support implemented (issues #39 and #11) 2020-02-11 15:38:32 +01:00
Bill Culp
a1d5f65588 bug: AbstractButton's ContentAreaFilled=false not honored when parent is a CellRendererPane
docs: AbstractButton:setContentAreaFilled

Sets the contentAreaFilled property. If true the button will paint the content area. If you wish to have a transparent button, such as an icon only button, for example, then you should set this to false. Do not call setOpaque(false). The default value for the the contentAreaFilled property is true.
This function may cause the component's opaque property to change.

The exact behavior of calling this function varies on a component-by-component and L&F-by-L&F basis.

Parameters:
b - if true, the content should be filled; if false the content area is not filled
2020-02-10 23:37:27 -08:00
Bill Culp
b6789e14a4 Option to allow tabbed pane separator to take full height 2020-02-10 22:32:11 -08:00
Bill Culp
c72ee30a25 fix: Illegal reflective access operation on mac 2020-02-10 18:17:20 -08:00
Karl Tauber
686d667c4f Table: optimized position of column sort arrow (issue #34) 2020-02-08 10:38:48 +01:00
Karl Tauber
26d603db5d UIDefaultsLoader: support scaling float, insets and dimension 2020-02-07 17:25:14 +01:00
Karl Tauber
409840aef9 README.md: added snapshots 2020-02-05 18:23:27 +01:00
Karl Tauber
1f3c264afe travis: moved JDKs back to top-level and execute "test" stage first (replaces "build" stage) 2020-02-05 16:12:56 +01:00
Karl Tauber
cd69d9a1a7 travis: moved JDKs to build job 2020-02-05 15:54:29 +01:00
Karl Tauber
a000c8fd99 travis: use stages and added snapshot upload 2020-02-05 15:29:00 +01:00
Karl Tauber
84d05603ef build.gradle.kts: separate versions for release and development (snapshot) 2020-02-05 15:21:01 +01:00
Karl Tauber
9d046ecd1d build.gradle.kts: added snapshot publishing to oss.jfrog.org 2020-02-05 12:34:07 +01:00
Karl Tauber
030e1809f3 Table: support positioning the column sort arrow in header right, left, top or bottom (issue #34) 2020-02-03 21:27:08 +01:00
Karl Tauber
5853bd4a96 InternalFrame: made buttons larger and square (issue #39) 2020-02-02 17:12:34 +01:00
Karl Tauber
10695ff51b InternalFrame: fixed exception on macOS when minimizing internal frame (#39) 2020-01-27 15:52:04 +01:00
Karl Tauber
f421659fea update to Gradle 6.1.1
./gradlew wrapper --gradle-version=6.1.1
2020-01-27 15:33:30 +01:00
Karl Tauber
df4f51eff3 InternalFrame: basic implementation (issues #39 and #11) 2020-01-27 15:23:03 +01:00
Karl Tauber
7e61d6a850 README.md: added some projects that use FlatLaf 2020-01-26 17:31:48 +01:00
Karl Tauber
0910bd23c4 ProgressBar: fixed visual artifacts in indeterminate mode, on HiDPI screens at 125%, 150% and 175% scaling, when the progress moves around 2020-01-23 10:33:01 +01:00
Karl Tauber
5a29753912 release 0.26 2020-01-22 15:07:56 +01:00
Karl Tauber
a467356437 build.gradle.kts: disable javadoc warnings for missing @param or @return 2020-01-22 14:54:49 +01:00
Karl Tauber
094967f52a ProgressBar: made progress bar paint smooth in indeterminate mode 2020-01-22 14:21:38 +01:00
Karl Tauber
757b0812ba Menu: highlight items in menu bar on mouse hover (issue #49) 2020-01-20 23:35:50 +01:00
Karl Tauber
8f4f5d8c92 FlatClientProperties: fixed javadoc error 2020-01-20 20:17:58 +01:00
Karl Tauber
4e266483ba Menus: menu items now have larger left and right margins 2020-01-20 20:13:37 +01:00
Karl Tauber
7433dc9cf3 Menus: changed menu bar and popup menu background colors (made brighter in light themes and darker in dark themes)
made `JMenu`, `JMenuItem`, `JCheckBoxMenuItem` and `JRadioButtonMenuItem` non-opaque
2020-01-20 20:09:32 +01:00
Karl Tauber
409a773e36 IntelliJ Themes Demo: updated Arc, Arc Orange, and Material UI Lite themes (used IJThemesUpdater) 2020-01-20 14:58:39 +01:00
Karl Tauber
48bdd5c3df TextField, FormattedTextField and PasswordField: select all text when a text field gains focus for the first time and selection was not set explicitly 2020-01-19 18:05:12 +01:00
smileatom
5796057a75 Merge pull request #1 from JFormDesigner/master
merge latest changes
2020-01-18 14:43:29 -08:00
Karl Tauber
c8248e91ca release 0.25.1 2020-01-18 10:35:18 +01:00
Karl Tauber
7317ce44e7 update to Gradle 6.1
./gradlew wrapper --gradle-version=6.1
2020-01-18 10:25:55 +01:00
Karl Tauber
10e2a5b1eb release 0.25 2020-01-17 13:18:29 +01:00
Karl Tauber
e675d1b7e2 show mnemonics if the active window does not have a focused component; ignore invisible components (issue #43) 2020-01-17 11:03:48 +01:00
Karl Tauber
499c4dadd5 FlatDarkLaf.properties: use slightly brighter color for popup menu border 2020-01-17 10:53:46 +01:00
Karl Tauber
f550f84acd Menu: fixed vertical alignment of sub-menus (issue #42) 2020-01-17 01:01:30 +01:00
Karl Tauber
8021f1a7fc ComboBox on macOS: fixed keyboard navigation and show/hide popup 2020-01-16 23:43:05 +01:00
Karl Tauber
d50fe606ee Tree on macOS: fixed Left and Right keys to collapse or expand nodes 2020-01-16 21:33:23 +01:00
Karl Tauber
281f014aa0 FlatTestFrame: support testing 3rd party lafs 2020-01-15 19:10:42 +01:00
Karl Tauber
2f6da3e84a FlatInspector: improved inspecting parent levels: Ctrl adds 1 level, Shift adds 2 levels and Alt adds 4 levels; no longer limit inspecting to content pane 2020-01-15 18:13:43 +01:00
Karl Tauber
f9accc2a7a ProgressBar: support square painting and larger height even if no string is painted 2020-01-15 17:13:39 +01:00
Karl Tauber
fe15078bbd TabbedPane: support per component tab height 2020-01-15 12:52:39 +01:00
Karl Tauber
27d4b5eba7 ToggleButton: Support per component styling for tab-style toggle buttons with client properties JToggleButton.tab.underlineHeight (integer), JToggleButton.tab.underlineColor (Color) and JToggleButton.tab.selectedBackground (Color) (issue #45) 2020-01-15 11:05:16 +01:00
Karl Tauber
e378576632 ToggleButton renamed toggle button type "underline" to "tab" (value of client property JButton.buttonType is now tab) 2020-01-14 23:59:56 +01:00
Karl Tauber
74909da110 Button and ToggleButton:
- support per component minimum height (issue #44)
- do not apply minimum width if button border was changed (is no longer an instance of `FlatButtonBorder`)
- ToggleButton: no longer use focus width for underline style toggle buttons to compute component size, which reduces/fixes component size in "Flat IntelliJ" and "Flat Darcula" themes
- revalidate/repaint client properties minimum width/height or buttonType change
2020-01-14 18:42:06 +01:00
Karl Tauber
655bf112ac ScrollPane: fixed UI artifact at bottom right corner of scroll pane if both scroll bars are visible, which was caused by Component.innerFocusWidth > 0 (issue #35) 2020-01-14 15:03:07 +01:00
Karl Tauber
5c3638a5a4 Menu: hide mnemonics by default and show them only when Alt key is pressed (issue #43) 2020-01-14 12:09:31 +01:00
Karl Tauber
2459a3654b TabbedPane: hide cropped line in scroll-tab-layout (issue #40) 2020-01-14 10:51:07 +01:00
Karl Tauber
e9a3456cf5 Tree: Tree.textBackground now has a valid color and is no longer null; instead set Tree.rendererFillBackground to false to always get correct cell backgrounds (in IntelliJ themes or if tree.setBackground(...) was used)
undone commit 645be4bfa3
2020-01-14 10:44:00 +01:00
135 changed files with 52022 additions and 417 deletions

View File

@@ -19,11 +19,21 @@ before_install:
- ./gradlew --version
- java -version
deploy:
provider: script
script: ./gradlew bintrayUpload
skip_cleanup: true # to upload artifacts created during the build
on:
branch: master
jdk: openjdk11
tags: true
stages:
- name: test
- name: snapshot
if: branch = master AND type IN (push) AND tag IS blank
- name: release
if: type IN (push) AND tag IS present
jobs:
include:
# publish snapshot to oss.jfrog.org
- stage: snapshot
jdk: openjdk11
script: ./gradlew artifactoryPublish
# release a new stable version to bintray
- stage: release
jdk: openjdk11
script: ./gradlew bintrayUpload -Drelease=true

View File

@@ -1,6 +1,82 @@
FlatLaf Change Log
==================
## 0.27
- Support `JInternalFrame` and `JDesktopPane`. (issues #39 and #11)
- Table: Support positioning the column sort arrow in header right, left, top or
bottom. (issue #34)
- ProgressBar: Fixed visual artifacts in indeterminate mode, on HiDPI screens at
125%, 150% and 175% scaling, when the progress moves around.
- TabbedPane: New option to allow tab separators to take full height (to enable
use `UIManager.put( "TabbedPane.tabSeparatorsFullHeight", true );`). (issue
#59, PR #62)
- CheckBox and RadioButton: Do not fill background if `contentAreaFilled` is
`false`. (issue #58, PR #63)
- ToggleButton: Make toggle button square if it has an icon but no text or text
is "..." or a single character.
- ToolBar: No longer use special rollover border for buttons in toolbar. (issue
#36)
- ToolBar: Added empty space around buttons in toolbar and toolbar itself (see
UI default values `Button.toolbar.spacingInsets` and `ToolBar.borderMargins`).
(issue #56)
- Fixed "illegal reflective access operation" warning on macOS when using Java
12 or later. (issue #60, PR #61)
## 0.26
- Menus:
- Changed menu bar and popup menu background colors (made brighter in light
themes and darker in dark themes).
- Highlight items in menu bar on mouse hover. (issue #49)
- Popup menus now have empty space at the top and bottom.
- Menu items now have larger left and right margins.
- Made `JMenu`, `JMenuItem`, `JCheckBoxMenuItem` and `JRadioButtonMenuItem`
non-opaque.
- TextField, FormattedTextField and PasswordField: Select all text when a text
field gains focus for the first time and selection was not set explicitly.
This can be configured to newer or always select all text on focus gain (see
UI default value `TextComponent.selectAllOnFocusPolicy`).
- ProgressBar: Made progress bar paint smooth in indeterminate mode.
## 0.25.1
Re-release of 0.25 because of problems with Maven Central.
## 0.25
- Hide menu mnemonics by default and show them only when <kbd>Alt</kbd> key is
pressed. (issue #43)
- Menu: Fixed vertical alignment of sub-menus. (issue #42)
- TabbedPane: In scroll-tab-layout, the cropped line is now hidden. (issue #40)
- Tree: UI default value `Tree.textBackground` now has a valid color and is no
longer `null`.
- Tree on macOS: Fixed <kbd>Left</kbd> and <kbd>Right</kbd> keys to collapse or
expand nodes.
- ComboBox on macOS: Fixed keyboard navigation and show/hide popup.
- Button and ToggleButton: Support per component minimum height (set client
property `JComponent.minimumHeight` to an integer). (issue #44)
- Button and ToggleButton: Do not apply minimum width if button border was
changed (is no longer an instance of `FlatButtonBorder`).
- ToggleButton: Renamed toggle button type "underline" to "tab" (value of client
property `JButton.buttonType` is now `tab`).
- ToggleButton: Support per component styling for tab-style toggle buttons with
client properties `JToggleButton.tab.underlineHeight` (integer),
`JToggleButton.tab.underlineColor` (Color) and
`JToggleButton.tab.selectedBackground` (Color). (issue #45)
- ToggleButton: No longer use focus width for tab-style toggle buttons to
compute component size, which reduces/fixes component size in "Flat IntelliJ"
and "Flat Darcula" themes.
- TabbedPane: Support per component tab height (set client property
`JTabbedPane.tabHeight` to an integer).
- ProgressBar: Support square painting (set client property
`JProgressBar.square` to `true`) and larger height even if no string is
painted (set client property `JProgressBar.largeHeight` to `true`).
## 0.24
- Support smooth scrolling with touchpads and high precision mouse wheels.

View File

@@ -45,13 +45,26 @@ build script:
groupId: com.formdev
artifactId: flatlaf
version: 0.24
version: (see button below)
Otherwise download `flatlaf-<version>.jar` here:
[![Download](https://api.bintray.com/packages/jformdesigner/flatlaf/flatlaf/images/download.svg)](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
### Snapshots
FlatLaf snapshot binaries are available in
[JFrog Artifactory](https://oss.jfrog.org/artifactory/oss-snapshot-local/com/formdev/).
To access the latest snapshot, change the FlatLaf version(s) in the dependencies
to `<version>-SNAPSHOT` (e.g. `0.27-SNAPSHOT`) and add the repository
`https://oss.jfrog.org/artifactory/oss-snapshot-local` to your build (see
[Maven](https://maven.apache.org/guides/mini/guide-multiple-repositories.html)
and
[Gradle](https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:declaring_custom_repository)
docs).
Addons
------
@@ -59,6 +72,18 @@ Addons
- [JIDE Common Layer](flatlaf-jide-oss)
Projects using FlatLaf
----------------------
- [NetBeans](https://netbeans.apache.org/) 11.3
- [jclasslib bytecode viewer](https://github.com/ingokegel/jclasslib) 5.5
- [j-lawyer](https://github.com/jlawyerorg/j-lawyer-org)
- [Rest Suite](https://github.com/supanadit/restsuite)
- [ControllerBuddy](https://github.com/bwRavencl/ControllerBuddy)
- [SpringRemote](https://github.com/HaleyWang/SpringRemote)
- and more...
Documentation
-------------

View File

@@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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,
@@ -14,9 +14,14 @@
* limitations under the License.
*/
version = "0.24"
val releaseVersion = "0.27"
val developmentVersion = "0.28-SNAPSHOT"
version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion
allprojects {
version = rootProject.version
repositories {
jcenter()
}
@@ -33,3 +38,39 @@ println( "FlatLaf Version: ${version}" )
println( "Gradle ${gradle.gradleVersion} at ${gradle.gradleHomeDir}" )
println( "Java ${System.getProperty( "java.version" )}" )
println()
extra["bintray.user"] = System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" )
extra["bintray.key"] = System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" )
// if true, do not upload to bintray
extra["bintray.dryRun"] = false
// if true, uploaded artifacts are visible to all
// if false, only visible to owner when logged into bintray
extra["bintray.publish"] = true
allprojects {
tasks {
withType<JavaCompile>().configureEach {
sourceCompatibility = "1.8"
targetCompatibility = "1.8"
options.encoding = "ISO-8859-1"
}
withType<Jar>().configureEach {
// manifest for all created JARs
manifest.attributes(mapOf(
"Implementation-Vendor" to "FormDev Software GmbH",
"Implementation-Copyright" to "Copyright (C) ${java.time.LocalDate.now().year} FormDev Software GmbH. All rights reserved.",
"Implementation-Version" to project.version))
// add META-INF/LICENSE to all created JARs
from("${rootDir}/LICENSE") {
into("META-INF")
}
}
}
}

View File

@@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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,
@@ -14,12 +14,11 @@
* limitations under the License.
*/
version = rootProject.version
plugins {
`java-library`
`maven-publish`
id( "com.jfrog.bintray" ) version "1.8.4"
id( "com.jfrog.bintray" )
id( "com.jfrog.artifactory" )
}
if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) {
@@ -34,11 +33,6 @@ if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) {
}
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks {
assemble {
dependsOn(
@@ -53,7 +47,7 @@ tasks {
targetCompatibility = "9"
}
}
jar {
archiveBaseName.set( "flatlaf" )
@@ -68,6 +62,7 @@ tasks {
options {
this as StandardJavadocDocletOptions
tags = listOf( "uiDefault", "clientProperty" )
addStringOption( "Xdoclint:all,-missing", "-Xdoclint:all,-missing" )
}
isFailOnError = false
}
@@ -106,7 +101,7 @@ publishing {
licenses {
license {
name.set( "The Apache License, Version 2.0" )
url.set( "http://www.apache.org/licenses/LICENSE-2.0.txt" )
url.set( "https://www.apache.org/licenses/LICENSE-2.0.txt" )
}
}
@@ -127,8 +122,8 @@ publishing {
}
bintray {
user = System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" )
key = System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" )
user = rootProject.extra["bintray.user"] as String?
key = rootProject.extra["bintray.key"] as String?
setPublications( "maven" )
@@ -142,6 +137,29 @@ bintray {
name = project.version.toString()
}
publish = true
publish = rootProject.extra["bintray.publish"] as Boolean
dryRun = rootProject.extra["bintray.dryRun"] as Boolean
}
}
artifactory {
setContextUrl( "https://oss.jfrog.org" )
publish( closureOf<org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig> {
repository( delegateClosureOf<groovy.lang.GroovyObject> {
setProperty( "repoKey", "oss-snapshot-local" )
setProperty( "username", rootProject.extra["bintray.user"] as String? )
setProperty( "password", rootProject.extra["bintray.key"] as String? )
} )
defaults( delegateClosureOf<groovy.lang.GroovyObject> {
invokeMethod( "publications", "maven" )
setProperty( "publishArtifacts", true )
setProperty( "publishPom", true )
} )
} )
resolve( delegateClosureOf<org.jfrog.gradle.plugin.artifactory.dsl.ResolverConfig> {
setProperty( "repoKey", "jcenter" )
} )
}

View File

@@ -16,6 +16,7 @@
package com.formdev.flatlaf;
import java.awt.Color;
import java.util.Objects;
import javax.swing.JComponent;
@@ -43,13 +44,13 @@ public interface FlatClientProperties
String BUTTON_TYPE_SQUARE = "square";
/**
* Paint the toggle button in underline style.
* Paint the toggle button in tab style.
* <p>
* <strong>Components</strong> {@link javax.swing.JToggleButton}
*
* @see #TOGGLE_BUTTON_TYPE
* @see #BUTTON_TYPE
*/
String BUTTON_TYPE_UNDERLINE = "underline";
String BUTTON_TYPE_TAB = "tab";
/**
* Paint a help button (circle with question mark).
@@ -79,11 +80,35 @@ public interface FlatClientProperties
/**
* Specifies minimum width of a component.
* <p>
* <strong>Component</strong> {@link javax.swing.JButton} and {@link javax.swing.text.JTextComponent}<br>
* <strong>Component</strong> {@link javax.swing.JButton}, {@link javax.swing.JToggleButton} and {@link javax.swing.text.JTextComponent}<br>
* <strong>Value type</strong> {@link java.lang.Integer}<br>
*/
String MINIMUM_WIDTH = "JComponent.minimumWidth";
/**
* Specifies minimum height of a component.
* <p>
* <strong>Component</strong> {@link javax.swing.JButton} and {@link javax.swing.JToggleButton}<br>
* <strong>Value type</strong> {@link java.lang.Integer}<br>
*/
String MINIMUM_HEIGHT = "JComponent.minimumHeight";
/**
* Specifies whether the progress bar has always the larger height even if no string is painted.
* <p>
* <strong>Component</strong> {@link javax.swing.JProgressBar}<br>
* <strong>Value type</strong> {@link java.lang.Boolean}
*/
String PROGRESS_BAR_LARGE_HEIGHT = "JProgressBar.largeHeight";
/**
* Specifies whether the progress bar is paint with square edges.
* <p>
* <strong>Component</strong> {@link javax.swing.JProgressBar}<br>
* <strong>Value type</strong> {@link java.lang.Boolean}
*/
String PROGRESS_BAR_SQUARE = "JProgressBar.square";
/**
* Specifies whether the decrease/increase arrow buttons of a scrollbar are shown.
* <p>
@@ -108,14 +133,80 @@ public interface FlatClientProperties
*/
String TABBED_PANE_HAS_FULL_BORDER = "JTabbedPane.hasFullBorder";
/**
* Specifies the height of a tab.
* <p>
* <strong>Component</strong> {@link javax.swing.JTabbedPane}<br>
* <strong>Value type</strong> {@link java.lang.Integer}
*/
String TABBED_PANE_TAB_HEIGHT = "JTabbedPane.tabHeight";
/**
* Specifies whether all text is selected when the text component gains focus.
* <p>
* <strong>Component</strong> {@link javax.swing.JTextField} (and subclasses)<br>
* <strong>Value type</strong> {@link java.lang.String}<br>
* <strong>Allowed Values</strong> {@link #SELECT_ALL_ON_FOCUS_POLICY_NEVER},
* {@link #SELECT_ALL_ON_FOCUS_POLICY_ONCE} (default) or
* {@link #SELECT_ALL_ON_FOCUS_POLICY_ALWAYS}
*/
String SELECT_ALL_ON_FOCUS_POLICY = "JTextField.selectAllOnFocusPolicy";
/**
* Never select all text when the text component gains focus.
*
* @see #SELECT_ALL_ON_FOCUS_POLICY
*/
String SELECT_ALL_ON_FOCUS_POLICY_NEVER = "never";
/**
* Select all text when the text component gains focus for the first time
* and selection was not modified (is at end of text).
* This is the default.
*
* @see #SELECT_ALL_ON_FOCUS_POLICY
*/
String SELECT_ALL_ON_FOCUS_POLICY_ONCE = "once";
/**
* Always select all text when the text component gains focus.
*
* @see #SELECT_ALL_ON_FOCUS_POLICY
*/
String SELECT_ALL_ON_FOCUS_POLICY_ALWAYS = "always";
/**
* Placeholder text that is only painted if the text field is empty.
* <p>
* <strong>Component</strong> {@link javax.swing.JTextField} or {@link javax.swing.JComboBox}<br>
* <strong>Component</strong> {@link javax.swing.JTextField} (and subclasses) or {@link javax.swing.JComboBox}<br>
* <strong>Value type</strong> {@link java.lang.String}
*/
String PLACEHOLDER_TEXT = "JTextField.placeholderText";
/**
* Height of underline if toggle button type is {@link #BUTTON_TYPE_TAB}.
* <p>
* <strong>Component</strong> {@link javax.swing.JToggleButton}<br>
* <strong>Value type</strong> {@link java.lang.Integer}
*/
String TAB_BUTTON_UNDERLINE_HEIGHT = "JToggleButton.tab.underlineHeight";
/**
* Color of underline if toggle button type is {@link #BUTTON_TYPE_TAB}.
* <p>
* <strong>Component</strong> {@link javax.swing.JToggleButton}<br>
* <strong>Value type</strong> {@link java.awt.Color}
*/
String TAB_BUTTON_UNDERLINE_COLOR = "JToggleButton.tab.underlineColor";
/**
* Background color if selected and toggle button type is {@link #BUTTON_TYPE_TAB}.
* <p>
* <strong>Component</strong> {@link javax.swing.JToggleButton}<br>
* <strong>Value type</strong> {@link java.awt.Color}
*/
String TAB_BUTTON_SELECTED_BACKGROUND = "JToggleButton.tab.selectedBackground";
/**
* Checks whether a client property of a component has the given value.
*/
@@ -131,4 +222,22 @@ public interface FlatClientProperties
Object value = c.getClientProperty( key );
return (value instanceof Boolean) ? (boolean) value : defaultValue;
}
/**
* Checks whether a client property of a component is an integer and returns its value.
* If the client property is not set, or not an integer, defaultValue is returned.
*/
static int clientPropertyInt( JComponent c, String key, int defaultValue ) {
Object value = c.getClientProperty( key );
return (value instanceof Integer) ? (int) value : defaultValue;
}
/**
* Checks whether a client property of a component is a color and returns its value.
* If the client property is not set, or not a color, defaultValue is returned.
*/
static Color clientPropertyColor( JComponent c, String key, Color defaultValue ) {
Object value = c.getClientProperty( key );
return (value instanceof Color) ? (Color) value : defaultValue;
}
}

View File

@@ -28,17 +28,23 @@ import java.awt.Window;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.util.List;
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractButton;
import javax.swing.InputMap;
import javax.swing.JLabel;
import javax.swing.JRootPane;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.LookAndFeel;
import javax.swing.PopupFactory;
import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIDefaults.LazyValue;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.ColorUIResource;
@@ -66,6 +72,7 @@ public abstract class FlatLaf
private KeyEventPostProcessor mnemonicListener;
private static boolean showMnemonics;
private static WeakReference<Window> lastShowMnemonicWindow;
private Consumer<UIDefaults> postInitialization;
@@ -188,7 +195,11 @@ public abstract class FlatLaf
// use Mac Aqua LaF as base
String aquaLafClassName = "com.apple.laf.AquaLookAndFeel";
try {
base = (BasicLookAndFeel) Class.forName( aquaLafClassName ).newInstance();
if( SystemInfo.IS_JAVA_9_OR_LATER ) {
Method m = UIManager.class.getMethod( "createLookAndFeel", String.class );
base = (BasicLookAndFeel) m.invoke( null, "Mac OS X" );
} else
base = (BasicLookAndFeel) Class.forName( aquaLafClassName ).newInstance();
} catch( Exception ex ) {
LOG.log( Level.SEVERE, "FlatLaf: Failed to initialize base look and feel '" + aquaLafClassName + "'.", ex );
throw new IllegalStateException();
@@ -229,6 +240,7 @@ public abstract class FlatLaf
initFonts( defaults );
initIconColors( defaults, isDark() );
initInputMaps( defaults );
// load defaults from properties
List<Class<?>> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading();
@@ -287,10 +299,9 @@ public abstract class FlatLaf
// override fonts
for( Object key : defaults.keySet() ) {
if( key instanceof String && ((String)key).endsWith( ".font" ) )
if( key instanceof String && (((String)key).endsWith( ".font" ) || ((String)key).endsWith( "Font" )) )
defaults.put( key, uiFont );
}
defaults.put( "MenuItem.acceleratorFont", uiFont );
// use smaller font for progress bar
defaults.put( "ProgressBar.font", UIScale.scaleFont( uiFont, 0.85f ) );
@@ -335,6 +346,57 @@ public abstract class FlatLaf
defaults.put( "Objects.BlackText", new ColorUIResource( 0x231F20 ) );
}
private void initInputMaps( UIDefaults defaults ) {
if( SystemInfo.IS_MAC ) {
// AquaLookAndFeel (the base for UI defaults on macOS) uses special
// action keys (e.g. "aquaExpandNode") for some macOS specific behaviour.
// Those action keys are not available in FlatLaf, which makes it
// necessary to make some modifications.
// combobox
defaults.put( "ComboBox.ancestorInputMap", new UIDefaults.LazyInputMap( new Object[] {
"ESCAPE", "hidePopup",
"PAGE_UP", "pageUpPassThrough",
"PAGE_DOWN", "pageDownPassThrough",
"HOME", "homePassThrough",
"END", "endPassThrough",
"DOWN", "selectNext",
"KP_DOWN", "selectNext",
"SPACE", "spacePopup",
"ENTER", "enterPressed",
"UP", "selectPrevious",
"KP_UP", "selectPrevious"
} ) );
// tree node expanding/collapsing
modifyInputMap( defaults, "Tree.focusInputMap",
"RIGHT", "selectChild",
"KP_RIGHT", "selectChild",
"LEFT", "selectParent",
"KP_LEFT", "selectParent",
"shift RIGHT", null,
"shift KP_RIGHT", null,
"shift LEFT", null,
"shift KP_LEFT", null,
"ctrl LEFT", null,
"ctrl KP_LEFT", null,
"ctrl RIGHT", null,
"ctrl KP_RIGHT", null
);
defaults.put( "Tree.focusInputMap.RightToLeft", new UIDefaults.LazyInputMap( new Object[] {
"RIGHT", "selectParent",
"KP_RIGHT", "selectParent",
"LEFT", "selectChild",
"KP_LEFT", "selectChild"
} ) );
}
}
private void modifyInputMap( UIDefaults defaults, String key, Object... bindings ) {
// Note: not using `defaults.get(key)` here because this would resolve the lazy value
defaults.put( key, new LazyModifyInputMap( defaults.remove( key ), bindings ) );
}
private static void reSetLookAndFeel() {
EventQueue.invokeLater( () -> {
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
@@ -373,15 +435,15 @@ public abstract class FlatLaf
if( SystemInfo.IS_MAC ) {
// Ctrl+Alt keys must be pressed on Mac
if( keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_ALT )
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED && e.isControlDown() && e.isAltDown() );
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED && e.isControlDown() && e.isAltDown(), e.getComponent() );
} else {
// Alt key must be pressed on Windows and Linux
if( keyCode == KeyEvent.VK_ALT )
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED );
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED, e.getComponent() );
}
}
private static void showMnemonics( boolean show ) {
private static void showMnemonics( boolean show, Component c ) {
if( show == showMnemonics )
return;
@@ -391,22 +453,35 @@ public abstract class FlatLaf
if( !UIManager.getBoolean( "Component.hideMnemonics" ) )
return;
// get focus owner
Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
if( focusOwner == null )
return;
if( show ) {
// get root pane
JRootPane rootPane = SwingUtilities.getRootPane( c );
if( rootPane == null )
return;
// get focused window
Window window = SwingUtilities.windowForComponent( focusOwner );
if( window == null )
return;
// get window
Window window = SwingUtilities.getWindowAncestor( rootPane );
if( window == null )
return;
// repaint components with mnemonics in focused window
repaintMnemonics( window );
// repaint components with mnemonics in focused window
repaintMnemonics( window );
lastShowMnemonicWindow = new WeakReference<>( window );
} else if( lastShowMnemonicWindow != null ) {
Window window = lastShowMnemonicWindow.get();
if( window != null )
repaintMnemonics( window );
lastShowMnemonicWindow = null;
}
}
private static void repaintMnemonics( Container container ) {
for( Component c : container.getComponents() ) {
if( !c.isVisible() )
continue;
if( hasMnemonic( c ) )
c.repaint();
@@ -433,4 +508,40 @@ public abstract class FlatLaf
return false;
}
//---- class LazyModifyInputMap -------------------------------------------
/**
* Takes a (lazy) base input map and lazily applies modifications to it specified in bindings.
*/
private static class LazyModifyInputMap
implements LazyValue
{
private final Object baseInputMap;
private final Object[] bindings;
public LazyModifyInputMap( Object baseInputMap, Object[] bindings ) {
this.baseInputMap = baseInputMap;
this.bindings = bindings;
}
@Override
public Object createValue( UIDefaults table ) {
// get base input map
InputMap inputMap = (baseInputMap instanceof LazyValue)
? (InputMap) ((LazyValue)baseInputMap).createValue( table )
: (InputMap) baseInputMap;
// modify input map (replace or remove)
for( int i = 0; i < bindings.length; i += 2 ) {
KeyStroke keyStroke = KeyStroke.getKeyStroke( (String) bindings[i] );
if( bindings[i + 1] != null )
inputMap.put( keyStroke, bindings[i + 1] );
else
inputMap.remove( keyStroke );
}
return inputMap;
}
}
}

View File

@@ -445,11 +445,11 @@ public class IntelliJTheme
for( Map.Entry<String, String> e : uiKeyMapping.entrySet() )
uiKeyInverseMapping.put( e.getValue(), e.getKey() );
uiKeyCopying.put( "ToggleButton.underline.underlineColor", "TabbedPane.underlineColor" );
uiKeyCopying.put( "ToggleButton.underline.disabledUnderlineColor", "TabbedPane.disabledUnderlineColor" );
uiKeyCopying.put( "ToggleButton.underline.selectedBackground", "TabbedPane.selectedBackground" );
uiKeyCopying.put( "ToggleButton.underline.hoverBackground", "TabbedPane.hoverColor" );
uiKeyCopying.put( "ToggleButton.underline.focusBackground", "TabbedPane.focusColor" );
uiKeyCopying.put( "ToggleButton.tab.underlineColor", "TabbedPane.underlineColor" );
uiKeyCopying.put( "ToggleButton.tab.disabledUnderlineColor", "TabbedPane.disabledUnderlineColor" );
uiKeyCopying.put( "ToggleButton.tab.selectedBackground", "TabbedPane.selectedBackground" );
uiKeyCopying.put( "ToggleButton.tab.hoverBackground", "TabbedPane.hoverColor" );
uiKeyCopying.put( "ToggleButton.tab.focusBackground", "TabbedPane.focusColor" );
checkboxKeyMapping.put( "Checkbox.Background.Default", "CheckBox.icon.background" );
checkboxKeyMapping.put( "Checkbox.Background.Disabled", "CheckBox.icon.disabledBackground" );

View File

@@ -221,7 +221,8 @@ class UIDefaultsLoader
return resolveValue( properties, newValue );
}
private enum ValueType { UNKNOWN, STRING, INTEGER, FLOAT, BORDER, ICON, INSETS, DIMENSION, COLOR, SCALEDINTEGER, INSTANCE, CLASS }
private enum ValueType { UNKNOWN, STRING, CHARACTER, INTEGER, FLOAT, BORDER, ICON, INSETS, DIMENSION, COLOR,
SCALEDINTEGER, SCALEDFLOAT, SCALEDINSETS, SCALEDDIMENSION, INSTANCE, CLASS }
static Object parseValue( String key, String value ) {
return parseValue( key, value, v -> v, Collections.emptyList() );
@@ -284,6 +285,8 @@ class UIDefaultsLoader
valueType = ValueType.DIMENSION;
else if( key.endsWith( "Width" ) || key.endsWith( "Height" ) )
valueType = ValueType.INTEGER;
else if( key.endsWith( "Char" ) )
valueType = ValueType.CHARACTER;
else if( key.endsWith( "UI" ) )
valueType = ValueType.STRING;
}
@@ -291,6 +294,7 @@ class UIDefaultsLoader
// parse value
switch( valueType ) {
case STRING: return value;
case CHARACTER: return parseCharacter( value );
case INTEGER: return parseInteger( value, true );
case FLOAT: return parseFloat( value, true );
case BORDER: return parseBorder( value, resolver, addonClassLoaders );
@@ -299,6 +303,9 @@ class UIDefaultsLoader
case DIMENSION: return parseDimension( value );
case COLOR: return parseColorOrFunction( value, resolver, true );
case SCALEDINTEGER: return parseScaledInteger( value );
case SCALEDFLOAT: return parseScaledFloat( value );
case SCALEDINSETS: return parseScaledInsets( value );
case SCALEDDIMENSION:return parseScaledDimension( value );
case INSTANCE: return parseInstance( value, addonClassLoaders );
case CLASS: return parseClass( value, addonClassLoaders );
case UNKNOWN:
@@ -595,6 +602,12 @@ class UIDefaultsLoader
return val;
}
private static Character parseCharacter( String value ) {
if( value.length() != 1 )
throw new IllegalArgumentException( "invalid character '" + value + "'" );
return value.charAt( 0 );
}
private static Integer parseInteger( String value, int min, int max ) {
Integer integer = parseInteger( value, true );
if( integer.intValue() < min || integer.intValue() > max )
@@ -629,6 +642,27 @@ class UIDefaultsLoader
};
}
private static ActiveValue parseScaledFloat( String value ) {
float val = parseFloat( value, true );
return (ActiveValue) t -> {
return UIScale.scale( val );
};
}
private static ActiveValue parseScaledInsets( String value ) {
Insets insets = parseInsets( value );
return (ActiveValue) t -> {
return UIScale.scale( insets );
};
}
private static ActiveValue parseScaledDimension( String value ) {
Dimension dimension = parseDimension( value );
return (ActiveValue) t -> {
return UIScale.scale( dimension );
};
}
/**
* Split string and trim parts.
*/

View File

@@ -47,7 +47,7 @@ public class FlatAscendingSortIcon
g.setColor( sortIconColor );
if( chevron ) {
// chevron arrow
Path2D path = FlatUIUtils.createPath( false, 1,5, 5,1, 9,5 );
Path2D path = FlatUIUtils.createPath( false, 1,4, 5,0, 9,4 );
g.setStroke( new BasicStroke( 1f ) );
g.draw( path );
} else {

View File

@@ -47,7 +47,7 @@ public class FlatDescendingSortIcon
g.setColor( sortIconColor );
if( chevron ) {
// chevron arrow
Path2D path = FlatUIUtils.createPath( false, 1,1, 5,5, 9,1 );
Path2D path = FlatUIUtils.createPath( false, 1,0, 5,4, 9,0 );
g.setStroke( new BasicStroke( 1f ) );
g.draw( path );
} else {

View File

@@ -0,0 +1,60 @@
/*
* Copyright 2019 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.icons;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatButtonUI;
import com.formdev.flatlaf.ui.FlatUIUtils;
/**
* Base class for internal frame icons.
*
* @uiDefault InternalFrame.buttonHoverBackground Color
* @uiDefault InternalFrame.buttonPressedBackground Color
*
* @author Karl Tauber
*/
public abstract class FlatInternalFrameAbstractIcon
extends FlatAbstractIcon
{
private final Color hoverBackground;
private final Color pressedBackground;
public FlatInternalFrameAbstractIcon() {
this( UIManager.getDimension( "InternalFrame.buttonSize" ),
UIManager.getColor( "InternalFrame.buttonHoverBackground" ),
UIManager.getColor( "InternalFrame.buttonPressedBackground" ) );
}
public FlatInternalFrameAbstractIcon( Dimension size, Color hoverBackground, Color pressedBackground ) {
super( size.width, size.height, null );
this.hoverBackground = hoverBackground;
this.pressedBackground = pressedBackground;
}
protected void paintBackground( Component c, Graphics2D g ) {
Color background = FlatButtonUI.buttonStateColor( c, null, null, null, hoverBackground, pressedBackground );
if( background != null ) {
FlatUIUtils.setColor( g, background, c.getBackground() );
g.fillRect( 0, 0, width, height );
}
}
}

View File

@@ -17,30 +17,42 @@
package com.formdev.flatlaf.icons;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatButtonUI;
/**
* "close" icon for {@link javax.swing.JInternalFrame}.
*
* @uiDefault InternalFrame.iconColor Color
* @uiDefault InternalFrame.buttonHoverBackground Color
* @uiDefault InternalFrame.buttonPressedBackground Color
*
* @author Karl Tauber
*/
public class FlatInternalFrameCloseIcon
extends FlatAbstractIcon
extends FlatInternalFrameAbstractIcon
{
private final Color hoverForeground = UIManager.getColor( "InternalFrame.closeHoverForeground" );
private final Color pressedForeground = UIManager.getColor( "InternalFrame.closePressedForeground" );
public FlatInternalFrameCloseIcon() {
super( 16, 16, UIManager.getColor( "InternalFrame.iconColor" ) );
super( UIManager.getDimension( "InternalFrame.buttonSize" ),
UIManager.getColor( "InternalFrame.closeHoverBackground" ),
UIManager.getColor( "InternalFrame.closePressedBackground" ) );
}
@Override
protected void paintIcon( Component c, Graphics2D g ) {
float mx = 8;
float my = 8;
paintBackground( c, g );
g.setColor( FlatButtonUI.buttonStateColor( c, c.getForeground(), null, null, hoverForeground, pressedForeground ) );
float mx = width / 2;
float my = height / 2;
float r = 3.25f;
Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );

View File

@@ -18,24 +18,23 @@ package com.formdev.flatlaf.icons;
import java.awt.Component;
import java.awt.Graphics2D;
import javax.swing.UIManager;
/**
* "iconify" icon for {@link javax.swing.JInternalFrame}.
*
* @uiDefault InternalFrame.iconColor Color
*
* @author Karl Tauber
*/
public class FlatInternalFrameIconifyIcon
extends FlatAbstractIcon
extends FlatInternalFrameAbstractIcon
{
public FlatInternalFrameIconifyIcon() {
super( 16, 16, UIManager.getColor( "InternalFrame.iconColor" ) );
}
@Override
protected void paintIcon( Component c, Graphics2D g ) {
g.fillRect( 3, 8, 10, 1 );
paintBackground( c, g );
g.setColor( c.getForeground() );
g.fillRect( (width / 2) - 4, height / 2, 8, 1 );
}
}

View File

@@ -18,25 +18,24 @@ package com.formdev.flatlaf.icons;
import java.awt.Component;
import java.awt.Graphics2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatUIUtils;
/**
* "maximize" icon for {@link javax.swing.JInternalFrame}.
*
* @uiDefault InternalFrame.iconColor Color
*
* @author Karl Tauber
*/
public class FlatInternalFrameMaximizeIcon
extends FlatAbstractIcon
extends FlatInternalFrameAbstractIcon
{
public FlatInternalFrameMaximizeIcon() {
super( 16, 16, UIManager.getColor( "InternalFrame.iconColor" ) );
}
@Override
protected void paintIcon( Component c, Graphics2D g ) {
g.fill( FlatUIUtils.createRectangle( 3, 3, 10, 10, 1 ) );
paintBackground( c, g );
g.setColor( c.getForeground() );
g.fill( FlatUIUtils.createRectangle( (width / 2) - 4, (height / 2) - 4, 8, 8, 1 ) );
}
}

View File

@@ -21,30 +21,32 @@ import java.awt.Graphics2D;
import java.awt.geom.Area;
import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatUIUtils;
/**
* "minimize" (actually "restore") icon for {@link javax.swing.JInternalFrame}.
*
* @uiDefault InternalFrame.iconColor Color
*
* @author Karl Tauber
*/
public class FlatInternalFrameMinimizeIcon
extends FlatAbstractIcon
extends FlatInternalFrameAbstractIcon
{
public FlatInternalFrameMinimizeIcon() {
super( 16, 16, UIManager.getColor( "InternalFrame.iconColor" ) );
}
@Override
protected void paintIcon( Component c, Graphics2D g ) {
Path2D r1 = FlatUIUtils.createRectangle( 5, 3, 8, 8, 1 );
Path2D r2 = FlatUIUtils.createRectangle( 3, 5, 8, 8, 1 );
paintBackground( c, g );
g.setColor( c.getForeground() );
int x = (width / 2) - 4;
int y = (height / 2) - 4;
Path2D r1 = FlatUIUtils.createRectangle( x + 1, y - 1, 8, 8, 1 );
Path2D r2 = FlatUIUtils.createRectangle( x - 1, y + 1, 8, 8, 1 );
Area area = new Area( r1 );
area.subtract( new Area( new Rectangle2D.Float( 3, 5, 8, 8 ) ) );
area.subtract( new Area( new Rectangle2D.Float( x - 1, y + 1, 8, 8 ) ) );
g.fill( area );
g.fill( r2 );

View File

@@ -73,14 +73,16 @@ public class FlatBorder
FlatUIUtils.setRenderingHints( g2 );
boolean isCellEditor = isTableCellEditor( c );
float focusWidth = isCellEditor ? 0 : getFocusWidth();
float focusWidth = isCellEditor ? 0 : getFocusWidth( c );
float borderWidth = getBorderWidth( c );
float arc = isCellEditor ? 0 : getArc( c );
if( isFocused( c ) ) {
float innerFocusWidth = !(c instanceof JScrollPane) ? this.innerFocusWidth : 0;
g2.setColor( getFocusColor( c ) );
FlatUIUtils.paintComponentOuterBorder( g2, x, y, width, height, focusWidth,
getLineWidth() + scale( innerFocusWidth ), arc );
getLineWidth( c ) + scale( innerFocusWidth ), arc );
}
g2.setPaint( getBorderColor( c ) );
@@ -151,7 +153,7 @@ public class FlatBorder
@Override
public Insets getBorderInsets( Component c, Insets insets ) {
boolean isCellEditor = isTableCellEditor( c );
float ow = (isCellEditor ? 0 : getFocusWidth()) + getLineWidth();
float ow = (isCellEditor ? 0 : getFocusWidth( c )) + getLineWidth( c );
insets = super.getBorderInsets( c, insets );
insets.top = Math.round( scale( (float) insets.top ) + ow );
@@ -161,16 +163,16 @@ public class FlatBorder
return insets;
}
protected float getFocusWidth() {
protected float getFocusWidth( Component c ) {
return scale( (float) focusWidth );
}
protected float getLineWidth() {
protected float getLineWidth( Component c ) {
return scale( 1f );
}
protected float getBorderWidth( Component c ) {
return getLineWidth();
return getLineWidth( c );
}
protected float getArc( Component c ) {

View File

@@ -23,9 +23,10 @@ import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Paint;
import javax.swing.JButton;
import javax.swing.AbstractButton;
import javax.swing.UIManager;
import javax.swing.plaf.UIResource;
import com.formdev.flatlaf.util.UIScale;
/**
* Border for {@link javax.swing.JButton}.
@@ -43,6 +44,8 @@ import javax.swing.plaf.UIResource;
* @uiDefault Button.default.focusedBorderColor Color
* @uiDefault Button.default.focusColor Color
* @uiDefault Button.default.borderWidth int
* @uiDefault Button.toolbar.margin Insets
* @uiDefault Button.toolbar.spacingInsets Insets
* @uiDefault Button.arc int
*
* @author Karl Tauber
@@ -61,12 +64,17 @@ public class FlatButtonBorder
protected final Color defaultFocusedBorderColor = UIManager.getColor( "Button.default.focusedBorderColor" );
protected final Color defaultFocusColor = UIManager.getColor( "Button.default.focusColor" );
protected final int defaultBorderWidth = UIManager.getInt( "Button.default.borderWidth" );
protected final Insets toolbarMargin = UIManager.getInsets( "Button.toolbar.margin" );
protected final Insets toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
protected final int arc = UIManager.getInt( "Button.arc" );
@Override
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
if( FlatButtonUI.isContentAreaFilled( c ) && !FlatButtonUI.isHelpButton( c ) && !FlatToggleButtonUI.isUnderlineButton( c ) )
super.paintBorder( c, g, x, y, width, height );
if( FlatButtonUI.isContentAreaFilled( c ) &&
!FlatButtonUI.isToolBarButton( c ) &&
!FlatButtonUI.isHelpButton( c ) &&
!FlatToggleButtonUI.isTabButton( c ) )
super.paintBorder( c, g, x, y, width, height );
}
@Override
@@ -95,15 +103,31 @@ public class FlatButtonBorder
@Override
public Insets getBorderInsets( Component c, Insets insets ) {
insets = super.getBorderInsets( c, insets );
if( FlatButtonUI.isToolBarButton( c ) ) {
// In toolbars, use button margin only if explicitly set.
// Otherwise use toolbar margin specified in UI defaults.
Insets margin = (c instanceof AbstractButton)
? ((AbstractButton)c).getMargin()
: null;
// use smaller left and right insets for icon-only buttons (so that they are square)
if( FlatButtonUI.isIconOnlyButton( c ) && ((JButton)c).getMargin() instanceof UIResource )
insets.left = insets.right = Math.min( insets.top, insets.bottom );
FlatUIUtils.setInsets( insets, UIScale.scale( FlatUIUtils.addInsets( toolbarSpacingInsets,
(margin != null && !(margin instanceof UIResource)) ? margin : toolbarMargin ) ) );
} else {
insets = super.getBorderInsets( c, insets );
// use smaller left and right insets for icon-only buttons (so that they are square)
if( FlatButtonUI.isIconOnlyButton( c ) && ((AbstractButton)c).getMargin() instanceof UIResource )
insets.left = insets.right = Math.min( insets.top, insets.bottom );
}
return insets;
}
@Override
protected float getFocusWidth( Component c ) {
return FlatToggleButtonUI.isTabButton( c ) ? 0 : super.getFocusWidth(c );
}
@Override
protected float getBorderWidth( Component c ) {
return FlatButtonUI.isDefaultButton( c ) ? scale( (float) defaultBorderWidth ) : super.getBorderWidth( c );

View File

@@ -26,19 +26,23 @@ import java.awt.FontMetrics;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.geom.RoundRectangle2D;
import java.beans.PropertyChangeEvent;
import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicButtonListener;
import javax.swing.plaf.basic.BasicButtonUI;
import com.formdev.flatlaf.FlatLaf;
import com.formdev.flatlaf.util.UIScale;
@@ -79,6 +83,7 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault Button.shadowWidth int default is 2
* @uiDefault Button.shadowColor Color optional
* @uiDefault Button.default.shadowColor Color optional
* @uiDefault Button.toolbar.spacingInsets Insets
* @uiDefault Button.toolbar.hoverBackground Color
* @uiDefault Button.toolbar.pressedBackground Color
*
@@ -111,6 +116,7 @@ public class FlatButtonUI
protected Color shadowColor;
protected Color defaultShadowColor;
protected Insets toolbarSpacingInsets;
protected Color toolbarHoverBackground;
protected Color toolbarPressedBackground;
@@ -163,6 +169,7 @@ public class FlatButtonUI
defaultPressedBackground = UIManager.getColor( "Button.default.pressedBackground" );
defaultBoldText = UIManager.getBoolean( "Button.default.boldText" );
toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
toolbarHoverBackground = UIManager.getColor( prefix + "toolbar.hoverBackground" );
toolbarPressedBackground = UIManager.getColor( prefix + "toolbar.pressedBackground" );
@@ -180,7 +187,7 @@ public class FlatButtonUI
LookAndFeel.installProperty( b, "opaque", false );
LookAndFeel.installProperty( b, "iconTextGap", scale( iconTextGap ) );
MigLayoutVisualPadding.install( b, focusWidth );
MigLayoutVisualPadding.install( b, getFocusWidth( b ) );
}
@Override
@@ -191,6 +198,26 @@ public class FlatButtonUI
defaults_initialized = false;
}
@Override
protected BasicButtonListener createButtonListener( AbstractButton b ) {
return new BasicButtonListener( b ) {
@Override
public void propertyChange( PropertyChangeEvent e ) {
super.propertyChange( e );
FlatButtonUI.this.propertyChange( b, e );
}
};
}
protected void propertyChange( AbstractButton b, PropertyChangeEvent e ) {
switch( e.getPropertyName() ) {
case MINIMUM_WIDTH:
case MINIMUM_HEIGHT:
b.revalidate();
break;
}
}
static boolean isContentAreaFilled( Component c ) {
return !(c instanceof AbstractButton) || ((AbstractButton)c).isContentAreaFilled();
}
@@ -200,11 +227,11 @@ public class FlatButtonUI
}
static boolean isIconOnlyButton( Component c ) {
if( !(c instanceof JButton) )
if( !(c instanceof JButton) && !(c instanceof JToggleButton) )
return false;
Icon icon = ((JButton)c).getIcon();
String text = ((JButton)c).getText();
Icon icon = ((AbstractButton)c).getIcon();
String text = ((AbstractButton)c).getText();
return (icon != null && (text == null || text.isEmpty())) ||
(icon == null && text != null && ("...".equals( text ) || text.length() == 1));
}
@@ -217,7 +244,7 @@ public class FlatButtonUI
return c instanceof JButton && clientPropertyEquals( (JButton) c, BUTTON_TYPE, BUTTON_TYPE_HELP );
}
static boolean isToolBarButton( JComponent c ) {
static boolean isToolBarButton( Component c ) {
return c.getParent() instanceof JToolBar;
}
@@ -246,27 +273,42 @@ public class FlatButtonUI
FlatUIUtils.setRenderingHints( g2 );
Border border = c.getBorder();
float focusWidth = (border instanceof FlatBorder) ? scale( (float) this.focusWidth ) : 0;
float arc = ((border instanceof FlatButtonBorder && !isSquareButton( c )) || isToolBarButton( c ))
boolean isToolBarButton = isToolBarButton( c );
float focusWidth = (border instanceof FlatBorder && !isToolBarButton) ? scale( (float) getFocusWidth( c ) ) : 0;
float arc = ((border instanceof FlatButtonBorder && !isSquareButton( c )) || isToolBarButton)
? scale( (float) this.arc ) : 0;
boolean def = isDefaultButton( c );
int x = 0;
int y = 0;
int width = c.getWidth();
int height = c.getHeight();
if( isToolBarButton ) {
Insets spacing = UIScale.scale( toolbarSpacingInsets );
x += spacing.left;
y += spacing.top;
width -= spacing.left + spacing.right;
height -= spacing.top + spacing.bottom;
}
// paint shadow
Color shadowColor = def ? defaultShadowColor : this.shadowColor;
if( shadowColor != null && shadowWidth > 0 && focusWidth > 0 && !c.hasFocus() && c.isEnabled() ) {
if( !isToolBarButton && shadowColor != null && shadowWidth > 0 && focusWidth > 0 && !c.hasFocus() && c.isEnabled() ) {
g2.setColor( shadowColor );
g2.fill( new RoundRectangle2D.Float( focusWidth, focusWidth + UIScale.scale( (float) shadowWidth ),
c.getWidth() - focusWidth * 2, c.getHeight() - focusWidth * 2, arc, arc ) );
width - focusWidth * 2, height - focusWidth * 2, arc, arc ) );
}
// paint background
Color startBg = def ? defaultBackground : startBackground;
Color endBg = def ? defaultEndBackground : endBackground;
if( background == startBg && endBg != null && !startBg.equals( endBg ) )
g2.setPaint( new GradientPaint( 0, 0, startBg, 0, c.getHeight(), endBg ) );
g2.setPaint( new GradientPaint( 0, 0, startBg, 0, height, endBg ) );
else
FlatUIUtils.setColor( g2, background, def ? defaultBackground : c.getBackground() );
FlatUIUtils.paintComponentBackground( g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, arc );
FlatUIUtils.paintComponentBackground( g2, x, y, width, height, focusWidth, arc );
} finally {
g2.dispose();
}
@@ -362,9 +404,16 @@ public class FlatButtonUI
// or apply minimum width, if not in toolbar and not a icon-only button
if( isIconOnlyButton( c ) )
prefSize.width = Math.max( prefSize.width, prefSize.height );
else if( !isToolBarButton( c ) )
else if( !isToolBarButton( c ) && c.getBorder() instanceof FlatButtonBorder ) {
int focusWidth = getFocusWidth( c );
prefSize.width = Math.max( prefSize.width, scale( FlatUIUtils.minimumWidth( c, minimumWidth ) + (focusWidth * 2) ) );
prefSize.height = Math.max( prefSize.height, scale( FlatUIUtils.minimumHeight( c, 0 ) + (focusWidth * 2) ) );
}
return prefSize;
}
protected int getFocusWidth( JComponent c ) {
return focusWidth;
}
}

View File

@@ -0,0 +1,128 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.EventQueue;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import javax.swing.JFormattedTextField;
import javax.swing.plaf.UIResource;
import javax.swing.text.DefaultCaret;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
/**
* Caret that can select all text on focus gained.
*
* @author Karl Tauber
*/
class FlatCaret
extends DefaultCaret
implements UIResource
{
private final String selectAllOnFocusPolicy;
private boolean wasFocused;
private boolean wasTemporaryLost;
private boolean isMousePressed;
FlatCaret( String selectAllOnFocusPolicy ) {
this.selectAllOnFocusPolicy = selectAllOnFocusPolicy;
}
@Override
public void install( JTextComponent c ) {
super.install( c );
// the dot and mark are lost when switching LaF
// --> move dot to end of text so that all text may be selected when it gains focus
Document doc = c.getDocument();
if( doc != null && getDot() == 0 && getMark() == 0 ) {
int length = doc.getLength();
if( length > 0 )
setDot( length );
}
}
@Override
public void focusGained( FocusEvent e ) {
if( !wasTemporaryLost && !isMousePressed )
selectAllOnFocusGained();
wasTemporaryLost = false;
wasFocused = true;
super.focusGained( e );
}
@Override
public void focusLost( FocusEvent e ) {
wasTemporaryLost = e.isTemporary();
super.focusLost( e );
}
@Override
public void mousePressed( MouseEvent e ) {
isMousePressed = true;
super.mousePressed( e );
}
@Override
public void mouseReleased( MouseEvent e ) {
isMousePressed = false;
super.mouseReleased( e );
}
private void selectAllOnFocusGained() {
JTextComponent c = getComponent();
Document doc = c.getDocument();
if( doc == null || !c.isEnabled() || !c.isEditable() )
return;
Object selectAllOnFocusPolicy = c.getClientProperty( SELECT_ALL_ON_FOCUS_POLICY );
if( selectAllOnFocusPolicy == null )
selectAllOnFocusPolicy = this.selectAllOnFocusPolicy;
if( SELECT_ALL_ON_FOCUS_POLICY_NEVER.equals( selectAllOnFocusPolicy ) )
return;
if( !SELECT_ALL_ON_FOCUS_POLICY_ALWAYS.equals( selectAllOnFocusPolicy ) ) {
// policy is "once" (or null or unknown)
// was already focused?
if( wasFocused )
return;
// check whether selection was modified before gaining focus
int dot = getDot();
int mark = getMark();
if( dot != mark || dot != doc.getLength() )
return;
}
// select all
if( c instanceof JFormattedTextField ) {
EventQueue.invokeLater( () -> {
setDot( 0 );
moveDot( doc.getLength() );
} );
} else {
setDot( 0 );
moveDot( doc.getLength() );
}
}
}

View File

@@ -17,8 +17,11 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.beans.PropertyChangeListener;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicCheckBoxMenuItemUI;
@@ -74,4 +77,9 @@ public class FlatCheckBoxMenuItemUI
defaultTextIconGap = scale( defaultTextIconGap );
};
}
@Override
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
FlatMenuItemUI.paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
}
}

View File

@@ -28,6 +28,8 @@ import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseListener;
@@ -35,13 +37,16 @@ import java.awt.geom.Rectangle2D;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.ref.WeakReference;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.ListCellRenderer;
import javax.swing.LookAndFeel;
import javax.swing.SwingConstants;
@@ -54,6 +59,7 @@ import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.text.JTextComponent;
import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.util.SystemInfo;
import com.formdev.flatlaf.util.UIScale;
/**
@@ -271,6 +277,18 @@ public class FlatComboBoxUI
editor.applyComponentOrientation( comboBox.getComponentOrientation() );
updateEditorColors();
// macOS
if( SystemInfo.IS_MAC && editor instanceof JTextComponent ) {
// delegate actions from editor text field to combobox, which is necessary
// because text field on macOS (based on Aqua LaF UI defaults)
// already handle those keys
InputMap inputMap = ((JTextComponent)editor).getInputMap();
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "UP" ) );
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "KP_UP" ) );
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "DOWN" ) );
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "KP_DOWN" ) );
}
}
private void updateEditorColors() {
@@ -608,4 +626,31 @@ public class FlatComboBoxUI
rendererBorder.paintBorder( c, g, x, y, width, height );
}
}
//---- class EditorDelegateAction -----------------------------------------
/**
* Delegates actions from editor text field to combobox.
*/
private class EditorDelegateAction
extends AbstractAction
{
private final KeyStroke keyStroke;
EditorDelegateAction( InputMap inputMap, KeyStroke keyStroke ) {
this.keyStroke = keyStroke;
// add to input map
inputMap.put( keyStroke, this );
}
@Override
public void actionPerformed( ActionEvent e ) {
ActionListener action = comboBox.getActionForKeyStroke( keyStroke );
if( action != null ) {
action.actionPerformed( new ActionEvent( comboBox, e.getID(),
e.getActionCommand(), e.getWhen(), e.getModifiers() ) );
}
}
}
}

View File

@@ -0,0 +1,308 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.ui;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Point;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.beans.PropertyVetoException;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JRootPane;
import javax.swing.JToolTip;
import javax.swing.LookAndFeel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicDesktopIconUI;
import com.formdev.flatlaf.util.UIScale;
/**
* Provides the Flat LaF UI delegate for {@link javax.swing.JInternalFrame.JDesktopIcon}.
*
* <!-- BasicDesktopIconUI -->
*
* @uiDefault DesktopIcon.border Border
*
* <!-- FlatDesktopIconUI -->
*
* @uiDefault DesktopIcon.background Color
* @uiDefault DesktopIcon.foreground Color
* @uiDefault DesktopIcon.iconSize Dimension
* @uiDefault DesktopIcon.closeSize Dimension
* @uiDefault DesktopIcon.closeIcon Icon
*
* @author Karl Tauber
*/
public class FlatDesktopIconUI
extends BasicDesktopIconUI
{
private Dimension iconSize;
private Dimension closeSize;
private JLabel dockIcon;
private JButton closeButton;
private JToolTip titleTip;
private ActionListener closeListener;
private MouseInputListener mouseInputListener;
public static ComponentUI createUI( JComponent c ) {
return new FlatDesktopIconUI();
}
@Override
public void uninstallUI( JComponent c ) {
super.uninstallUI( c );
dockIcon = null;
closeButton = null;
}
@Override
protected void installComponents() {
dockIcon = new JLabel();
dockIcon.setHorizontalAlignment( SwingConstants.CENTER );
closeButton = new JButton();
closeButton.setIcon( UIManager.getIcon( "DesktopIcon.closeIcon" ) );
closeButton.setFocusable( false );
closeButton.setBorder( BorderFactory.createEmptyBorder() );
closeButton.setOpaque( true );
closeButton.setBackground( FlatUIUtils.nonUIResource( desktopIcon.getBackground() ) );
closeButton.setForeground( FlatUIUtils.nonUIResource( desktopIcon.getForeground() ) );
closeButton.setVisible( false );
desktopIcon.setLayout( new FlatDesktopIconLayout() );
desktopIcon.add( closeButton );
desktopIcon.add( dockIcon );
}
@Override
protected void uninstallComponents() {
hideTitleTip();
desktopIcon.remove( dockIcon );
desktopIcon.remove( closeButton );
desktopIcon.setLayout( null );
}
@Override
protected void installDefaults() {
super.installDefaults();
LookAndFeel.installColors( desktopIcon, "DesktopIcon.background", "DesktopIcon.foreground" );
iconSize = UIManager.getDimension( "DesktopIcon.iconSize" );
closeSize = UIManager.getDimension( "DesktopIcon.closeSize" );
}
@Override
protected void installListeners() {
super.installListeners();
closeListener = e -> {
if( frame.isClosable() )
frame.doDefaultCloseAction();
};
closeButton.addActionListener( closeListener );
closeButton.addMouseListener( mouseInputListener );
}
@Override
protected void uninstallListeners() {
super.uninstallListeners();
closeButton.removeActionListener( closeListener );
closeButton.removeMouseListener( mouseInputListener );
closeListener = null;
mouseInputListener = null;
}
@Override
protected MouseInputListener createMouseInputListener() {
mouseInputListener = new MouseInputAdapter() {
@Override
public void mouseReleased( MouseEvent e ) {
if( frame.isIcon() && desktopIcon.contains( e.getX(), e.getY() ) ) {
hideTitleTip();
closeButton.setVisible( false );
try {
frame.setIcon( false );
} catch( PropertyVetoException ex ) {
// ignore
}
}
}
@Override
public void mouseEntered( MouseEvent e ) {
showTitleTip();
if( frame.isClosable() )
closeButton.setVisible( true );
}
@Override
public void mouseExited( MouseEvent e ) {
hideTitleTip();
closeButton.setVisible( false );
}
};
return mouseInputListener;
}
private void showTitleTip() {
JRootPane rootPane = SwingUtilities.getRootPane( desktopIcon );
if( rootPane == null )
return;
if( titleTip == null ) {
titleTip = new JToolTip();
rootPane.getLayeredPane().add( titleTip, JLayeredPane.POPUP_LAYER );
}
titleTip.setTipText( frame.getTitle() );
titleTip.setSize( titleTip.getPreferredSize() );
int tx = (desktopIcon.getWidth() - titleTip.getWidth()) / 2;
int ty = -(titleTip.getHeight() + UIScale.scale( 4 ));
Point pt = SwingUtilities.convertPoint( desktopIcon, tx, ty, titleTip.getParent() );
if( pt.x + titleTip.getWidth() > rootPane.getWidth() )
pt.x = rootPane.getWidth() - titleTip.getWidth();
if( pt.x < 0 )
pt.x = 0;
titleTip.setLocation( pt );
titleTip.repaint();
}
private void hideTitleTip() {
if( titleTip == null )
return;
titleTip.setVisible( false );
titleTip.getParent().remove( titleTip );
titleTip = null;
}
@Override
public Dimension getPreferredSize( JComponent c ) {
return UIScale.scale( iconSize );
}
@Override
public Dimension getMinimumSize( JComponent c ) {
return getPreferredSize( c );
}
@Override
public Dimension getMaximumSize( JComponent c ) {
return getPreferredSize( c );
}
void updateDockIcon() {
// use invoke later to make sure that components are updated when switching LaF
EventQueue.invokeLater( () -> {
if( dockIcon != null )
updateDockIconLater();
} );
}
private void updateDockIconLater() {
// make sure that frame is not selected
if( frame.isSelected() ) {
try {
frame.setSelected( false );
} catch( PropertyVetoException ex ) {
// ignore
}
}
// 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();
}
// compute preview size (keep ratio; also works with non-square preview)
Insets insets = desktopIcon.getInsets();
int previewWidth = UIScale.scale( iconSize.width ) - insets.left - insets.right;
int previewHeight = UIScale.scale( iconSize.height ) - insets.top - insets.bottom;
float frameRatio = ((float) frameHeight / (float) frameWidth);
if( ((float) previewWidth / (float) frameWidth) > ((float) previewHeight / (float) frameHeight) )
previewWidth = Math.round( previewHeight / frameRatio );
else
previewHeight = Math.round( previewWidth * frameRatio );
// scale preview
Image previewImage = frameImage.getScaledInstance( previewWidth, previewHeight, Image.SCALE_SMOOTH );
dockIcon.setIcon( new ImageIcon( previewImage ) );
}
//---- class DockIcon -----------------------------------------------------
private class FlatDesktopIconLayout
implements LayoutManager
{
@Override public void addLayoutComponent( String name, Component comp ) {}
@Override public void removeLayoutComponent( Component comp ) {}
@Override
public Dimension preferredLayoutSize( Container parent ) {
return dockIcon.getPreferredSize();
}
@Override
public Dimension minimumLayoutSize( Container parent ) {
return dockIcon.getMinimumSize();
}
@Override
public void layoutContainer( Container parent ) {
Insets insets = parent.getInsets();
// dock icon
dockIcon.setBounds( insets.left, insets.top,
parent.getWidth() - insets.left - insets.right,
parent.getHeight() - insets.top - insets.bottom );
// close button in upper right corner
Dimension cSize = UIScale.scale( closeSize );
closeButton.setBounds( parent.getWidth() - cSize.width, 0, cSize.width, cSize.height );
}
}
}

View File

@@ -0,0 +1,65 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.ui;
import javax.swing.DefaultDesktopManager;
import javax.swing.JComponent;
import javax.swing.JInternalFrame;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicDesktopPaneUI;
/**
* Provides the Flat LaF UI delegate for {@link javax.swing.JDesktopPane}.
*
* <!-- BasicDesktopPaneUI -->
*
* @uiDefault Desktop.background Color
* @uiDefault Desktop.minOnScreenInsets Insets
*
* @author Karl Tauber
*/
public class FlatDesktopPaneUI
extends BasicDesktopPaneUI
{
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 );
}
}
//---- class FlatDesktopManager -------------------------------------------
private class FlatDesktopManager
extends DefaultDesktopManager
implements UIResource
{
@Override
public void iconifyFrame( JInternalFrame f ) {
super.iconifyFrame( f );
((FlatDesktopIconUI)f.getDesktopIcon().getUI()).updateDockIcon();
}
}
}

View File

@@ -50,9 +50,10 @@ public class FlatEmptyBorder
@Override
public Insets getBorderInsets( Component c, Insets insets ) {
insets.left = scale( left );
boolean leftToRight = left == right || c.getComponentOrientation().isLeftToRight();
insets.left = scale( leftToRight ? left : right );
insets.top = scale( top );
insets.right = scale( right );
insets.right = scale( leftToRight ? right : left );
insets.bottom = scale( bottom );
return insets;
}

View File

@@ -43,6 +43,7 @@ import javax.swing.plaf.ComponentUI;
* @uiDefault Component.minimumWidth int
* @uiDefault Component.isIntelliJTheme boolean
* @uiDefault FormattedTextField.placeholderForeground Color
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
*
* @author Karl Tauber
*/

View File

@@ -0,0 +1,190 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
import com.formdev.flatlaf.util.UIScale;
/**
* Provides the Flat LaF internal frame title bar.
*
* @author Karl Tauber
*/
public class FlatInternalFrameTitlePane
extends BasicInternalFrameTitlePane
{
private JLabel titleLabel;
private JPanel buttonPanel;
public FlatInternalFrameTitlePane( JInternalFrame f ) {
super( f );
}
@Override
protected void installDefaults() {
super.installDefaults();
LookAndFeel.installBorder( this, "InternalFrameTitlePane.border" );
}
@Override
protected PropertyChangeListener createPropertyChangeListener() {
return new FlatPropertyChangeHandler();
}
@Override
protected LayoutManager createLayout() {
return new BorderLayout( UIScale.scale( 4 ), 0 );
}
@Override
protected void createButtons() {
super.createButtons();
iconButton.setContentAreaFilled( false );
maxButton.setContentAreaFilled( false );
closeButton.setContentAreaFilled( false );
Border emptyBorder = BorderFactory.createEmptyBorder();
iconButton.setBorder( emptyBorder );
maxButton.setBorder( emptyBorder );
closeButton.setBorder( emptyBorder );
updateButtonsVisibility();
}
@Override
protected void addSubComponents() {
titleLabel = new JLabel( frame.getTitle() );
titleLabel.setFont( FlatUIUtils.nonUIResource( getFont() ) );
titleLabel.setMinimumSize( new Dimension( UIScale.scale( 32 ), 1 ) );
updateFrameIcon();
updateColors();
buttonPanel = new JPanel();
buttonPanel.setLayout( new BoxLayout( buttonPanel, BoxLayout.LINE_AXIS ) );
buttonPanel.setOpaque( false );
buttonPanel.add( iconButton );
buttonPanel.add( maxButton );
buttonPanel.add( closeButton );
add( titleLabel, BorderLayout.CENTER );
add( buttonPanel, BorderLayout.LINE_END );
}
private void updateFrameIcon() {
Icon frameIcon = frame.getFrameIcon();
if( frameIcon == UIManager.getIcon( "InternalFrame.icon" ) )
frameIcon = null;
titleLabel.setIcon( frameIcon );
}
private void updateColors() {
Color background = FlatUIUtils.nonUIResource( frame.isSelected() ? selectedTitleColor : notSelectedTitleColor );
Color foreground = FlatUIUtils.nonUIResource( frame.isSelected() ? selectedTextColor : notSelectedTextColor );
titleLabel.setForeground( foreground );
iconButton.setBackground( background );
iconButton.setForeground( foreground );
maxButton.setBackground( background );
maxButton.setForeground( foreground );
closeButton.setBackground( background );
closeButton.setForeground( foreground );
}
private void updateButtonsVisibility() {
iconButton.setVisible( frame.isIconifiable() );
maxButton.setVisible( frame.isMaximizable() );
closeButton.setVisible( frame.isClosable() );
}
/**
* Does nothing because FlatLaf internal frames do not have system menus.
*/
@Override
protected void assembleSystemMenu() {
}
/**
* Does nothing because FlatLaf internal frames do not have system menus.
*/
@Override
protected void showSystemMenu() {
}
@Override
public void paintComponent( Graphics g ) {
paintTitleBackground( g );
}
//---- class FlatPropertyChangeHandler ------------------------------------
private class FlatPropertyChangeHandler
extends PropertyChangeHandler
{
@Override
public void propertyChange( PropertyChangeEvent e ) {
switch( e.getPropertyName() ) {
case JInternalFrame.TITLE_PROPERTY:
titleLabel.setText( frame.getTitle() );
break;
case JInternalFrame.FRAME_ICON_PROPERTY:
updateFrameIcon();
break;
case JInternalFrame.IS_SELECTED_PROPERTY:
updateColors();
break;
case "iconable":
case "maximizable":
case "closable":
updateButtonsVisibility();
enableActions();
revalidate();
repaint();
// do not invoke super.propertyChange() because this adds/removes the buttons
return;
case "componentOrientation":
applyComponentOrientation( frame.getComponentOrientation() );
break;
}
super.propertyChange( e );
}
}
}

View File

@@ -0,0 +1,155 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import javax.swing.JComponent;
import javax.swing.JInternalFrame;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicInternalFrameUI;
/**
* Provides the Flat LaF UI delegate for {@link javax.swing.JInternalFrame}.
*
* <!-- BasicInternalFrameUI -->
*
* @uiDefault control Color
* @uiDefault InternalFrame.icon Icon
* @uiDefault InternalFrame.border Border
* @uiDefault InternalFrame.layoutTitlePaneAtOrigin boolean
*
* <!-- BasicInternalFrameTitlePane -->
*
* @uiDefault InternalFrame.titleFont Font
* @uiDefault InternalFrame.icon Icon
* @uiDefault InternalFrame.maximizeIcon Icon
* @uiDefault InternalFrame.minimizeIcon Icon
* @uiDefault InternalFrame.iconifyIcon Icon
* @uiDefault InternalFrame.closeIcon Icon
* @uiDefault InternalFrame.activeTitleBackground Color
* @uiDefault InternalFrame.activeTitleForeground Color
* @uiDefault InternalFrame.inactiveTitleBackground Color
* @uiDefault InternalFrame.inactiveTitleForeground Color
* @uiDefault InternalFrame.closeButtonToolTip String
* @uiDefault InternalFrame.iconButtonToolTip String
* @uiDefault InternalFrame.restoreButtonToolTip String
* @uiDefault InternalFrame.maxButtonToolTip String
* @uiDefault InternalFrameTitlePane.closeButtonText String
* @uiDefault InternalFrameTitlePane.minimizeButtonText String
* @uiDefault InternalFrameTitlePane.restoreButtonText String
* @uiDefault InternalFrameTitlePane.maximizeButtonText String
* @uiDefault InternalFrameTitlePane.moveButtonText String
* @uiDefault InternalFrameTitlePane.sizeButtonText String
* @uiDefault InternalFrameTitlePane.closeButton.mnemonic Integer
* @uiDefault InternalFrameTitlePane.minimizeButton.mnemonic Integer
* @uiDefault InternalFrameTitlePane.restoreButton.mnemonic Integer
* @uiDefault InternalFrameTitlePane.maximizeButton.mnemonic Integer
* @uiDefault InternalFrameTitlePane.moveButton.mnemonic Integer
* @uiDefault InternalFrameTitlePane.sizeButton.mnemonic Integer
*
* <!-- FlatInternalFrameUI -->
*
* @uiDefault InternalFrame.activeBorderColor Color
* @uiDefault InternalFrame.inactiveBorderColor Color
* @uiDefault InternalFrame.borderLineWidth int
* @uiDefault InternalFrame.borderMargins Insets
*
* <!-- FlatInternalFrameTitlePane -->
*
* @uiDefault InternalFrameTitlePane.border Border
*
* @author Karl Tauber
*/
public class FlatInternalFrameUI
extends BasicInternalFrameUI
{
public static ComponentUI createUI( JComponent c ) {
return new FlatInternalFrameUI( (JInternalFrame) c );
}
public FlatInternalFrameUI( JInternalFrame b ) {
super( b );
}
@Override
public void installUI( JComponent c ) {
super.installUI( c );
LookAndFeel.installProperty( frame, "opaque", false );
}
@Override
protected JComponent createNorthPane( JInternalFrame w ) {
return new FlatInternalFrameTitlePane( w );
}
//---- class FlatInternalFrameBorder --------------------------------------
public static class FlatInternalFrameBorder
extends FlatEmptyBorder
{
private final Color activeBorderColor = UIManager.getColor( "InternalFrame.activeBorderColor" );
private final Color inactiveBorderColor = UIManager.getColor( "InternalFrame.inactiveBorderColor" );
private final int borderLineWidth = FlatUIUtils.getUIInt( "InternalFrame.borderLineWidth", 1 );
public FlatInternalFrameBorder() {
super( UIManager.getInsets( "InternalFrame.borderMargins" ) );
}
@Override
public Insets getBorderInsets( Component c, Insets insets ) {
if( c instanceof JInternalFrame && ((JInternalFrame)c).isMaximum() ) {
insets.left = scale( Math.min( borderLineWidth, left ) );
insets.top = scale( Math.min( borderLineWidth, top ) );
insets.right = scale( Math.min( borderLineWidth, right ) );
insets.bottom = scale( Math.min( borderLineWidth, bottom ) );
return insets;
}
return super.getBorderInsets( c, insets );
}
@Override
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
JInternalFrame f = (JInternalFrame) c;
Insets insets = getBorderInsets( c );
float lineWidth = scale( (float) borderLineWidth );
Graphics2D g2 = (Graphics2D) g.create();
try {
FlatUIUtils.setRenderingHints( g2 );
g2.setColor( f.isSelected() ? activeBorderColor : inactiveBorderColor );
g2.fill( FlatUIUtils.createRectangle(
x + insets.left - lineWidth,
y + insets.top - lineWidth,
width - insets.left - insets.right + (lineWidth * 2),
height - insets.top - insets.bottom + (lineWidth * 2),
lineWidth ) );
} finally {
g2.dispose();
}
}
}
}

View File

@@ -29,13 +29,26 @@ import javax.swing.plaf.basic.BasicBorders;
public class FlatMarginBorder
extends BasicBorders.MarginBorder
{
private final int left, right, top, bottom;
public FlatMarginBorder() {
left = right = top = bottom = 0;
}
public FlatMarginBorder( Insets insets ) {
left = insets.left;
top = insets.top;
right = insets.right;
bottom = insets.bottom;
}
@Override
public Insets getBorderInsets( Component c, Insets insets ) {
insets = super.getBorderInsets( c, insets );
insets.top = scale( insets.top );
insets.left = scale( insets.left );
insets.bottom = scale( insets.bottom );
insets.right = scale( insets.right );
insets.top = scale( insets.top + top );
insets.left = scale( insets.left + left );
insets.bottom = scale( insets.bottom + bottom );
insets.right = scale( insets.right + right );
return insets;
}
}

View File

@@ -0,0 +1,49 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Component;
import java.awt.Insets;
import javax.swing.JMenuBar;
import javax.swing.UIManager;
/**
* Border for {@link javax.swing.JMenu}, {@link javax.swing.JMenuItem},
* {@link javax.swing.JCheckBoxMenuItem} and {@link javax.swing.JRadioButtonMenuItem}.
*
* @uiDefault MenuBar.itemMargins Insets
*
* @author Karl Tauber
*/
public class FlatMenuItemBorder
extends FlatMarginBorder
{
private final Insets menuBarItemMargins = UIManager.getInsets( "MenuBar.itemMargins" );
@Override
public Insets getBorderInsets( Component c, Insets insets ) {
if( c.getParent() instanceof JMenuBar ) {
insets.top = scale( menuBarItemMargins.top );
insets.left = scale( menuBarItemMargins.left );
insets.bottom = scale( menuBarItemMargins.bottom + 1 );
insets.right = scale( menuBarItemMargins.right );
return insets;
} else
return super.getBorderInsets( c, insets );
}
}

View File

@@ -17,10 +17,18 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.beans.PropertyChangeListener;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicMenuItemUI;
import com.formdev.flatlaf.FlatLaf;
/**
* Provides the Flat LaF UI delegate for {@link javax.swing.JMenuItem}.
@@ -74,4 +82,26 @@ public class FlatMenuItemUI
defaultTextIconGap = scale( defaultTextIconGap );
};
}
@Override
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
}
public static void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect,
String text, Color disabledForeground, Color selectionForeground )
{
FontMetrics fm = menuItem.getFontMetrics( menuItem.getFont() );
int mnemonicIndex = FlatLaf.isShowMnemonics() ? menuItem.getDisplayedMnemonicIndex() : -1;
ButtonModel model = menuItem.getModel();
g.setColor( !model.isEnabled()
? disabledForeground
: (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())
? selectionForeground
: menuItem.getForeground()) );
FlatUIUtils.drawStringUnderlineCharAt( menuItem, g, text, mnemonicIndex,
textRect.x, textRect.y + fm.getAscent() );
}
}

View File

@@ -17,8 +17,17 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeListener;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.UIManager;
import javax.swing.event.MouseInputListener;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicMenuUI;
@@ -48,11 +57,17 @@ import javax.swing.plaf.basic.BasicMenuUI;
* @uiDefault Menu.useMenuBarBackgroundForTopLevel boolean default is false
* @uiDefault MenuBar.background Color used if Menu.useMenuBarBackgroundForTopLevel is true
*
* <!-- FlatMenuUI -->
*
* @uiDefault MenuBar.hoverBackground Color
*
* @author Karl Tauber
*/
public class FlatMenuUI
extends BasicMenuUI
{
private Color hoverBackground;
public static ComponentUI createUI( JComponent c ) {
return new FlatMenuUI();
}
@@ -61,10 +76,21 @@ public class FlatMenuUI
protected void installDefaults() {
super.installDefaults();
menuItem.setRolloverEnabled( true );
hoverBackground = UIManager.getColor( "MenuBar.hoverBackground" );
// scale
defaultTextIconGap = scale( defaultTextIconGap );
}
@Override
protected void uninstallDefaults() {
super.uninstallDefaults();
hoverBackground = null;
}
/**
* Scale defaultTextIconGap again if iconTextGap property has changed.
*/
@@ -77,4 +103,46 @@ public class FlatMenuUI
defaultTextIconGap = scale( defaultTextIconGap );
};
}
@Override
protected MouseInputListener createMouseInputListener( JComponent c ) {
return new BasicMenuUI.MouseInputHandler() {
@Override
public void mouseEntered( MouseEvent e ) {
super.mouseEntered( e );
rollover( e, true );
}
@Override
public void mouseExited( MouseEvent e ) {
super.mouseExited( e );
rollover( e, false );
}
private void rollover( MouseEvent e, boolean rollover ) {
JMenu menu = (JMenu) e.getSource();
if( menu.isTopLevelMenu() && menu.isRolloverEnabled() ) {
menu.getModel().setRollover( rollover );
menu.repaint();
}
}
};
}
@Override
protected void paintBackground( Graphics g, JMenuItem menuItem, Color bgColor ) {
ButtonModel model = menuItem.getModel();
if( model.isArmed() || model.isSelected() ) {
super.paintBackground( g, menuItem, bgColor );
} else if( model.isRollover() && model.isEnabled() && ((JMenu)menuItem).isTopLevelMenu() ) {
FlatUIUtils.setColor( g, hoverBackground, menuItem.getBackground() );
g.fillRect( 0, 0, menuItem.getWidth(), menuItem.getHeight() );
} else
super.paintBackground( g, menuItem, bgColor );
}
@Override
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
FlatMenuItemUI.paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
}
}

View File

@@ -27,8 +27,8 @@ import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicPasswordFieldUI;
import javax.swing.text.Caret;
import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.util.SystemInfo;
/**
* Provides the Flat LaF UI delegate for {@link javax.swing.JPasswordField}.
@@ -55,6 +55,7 @@ import com.formdev.flatlaf.util.SystemInfo;
* @uiDefault Component.minimumWidth int
* @uiDefault Component.isIntelliJTheme boolean
* @uiDefault PasswordField.placeholderForeground Color
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
*
* @author Karl Tauber
*/
@@ -76,10 +77,6 @@ public class FlatPasswordFieldUI
protected void installDefaults() {
super.installDefaults();
// use other echoChar on Mac because the default is too large in SF font
if( SystemInfo.IS_MAC )
LookAndFeel.installProperty( getComponent(), "echoChar", '\u2022' );
String prefix = getPropertyPrefix();
focusWidth = UIManager.getInt( "Component.focusWidth" );
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
@@ -116,6 +113,11 @@ public class FlatPasswordFieldUI
focusListener = null;
}
@Override
protected Caret createCaret() {
return new FlatCaret( UIManager.getString( "TextComponent.selectAllOnFocusPolicy" ) );
}
@Override
protected void propertyChange( PropertyChangeEvent e ) {
super.propertyChange( e );

View File

@@ -16,7 +16,12 @@
package com.formdev.flatlaf.ui;
import java.awt.Component;
import java.awt.Container;
import java.awt.Insets;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import com.formdev.flatlaf.util.UIScale;
/**
* Border for {@link javax.swing.JPopupMenu}.
@@ -33,4 +38,18 @@ public class FlatPopupMenuBorder
super( UIManager.getInsets( "PopupMenu.borderInsets" ),
UIManager.getColor( "PopupMenu.borderColor" ) );
}
@Override
public Insets getBorderInsets( Component c, Insets insets ) {
if( c instanceof Container &&
((Container)c).getComponentCount() > 0 &&
((Container)c).getComponent( 0 ) instanceof JScrollPane )
{
// e.g. for combobox popups
insets.left = insets.top = insets.right = insets.bottom = UIScale.scale( 1 );
return insets;
}
return super.getBorderInsets( c, insets );
}
}

View File

@@ -16,6 +16,7 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
@@ -23,6 +24,7 @@ import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Area;
import java.awt.geom.RoundRectangle2D;
import java.beans.PropertyChangeListener;
import javax.swing.JComponent;
import javax.swing.JProgressBar;
import javax.swing.LookAndFeel;
@@ -60,6 +62,8 @@ public class FlatProgressBarUI
protected Dimension horizontalSize;
protected Dimension verticalSize;
private PropertyChangeListener propertyChangeListener;
public static ComponentUI createUI( JComponent c ) {
return new FlatProgressBarUI();
}
@@ -75,11 +79,35 @@ public class FlatProgressBarUI
verticalSize = UIManager.getDimension( "ProgressBar.verticalSize" );
}
@Override
protected void installListeners() {
super.installListeners();
propertyChangeListener = e -> {
switch( e.getPropertyName() ) {
case PROGRESS_BAR_LARGE_HEIGHT:
case PROGRESS_BAR_SQUARE:
progressBar.revalidate();
progressBar.repaint();
break;
}
};
progressBar.addPropertyChangeListener( propertyChangeListener );
}
@Override
protected void uninstallListeners() {
super.uninstallListeners();
progressBar.removePropertyChangeListener( propertyChangeListener );
propertyChangeListener = null;
}
@Override
public Dimension getPreferredSize( JComponent c ) {
Dimension size = super.getPreferredSize( c );
if( progressBar.isStringPainted() ) {
if( progressBar.isStringPainted() || clientPropertyBoolean( c, PROGRESS_BAR_LARGE_HEIGHT, false ) ) {
// recalculate progress height/width to make it smaller
Insets insets = progressBar.getInsets();
FontMetrics fm = progressBar.getFontMetrics( progressBar.getFont() );
@@ -122,7 +150,9 @@ public class FlatProgressBarUI
return;
boolean horizontal = (progressBar.getOrientation() == JProgressBar.HORIZONTAL);
int arc = Math.min( UIScale.scale( this.arc ), horizontal ? height : width );
int arc = clientPropertyBoolean( c, PROGRESS_BAR_SQUARE, false )
? 0
: Math.min( UIScale.scale( this.arc ), horizontal ? height : width );
FlatUIUtils.setRenderingHints( (Graphics2D) g );
@@ -163,4 +193,19 @@ public class FlatProgressBarUI
paintString( g, x, y, width, height, amountFull, insets );
}
}
@Override
protected void setAnimationIndex( int newValue ) {
super.setAnimationIndex( newValue );
// On HiDPI screens at 125%, 150% and 175% scaling, it occurs that antialiased painting
// may paint one pixel outside of the clipping area. This results in visual artifacts
// in indeterminate mode when the progress moves around.
// Unfortunately it is not safe to invoke getBox() from here (may throw NPE),
// which makes it impractical to get progress box and repaint increased box.
// Only solution is to repaint whole progress bar.
double systemScaleFactor = UIScale.getSystemScaleFactor( progressBar.getGraphicsConfiguration() );
if( (int) systemScaleFactor != systemScaleFactor )
progressBar.repaint();
}
}

View File

@@ -17,8 +17,11 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.beans.PropertyChangeListener;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI;
@@ -74,4 +77,9 @@ public class FlatRadioButtonMenuItemUI
defaultTextIconGap = scale( defaultTextIconGap );
};
}
@Override
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
FlatMenuItemUI.paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
}
}

View File

@@ -118,11 +118,13 @@ public class FlatRadioButtonUI
@Override
public void paint( Graphics g, JComponent c ) {
// fill background even if opaque if
// - used as cell renderer (because of selection background)
// - if background was explicitly set to a non-UIResource color
// fill background even if not opaque if
// - contentAreaFilled is true and
// - used as cell renderer (because of selection background)
// - or if background was explicitly set to a non-UIResource color
if( !c.isOpaque() &&
(c.getParent() instanceof CellRendererPane || !(c.getBackground() instanceof UIResource)) )
((AbstractButton)c).isContentAreaFilled() &&
(c.getParent() instanceof CellRendererPane || !(c.getBackground() instanceof UIResource)))
{
g.setColor( c.getBackground() );
g.fillRect( 0, 0, c.getWidth(), c.getHeight() );

View File

@@ -82,6 +82,7 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault TabbedPane.tabSelectionHeight int
* @uiDefault TabbedPane.contentSeparatorHeight int
* @uiDefault TabbedPane.showTabSeparators boolean
* @uiDefault TabbedPane.tabSeparatorsFullHeight boolean
* @uiDefault TabbedPane.hasFullBorder boolean
*
* @author Karl Tauber
@@ -103,6 +104,7 @@ public class FlatTabbedPaneUI
protected int tabSelectionHeight;
protected int contentSeparatorHeight;
protected boolean showTabSeparators;
protected boolean tabSeparatorsFullHeight;
protected boolean hasFullBorder;
protected boolean tabsOverlapBorder;
@@ -128,6 +130,7 @@ public class FlatTabbedPaneUI
tabSelectionHeight = UIManager.getInt( "TabbedPane.tabSelectionHeight" );
contentSeparatorHeight = UIManager.getInt( "TabbedPane.contentSeparatorHeight" );
showTabSeparators = UIManager.getBoolean( "TabbedPane.showTabSeparators" );
tabSeparatorsFullHeight = UIManager.getBoolean( "TabbedPane.tabSeparatorsFullHeight" );
hasFullBorder = UIManager.getBoolean( "TabbedPane.hasFullBorder" );
tabsOverlapBorder = UIManager.getBoolean( "TabbedPane.tabsOverlapBorder" );
@@ -169,6 +172,7 @@ public class FlatTabbedPaneUI
switch( e.getPropertyName() ) {
case TABBED_PANE_SHOW_TAB_SEPARATORS:
case TABBED_PANE_HAS_FULL_BORDER:
case TABBED_PANE_TAB_HEIGHT:
tabPane.revalidate();
tabPane.repaint();
break;
@@ -181,7 +185,7 @@ public class FlatTabbedPaneUI
protected JButton createScrollButton( int direction ) {
// this method is invoked before installDefaults(), so we can not use color fields here
return new FlatArrowButton( direction, UIManager.getString( "Component.arrowType" ),
UIManager.getColor( "TabbedPane.shadow" ),
UIManager.getColor( "TabbedPane.foreground" ),
UIManager.getColor( "TabbedPane.disabledForeground" ), null,
UIManager.getColor( "TabbedPane.hoverColor" ) );
}
@@ -215,6 +219,7 @@ public class FlatTabbedPaneUI
@Override
protected int calculateTabHeight( int tabPlacement, int tabIndex, int fontHeight ) {
int tabHeight = clientPropertyInt( tabPane, TABBED_PANE_TAB_HEIGHT, this.tabHeight );
return Math.max( tabHeight, super.calculateTabHeight( tabPlacement, tabIndex, fontHeight ) - 2 /* was added by superclass */ );
}
@@ -305,7 +310,7 @@ public class FlatTabbedPaneUI
!isLastInRun( tabIndex ) )
{
float sepWidth = UIScale.scale( 1f );
float offset = UIScale.scale( 5f );
float offset = tabSeparatorsFullHeight ? 0 : UIScale.scale( 5f );
g.setColor( (tabSeparatorColor != null) ? tabSeparatorColor : contentAreaColor );
if( tabPlacement == LEFT || tabPlacement == RIGHT ) {

View File

@@ -22,13 +22,20 @@ 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.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
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;
@@ -49,6 +56,7 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault TableHeader.separatorColor Color
* @uiDefault TableHeader.bottomSeparatorColor Color
* @uiDefault TableHeader.height int
* @uiDefault TableHeader.sortIconPosition String right (default), left, top or bottom
*
* @author Karl Tauber
*/
@@ -58,6 +66,7 @@ public class FlatTableHeaderUI
protected Color separatorColor;
protected Color bottomSeparatorColor;
protected int height;
protected int sortIconPosition;
public static ComponentUI createUI( JComponent c ) {
return new FlatTableHeaderUI();
@@ -70,12 +79,33 @@ public class FlatTableHeaderUI
separatorColor = UIManager.getColor( "TableHeader.separatorColor" );
bottomSeparatorColor = UIManager.getColor( "TableHeader.bottomSeparatorColor" );
height = UIManager.getInt( "TableHeader.height" );
switch( Objects.toString( UIManager.getString( "TableHeader.sortIconPosition" ), "right" ) ) {
default:
case "right": sortIconPosition = SwingConstants.RIGHT; break;
case "left": sortIconPosition = SwingConstants.LEFT; break;
case "top": sortIconPosition = SwingConstants.TOP; break;
case "bottom": sortIconPosition = SwingConstants.BOTTOM; break;
}
// use own renderer if necessary
if( sortIconPosition != SwingConstants.RIGHT ) {
TableCellRenderer defaultRenderer = header.getDefaultRenderer();
if( defaultRenderer instanceof UIResource )
header.setDefaultRenderer( new FlatTableCellHeaderRenderer( defaultRenderer ) );
}
}
@Override
protected void uninstallDefaults() {
super.uninstallDefaults();
// restore default renderer
TableCellRenderer defaultRenderer = header.getDefaultRenderer();
if( defaultRenderer instanceof FlatTableCellHeaderRenderer ) {
((FlatTableCellHeaderRenderer)defaultRenderer).reset();
header.setDefaultRenderer( ((FlatTableCellHeaderRenderer)defaultRenderer).delegate );
}
separatorColor = null;
bottomSeparatorColor = null;
}
@@ -215,4 +245,83 @@ public class FlatTableHeaderUI
parent = parent.getParent();
return (parent instanceof JScrollPane) ? (JScrollPane) parent : null;
}
//---- class FlatTableCellHeaderRenderer ----------------------------------
/**
* A delegating header renderer that is only used to paint sort arrows at
* top, bottom or left position.
*/
private class FlatTableCellHeaderRenderer
implements TableCellRenderer, Border, UIResource
{
private final TableCellRenderer delegate;
private int oldHorizontalTextPosition = -1;
private Border origBorder;
private Icon sortIcon;
FlatTableCellHeaderRenderer( TableCellRenderer delegate ) {
this.delegate = delegate;
}
@Override
public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column )
{
Component c = delegate.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
if( !(c instanceof JLabel) )
return c;
JLabel l = (JLabel) c;
if( sortIconPosition == SwingConstants.LEFT ) {
if( oldHorizontalTextPosition < 0 )
oldHorizontalTextPosition = l.getHorizontalTextPosition();
l.setHorizontalTextPosition( SwingConstants.RIGHT );
} else {
// top or bottom
sortIcon = l.getIcon();
origBorder = l.getBorder();
l.setIcon( null );
l.setBorder( this );
}
return l;
}
void reset() {
if( sortIconPosition == SwingConstants.LEFT && oldHorizontalTextPosition >= 0 ) {
Component c = getTableCellRendererComponent( header.getTable(), "", false, false, -1, 0 );
if( c instanceof JLabel && ((JLabel)c).getHorizontalTextPosition() == SwingConstants.RIGHT )
((JLabel)c).setHorizontalTextPosition( oldHorizontalTextPosition );
}
}
@Override
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
if( origBorder != null )
origBorder.paintBorder( c, g, x, y, width, height );
if( sortIcon != null ) {
int xi = x + ((width - sortIcon.getIconWidth()) / 2);
int yi = (sortIconPosition == SwingConstants.TOP)
? y + UIScale.scale( 1 )
: y + height - sortIcon.getIconHeight()
- 1 // for gap
- (int) (1 * UIScale.getUserScaleFactor()); // for bottom border
sortIcon.paintIcon( c, g, xi, yi );
}
}
@Override
public Insets getBorderInsets( Component c ) {
return (origBorder != null) ? origBorder.getBorderInsets( c ) : new Insets( 0, 0, 0, 0 );
}
@Override
public boolean isBorderOpaque() {
return (origBorder != null) ? origBorder.isBorderOpaque() : false;
}
}
}

View File

@@ -35,6 +35,7 @@ import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicTextFieldUI;
import javax.swing.text.Caret;
import javax.swing.text.JTextComponent;
import com.formdev.flatlaf.FlatClientProperties;
@@ -62,6 +63,7 @@ import com.formdev.flatlaf.FlatClientProperties;
* @uiDefault Component.minimumWidth int
* @uiDefault Component.isIntelliJTheme boolean
* @uiDefault TextField.placeholderForeground Color
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
*
* @author Karl Tauber
*/
@@ -119,6 +121,11 @@ public class FlatTextFieldUI
focusListener = null;
}
@Override
protected Caret createCaret() {
return new FlatCaret( UIManager.getString( "TextComponent.selectAllOnFocusPolicy" ) );
}
@Override
protected void propertyChange( PropertyChangeEvent e ) {
super.propertyChange( e );

View File

@@ -20,6 +20,7 @@ import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.beans.PropertyChangeEvent;
import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
@@ -60,12 +61,12 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault ToggleButton.disabledSelectedBackground Color
* @uiDefault ToggleButton.toolbar.selectedBackground Color
*
* @uiDefault ToggleButton.underline.underlineHeight int
* @uiDefault ToggleButton.underline.underlineColor Color
* @uiDefault ToggleButton.underline.disabledUnderlineColor Color
* @uiDefault ToggleButton.underline.selectedBackground Color optional
* @uiDefault ToggleButton.underline.hoverBackground Color
* @uiDefault ToggleButton.underline.focusBackground Color
* @uiDefault ToggleButton.tab.underlineHeight int
* @uiDefault ToggleButton.tab.underlineColor Color
* @uiDefault ToggleButton.tab.disabledUnderlineColor Color
* @uiDefault ToggleButton.tab.selectedBackground Color optional
* @uiDefault ToggleButton.tab.hoverBackground Color
* @uiDefault ToggleButton.tab.focusBackground Color
*
*
* @author Karl Tauber
@@ -79,12 +80,12 @@ public class FlatToggleButtonUI
protected Color toolbarSelectedBackground;
protected int underlineHeight;
protected Color underlineColor;
protected Color disabledUnderlineColor;
protected Color underlineSelectedBackground;
protected Color underlineHoverBackground;
protected Color underlineFocusBackground;
protected int tabUnderlineHeight;
protected Color tabUnderlineColor;
protected Color tabDisabledUnderlineColor;
protected Color tabSelectedBackground;
protected Color tabHoverBackground;
protected Color tabFocusBackground;
private boolean defaults_initialized = false;
@@ -112,12 +113,12 @@ public class FlatToggleButtonUI
toolbarSelectedBackground = UIManager.getColor( "ToggleButton.toolbar.selectedBackground" );
underlineHeight = UIManager.getInt( "ToggleButton.underline.underlineHeight" );
underlineColor = UIManager.getColor( "ToggleButton.underline.underlineColor" );
disabledUnderlineColor = UIManager.getColor( "ToggleButton.underline.disabledUnderlineColor" );
underlineSelectedBackground = UIManager.getColor( "ToggleButton.underline.selectedBackground" );
underlineHoverBackground = UIManager.getColor( "ToggleButton.underline.hoverBackground" );
underlineFocusBackground = UIManager.getColor( "ToggleButton.underline.focusBackground" );
tabUnderlineHeight = UIManager.getInt( "ToggleButton.tab.underlineHeight" );
tabUnderlineColor = UIManager.getColor( "ToggleButton.tab.underlineColor" );
tabDisabledUnderlineColor = UIManager.getColor( "ToggleButton.tab.disabledUnderlineColor" );
tabSelectedBackground = UIManager.getColor( "ToggleButton.tab.selectedBackground" );
tabHoverBackground = UIManager.getColor( "ToggleButton.tab.hoverBackground" );
tabFocusBackground = UIManager.getColor( "ToggleButton.tab.focusBackground" );
defaults_initialized = true;
}
@@ -129,21 +130,44 @@ public class FlatToggleButtonUI
defaults_initialized = false;
}
static boolean isUnderlineButton( Component c ) {
return c instanceof JToggleButton && clientPropertyEquals( (JToggleButton) c, BUTTON_TYPE, BUTTON_TYPE_UNDERLINE );
@Override
protected void propertyChange( AbstractButton b, PropertyChangeEvent e ) {
super.propertyChange( b, e );
switch( e.getPropertyName() ) {
case BUTTON_TYPE:
if( BUTTON_TYPE_TAB.equals( e.getOldValue() ) || BUTTON_TYPE_TAB.equals( e.getNewValue() ) ) {
MigLayoutVisualPadding.uninstall( b );
MigLayoutVisualPadding.install( b, getFocusWidth( b ) );
b.revalidate();
}
b.repaint();
break;
case TAB_BUTTON_UNDERLINE_HEIGHT:
case TAB_BUTTON_UNDERLINE_COLOR:
case TAB_BUTTON_SELECTED_BACKGROUND:
b.repaint();
break;
}
}
static boolean isTabButton( Component c ) {
return c instanceof JToggleButton && clientPropertyEquals( (JToggleButton) c, BUTTON_TYPE, BUTTON_TYPE_TAB );
}
@Override
protected void paintBackground( Graphics g, JComponent c ) {
if( isUnderlineButton( c ) ) {
if( isTabButton( c ) ) {
int height = c.getHeight();
int width = c.getWidth();
boolean selected = ((AbstractButton)c).isSelected();
// paint background
Color background = buttonStateColor( c,
selected ? underlineSelectedBackground : null,
null, underlineFocusBackground, underlineHoverBackground, null );
selected ? clientPropertyColor( c, TAB_BUTTON_SELECTED_BACKGROUND, tabSelectedBackground ) : null,
null, tabFocusBackground, tabHoverBackground, null );
if( background != null ) {
g.setColor( background );
g.fillRect( 0, 0, width, height );
@@ -151,8 +175,10 @@ public class FlatToggleButtonUI
// paint underline if selected
if( selected ) {
int underlineHeight = UIScale.scale( this.underlineHeight );
g.setColor( c.isEnabled() ? underlineColor : disabledUnderlineColor );
int underlineHeight = UIScale.scale( clientPropertyInt( c, TAB_BUTTON_UNDERLINE_HEIGHT, tabUnderlineHeight ) );
g.setColor( c.isEnabled()
? clientPropertyColor( c, TAB_BUTTON_UNDERLINE_COLOR, tabUnderlineColor )
: tabDisabledUnderlineColor );
g.fillRect( 0, height - underlineHeight, width, underlineHeight );
}
} else
@@ -186,4 +212,9 @@ public class FlatToggleButtonUI
return super.getForeground( c );
}
@Override
protected int getFocusWidth( JComponent c ) {
return isTabButton( c ) ? 0 : super.getFocusWidth( c );
}
}

View File

@@ -29,6 +29,7 @@ import javax.swing.UIManager;
/**
* Border for {@link javax.swing.JToolBar}.
*
* @uiDefault ToolBar.borderMargins Insets
* @uiDefault ToolBar.gripColor Color
*
* @author Karl Tauber
@@ -42,6 +43,10 @@ public class FlatToolBarBorder
protected final Color gripColor = UIManager.getColor( "ToolBar.gripColor" );
public FlatToolBarBorder() {
super( UIManager.getInsets( "ToolBar.borderMargins" ) );
}
@Override
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
// paint grip

View File

@@ -16,18 +16,14 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Component;
import java.awt.Insets;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import javax.swing.AbstractButton;
import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicToolBarUI;
/**
@@ -45,28 +41,15 @@ import javax.swing.plaf.basic.BasicToolBarUI;
* @uiDefault ToolBar.floatingForeground Color
* @uiDefault ToolBar.isRollover boolean
*
* <!-- FlatToolBarUI -->
*
* @uiDefault ToolBar.buttonMargins Insets
*
* @author Karl Tauber
*/
public class FlatToolBarUI
extends BasicToolBarUI
{
private Border rolloverBorder;
public static ComponentUI createUI( JComponent c ) {
return new FlatToolBarUI();
}
@Override
public void uninstallUI( JComponent c ) {
super.uninstallUI( c );
rolloverBorder = null;
}
@Override
protected ContainerListener createToolBarContListener() {
return new ToolBarContListener() {
@@ -90,26 +73,15 @@ public class FlatToolBarUI
};
}
@Override
protected Border createRolloverBorder() {
return getRolloverBorder();
}
@Override
protected Border createNonRolloverBorder() {
return getRolloverBorder();
}
@Override
protected Border getNonRolloverBorder( AbstractButton b ) {
return getRolloverBorder();
}
private Border getRolloverBorder() {
if( rolloverBorder == null )
rolloverBorder = new FlatRolloverMarginBorder();
return rolloverBorder;
}
// disable rollover border
@Override protected void setBorderToRollover( Component c ) {}
@Override protected void setBorderToNonRollover( Component c ) {}
@Override protected void setBorderToNormal( Component c ) {}
@Override protected void installRolloverBorders( JComponent c ) {}
@Override protected void installNonRolloverBorders( JComponent c ) {}
@Override protected void installNormalBorders( JComponent c ) {}
@Override protected Border createRolloverBorder() { return null; }
@Override protected Border createNonRolloverBorder() { return null; }
@Override
public void setOrientation( int orientation ) {
@@ -123,46 +95,4 @@ public class FlatToolBarUI
super.setOrientation( orientation );
}
//---- class FlatRolloverMarginBorder -------------------------------------
/**
* Uses button margin only if explicitly set.
* Otherwise uses insets specified in constructor.
*/
private static class FlatRolloverMarginBorder
extends EmptyBorder
{
public FlatRolloverMarginBorder() {
super( UIManager.getInsets( "ToolBar.buttonMargins" ) );
}
@Override
public Insets getBorderInsets( Component c, Insets insets ) {
Insets margin = (c instanceof AbstractButton)
? ((AbstractButton) c).getMargin()
: null;
if( margin == null || margin instanceof UIResource ) {
insets.top = top;
insets.left = left;
insets.bottom = bottom;
insets.right = right;
} else {
// margin explicitly set
insets.top = margin.top;
insets.left = margin.left;
insets.bottom = margin.bottom;
insets.right = margin.right;
}
// scale
insets.top = scale( insets.top );
insets.left = scale( insets.left );
insets.bottom = scale( insets.bottom );
insets.right = scale( insets.right );
return insets;
}
}
}

View File

@@ -20,6 +20,7 @@ import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
@@ -37,7 +38,7 @@ import java.util.function.Consumer;
import javax.swing.JComponent;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.UIResource;
import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.util.DerivedColor;
import com.formdev.flatlaf.util.HiDPIUtils;
@@ -83,6 +84,13 @@ public class FlatUIUtils
insets1.right + insets2.right );
}
public static void setInsets( Insets dest, Insets src ) {
dest.top = src.top;
dest.left = src.left;
dest.bottom = src.bottom;
dest.right = src.right;
}
public static Color getUIColor( String key, int defaultColorRGB ) {
Color color = UIManager.getColor( key );
return (color != null) ? color : new Color( defaultColorRGB );
@@ -109,12 +117,19 @@ public class FlatUIUtils
}
public static Color nonUIResource( Color c ) {
return (c instanceof ColorUIResource) ? new Color( c.getRGB(), true ) : c;
return (c instanceof UIResource) ? new Color( c.getRGB(), true ) : c;
}
public static Font nonUIResource( Font font ) {
return (font instanceof UIResource) ? new Font( font.getName(), font.getStyle(), font.getSize() ) : font;
}
public static int minimumWidth( JComponent c, int minimumWidth ) {
Object p = c.getClientProperty( FlatClientProperties.MINIMUM_WIDTH );
return (p instanceof Integer) ? ((Integer)p).intValue() : minimumWidth;
return FlatClientProperties.clientPropertyInt( c, FlatClientProperties.MINIMUM_WIDTH, minimumWidth );
}
public static int minimumHeight( JComponent c, int minimumHeight ) {
return FlatClientProperties.clientPropertyInt( c, FlatClientProperties.MINIMUM_HEIGHT, minimumHeight );
}
public static boolean isTableCellEditor( Component c ) {

View File

@@ -28,6 +28,7 @@
@selectionInactiveForeground=@foreground
@disabledText=#777777
@textComponentBackground=#45494A
@menuBackground=darken(@background,5%)
@cellFocusColor=#000000
@icon=#adadad
@@ -130,6 +131,34 @@ Component.focusColor=#3d6185
Component.linkColor=#589df6
#---- Desktop ----
Desktop.background=#3E434C
#---- DesktopIcon ----
DesktopIcon.background=lighten($Desktop.background,10%)
#---- InternalFrame ----
InternalFrame.activeTitleBackground=darken(@background,10%)
InternalFrame.activeTitleForeground=@foreground
InternalFrame.inactiveTitleBackground=darken(@background,5%)
InternalFrame.inactiveTitleForeground=@disabledText
InternalFrame.activeBorderColor=lighten($Component.borderColor,10%)
InternalFrame.inactiveBorderColor=$Component.borderColor
InternalFrame.buttonHoverBackground=lighten(10%,autoInverse)
InternalFrame.buttonPressedBackground=lighten(20%,autoInverse)
InternalFrame.closeHoverBackground=lazy(Actions.Red)
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
InternalFrame.closeHoverForeground=#fff
InternalFrame.closePressedForeground=#fff
#---- List ----
List.background=@textComponentBackground
@@ -144,6 +173,7 @@ Menu.icon.disabledArrowColor=#606060
#---- MenuBar ----
MenuBar.borderColor=#515151
MenuBar.hoverBackground=lighten($MenuBar.background,10%)
#---- MenuItemCheckBox ----
@@ -154,7 +184,7 @@ MenuItemCheckBox.icon.disabledCheckmarkColor=#606060
#---- PopupMenu ----
PopupMenu.borderColor=#515151
PopupMenu.borderColor=#5e5e5e
#---- ProgressBar ----

View File

@@ -21,9 +21,12 @@ CheckBoxUI=com.formdev.flatlaf.ui.FlatCheckBoxUI
CheckBoxMenuItemUI=com.formdev.flatlaf.ui.FlatCheckBoxMenuItemUI
ColorChooserUI=com.formdev.flatlaf.ui.FlatColorChooserUI
ComboBoxUI=com.formdev.flatlaf.ui.FlatComboBoxUI
DesktopIconUI=com.formdev.flatlaf.ui.FlatDesktopIconUI
DesktopPaneUI=com.formdev.flatlaf.ui.FlatDesktopPaneUI
EditorPaneUI=com.formdev.flatlaf.ui.FlatEditorPaneUI
FileChooserUI=com.formdev.flatlaf.ui.FlatFileChooserUI
FormattedTextFieldUI=com.formdev.flatlaf.ui.FlatFormattedTextFieldUI
InternalFrameUI=com.formdev.flatlaf.ui.FlatInternalFrameUI
LabelUI=com.formdev.flatlaf.ui.FlatLabelUI
ListUI=com.formdev.flatlaf.ui.FlatListUI
MenuUI=com.formdev.flatlaf.ui.FlatMenuUI
@@ -59,6 +62,7 @@ ViewportUI=com.formdev.flatlaf.ui.FlatViewportUI
#---- variables ----
@textComponentMargin=2,6,2,6
@menuItemMargin=2,8,2,8
#---- system colors ----
@@ -99,6 +103,9 @@ Button.defaultButtonFollowsFocus=false
Button.default.borderWidth=1
Button.toolbar.margin=3,3,3,3
Button.toolbar.spacingInsets=1,2,1,2
#---- Caret ----
@@ -117,10 +124,12 @@ CheckBox.rollover=true
#---- CheckBoxMenuItem ----
CheckBoxMenuItem.border=com.formdev.flatlaf.ui.FlatMarginBorder
CheckBoxMenuItem.border=com.formdev.flatlaf.ui.FlatMenuItemBorder
CheckBoxMenuItem.checkIcon=com.formdev.flatlaf.icons.FlatCheckBoxMenuItemIcon
CheckBoxMenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
CheckBoxMenuItem.margin=2,2,2,2
CheckBoxMenuItem.margin=@menuItemMargin
CheckBoxMenuItem.opaque=false
CheckBoxMenuItem.background=@menuBackground
#---- ColorChooser ----
@@ -145,6 +154,14 @@ Component.arrowType=chevron
Component.hideMnemonics=true
#---- DesktopIcon ----
DesktopIcon.border=4,4,4,4
DesktopIcon.iconSize=64,64
DesktopIcon.closeSize=20,20
DesktopIcon.closeIcon=com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon
#---- EditorPane ----
EditorPane.border=com.formdev.flatlaf.ui.FlatMarginBorder
@@ -194,6 +211,23 @@ HelpButton.questionMarkColor=$CheckBox.icon.checkmarkColor
HelpButton.disabledQuestionMarkColor=$CheckBox.icon.disabledCheckmarkColor
#---- InternalFrame ----
InternalFrame.border=com.formdev.flatlaf.ui.FlatInternalFrameUI$FlatInternalFrameBorder
InternalFrame.borderLineWidth=1
InternalFrame.borderMargins=6,6,6,6
InternalFrame.buttonSize=24,24
InternalFrame.closeIcon=com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon
InternalFrame.iconifyIcon=com.formdev.flatlaf.icons.FlatInternalFrameIconifyIcon
InternalFrame.maximizeIcon=com.formdev.flatlaf.icons.FlatInternalFrameMaximizeIcon
InternalFrame.minimizeIcon=com.formdev.flatlaf.icons.FlatInternalFrameMinimizeIcon
#---- InternalFrameTitlePane ----
InternalFrameTitlePane.border=0,8,0,0
#---- List ----
List.border=1,0,1,0
@@ -212,21 +246,29 @@ List.dropLineColor=@dropLineColor
#---- Menu ----
Menu.border=com.formdev.flatlaf.ui.FlatMarginBorder
Menu.border=com.formdev.flatlaf.ui.FlatMenuItemBorder
Menu.arrowIcon=com.formdev.flatlaf.icons.FlatMenuArrowIcon
Menu.margin=2,2,2,2
Menu.margin=@menuItemMargin
Menu.submenuPopupOffsetX={scaledInteger}-4
Menu.submenuPopupOffsetY={scaledInteger}-4
Menu.opaque=false
Menu.background=@menuBackground
#---- MenuBar ----
MenuBar.border=com.formdev.flatlaf.ui.FlatMenuBarBorder
MenuBar.background=@menuBackground
MenuBar.itemMargins=3,3,3,3
#---- MenuItem ----
MenuItem.border=com.formdev.flatlaf.ui.FlatMarginBorder
MenuItem.border=com.formdev.flatlaf.ui.FlatMenuItemBorder
MenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
MenuItem.margin=2,2,2,2
MenuItem.margin=@menuItemMargin
MenuItem.opaque=false
MenuItem.background=@menuBackground
#---- OptionPane ----
@@ -258,12 +300,14 @@ PasswordField.border=com.formdev.flatlaf.ui.FlatBorder
PasswordField.margin=@textComponentMargin
PasswordField.background=@textComponentBackground
PasswordField.placeholderForeground=@disabledText
PasswordField.echoChar=\u2022
#---- PopupMenu ----
PopupMenu.border=com.formdev.flatlaf.ui.FlatPopupMenuBorder
PopupMenu.borderInsets=1,1,1,1
PopupMenu.borderInsets=4,1,4,1
PopupMenu.background=@menuBackground
#---- PopupMenuSeparator ----
@@ -279,6 +323,8 @@ ProgressBar.border=com.formdev.flatlaf.ui.FlatEmptyBorder
ProgressBar.arc=4
ProgressBar.horizontalSize=146,4
ProgressBar.verticalSize=4,146
ProgressBar.cycleTime=4000
ProgressBar.repaintInterval=15
#---- RadioButton ----
@@ -293,10 +339,12 @@ RadioButton.rollover=true
#---- RadioButtonMenuItem ----
RadioButtonMenuItem.border=com.formdev.flatlaf.ui.FlatMarginBorder
RadioButtonMenuItem.border=com.formdev.flatlaf.ui.FlatMenuItemBorder
RadioButtonMenuItem.checkIcon=com.formdev.flatlaf.icons.FlatRadioButtonMenuItemIcon
RadioButtonMenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
RadioButtonMenuItem.margin=2,2,2,2
RadioButtonMenuItem.margin=@menuItemMargin
RadioButtonMenuItem.opaque=false
RadioButtonMenuItem.background=@menuBackground
#---- ScrollBar ----
@@ -366,7 +414,7 @@ TabbedPane.tabAreaInsets=0,0,0,0
TabbedPane.selectedTabPadInsets=0,0,0,0
TabbedPane.tabRunOverlay=0
TabbedPane.tabsOverlapBorder=true
TabbedPane.shadow=$ComboBox.buttonArrowColor
TabbedPane.shadow=@background
#---- Table ----
@@ -405,6 +453,12 @@ TextArea.margin=@textComponentMargin
TextArea.background=@textComponentBackground
#---- TextComponent ----
# allowed values: "never", "once" (default) or "always"
TextComponent.selectAllOnFocusPolicy=once
#---- TextField ----
TextField.border=com.formdev.flatlaf.ui.FlatBorder
@@ -439,20 +493,20 @@ ToggleButton.pressedBackground=$Button.pressedBackground
ToggleButton.toolbar.hoverBackground=$Button.toolbar.hoverBackground
ToggleButton.toolbar.pressedBackground=$Button.toolbar.pressedBackground
# button type "underline"
ToggleButton.underline.underlineHeight=2
ToggleButton.underline.underlineColor=$TabbedPane.underlineColor
ToggleButton.underline.disabledUnderlineColor=$TabbedPane.disabledUnderlineColor
ToggleButton.underline.selectedBackground=$?TabbedPane.selectedBackground
ToggleButton.underline.hoverBackground=$TabbedPane.hoverColor
ToggleButton.underline.focusBackground=$TabbedPane.focusColor
# button type "tab"
ToggleButton.tab.underlineHeight=2
ToggleButton.tab.underlineColor=$TabbedPane.underlineColor
ToggleButton.tab.disabledUnderlineColor=$TabbedPane.disabledUnderlineColor
ToggleButton.tab.selectedBackground=$?TabbedPane.selectedBackground
ToggleButton.tab.hoverBackground=$TabbedPane.hoverColor
ToggleButton.tab.focusBackground=$TabbedPane.focusColor
#---- ToolBar ----
ToolBar.border=com.formdev.flatlaf.ui.FlatToolBarBorder
ToolBar.borderMargins=2,2,2,2
ToolBar.isRollover=true
ToolBar.buttonMargins=3,3,3,3
ToolBar.gripColor=@icon
ToolBar.dockingBackground=@background
ToolBar.floatingBackground=@background
@@ -461,6 +515,8 @@ ToolBar.separatorSize=null
ToolBar.separatorWidth=7
ToolBar.separatorColor=$Separator.foreground
ToolBar.spacingBorder=$Button.toolbar.spacingInsets
#---- ToolTip ----
@@ -475,11 +531,12 @@ ToolTip.foregroundInactive=@disabledText
Tree.border=1,1,1,1
Tree.selectionInactiveBackground=@selectionInactiveBackground
Tree.selectionInactiveForeground=@selectionInactiveForeground
Tree.textBackground=null
Tree.textBackground=$Tree.background
Tree.selectionBorderColor=@cellFocusColor
Tree.dropCellBackground=@dropCellBackground
Tree.dropCellForeground=@dropCellForeground
Tree.dropLineColor=@dropLineColor
Tree.rendererFillBackground=false
Tree.rendererMargins=1,2,1,2
Tree.wideSelection=true
Tree.paintLines=false

View File

@@ -28,6 +28,7 @@
@selectionInactiveForeground=@foreground
@disabledText=#8C8C8C
@textComponentBackground=#ffffff
@menuBackground=#fff
@cellFocusColor=#000000
@icon=#afafaf
@@ -132,11 +133,39 @@ Component.focusColor=#97c3f3
Component.linkColor=#2470B3
#---- Desktop ----
Desktop.background=#E6EBF0
#---- DesktopIcon ----
DesktopIcon.background=darken($Desktop.background,10%)
#---- HelpButton ----
HelpButton.questionMarkColor=#4F9EE3
#---- InternalFrame ----
InternalFrame.activeTitleBackground=#fff
InternalFrame.activeTitleForeground=@foreground
InternalFrame.inactiveTitleBackground=#fafafa
InternalFrame.inactiveTitleForeground=@disabledText
InternalFrame.activeBorderColor=darken($Component.borderColor,20%)
InternalFrame.inactiveBorderColor=$Component.borderColor
InternalFrame.buttonHoverBackground=darken(10%,autoInverse)
InternalFrame.buttonPressedBackground=darken(20%,autoInverse)
InternalFrame.closeHoverBackground=lazy(Actions.Red)
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
InternalFrame.closeHoverForeground=#fff
InternalFrame.closePressedForeground=#fff
#---- List ----
List.background=@textComponentBackground
@@ -151,6 +180,7 @@ Menu.icon.disabledArrowColor=#ABABAB
#---- MenuBar ----
MenuBar.borderColor=#cdcdcd
MenuBar.hoverBackground=darken($MenuBar.background,10%)
#---- MenuItemCheckBox ----

View File

@@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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,
@@ -14,11 +14,17 @@
* limitations under the License.
*/
version = rootProject.version
plugins {
`java-library`
id( "com.jfrog.bintray" ) version "1.8.4"
id( "com.jfrog.bintray" )
// Although artifactory plugin is not used in this subproject, the plugin is required
// because otherwise gradle fails with following error:
// Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException:
// Cannot cast object 'task ':bintrayUpload''
// with class 'com.jfrog.bintray.gradle.tasks.BintrayUploadTask_Decorated'
// to class 'com.jfrog.bintray.gradle.tasks.BintrayUploadTask'
id( "com.jfrog.artifactory" )
}
dependencies {
@@ -28,11 +34,6 @@ dependencies {
implementation( "com.jgoodies:jgoodies-forms:1.9.0" )
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks {
jar {
dependsOn( ":flatlaf-core:jar" )
@@ -46,14 +47,18 @@ tasks {
// include all dependencies in jar
from( {
configurations.runtimeClasspath.get().filter { it.name.endsWith( "jar" ) }.map { zipTree( it ) }
configurations.runtimeClasspath.get()
.filter { it.name.endsWith( "jar" ) }
.map { zipTree( it ).matching {
exclude( "META-INF/LICENSE" )
} }
} )
}
}
bintray {
user = System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" )
key = System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" )
user = rootProject.extra["bintray.user"] as String?
key = rootProject.extra["bintray.key"] as String?
setConfigurations( "archives" )
@@ -67,6 +72,7 @@ bintray {
name = project.version.toString()
}
publish = true
publish = rootProject.extra["bintray.publish"] as Boolean
dryRun = rootProject.extra["bintray.dryRun"] as Boolean
}
}

View File

@@ -17,6 +17,7 @@
package com.formdev.flatlaf.demo;
import javax.swing.*;
import javax.swing.text.DefaultEditorKit;
import net.miginfocom.swing.*;
/**
@@ -113,6 +114,10 @@ class BasicComponentsPanel
JScrollPane scrollPane12 = new JScrollPane();
JTextPane textPane4 = new JTextPane();
JTextPane textPane5 = new JTextPane();
JPopupMenu popupMenu1 = new JPopupMenu();
JMenuItem cutMenuItem = new JMenuItem();
JMenuItem copyMenuItem = new JMenuItem();
JMenuItem pasteMenuItem = new JMenuItem();
//======== this ========
setLayout(new MigLayout(
@@ -260,6 +265,8 @@ class BasicComponentsPanel
//---- comboBoxLabel ----
comboBoxLabel.setText("JComboBox:");
comboBoxLabel.setDisplayedMnemonic('C');
comboBoxLabel.setLabelFor(comboBox1);
add(comboBoxLabel, "cell 0 4");
//---- comboBox1 ----
@@ -314,6 +321,8 @@ class BasicComponentsPanel
//---- spinnerLabel ----
spinnerLabel.setText("JSpinner:");
spinnerLabel.setLabelFor(spinner1);
spinnerLabel.setDisplayedMnemonic('S');
add(spinnerLabel, "cell 0 5");
add(spinner1, "cell 1 5,growx");
@@ -328,10 +337,13 @@ class BasicComponentsPanel
//---- textFieldLabel ----
textFieldLabel.setText("JTextField:");
textFieldLabel.setDisplayedMnemonic('T');
textFieldLabel.setLabelFor(textField1);
add(textFieldLabel, "cell 0 6");
//---- textField1 ----
textField1.setText("editable");
textField1.setComponentPopupMenu(popupMenu1);
add(textField1, "cell 1 6,growx");
//---- textField2 ----
@@ -356,10 +368,13 @@ class BasicComponentsPanel
//---- formattedTextFieldLabel ----
formattedTextFieldLabel.setText("JFormattedTextField:");
formattedTextFieldLabel.setLabelFor(formattedTextField1);
formattedTextFieldLabel.setDisplayedMnemonic('O');
add(formattedTextFieldLabel, "cell 0 7");
//---- formattedTextField1 ----
formattedTextField1.setText("editable");
formattedTextField1.setComponentPopupMenu(popupMenu1);
add(formattedTextField1, "cell 1 7,growx");
//---- formattedTextField2 ----
@@ -582,7 +597,27 @@ class BasicComponentsPanel
//---- textPane5 ----
textPane5.setText("no scroll pane");
add(textPane5, "cell 5 11,growx");
//======== popupMenu1 ========
{
//---- cutMenuItem ----
cutMenuItem.setText("Cut");
popupMenu1.add(cutMenuItem);
//---- copyMenuItem ----
copyMenuItem.setText("Copy");
popupMenu1.add(copyMenuItem);
//---- pasteMenuItem ----
pasteMenuItem.setText("Paste");
popupMenu1.add(pasteMenuItem);
}
// JFormDesigner - End of component initialization //GEN-END:initComponents
cutMenuItem.addActionListener( new DefaultEditorKit.CutAction() );
copyMenuItem.addActionListener( new DefaultEditorKit.CopyAction() );
pasteMenuItem.addActionListener( new DefaultEditorKit.PasteAction() );
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables

View File

@@ -183,6 +183,8 @@ new FormModel {
add( new FormComponent( "javax.swing.JLabel" ) {
name: "comboBoxLabel"
"text": "JComboBox:"
"displayedMnemonic": 67
"labelFor": new FormReference( "comboBox1" )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4"
} )
@@ -254,6 +256,8 @@ new FormModel {
add( new FormComponent( "javax.swing.JLabel" ) {
name: "spinnerLabel"
"text": "JSpinner:"
"labelFor": new FormReference( "spinner1" )
"displayedMnemonic": 83
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 5"
} )
@@ -281,12 +285,15 @@ new FormModel {
add( new FormComponent( "javax.swing.JLabel" ) {
name: "textFieldLabel"
"text": "JTextField:"
"displayedMnemonic": 84
"labelFor": new FormReference( "textField1" )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 6"
} )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField1"
"text": "editable"
"componentPopupMenu": &FormReference0 new FormReference( "popupMenu1" )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 6,growx"
} )
@@ -321,12 +328,15 @@ new FormModel {
add( new FormComponent( "javax.swing.JLabel" ) {
name: "formattedTextFieldLabel"
"text": "JFormattedTextField:"
"labelFor": new FormReference( "formattedTextField1" )
"displayedMnemonic": 79
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 7"
} )
add( new FormComponent( "javax.swing.JFormattedTextField" ) {
name: "formattedTextField1"
"text": "editable"
"componentPopupMenu": #FormReference0
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 7,growx"
} )
@@ -585,7 +595,25 @@ new FormModel {
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 790, 715 )
"size": new java.awt.Dimension( 790, 440 )
} )
add( new FormContainer( "javax.swing.JPopupMenu", new FormLayoutManager( class javax.swing.JPopupMenu ) ) {
name: "popupMenu1"
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "cutMenuItem"
"text": "Cut"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "copyMenuItem"
"text": "Copy"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "pasteMenuItem"
"text": "Paste"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 500 )
"size": new java.awt.Dimension( 91, 87 )
} )
}
}

View File

@@ -19,6 +19,7 @@ package com.formdev.flatlaf.demo;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.DefaultEditorKit;
import com.formdev.flatlaf.demo.intellijthemes.*;
import com.formdev.flatlaf.extras.FlatSVGIcon;
import net.miginfocom.swing.*;
@@ -51,6 +52,12 @@ class DemoFrame
DemoPrefs.getState().putInt( FlatLafDemo.KEY_TAB, tabbedPane.getSelectedIndex() );
}
private void menuItemActionPerformed(ActionEvent e) {
SwingUtilities.invokeLater( () -> {
JOptionPane.showMessageDialog( this, e.getActionCommand(), "Menu Item", JOptionPane.PLAIN_MESSAGE );
} );
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
JMenuBar menuBar1 = new JMenuBar();
@@ -68,6 +75,14 @@ class DemoFrame
JMenuItem deleteMenuItem = new JMenuItem();
JMenu viewMenu = new JMenu();
JCheckBoxMenuItem checkBoxMenuItem1 = new JCheckBoxMenuItem();
JMenu menu1 = new JMenu();
JMenu subViewsMenu = new JMenu();
JMenu subSubViewsMenu = new JMenu();
JMenuItem errorLogViewMenuItem = new JMenuItem();
JMenuItem searchViewMenuItem = new JMenuItem();
JMenuItem projectViewMenuItem = new JMenuItem();
JMenuItem structureViewMenuItem = new JMenuItem();
JMenuItem propertiesViewMenuItem = new JMenuItem();
JRadioButtonMenuItem radioButtonMenuItem1 = new JRadioButtonMenuItem();
JRadioButtonMenuItem radioButtonMenuItem2 = new JRadioButtonMenuItem();
JRadioButtonMenuItem radioButtonMenuItem3 = new JRadioButtonMenuItem();
@@ -103,27 +118,35 @@ class DemoFrame
//======== fileMenu ========
{
fileMenu.setText("File");
fileMenu.setMnemonic('F');
//---- newMenuItem ----
newMenuItem.setText("New");
newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
newMenuItem.setMnemonic('N');
newMenuItem.addActionListener(e -> menuItemActionPerformed(e));
fileMenu.add(newMenuItem);
//---- openMenuItem ----
openMenuItem.setText("Open");
openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
openMenuItem.setMnemonic('O');
openMenuItem.addActionListener(e -> menuItemActionPerformed(e));
fileMenu.add(openMenuItem);
fileMenu.addSeparator();
//---- closeMenuItem ----
closeMenuItem.setText("Close");
closeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
closeMenuItem.setMnemonic('C');
closeMenuItem.addActionListener(e -> menuItemActionPerformed(e));
fileMenu.add(closeMenuItem);
fileMenu.addSeparator();
//---- exitMenuItem ----
exitMenuItem.setText("Exit");
exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
exitMenuItem.setMnemonic('X');
exitMenuItem.addActionListener(e -> exitActionPerformed());
fileMenu.add(exitMenuItem);
}
@@ -132,37 +155,47 @@ class DemoFrame
//======== editMenu ========
{
editMenu.setText("Edit");
editMenu.setMnemonic('E');
//---- undoMenuItem ----
undoMenuItem.setText("Undo");
undoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
undoMenuItem.setMnemonic('U');
undoMenuItem.addActionListener(e -> menuItemActionPerformed(e));
editMenu.add(undoMenuItem);
//---- redoMenuItem ----
redoMenuItem.setText("Redo");
redoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
redoMenuItem.setMnemonic('R');
redoMenuItem.addActionListener(e -> menuItemActionPerformed(e));
editMenu.add(redoMenuItem);
editMenu.addSeparator();
//---- cutMenuItem ----
cutMenuItem.setText("Cut");
cutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
cutMenuItem.setMnemonic('C');
editMenu.add(cutMenuItem);
//---- copyMenuItem ----
copyMenuItem.setText("Copy");
copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
copyMenuItem.setMnemonic('O');
editMenu.add(copyMenuItem);
//---- pasteMenuItem ----
pasteMenuItem.setText("Paste");
pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
pasteMenuItem.setMnemonic('P');
editMenu.add(pasteMenuItem);
editMenu.addSeparator();
//---- deleteMenuItem ----
deleteMenuItem.setText("Delete");
deleteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
deleteMenuItem.setMnemonic('D');
deleteMenuItem.addActionListener(e -> menuItemActionPerformed(e));
editMenu.add(deleteMenuItem);
}
menuBar1.add(editMenu);
@@ -170,24 +203,84 @@ class DemoFrame
//======== viewMenu ========
{
viewMenu.setText("View");
viewMenu.setMnemonic('V');
//---- checkBoxMenuItem1 ----
checkBoxMenuItem1.setText("Show Toolbar");
checkBoxMenuItem1.setSelected(true);
checkBoxMenuItem1.setMnemonic('T');
checkBoxMenuItem1.addActionListener(e -> menuItemActionPerformed(e));
viewMenu.add(checkBoxMenuItem1);
//======== menu1 ========
{
menu1.setText("Show View");
menu1.setMnemonic('V');
//======== subViewsMenu ========
{
subViewsMenu.setText("Sub Views");
subViewsMenu.setMnemonic('S');
//======== subSubViewsMenu ========
{
subSubViewsMenu.setText("Sub sub Views");
subSubViewsMenu.setMnemonic('U');
//---- errorLogViewMenuItem ----
errorLogViewMenuItem.setText("Error Log");
errorLogViewMenuItem.setMnemonic('E');
errorLogViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
subSubViewsMenu.add(errorLogViewMenuItem);
}
subViewsMenu.add(subSubViewsMenu);
//---- searchViewMenuItem ----
searchViewMenuItem.setText("Search");
searchViewMenuItem.setMnemonic('S');
searchViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
subViewsMenu.add(searchViewMenuItem);
}
menu1.add(subViewsMenu);
//---- projectViewMenuItem ----
projectViewMenuItem.setText("Project");
projectViewMenuItem.setMnemonic('P');
projectViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
menu1.add(projectViewMenuItem);
//---- structureViewMenuItem ----
structureViewMenuItem.setText("Structure");
structureViewMenuItem.setMnemonic('T');
structureViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
menu1.add(structureViewMenuItem);
//---- propertiesViewMenuItem ----
propertiesViewMenuItem.setText("Properties");
propertiesViewMenuItem.setMnemonic('O');
propertiesViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
menu1.add(propertiesViewMenuItem);
}
viewMenu.add(menu1);
viewMenu.addSeparator();
//---- radioButtonMenuItem1 ----
radioButtonMenuItem1.setText("Details");
radioButtonMenuItem1.setSelected(true);
radioButtonMenuItem1.setMnemonic('D');
radioButtonMenuItem1.addActionListener(e -> menuItemActionPerformed(e));
viewMenu.add(radioButtonMenuItem1);
//---- radioButtonMenuItem2 ----
radioButtonMenuItem2.setText("Small Icons");
radioButtonMenuItem2.setMnemonic('S');
radioButtonMenuItem2.addActionListener(e -> menuItemActionPerformed(e));
viewMenu.add(radioButtonMenuItem2);
//---- radioButtonMenuItem3 ----
radioButtonMenuItem3.setText("Large Icons");
radioButtonMenuItem3.setMnemonic('L');
radioButtonMenuItem3.addActionListener(e -> menuItemActionPerformed(e));
viewMenu.add(radioButtonMenuItem3);
}
menuBar1.add(viewMenu);
@@ -195,9 +288,11 @@ class DemoFrame
//======== helpMenu ========
{
helpMenu.setText("Help");
helpMenu.setMnemonic('H');
//---- aboutMenuItem ----
aboutMenuItem.setText("About");
aboutMenuItem.setMnemonic('A');
aboutMenuItem.addActionListener(e -> aboutActionPerformed());
helpMenu.add(aboutMenuItem);
}
@@ -288,6 +383,10 @@ class DemoFrame
pasteButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/menu-paste.svg" ) );
refreshButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/refresh.svg" ) );
showToggleButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/show.svg" ) );
cutMenuItem.addActionListener( new DefaultEditorKit.CutAction() );
copyMenuItem.addActionListener( new DefaultEditorKit.CopyAction() );
pasteMenuItem.addActionListener( new DefaultEditorKit.PasteAction() );
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.0.0.194" Java: "13.0.1" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -117,15 +117,20 @@ new FormModel {
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "fileMenu"
"text": "File"
"mnemonic": 70
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "newMenuItem"
"text": "New"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 78, 4226, false )
"mnemonic": 78
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "openMenuItem"
"text": "Open"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 79, 4226, false )
"mnemonic": 79
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
name: "separator2"
@@ -134,6 +139,8 @@ new FormModel {
name: "closeMenuItem"
"text": "Close"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 87, 4226, false )
"mnemonic": 67
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
name: "separator1"
@@ -142,21 +149,27 @@ new FormModel {
name: "exitMenuItem"
"text": "Exit"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 81, 4226, false )
"mnemonic": 88
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "exitActionPerformed", false ) )
} )
} )
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "editMenu"
"text": "Edit"
"mnemonic": 69
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "undoMenuItem"
"text": "Undo"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 90, 4226, false )
"mnemonic": 85
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "redoMenuItem"
"text": "Redo"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 89, 4226, false )
"mnemonic": 82
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
name: "separator4"
@@ -165,16 +178,19 @@ new FormModel {
name: "cutMenuItem"
"text": "Cut"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 88, 4226, false )
"mnemonic": 67
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "copyMenuItem"
"text": "Copy"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 67, 4226, false )
"mnemonic": 79
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "pasteMenuItem"
"text": "Paste"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 86, 4226, false )
"mnemonic": 80
} )
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
name: "separator3"
@@ -183,15 +199,65 @@ new FormModel {
name: "deleteMenuItem"
"text": "Delete"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 127, 0, false )
"mnemonic": 68
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
} )
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "viewMenu"
"text": "View"
"mnemonic": 86
add( new FormComponent( "javax.swing.JCheckBoxMenuItem" ) {
name: "checkBoxMenuItem1"
"text": "Show Toolbar"
"selected": true
"mnemonic": 84
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "menu1"
"text": "Show View"
"mnemonic": 86
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "subViewsMenu"
"text": "Sub Views"
"mnemonic": 83
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "subSubViewsMenu"
"text": "Sub sub Views"
"mnemonic": 85
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "errorLogViewMenuItem"
"text": "Error Log"
"mnemonic": 69
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "searchViewMenuItem"
"text": "Search"
"mnemonic": 83
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "projectViewMenuItem"
"text": "Project"
"mnemonic": 80
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "structureViewMenuItem"
"text": "Structure"
"mnemonic": 84
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "propertiesViewMenuItem"
"text": "Properties"
"mnemonic": 79
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
} )
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
name: "separator8"
@@ -201,24 +267,32 @@ new FormModel {
"text": "Details"
"selected": true
"$buttonGroup": new FormReference( "buttonGroup1" )
"mnemonic": 68
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
name: "radioButtonMenuItem2"
"text": "Small Icons"
"$buttonGroup": new FormReference( "buttonGroup1" )
"mnemonic": 83
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
name: "radioButtonMenuItem3"
"text": "Large Icons"
"$buttonGroup": new FormReference( "buttonGroup1" )
"mnemonic": 76
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
} )
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "helpMenu"
"text": "Help"
"mnemonic": 72
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "aboutMenuItem"
"text": "About"
"mnemonic": 65
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "aboutActionPerformed", false ) )
} )
} )

View File

@@ -10,7 +10,8 @@
"selectionForeground": "#ffffff",
"selectionInactiveBackground": "#C36200",
"selectionBackgroundInactive": "#c36200",
"background" : "#F5F5F5"
"background" : "#FFFFFF",
"focusColor" : "#f57900"
},
"Borders": {
@@ -23,6 +24,7 @@
"startBorderColor": "#C4C4C4",
"endBorderColor": "#C4C4C4",
"focusedBorderColor" : "#f57900",
"background" : "#F5F5F5",
"default": {
"foreground": "#FFFFFF",
"startBackground": "#f57900",
@@ -40,8 +42,6 @@
"WelcomeScreen.background" : "#F5F5F5",
"WelcomeScreen.Projects.background" : "#ffffff",
"List.background" : "#ffffff",
"MenuBar.foreground" : "#5c616c",
"Menu.background" : "#ffffff",
"Menu.separatorColor" : "#F5F5F5",
@@ -49,8 +49,10 @@
"MenuItem.foreground" : "#5c616c",
"MenuItem.background" : "#ffffff",
"PopupMenuSeparator.height" : "1",
"Separator.separatorColor" : "#9ba2ab",
"Tree.background" : "#ffffff",
"Tree.rowHeight": "23",
"ProgressBar.background" : "#f57900",
"ProgressBar.foreground" : "#f57900",
@@ -69,9 +71,11 @@
"ParameterInfo.background" : "#fffae3",
"ParameterInfo.currentOverloadBackground" : "#fffae3",
"List.background" : "#ffffff",
"List.dropLineColor" : "#f57900",
"List.selectionBackground": "#f57900",
"List.selectionForeground": "#ffffff",
"List.selectionInactiveBackground": "#C36200",
"Table.background" : "#ffffff",
"Table.selectionBackground" : "#f57900",
@@ -83,6 +87,7 @@
"TabbedPane.underlineColor" : "#f57900",
"TabbedPane.tabSelectionHeight" : 2,
"TabbedPane.background" : "#F5F5F5",
"Link.hoverForeground" : "#f57900",
"Link.activeForeground" : "#f57900",
@@ -98,8 +103,22 @@
"TextArea.background" : "#ffffff",
"TextPane.background" : "#ffffff",
"PasswordField.background" : "#ffffff",
"FormattedTextField.background" : "#ffffff",
"Editor.background" : "#f5f5f5",
"EditorPane.background" : "#ffffff",
"CompletionPopup.background" : "#ffffff",
"CheckBox.background" : "#F5F5F5",
"RadioButton.background" : "#F5F5F5",
"Slider.background" : "#F5F5F5",
"Spinner.background" : "#F5F5F5",
"OptionPane.background" : "#F5F5F5",
"CompletionPopup": {
"selectionBackground" : "#F5790055",
"nonFocusedMask": false,
"matchForeground": "#F57900",
"selectionInactiveBackground": "#C36200"
},
"Plugins.lightSelectionBackground" : "#dddee1",
"Plugins.SearchField.background" : "#ffffff",
@@ -116,8 +135,10 @@
"Counter.foreground" : "#ffffff",
"SearchEverywhere.SearchField.background" : "#ffffff",
"SearchEverywhere.Header.background" : "#F5F5F5",
"ToolTip.background" : "#fffae3",
"ToolTip.background" : "#F5F5F5",
"ToolTip.Actions.background" : "#F5F5F5",
"ToolWindow.Header.background" : "#e7e8eb",
"ToolWindow.HeaderTab.selectedBackground" : "#dddee1",
@@ -128,8 +149,12 @@
"ToolWindow.HeaderTab.underlineColor" : "#f57900",
"DefaultTabs.underlineHeight" : 2,
"DefaultTabs.underlineColor" : "#f57900",
"DefaultTabs.background" : "#F5F5F5",
"EditorTabs.underlineHeight" : 2,
"EditorTabs.underlineColor" : "#f57900"
"EditorTabs.underlineColor" : "#f57900",
"EditorTabs.background" : "#F5F5F5",
"Notification.background" : "#F5F5F5"
},

View File

@@ -10,7 +10,8 @@
"selectionForeground": "#ffffff",
"selectionInactiveBackground": "#1e61b0",
"selectionBackgroundInactive": "#1e61b0",
"background" : "#F5F5F5"
"background" : "#FFFFFF",
"focusColor" : "#2679db"
},
"Borders": {
@@ -23,6 +24,7 @@
"startBorderColor": "#C4C4C4",
"endBorderColor": "#C4C4C4",
"focusedBorderColor" : "#2679db",
"background" : "#F5F5F5",
"default": {
"foreground": "#FFFFFF",
"startBackground": "#2679db",
@@ -40,8 +42,6 @@
"WelcomeScreen.background" : "#F5F5F5",
"WelcomeScreen.Projects.background" : "#ffffff",
"List.background" : "#ffffff",
"MenuBar.foreground" : "#5c616c",
"Menu.background" : "#ffffff",
"Menu.separatorColor" : "#F5F5F5",
@@ -49,8 +49,10 @@
"MenuItem.foreground" : "#5c616c",
"MenuItem.background" : "#ffffff",
"PopupMenuSeparator.height" : "1",
"Separator.separatorColor" : "#9ba2ab",
"Tree.background" : "#ffffff",
"Tree.rowHeight": "23",
"ProgressBar.background" : "#2679db",
"ProgressBar.foreground" : "#2679db",
@@ -69,9 +71,11 @@
"ParameterInfo.background" : "#fffae3",
"ParameterInfo.currentOverloadBackground" : "#fffae3",
"List.background" : "#ffffff",
"List.dropLineColor" : "#2679db",
"List.selectionBackground": "#2679db",
"List.selectionForeground": "#ffffff",
"List.selectionInactiveBackground": "#1e61b0",
"Table.background" : "#ffffff",
"Table.selectionBackground" : "#2679db",
@@ -83,6 +87,7 @@
"TabbedPane.underlineColor" : "#2679db",
"TabbedPane.tabSelectionHeight" : 2,
"TabbedPane.background" : "#F5F5F5",
"Link.hoverForeground" : "#2679db",
"Link.activeForeground" : "#2679db",
@@ -98,8 +103,22 @@
"TextArea.background" : "#ffffff",
"TextPane.background" : "#ffffff",
"PasswordField.background" : "#ffffff",
"FormattedTextField.background" : "#ffffff",
"Editor.background" : "#f5f5f5",
"EditorPane.background" : "#ffffff",
"CompletionPopup.background" : "#ffffff",
"CheckBox.background" : "#F5F5F5",
"RadioButton.background" : "#F5F5F5",
"Slider.background" : "#F5F5F5",
"Spinner.background" : "#F5F5F5",
"OptionPane.background" : "#F5F5F5",
"CompletionPopup": {
"selectionBackground" : "#2679db55",
"nonFocusedMask": false,
"matchForeground": "#2679db",
"selectionInactiveBackground": "#1e61b0"
},
"Plugins.lightSelectionBackground" : "#dddee1",
"Plugins.SearchField.background" : "#ffffff",
@@ -116,8 +135,10 @@
"Counter.foreground" : "#ffffff",
"SearchEverywhere.SearchField.background" : "#ffffff",
"SearchEverywhere.Header.background" : "#F5F5F5",
"ToolTip.background" : "#fffae3",
"ToolTip.background" : "#F5F5F5",
"ToolTip.Actions.background" : "#F5F5F5",
"ToolWindow.Header.background" : "#e7e8eb",
"ToolWindow.HeaderTab.selectedBackground" : "#dddee1",
@@ -128,8 +149,12 @@
"ToolWindow.HeaderTab.underlineColor" : "#2679db",
"DefaultTabs.underlineHeight" : 2,
"DefaultTabs.underlineColor" : "#2679db",
"DefaultTabs.background" : "#F5F5F5",
"EditorTabs.underlineHeight" : 2,
"EditorTabs.underlineColor" : "#2679db"
"EditorTabs.underlineColor" : "#2679db",
"EditorTabs.background" : "#F5F5F5",
"Notification.background" : "#F5F5F5"
},

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#42A5F5",
"Checkbox.Foreground.Disabled": "#D3DAE3",
"Checkbox.Foreground.Disabled.Dark": "#D3DAE3",
"Checkbox.Background.Selected": "#2f343f",
"Checkbox.Background.Selected": "#42A5F5",
"Checkbox.Background.Selected.Dark": "#2f343f",
"Checkbox.Border.Selected": "#42A5F5",
"Checkbox.Border.Selected.Dark": "#42A5F5",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#42A5F5",
"Checkbox.Foreground.Disabled": "#D3DAE3",
"Checkbox.Foreground.Disabled.Dark": "#D3DAE3",
"Checkbox.Background.Selected": "#2f343f",
"Checkbox.Background.Selected": "#42A5F5",
"Checkbox.Background.Selected.Dark": "#2f343f",
"Checkbox.Border.Selected": "#42A5F5",
"Checkbox.Border.Selected.Dark": "#42A5F5",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#2979ff",
"Checkbox.Foreground.Disabled": "#6B727D",
"Checkbox.Foreground.Disabled.Dark": "#6B727D",
"Checkbox.Background.Selected": "#282C34",
"Checkbox.Background.Selected": "#2979ff",
"Checkbox.Background.Selected.Dark": "#282C34",
"Checkbox.Border.Selected": "#2979ff",
"Checkbox.Border.Selected.Dark": "#2979ff",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#2979ff",
"Checkbox.Foreground.Disabled": "#6B727D",
"Checkbox.Foreground.Disabled.Dark": "#6B727D",
"Checkbox.Background.Selected": "#282C34",
"Checkbox.Background.Selected": "#2979ff",
"Checkbox.Background.Selected.Dark": "#282C34",
"Checkbox.Border.Selected": "#2979ff",
"Checkbox.Border.Selected.Dark": "#2979ff",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#2979ff",
"Checkbox.Foreground.Disabled": "#b8b8b9",
"Checkbox.Foreground.Disabled.Dark": "#b8b8b9",
"Checkbox.Background.Selected": "#F4F4F4",
"Checkbox.Background.Selected": "#2979ff",
"Checkbox.Background.Selected.Dark": "#F4F4F4",
"Checkbox.Border.Selected": "#2979ff",
"Checkbox.Border.Selected.Dark": "#2979ff",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#2979ff",
"Checkbox.Foreground.Disabled": "#b8b8b9",
"Checkbox.Foreground.Disabled.Dark": "#b8b8b9",
"Checkbox.Background.Selected": "#F4F4F4",
"Checkbox.Background.Selected": "#2979ff",
"Checkbox.Background.Selected.Dark": "#F4F4F4",
"Checkbox.Border.Selected": "#2979ff",
"Checkbox.Border.Selected.Dark": "#2979ff",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#FF79C5",
"Checkbox.Foreground.Disabled": "#6272A4",
"Checkbox.Foreground.Disabled.Dark": "#6272A4",
"Checkbox.Background.Selected": "#282A36",
"Checkbox.Background.Selected": "#FF79C5",
"Checkbox.Background.Selected.Dark": "#282A36",
"Checkbox.Border.Selected": "#FF79C5",
"Checkbox.Border.Selected.Dark": "#FF79C5",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#FF79C5",
"Checkbox.Foreground.Disabled": "#6272A4",
"Checkbox.Foreground.Disabled.Dark": "#6272A4",
"Checkbox.Background.Selected": "#282A36",
"Checkbox.Background.Selected": "#FF79C5",
"Checkbox.Background.Selected.Dark": "#282A36",
"Checkbox.Border.Selected": "#FF79C5",
"Checkbox.Border.Selected.Dark": "#FF79C5",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#79CB60",
"Checkbox.Foreground.Disabled": "#9ba0a3",
"Checkbox.Foreground.Disabled.Dark": "#9ba0a3",
"Checkbox.Background.Selected": "#F7F8FA",
"Checkbox.Background.Selected": "#79CB60",
"Checkbox.Background.Selected.Dark": "#F7F8FA",
"Checkbox.Border.Selected": "#79CB60",
"Checkbox.Border.Selected.Dark": "#79CB60",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#79CB60",
"Checkbox.Foreground.Disabled": "#9ba0a3",
"Checkbox.Foreground.Disabled.Dark": "#9ba0a3",
"Checkbox.Background.Selected": "#F7F8FA",
"Checkbox.Background.Selected": "#79CB60",
"Checkbox.Background.Selected.Dark": "#F7F8FA",
"Checkbox.Border.Selected": "#79CB60",
"Checkbox.Border.Selected.Dark": "#79CB60",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#2AA298",
"Checkbox.Foreground.Disabled": "#93A1A1",
"Checkbox.Foreground.Disabled.Dark": "#93A1A1",
"Checkbox.Background.Selected": "#F0F0F0",
"Checkbox.Background.Selected": "#2AA298",
"Checkbox.Background.Selected.Dark": "#F0F0F0",
"Checkbox.Border.Selected": "#2AA298",
"Checkbox.Border.Selected.Dark": "#2AA298",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#2AA298",
"Checkbox.Foreground.Disabled": "#93A1A1",
"Checkbox.Foreground.Disabled.Dark": "#93A1A1",
"Checkbox.Background.Selected": "#F0F0F0",
"Checkbox.Background.Selected": "#2AA298",
"Checkbox.Background.Selected.Dark": "#F0F0F0",
"Checkbox.Border.Selected": "#2AA298",
"Checkbox.Border.Selected.Dark": "#2AA298",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#FF9800",
"Checkbox.Foreground.Disabled": "#474747",
"Checkbox.Foreground.Disabled.Dark": "#474747",
"Checkbox.Background.Selected": "#212121",
"Checkbox.Background.Selected": "#FF9800",
"Checkbox.Background.Selected.Dark": "#212121",
"Checkbox.Border.Selected": "#FF9800",
"Checkbox.Border.Selected.Dark": "#FF9800",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#FF9800",
"Checkbox.Foreground.Disabled": "#474747",
"Checkbox.Foreground.Disabled.Dark": "#474747",
"Checkbox.Background.Selected": "#212121",
"Checkbox.Background.Selected": "#FF9800",
"Checkbox.Background.Selected.Dark": "#212121",
"Checkbox.Border.Selected": "#FF9800",
"Checkbox.Border.Selected.Dark": "#FF9800",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#84ffff",
"Checkbox.Foreground.Disabled": "#464B5D",
"Checkbox.Foreground.Disabled.Dark": "#464B5D",
"Checkbox.Background.Selected": "#0F111A",
"Checkbox.Background.Selected": "#84ffff",
"Checkbox.Background.Selected.Dark": "#0F111A",
"Checkbox.Border.Selected": "#84ffff",
"Checkbox.Border.Selected.Dark": "#84ffff",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#84ffff",
"Checkbox.Foreground.Disabled": "#464B5D",
"Checkbox.Foreground.Disabled.Dark": "#464B5D",
"Checkbox.Background.Selected": "#0F111A",
"Checkbox.Background.Selected": "#84ffff",
"Checkbox.Background.Selected.Dark": "#0F111A",
"Checkbox.Border.Selected": "#84ffff",
"Checkbox.Border.Selected.Dark": "#84ffff",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#00BCD4",
"Checkbox.Foreground.Disabled": "#D2D4D5",
"Checkbox.Foreground.Disabled.Dark": "#D2D4D5",
"Checkbox.Background.Selected": "#FAFAFA",
"Checkbox.Background.Selected": "#00BCD4",
"Checkbox.Background.Selected.Dark": "#FAFAFA",
"Checkbox.Border.Selected": "#00BCD4",
"Checkbox.Border.Selected.Dark": "#00BCD4",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#00BCD4",
"Checkbox.Foreground.Disabled": "#D2D4D5",
"Checkbox.Foreground.Disabled.Dark": "#D2D4D5",
"Checkbox.Background.Selected": "#FAFAFA",
"Checkbox.Background.Selected": "#00BCD4",
"Checkbox.Background.Selected.Dark": "#FAFAFA",
"Checkbox.Border.Selected": "#00BCD4",
"Checkbox.Border.Selected.Dark": "#00BCD4",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#009688",
"Checkbox.Foreground.Disabled": "#415967",
"Checkbox.Foreground.Disabled.Dark": "#415967",
"Checkbox.Background.Selected": "#263238",
"Checkbox.Background.Selected": "#009688",
"Checkbox.Background.Selected.Dark": "#263238",
"Checkbox.Border.Selected": "#009688",
"Checkbox.Border.Selected.Dark": "#009688",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#009688",
"Checkbox.Foreground.Disabled": "#415967",
"Checkbox.Foreground.Disabled.Dark": "#415967",
"Checkbox.Background.Selected": "#263238",
"Checkbox.Background.Selected": "#009688",
"Checkbox.Background.Selected.Dark": "#263238",
"Checkbox.Border.Selected": "#009688",
"Checkbox.Border.Selected.Dark": "#009688",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#ab47bc",
"Checkbox.Foreground.Disabled": "#515772",
"Checkbox.Foreground.Disabled.Dark": "#515772",
"Checkbox.Background.Selected": "#292D3E",
"Checkbox.Background.Selected": "#ab47bc",
"Checkbox.Background.Selected.Dark": "#292D3E",
"Checkbox.Border.Selected": "#ab47bc",
"Checkbox.Border.Selected.Dark": "#ab47bc",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#ab47bc",
"Checkbox.Foreground.Disabled": "#515772",
"Checkbox.Foreground.Disabled.Dark": "#515772",
"Checkbox.Background.Selected": "#292D3E",
"Checkbox.Background.Selected": "#ab47bc",
"Checkbox.Background.Selected.Dark": "#292D3E",
"Checkbox.Border.Selected": "#ab47bc",
"Checkbox.Border.Selected.Dark": "#ab47bc",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#ffd866",
"Checkbox.Foreground.Disabled": "#5b595c",
"Checkbox.Foreground.Disabled.Dark": "#5b595c",
"Checkbox.Background.Selected": "#2D2A2E",
"Checkbox.Background.Selected": "#ffd866",
"Checkbox.Background.Selected.Dark": "#2D2A2E",
"Checkbox.Border.Selected": "#ffd866",
"Checkbox.Border.Selected.Dark": "#ffd866",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#ffd866",
"Checkbox.Foreground.Disabled": "#5b595c",
"Checkbox.Foreground.Disabled.Dark": "#5b595c",
"Checkbox.Background.Selected": "#2D2A2E",
"Checkbox.Background.Selected": "#ffd866",
"Checkbox.Background.Selected.Dark": "#2D2A2E",
"Checkbox.Border.Selected": "#ffd866",
"Checkbox.Border.Selected.Dark": "#ffd866",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#7e57c2",
"Checkbox.Foreground.Disabled": "#697098",
"Checkbox.Foreground.Disabled.Dark": "#697098",
"Checkbox.Background.Selected": "#011627",
"Checkbox.Background.Selected": "#7e57c2",
"Checkbox.Background.Selected.Dark": "#011627",
"Checkbox.Border.Selected": "#7e57c2",
"Checkbox.Border.Selected.Dark": "#7e57c2",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#7e57c2",
"Checkbox.Foreground.Disabled": "#697098",
"Checkbox.Foreground.Disabled.Dark": "#697098",
"Checkbox.Background.Selected": "#011627",
"Checkbox.Background.Selected": "#7e57c2",
"Checkbox.Background.Selected.Dark": "#011627",
"Checkbox.Border.Selected": "#7e57c2",
"Checkbox.Border.Selected.Dark": "#7e57c2",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#d33682",
"Checkbox.Foreground.Disabled": "#2E5861",
"Checkbox.Foreground.Disabled.Dark": "#2E5861",
"Checkbox.Background.Selected": "#002B36",
"Checkbox.Background.Selected": "#d33682",
"Checkbox.Background.Selected.Dark": "#002B36",
"Checkbox.Border.Selected": "#d33682",
"Checkbox.Border.Selected.Dark": "#d33682",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#d33682",
"Checkbox.Foreground.Disabled": "#2E5861",
"Checkbox.Foreground.Disabled.Dark": "#2E5861",
"Checkbox.Background.Selected": "#002B36",
"Checkbox.Background.Selected": "#d33682",
"Checkbox.Background.Selected.Dark": "#002B36",
"Checkbox.Border.Selected": "#d33682",
"Checkbox.Border.Selected.Dark": "#d33682",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#d33682",
"Checkbox.Foreground.Disabled": "#C9CCC3",
"Checkbox.Foreground.Disabled.Dark": "#C9CCC3",
"Checkbox.Background.Selected": "#fdf6e3",
"Checkbox.Background.Selected": "#d33682",
"Checkbox.Background.Selected.Dark": "#fdf6e3",
"Checkbox.Border.Selected": "#d33682",
"Checkbox.Border.Selected.Dark": "#d33682",

View File

@@ -850,7 +850,7 @@
"Checkbox.Focus.Wide.Dark": "#d33682",
"Checkbox.Foreground.Disabled": "#C9CCC3",
"Checkbox.Foreground.Disabled.Dark": "#C9CCC3",
"Checkbox.Background.Selected": "#fdf6e3",
"Checkbox.Background.Selected": "#d33682",
"Checkbox.Background.Selected.Dark": "#fdf6e3",
"Checkbox.Border.Selected": "#d33682",
"Checkbox.Border.Selected.Dark": "#d33682",

View File

@@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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,
@@ -14,8 +14,6 @@
* limitations under the License.
*/
version = rootProject.version
plugins {
`java-library`
}
@@ -24,8 +22,3 @@ dependencies {
implementation( project( ":flatlaf-core" ) )
implementation( "com.formdev:svgSalamander:1.1.2.1" )
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}

View File

@@ -26,7 +26,7 @@ build script:
groupId: com.formdev
artifactId: flatlaf-jide-oss
version: 0.24
version: (see button below)
Otherwise download `flatlaf-jide-oss-<version>.jar` here:

View File

@@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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,
@@ -14,12 +14,11 @@
* limitations under the License.
*/
version = rootProject.version
plugins {
`java-library`
`maven-publish`
id( "com.jfrog.bintray" ) version "1.8.4"
id( "com.jfrog.bintray" )
id( "com.jfrog.artifactory" )
}
dependencies {
@@ -27,11 +26,6 @@ dependencies {
implementation( "com.jidesoft:jide-oss:3.6.18" )
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks {
assemble {
dependsOn(
@@ -80,7 +74,7 @@ publishing {
licenses {
license {
name.set( "The Apache License, Version 2.0" )
url.set( "http://www.apache.org/licenses/LICENSE-2.0.txt" )
url.set( "https://www.apache.org/licenses/LICENSE-2.0.txt" )
}
}
@@ -101,8 +95,8 @@ publishing {
}
bintray {
user = System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" )
key = System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" )
user = rootProject.extra["bintray.user"] as String?
key = rootProject.extra["bintray.key"] as String?
setPublications( "maven" )
@@ -116,6 +110,29 @@ bintray {
name = project.version.toString()
}
publish = true
publish = rootProject.extra["bintray.publish"] as Boolean
dryRun = rootProject.extra["bintray.dryRun"] as Boolean
}
}
artifactory {
setContextUrl( "https://oss.jfrog.org" )
publish( closureOf<org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig> {
repository( delegateClosureOf<groovy.lang.GroovyObject> {
setProperty( "repoKey", "oss-snapshot-local" )
setProperty( "username", rootProject.extra["bintray.user"] as String? )
setProperty( "password", rootProject.extra["bintray.key"] as String? )
} )
defaults( delegateClosureOf<groovy.lang.GroovyObject> {
invokeMethod( "publications", "maven" )
setProperty( "publishArtifacts", true )
setProperty( "publishPom", true )
} )
} )
resolve( delegateClosureOf<org.jfrog.gradle.plugin.artifactory.dsl.ResolverConfig> {
setProperty( "repoKey", "jcenter" )
} )
}

View File

@@ -33,7 +33,7 @@ build script:
groupId: com.formdev
artifactId: flatlaf-swingx
version: 0.24
version: (see button below)
Otherwise download `flatlaf-swingx-<version>.jar` here:

View File

@@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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,
@@ -14,12 +14,11 @@
* limitations under the License.
*/
version = rootProject.version
plugins {
`java-library`
`maven-publish`
id( "com.jfrog.bintray" ) version "1.8.4"
id( "com.jfrog.bintray" )
id( "com.jfrog.artifactory" )
}
dependencies {
@@ -27,11 +26,6 @@ dependencies {
implementation( "org.swinglabs.swingx:swingx-all:1.6.5-1" )
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks {
assemble {
dependsOn(
@@ -80,7 +74,7 @@ publishing {
licenses {
license {
name.set( "The Apache License, Version 2.0" )
url.set( "http://www.apache.org/licenses/LICENSE-2.0.txt" )
url.set( "https://www.apache.org/licenses/LICENSE-2.0.txt" )
}
}
@@ -101,8 +95,8 @@ publishing {
}
bintray {
user = System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" )
key = System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" )
user = rootProject.extra["bintray.user"] as String?
key = rootProject.extra["bintray.key"] as String?
setPublications( "maven" )
@@ -116,6 +110,29 @@ bintray {
name = project.version.toString()
}
publish = true
publish = rootProject.extra["bintray.publish"] as Boolean
dryRun = rootProject.extra["bintray.dryRun"] as Boolean
}
}
artifactory {
setContextUrl( "https://oss.jfrog.org" )
publish( closureOf<org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig> {
repository( delegateClosureOf<groovy.lang.GroovyObject> {
setProperty( "repoKey", "oss-snapshot-local" )
setProperty( "username", rootProject.extra["bintray.user"] as String? )
setProperty( "password", rootProject.extra["bintray.key"] as String? )
} )
defaults( delegateClosureOf<groovy.lang.GroovyObject> {
invokeMethod( "publications", "maven" )
setProperty( "publishArtifacts", true )
setProperty( "publishPom", true )
} )
} )
resolve( delegateClosureOf<org.jfrog.gradle.plugin.artifactory.dsl.ResolverConfig> {
setProperty( "repoKey", "jcenter" )
} )
}

View File

@@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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,
@@ -14,8 +14,6 @@
* limitations under the License.
*/
version = rootProject.version
plugins {
`java-library`
}
@@ -33,9 +31,8 @@ dependencies {
implementation( "org.swinglabs.swingx:swingx-beaninfo:1.6.5-1" )
implementation( "com.jidesoft:jide-oss:3.6.18" )
implementation( "org.netbeans.api:org-openide-awt:RELEASE112" )
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
// implementation( "org.pushing-pixels:radiance-substance:2.5.1" )
// implementation( "com.weblookandfeel:weblaf-ui:1.2.12" )
// implementation( "com.jgoodies:jgoodies-looks:2.7.0" )
}

View File

@@ -54,6 +54,15 @@ public class FlatComponentsTest
progressBar4.setIndeterminate( indeterminate );
}
private void contentAreaFilledChanged() {
boolean contentAreaFilled = contentAreaFilledCheckBox.isSelected();
for( Component c : getComponents() ) {
if( c instanceof AbstractButton )
((AbstractButton)c).setContentAreaFilled( contentAreaFilled );
}
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
JLabel labelLabel = new JLabel();
@@ -78,18 +87,23 @@ public class FlatComponentsTest
JToggleButton toggleButton10 = new JToggleButton();
JToggleButton toggleButton3 = new JToggleButton();
JToggleButton toggleButton4 = new JToggleButton();
JToggleButton toggleButton5 = new JToggleButton();
JToggleButton toggleButton8 = new JToggleButton();
JToggleButton toggleButton11 = new JToggleButton();
JToggleButton toggleButton12 = new JToggleButton();
JToggleButton toggleButton13 = new JToggleButton();
JToggleButton toggleButton14 = new JToggleButton();
JLabel checkBoxLabel = new JLabel();
JCheckBox checkBox1 = new JCheckBox();
JCheckBox checkBox2 = new JCheckBox();
JCheckBox checkBox3 = new JCheckBox();
JCheckBox checkBox4 = new JCheckBox();
JToggleButton toggleButton5 = new JToggleButton();
JToggleButton toggleButton8 = new JToggleButton();
JLabel radioButtonLabel = new JLabel();
JRadioButton radioButton1 = new JRadioButton();
JRadioButton radioButton2 = new JRadioButton();
JRadioButton radioButton3 = new JRadioButton();
JRadioButton radioButton4 = new JRadioButton();
contentAreaFilledCheckBox = new JCheckBox();
JLabel comboBoxLabel = new JLabel();
JComboBox<String> comboBox1 = new JComboBox<>();
JComboBox<String> comboBox2 = new JComboBox<>();
@@ -193,6 +207,9 @@ public class FlatComponentsTest
JButton button7 = new JButton();
JButton button8 = new JButton();
JToggleButton toggleButton6 = new JToggleButton();
JToggleButton toggleButton15 = new JToggleButton();
JToggleButton toggleButton16 = new JToggleButton();
JToggleButton toggleButton17 = new JToggleButton();
//======== this ========
setLayout(new MigLayout(
@@ -343,18 +360,25 @@ public class FlatComponentsTest
toggleButton4.setSelected(true);
add(toggleButton4, "cell 4 2");
//---- toggleButton5 ----
toggleButton5.setText("underline");
toggleButton5.putClientProperty("JButton.buttonType", "underline");
toggleButton5.setSelected(true);
add(toggleButton5, "cell 5 2");
//---- toggleButton11 ----
toggleButton11.setIcon(UIManager.getIcon("Tree.closedIcon"));
toggleButton11.setSelected(true);
add(toggleButton11, "cell 5 2");
//---- toggleButton8 ----
toggleButton8.setText("underline");
toggleButton8.putClientProperty("JButton.buttonType", "underline");
toggleButton8.setEnabled(false);
toggleButton8.setSelected(true);
add(toggleButton8, "cell 5 2");
//---- toggleButton12 ----
toggleButton12.setText("...");
toggleButton12.setSelected(true);
add(toggleButton12, "cell 5 2");
//---- toggleButton13 ----
toggleButton13.setText("\u2026");
toggleButton13.setSelected(true);
add(toggleButton13, "cell 5 2");
//---- toggleButton14 ----
toggleButton14.setText("#");
toggleButton14.setSelected(true);
add(toggleButton14, "cell 5 2");
//---- checkBoxLabel ----
checkBoxLabel.setText("JCheckBox");
@@ -382,6 +406,19 @@ public class FlatComponentsTest
checkBox4.setEnabled(false);
add(checkBox4, "cell 4 3");
//---- toggleButton5 ----
toggleButton5.setText("tab");
toggleButton5.putClientProperty("JButton.buttonType", "tab");
toggleButton5.setSelected(true);
add(toggleButton5, "cell 5 3");
//---- toggleButton8 ----
toggleButton8.setText("tab");
toggleButton8.putClientProperty("JButton.buttonType", "tab");
toggleButton8.setEnabled(false);
toggleButton8.setSelected(true);
add(toggleButton8, "cell 5 3");
//---- radioButtonLabel ----
radioButtonLabel.setText("JRadioButton:");
add(radioButtonLabel, "cell 0 4");
@@ -408,6 +445,12 @@ public class FlatComponentsTest
radioButton4.setEnabled(false);
add(radioButton4, "cell 4 4");
//---- contentAreaFilledCheckBox ----
contentAreaFilledCheckBox.setText("contentAreaFilled");
contentAreaFilledCheckBox.setSelected(true);
contentAreaFilledCheckBox.addActionListener(e -> contentAreaFilledChanged());
add(contentAreaFilledCheckBox, "cell 5 4");
//---- comboBoxLabel ----
comboBoxLabel.setText("JComboBox:");
add(comboBoxLabel, "cell 0 5");
@@ -963,6 +1006,21 @@ public class FlatComponentsTest
toggleButton6.setIcon(UIManager.getIcon("Tree.leafIcon"));
toggleButton6.setSelected(true);
toolBar1.add(toggleButton6);
//---- toggleButton15 ----
toggleButton15.setIcon(UIManager.getIcon("FileView.computerIcon"));
toggleButton15.setSelected(true);
toolBar1.add(toggleButton15);
//---- toggleButton16 ----
toggleButton16.setIcon(UIManager.getIcon("FileView.floppyDriveIcon"));
toggleButton16.setSelected(true);
toolBar1.add(toggleButton16);
//---- toggleButton17 ----
toggleButton17.setIcon(UIManager.getIcon("FileView.hardDriveIcon"));
toggleButton17.setSelected(true);
toolBar1.add(toggleButton17);
}
add(toolBar1, "cell 1 23 3 1,growx");
// JFormDesigner - End of component initialization //GEN-END:initComponents
@@ -974,6 +1032,7 @@ public class FlatComponentsTest
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JCheckBox contentAreaFilledCheckBox;
private JProgressBar progressBar3;
private JProgressBar progressBar4;
private JSlider slider3;

View File

@@ -98,7 +98,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button13"
"icon": new com.jformdesigner.model.SwingIcon( 2, "Tree.closedIcon" )
"icon": &SwingIcon0 new com.jformdesigner.model.SwingIcon( 2, "Tree.closedIcon" )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 1"
} )
@@ -170,18 +170,29 @@ new FormModel {
"value": "cell 4 2"
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton5"
"text": "underline"
"$client.JButton.buttonType": "underline"
name: "toggleButton11"
"icon": #SwingIcon0
"selected": true
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 2"
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton8"
"text": "underline"
"$client.JButton.buttonType": "underline"
"enabled": false
name: "toggleButton12"
"text": "..."
"selected": true
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 2"
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton13"
"text": "…"
"selected": true
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 2"
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton14"
"text": "#"
"selected": true
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 2"
@@ -222,6 +233,23 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 3"
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton5"
"text": "tab"
"$client.JButton.buttonType": "tab"
"selected": true
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 3"
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton8"
"text": "tab"
"$client.JButton.buttonType": "tab"
"enabled": false
"selected": true
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 3"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "radioButtonLabel"
"text": "JRadioButton:"
@@ -258,6 +286,17 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 4"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "contentAreaFilledCheckBox"
"text": "contentAreaFilled"
"selected": true
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "contentAreaFilledChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 4"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "comboBoxLabel"
"text": "JComboBox:"
@@ -773,18 +812,18 @@ new FormModel {
"orientation": 1
add( new FormComponent( "javax.swing.JButton" ) {
name: "button9"
"icon": &SwingIcon0 new com.jformdesigner.model.SwingIcon( 2, "Tree.closedIcon" )
"icon": &SwingIcon1 new com.jformdesigner.model.SwingIcon( 2, "Tree.closedIcon" )
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button10"
"icon": &SwingIcon1 new com.jformdesigner.model.SwingIcon( 2, "Tree.openIcon" )
"icon": &SwingIcon2 new com.jformdesigner.model.SwingIcon( 2, "Tree.openIcon" )
} )
add( new FormComponent( "javax.swing.JToolBar$Separator" ) {
name: "separator5"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button11"
"icon": &SwingIcon2 new com.jformdesigner.model.SwingIcon( 2, "Tree.leafIcon" )
"icon": &SwingIcon3 new com.jformdesigner.model.SwingIcon( 2, "Tree.leafIcon" )
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton7"
@@ -952,18 +991,18 @@ new FormModel {
name: "toolBar1"
add( new FormComponent( "javax.swing.JButton" ) {
name: "button4"
"icon": #SwingIcon0
"icon": #SwingIcon1
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button6"
"icon": #SwingIcon1
"icon": #SwingIcon2
} )
add( new FormComponent( "javax.swing.JToolBar$Separator" ) {
name: "separator3"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button7"
"icon": #SwingIcon2
"icon": #SwingIcon3
} )
add( new FormComponent( "javax.swing.JToolBar$Separator" ) {
name: "separator4"
@@ -979,6 +1018,21 @@ new FormModel {
"icon": new com.jformdesigner.model.SwingIcon( 2, "Tree.leafIcon" )
"selected": true
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton15"
"icon": new com.jformdesigner.model.SwingIcon( 2, "FileView.computerIcon" )
"selected": true
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton16"
"icon": new com.jformdesigner.model.SwingIcon( 2, "FileView.floppyDriveIcon" )
"selected": true
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton17"
"icon": new com.jformdesigner.model.SwingIcon( 2, "FileView.hardDriveIcon" )
"selected": true
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 23 3 1,growx"
} )

View File

@@ -71,7 +71,7 @@ public class FlatInspector
private Component lastComponent;
private int lastX;
private int lastY;
private boolean inspectParent;
private int inspectParentLevel;
private JComponent highlightFigure;
private JToolTip tip;
@@ -112,7 +112,9 @@ public class FlatInspector
public void mouseMoved( MouseEvent e ) {
lastX = e.getX();
lastY = e.getY();
inspectParent = e.isShiftDown();
inspectParentLevel = (e.isControlDown() ? 1 : 0)
+ (e.isShiftDown() ? 2 : 0)
+ (e.isAltDown() ? 4 : 0);
inspect( lastX, lastY );
}
};
@@ -157,10 +159,9 @@ public class FlatInspector
Container contentPane = rootPane.getContentPane();
Point pt = SwingUtilities.convertPoint( rootPane.getGlassPane(), x, y, contentPane );
Component c = SwingUtilities.getDeepestComponentAt( contentPane, pt.x, pt.y );
if( inspectParent && c != null && c != contentPane )
for( int i = 0; i < inspectParentLevel && c != null; i++ ) {
c = c.getParent();
if( c == contentPane || (c != null && c.getParent() == contentPane) )
c = null;
}
if( c == lastComponent )
return;
@@ -300,6 +301,9 @@ public class FlatInspector
text += "Left-to-right: " + c.getComponentOrientation().isLeftToRight() + '\n';
text += "Parent: " + c.getParent().getClass().getName();
if( inspectParentLevel > 0 )
text += "\n\nParent level: " + inspectParentLevel;
return text;
}

View File

@@ -7,6 +7,7 @@ package com.formdev.flatlaf.testing;
import java.awt.*;
import java.beans.PropertyVetoException;
import javax.swing.*;
import com.formdev.flatlaf.icons.FlatFileViewFloppyDriveIcon;
import com.formdev.flatlaf.util.UIScale;
import net.miginfocom.swing.*;
@@ -49,10 +50,25 @@ public class FlatInternalFrameTest
maximizableCheckBox.isSelected(),
iconifiableCheckBox.isSelected() );
JPanel panel = new JPanel();
panel.setBackground( new Color( (int) (Math.random() * 0xffffff) ) );
if( iconCheckBox.isSelected() )
internalFrame.setFrameIcon( new FlatFileViewFloppyDriveIcon() );
JPanel panel = new JPanel() {
private final Color color = new Color( (int) (Math.random() * 0xffffff) | 0x20000000, true );
@Override
protected void paintComponent( Graphics g ) {
super.paintComponent( g );
g.setColor( color );
g.fillRect( 20, 20, getWidth() - 40, getHeight() - 40 );
}
};
internalFrame.setContentPane( panel );
if( !palette.getComponentOrientation().isLeftToRight() )
internalFrame.setComponentOrientation( ComponentOrientation.RIGHT_TO_LEFT );
internalFrame.setBounds( frameX + UIScale.scale( GAP ) * (frameCount % 10),
frameY + UIScale.scale( GAP ) * (frameCount % 10), UIScale.scale( 200 ), UIScale.scale( 200 ) );
desktopPane.add( internalFrame, JLayeredPane.DEFAULT_LAYER );
@@ -76,6 +92,7 @@ public class FlatInternalFrameTest
closableCheckBox = new JCheckBox();
iconifiableCheckBox = new JCheckBox();
maximizableCheckBox = new JCheckBox();
iconCheckBox = new JCheckBox();
titleLabel = new JLabel();
titleField = new JTextField();
createFrameButton = new JButton();
@@ -107,6 +124,7 @@ public class FlatInternalFrameTest
// rows
"[fill]0" +
"[]0" +
"[]0" +
"[]unrel" +
"[]unrel"));
@@ -130,18 +148,22 @@ public class FlatInternalFrameTest
maximizableCheckBox.setSelected(true);
paletteContentPane.add(maximizableCheckBox, "cell 1 1,alignx left,growx 0");
//---- iconCheckBox ----
iconCheckBox.setText("Frame icon");
paletteContentPane.add(iconCheckBox, "cell 0 2");
//---- titleLabel ----
titleLabel.setText("Frame title:");
paletteContentPane.add(titleLabel, "cell 0 2");
paletteContentPane.add(titleField, "cell 1 2");
paletteContentPane.add(titleLabel, "cell 0 3");
paletteContentPane.add(titleField, "cell 1 3");
//---- createFrameButton ----
createFrameButton.setText("Create Frame");
createFrameButton.addActionListener(e -> createInternalFrame());
paletteContentPane.add(createFrameButton, "cell 1 3,alignx right,growx 0");
paletteContentPane.add(createFrameButton, "cell 1 4,alignx right,growx 0");
}
desktopPane.add(palette, JLayeredPane.PALETTE_LAYER);
palette.setBounds(15, 25, 220, 160);
palette.setBounds(15, 25, 220, 185);
}
add(desktopPane, "cell 0 0,width 600,height 600");
// JFormDesigner - End of component initialization //GEN-END:initComponents
@@ -157,6 +179,7 @@ public class FlatInternalFrameTest
private JCheckBox closableCheckBox;
private JCheckBox iconifiableCheckBox;
private JCheckBox maximizableCheckBox;
private JCheckBox iconCheckBox;
private JLabel titleLabel;
private JTextField titleField;
private JButton createFrameButton;

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.0.0.194" Java: "13.0.1" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -14,7 +14,7 @@ new FormModel {
add( new FormContainer( "javax.swing.JInternalFrame", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$columnConstraints": "[fill][fill]"
"$rowConstraints": "[fill]0[]0[]unrel[]unrel"
"$rowConstraints": "[fill]0[]0[]0[]unrel[]unrel"
} ) {
name: "palette"
"visible": true
@@ -50,29 +50,35 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 1,alignx left,growx 0"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "iconCheckBox"
"text": "Frame icon"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "titleLabel"
"text": "Frame title:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
"value": "cell 0 3"
} )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "titleField"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 2"
"value": "cell 1 3"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "createFrameButton"
"text": "Create Frame"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "createInternalFrame", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 3,alignx right,growx 0"
"value": "cell 1 4,alignx right,growx 0"
} )
}, new FormLayoutConstraints( null ) {
"x": 15
"y": 25
"width": 220
"height": 160
"height": 185
"layer": 100
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {

View File

@@ -126,13 +126,16 @@ public class FlatMenusTest
//======== menu5 ========
{
menu5.setText("text");
menu5.setMnemonic('T');
//---- menuItem7 ----
menuItem7.setText("text");
menuItem7.setMnemonic('X');
menu5.add(menuItem7);
//---- menuItem8 ----
menuItem8.setText("text");
menuItem8.setMnemonic('E');
menu5.add(menuItem8);
}
menuBar1.add(menu5);
@@ -175,6 +178,7 @@ public class FlatMenusTest
//======== menu1 ========
{
menu1.setText("enabled");
menu1.setMnemonic('E');
}
panel1.add(menu1, "cell 1 0");
@@ -185,6 +189,7 @@ public class FlatMenusTest
//---- menuItem1 ----
menuItem1.setText("enabled");
menuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK));
menuItem1.setMnemonic('N');
panel1.add(menuItem1, "cell 1 1");
//---- checkBoxMenuItemLabel ----
@@ -194,6 +199,7 @@ public class FlatMenusTest
//---- checkBoxMenuItem1 ----
checkBoxMenuItem1.setText("enabled");
checkBoxMenuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
checkBoxMenuItem1.setMnemonic('A');
panel1.add(checkBoxMenuItem1, "cell 1 2");
//---- radioButtonMenuItemLabel ----
@@ -203,6 +209,7 @@ public class FlatMenusTest
//---- radioButtonMenuItem1 ----
radioButtonMenuItem1.setText("enabled");
radioButtonMenuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
radioButtonMenuItem1.setMnemonic('B');
panel1.add(radioButtonMenuItem1, "cell 1 3");
//---- popupMenuSeparatorLabel ----
@@ -230,6 +237,7 @@ public class FlatMenusTest
{
menu2.setText("disabled");
menu2.setEnabled(false);
menu2.setMnemonic('D');
}
panel2.add(menu2, "cell 0 0");
@@ -237,18 +245,21 @@ public class FlatMenusTest
menuItem2.setText("disabled");
menuItem2.setEnabled(false);
menuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.ALT_MASK|KeyEvent.SHIFT_MASK));
menuItem2.setMnemonic('I');
panel2.add(menuItem2, "cell 0 1");
//---- checkBoxMenuItem2 ----
checkBoxMenuItem2.setText("disabled");
checkBoxMenuItem2.setEnabled(false);
checkBoxMenuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
checkBoxMenuItem2.setMnemonic('S');
panel2.add(checkBoxMenuItem2, "cell 0 2");
//---- radioButtonMenuItem2 ----
radioButtonMenuItem2.setText("disabled");
radioButtonMenuItem2.setEnabled(false);
radioButtonMenuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
radioButtonMenuItem2.setMnemonic('L');
panel2.add(radioButtonMenuItem2, "cell 0 3");
}
add(panel2, "cell 2 1");

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.0.0.194" Java: "13.0.1" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -23,13 +23,16 @@ new FormModel {
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "menu5"
"text": "text"
"mnemonic": 84
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem7"
"text": "text"
"mnemonic": 88
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem8"
"text": "text"
"mnemonic": 69
} )
} )
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
@@ -63,6 +66,7 @@ new FormModel {
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "menu1"
"text": "enabled"
"mnemonic": 69
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0"
} )
@@ -76,6 +80,7 @@ new FormModel {
name: "menuItem1"
"text": "enabled"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 65, 130, false )
"mnemonic": 78
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 1"
} )
@@ -89,6 +94,7 @@ new FormModel {
name: "checkBoxMenuItem1"
"text": "enabled"
"accelerator": &KeyStroke0 static javax.swing.KeyStroke getKeyStroke( 112, 0, false )
"mnemonic": 65
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 2"
} )
@@ -102,6 +108,7 @@ new FormModel {
name: "radioButtonMenuItem1"
"text": "enabled"
"accelerator": #KeyStroke0
"mnemonic": 66
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 3"
} )
@@ -130,6 +137,7 @@ new FormModel {
name: "menu2"
"text": "disabled"
"enabled": false
"mnemonic": 68
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
@@ -138,6 +146,7 @@ new FormModel {
"text": "disabled"
"enabled": false
"accelerator": static javax.swing.KeyStroke getKeyStroke( 68, 585, false )
"mnemonic": 73
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1"
} )
@@ -146,6 +155,7 @@ new FormModel {
"text": "disabled"
"enabled": false
"accelerator": #KeyStroke0
"mnemonic": 83
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
} )
@@ -154,6 +164,7 @@ new FormModel {
"text": "disabled"
"enabled": false
"accelerator": #KeyStroke0
"mnemonic": 76
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3"
} )

View File

@@ -111,6 +111,30 @@ public class FlatTestFrame
lafModel.addElement( new LookAndFeelInfo( name, className ) );
}
String substanceClassName = "org.pushingpixels.substance.api.skin.SubstanceGraphiteAquaLookAndFeel";
if( SystemInfo.IS_JAVA_9_OR_LATER && isClassAvailable( substanceClassName ) ) {
lafModel.addElement( new LookAndFeelInfo( "Substance (F5)", substanceClassName ) );
registerSwitchToLookAndFeel( KeyEvent.VK_F5, substanceClassName );
}
String webLafClassName = "com.alee.laf.WebLookAndFeel";
if( isClassAvailable( webLafClassName ) ) {
lafModel.addElement( new LookAndFeelInfo( "WebLaf (F12)", webLafClassName ) );
registerSwitchToLookAndFeel( KeyEvent.VK_F12, webLafClassName );
}
String looksPlasticClassName = "com.jgoodies.looks.plastic.PlasticLookAndFeel";
if( isClassAvailable( looksPlasticClassName ) ) {
lafModel.addElement( new LookAndFeelInfo( "JGoodies Looks Plastic (F6)", looksPlasticClassName ) );
registerSwitchToLookAndFeel( KeyEvent.VK_F6, looksPlasticClassName );
}
String looksWindowsClassName = "com.jgoodies.looks.windows.WindowsLookAndFeel";
if( isClassAvailable( looksWindowsClassName ) ) {
lafModel.addElement( new LookAndFeelInfo( "JGoodies Looks Windows (F7)", looksWindowsClassName ) );
registerSwitchToLookAndFeel( KeyEvent.VK_F7, looksWindowsClassName );
}
lookAndFeelComboBox.setModel( lafModel );
updateScaleFactorComboBox();
@@ -203,6 +227,15 @@ public class FlatTestFrame
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
}
private boolean isClassAvailable( String className ) {
try {
Class.forName( className );
return true;
} catch( ClassNotFoundException ex ) {
return false;
}
}
public void showFrame( Supplier<JComponent> contentFactory ) {
this.contentFactory = contentFactory;
this.content = contentFactory.get();
@@ -370,8 +403,8 @@ public class FlatTestFrame
private void updateComponentsRecur( Container container, BiConsumer<Component, String> action ) {
for( Component c : container.getComponents() ) {
if( c instanceof JPanel ) {
updateComponentsRecur( (JPanel) c, action );
if( c instanceof JPanel || c instanceof JDesktopPane ) {
updateComponentsRecur( (Container) c, action );
continue;
}
@@ -481,6 +514,7 @@ public class FlatTestFrame
null));
//---- lookAndFeelComboBox ----
lookAndFeelComboBox.setMaximumRowCount(20);
lookAndFeelComboBox.addActionListener(e -> lookAndFeelChanged());
buttonBar.add(lookAndFeelComboBox, "cell 0 0");

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.0.0.194" Java: "13.0.1" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -27,6 +27,7 @@ new FormModel {
name: "buttonBar"
add( new FormComponent( "com.formdev.flatlaf.demo.LookAndFeelsComboBox" ) {
name: "lookAndFeelComboBox"
"maximumRowCount": 20
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "lookAndFeelChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"

View File

@@ -0,0 +1,339 @@
/*
* 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.testing;
import javax.swing.*;
import javax.swing.text.DefaultEditorKit;
import net.miginfocom.swing.*;
/**
* @author Karl Tauber
*/
public class FlatTextComponentsTest
extends FlatTestPanel
{
public static void main( String[] args ) {
SwingUtilities.invokeLater( () -> {
FlatTestFrame frame = FlatTestFrame.create( args, "FlatTextComponentsTest" );
frame.showFrame( FlatTextComponentsTest::new );
} );
}
FlatTextComponentsTest() {
initComponents();
}
private void changeText() {
textField1.setText( "new text" );
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
JLabel textFieldLabel = new JLabel();
textField1 = new JTextField();
JTextField textField3 = new JTextField();
JTextField textField2 = new JTextField();
JButton button1 = new JButton();
JLabel formattedTextFieldLabel = new JLabel();
JFormattedTextField formattedTextField1 = new JFormattedTextField();
JFormattedTextField formattedTextField3 = new JFormattedTextField();
JLabel passwordFieldLabel = new JLabel();
JPasswordField passwordField1 = new JPasswordField();
JPasswordField passwordField3 = new JPasswordField();
JLabel textAreaLabel = new JLabel();
JScrollPane scrollPane1 = new JScrollPane();
JTextArea textArea1 = new JTextArea();
JScrollPane scrollPane3 = new JScrollPane();
JTextArea textArea3 = new JTextArea();
JLabel editorPaneLabel = new JLabel();
JScrollPane scrollPane5 = new JScrollPane();
JEditorPane editorPane1 = new JEditorPane();
JScrollPane scrollPane7 = new JScrollPane();
JEditorPane editorPane3 = new JEditorPane();
JLabel textPaneLabel = new JLabel();
JScrollPane scrollPane9 = new JScrollPane();
JTextPane textPane1 = new JTextPane();
JScrollPane scrollPane11 = new JScrollPane();
JTextPane textPane3 = new JTextPane();
JLabel comboBoxLabel = new JLabel();
JComboBox<String> comboBox1 = new JComboBox<>();
JComboBox<String> comboBox3 = new JComboBox<>();
JLabel spinnerLabel = new JLabel();
JSpinner spinner1 = new JSpinner();
JPopupMenu popupMenu1 = new JPopupMenu();
JMenuItem cutMenuItem = new JMenuItem();
JMenuItem copyMenuItem = new JMenuItem();
JMenuItem pasteMenuItem = new JMenuItem();
//======== this ========
setName("this");
setLayout(new MigLayout(
"ltr,insets dialog,hidemode 3",
// columns
"[]" +
"[]" +
"[::100]" +
"[100,fill]" +
"[fill]",
// rows
"[]" +
"[]" +
"[]" +
"[50,fill]" +
"[50,fill]" +
"[50,fill]" +
"[]" +
"[]"));
//---- textFieldLabel ----
textFieldLabel.setText("JTextField:");
textFieldLabel.setDisplayedMnemonic('T');
textFieldLabel.setLabelFor(textField1);
textFieldLabel.setName("textFieldLabel");
add(textFieldLabel, "cell 0 0");
//---- textField1 ----
textField1.setText("editable");
textField1.setComponentPopupMenu(popupMenu1);
textField1.setName("textField1");
add(textField1, "cell 1 0,growx");
//---- textField3 ----
textField3.setText("longer text for testing horizontal scrolling");
textField3.setComponentPopupMenu(popupMenu1);
textField3.setName("textField3");
add(textField3, "cell 2 0,growx");
//---- textField2 ----
textField2.setText("partly selected");
textField2.setSelectionStart(1);
textField2.setSelectionEnd(4);
textField2.setComponentPopupMenu(popupMenu1);
textField2.setName("textField2");
add(textField2, "cell 3 0");
//---- button1 ----
button1.setText("change text");
button1.setName("button1");
button1.addActionListener(e -> changeText());
add(button1, "cell 4 0");
//---- formattedTextFieldLabel ----
formattedTextFieldLabel.setText("JFormattedTextField:");
formattedTextFieldLabel.setDisplayedMnemonic('F');
formattedTextFieldLabel.setLabelFor(formattedTextField1);
formattedTextFieldLabel.setName("formattedTextFieldLabel");
add(formattedTextFieldLabel, "cell 0 1");
//---- formattedTextField1 ----
formattedTextField1.setText("editable");
formattedTextField1.setComponentPopupMenu(popupMenu1);
formattedTextField1.setName("formattedTextField1");
add(formattedTextField1, "cell 1 1,growx");
//---- formattedTextField3 ----
formattedTextField3.setText("longer text for testing horizontal scrolling");
formattedTextField3.setComponentPopupMenu(popupMenu1);
formattedTextField3.setName("formattedTextField3");
add(formattedTextField3, "cell 2 1,growx");
//---- passwordFieldLabel ----
passwordFieldLabel.setText("JPasswordField:");
passwordFieldLabel.setDisplayedMnemonic('P');
passwordFieldLabel.setLabelFor(passwordField1);
passwordFieldLabel.setName("passwordFieldLabel");
add(passwordFieldLabel, "cell 0 2");
//---- passwordField1 ----
passwordField1.setText("editable");
passwordField1.setComponentPopupMenu(popupMenu1);
passwordField1.setName("passwordField1");
add(passwordField1, "cell 1 2,growx");
//---- passwordField3 ----
passwordField3.setText("longer text for testing horizontal scrolling");
passwordField3.setComponentPopupMenu(popupMenu1);
passwordField3.setName("passwordField3");
add(passwordField3, "cell 2 2,growx");
//---- textAreaLabel ----
textAreaLabel.setText("JTextArea:");
textAreaLabel.setDisplayedMnemonic('A');
textAreaLabel.setLabelFor(textArea1);
textAreaLabel.setName("textAreaLabel");
add(textAreaLabel, "cell 0 3");
//======== scrollPane1 ========
{
scrollPane1.setName("scrollPane1");
//---- textArea1 ----
textArea1.setText("editable");
textArea1.setComponentPopupMenu(popupMenu1);
textArea1.setName("textArea1");
scrollPane1.setViewportView(textArea1);
}
add(scrollPane1, "cell 1 3,growx");
//======== scrollPane3 ========
{
scrollPane3.setName("scrollPane3");
//---- textArea3 ----
textArea3.setText("longer text for testing horizontal scrolling");
textArea3.setComponentPopupMenu(popupMenu1);
textArea3.setName("textArea3");
scrollPane3.setViewportView(textArea3);
}
add(scrollPane3, "cell 2 3,growx");
//---- editorPaneLabel ----
editorPaneLabel.setText("JEditorPane");
editorPaneLabel.setDisplayedMnemonic('J');
editorPaneLabel.setLabelFor(editorPane1);
editorPaneLabel.setName("editorPaneLabel");
add(editorPaneLabel, "cell 0 4");
//======== scrollPane5 ========
{
scrollPane5.setName("scrollPane5");
//---- editorPane1 ----
editorPane1.setText("editable");
editorPane1.setComponentPopupMenu(popupMenu1);
editorPane1.setName("editorPane1");
scrollPane5.setViewportView(editorPane1);
}
add(scrollPane5, "cell 1 4,growx");
//======== scrollPane7 ========
{
scrollPane7.setName("scrollPane7");
//---- editorPane3 ----
editorPane3.setText("longer text for testing horizontal scrolling");
editorPane3.setComponentPopupMenu(popupMenu1);
editorPane3.setName("editorPane3");
scrollPane7.setViewportView(editorPane3);
}
add(scrollPane7, "cell 2 4,growx");
//---- textPaneLabel ----
textPaneLabel.setText("JTextPane:");
textPaneLabel.setDisplayedMnemonic('N');
textPaneLabel.setLabelFor(textPane1);
textPaneLabel.setName("textPaneLabel");
add(textPaneLabel, "cell 0 5");
//======== scrollPane9 ========
{
scrollPane9.setName("scrollPane9");
//---- textPane1 ----
textPane1.setText("editable");
textPane1.setComponentPopupMenu(popupMenu1);
textPane1.setName("textPane1");
scrollPane9.setViewportView(textPane1);
}
add(scrollPane9, "cell 1 5,growx");
//======== scrollPane11 ========
{
scrollPane11.setName("scrollPane11");
//---- textPane3 ----
textPane3.setText("longer text for testing horizontal scrolling");
textPane3.setComponentPopupMenu(popupMenu1);
textPane3.setName("textPane3");
scrollPane11.setViewportView(textPane3);
}
add(scrollPane11, "cell 2 5,growx");
//---- comboBoxLabel ----
comboBoxLabel.setText("JComboBox:");
comboBoxLabel.setDisplayedMnemonic('C');
comboBoxLabel.setLabelFor(comboBox1);
comboBoxLabel.setName("comboBoxLabel");
add(comboBoxLabel, "cell 0 6");
//---- comboBox1 ----
comboBox1.setEditable(true);
comboBox1.setModel(new DefaultComboBoxModel<>(new String[] {
"editable",
"a",
"bb",
"ccc"
}));
comboBox1.setComponentPopupMenu(popupMenu1);
comboBox1.setName("comboBox1");
add(comboBox1, "cell 1 6,growx");
//---- comboBox3 ----
comboBox3.setModel(new DefaultComboBoxModel<>(new String[] {
"longer text for testing horizontal scrolling",
"a",
"bb",
"ccc"
}));
comboBox3.setEditable(true);
comboBox3.setPrototypeDisplayValue("12345");
comboBox3.setComponentPopupMenu(popupMenu1);
comboBox3.setName("comboBox3");
add(comboBox3, "cell 2 6,growx");
//---- spinnerLabel ----
spinnerLabel.setText("JSpinner:");
spinnerLabel.setDisplayedMnemonic('S');
spinnerLabel.setLabelFor(spinner1);
spinnerLabel.setName("spinnerLabel");
add(spinnerLabel, "cell 0 7");
//---- spinner1 ----
spinner1.setComponentPopupMenu(popupMenu1);
spinner1.setName("spinner1");
add(spinner1, "cell 1 7,growx");
//======== popupMenu1 ========
{
popupMenu1.setName("popupMenu1");
//---- cutMenuItem ----
cutMenuItem.setText("Cut");
cutMenuItem.setName("cutMenuItem");
popupMenu1.add(cutMenuItem);
//---- copyMenuItem ----
copyMenuItem.setText("Copy");
copyMenuItem.setName("copyMenuItem");
popupMenu1.add(copyMenuItem);
//---- pasteMenuItem ----
pasteMenuItem.setText("Paste");
pasteMenuItem.setName("pasteMenuItem");
popupMenu1.add(pasteMenuItem);
}
// JFormDesigner - End of component initialization //GEN-END:initComponents
cutMenuItem.addActionListener( new DefaultEditorKit.CutAction() );
copyMenuItem.addActionListener( new DefaultEditorKit.CopyAction() );
pasteMenuItem.addActionListener( new DefaultEditorKit.PasteAction() );
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JTextField textField1;
// JFormDesigner - End of variables declaration //GEN-END:variables
}

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