diff --git a/.travis.yml b/.travis.yml index a27d5275..89a008a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -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: branch = master AND 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 diff --git a/CHANGELOG.md b/CHANGELOG.md index dd42c9df..ca0a9119 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,37 @@ FlatLaf Change Log ================== +## Unreleased + +- 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) + + +## 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. diff --git a/README.md b/README.md index 9e2368f0..0dca7306 100644 --- a/README.md +++ b/README.md @@ -45,13 +45,26 @@ build script: groupId: com.formdev artifactId: flatlaf - version: 0.25.1 + version: (see button below) Otherwise download `flatlaf-.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 `-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 ------------- diff --git a/build.gradle.kts b/build.gradle.kts index 7bc57e70..af9fde3f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,9 +14,14 @@ * limitations under the License. */ -version = "0.25.1" +val releaseVersion = "0.26" +val developmentVersion = "0.27-SNAPSHOT" + +version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion allprojects { + version = rootProject.version + repositories { jcenter() } diff --git a/flatlaf-core/build.gradle.kts b/flatlaf-core/build.gradle.kts index b09ec33c..e2d814e4 100644 --- a/flatlaf-core/build.gradle.kts +++ b/flatlaf-core/build.gradle.kts @@ -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.artifactory" ) version "4.13.0" } if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) { @@ -53,7 +52,7 @@ tasks { targetCompatibility = "9" } } - + jar { archiveBaseName.set( "flatlaf" ) @@ -68,6 +67,7 @@ tasks { options { this as StandardJavadocDocletOptions tags = listOf( "uiDefault", "clientProperty" ) + addStringOption( "Xdoclint:all,-missing", "-Xdoclint:all,-missing" ) } isFailOnError = false } @@ -145,3 +145,25 @@ bintray { publish = true } } + +artifactory { + setContextUrl( "https://oss.jfrog.org" ) + + publish( closureOf { + repository( delegateClosureOf { + setProperty( "repoKey", "oss-snapshot-local" ) + setProperty( "username", System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" ) ) + setProperty( "password", System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" ) ) + } ) + + defaults( delegateClosureOf { + invokeMethod( "publications", "maven" ) + setProperty( "publishArtifacts", true ) + setProperty( "publishPom", true ) + } ) + } ) + + resolve( delegateClosureOf { + setProperty( "repoKey", "jcenter" ) + } ) +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index 98ca89c2..a1dca00d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -48,7 +48,7 @@ public interface FlatClientProperties *

* Components {@link javax.swing.JToggleButton} * - * @see #TOGGLE_BUTTON_TYPE + * @see #BUTTON_TYPE */ String BUTTON_TYPE_TAB = "tab"; @@ -141,10 +141,44 @@ public interface FlatClientProperties */ String TABBED_PANE_TAB_HEIGHT = "JTabbedPane.tabHeight"; + /** + * Specifies whether all text is selected when the text component gains focus. + *

+ * Component {@link javax.swing.JTextField} (and subclasses)
+ * Value type {@link java.lang.String}
+ * Allowed Values {@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. *

- * Component {@link javax.swing.JTextField} or {@link javax.swing.JComboBox}
+ * Component {@link javax.swing.JTextField} (and subclasses) or {@link javax.swing.JComboBox}
* Value type {@link java.lang.String} */ String PLACEHOLDER_TEXT = "JTextField.placeholderText"; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java index 69e3e774..ae79de82 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -288,10 +288,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 ) ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java index b82ae296..3316b876 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -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, 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() ); @@ -299,6 +300,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: @@ -629,6 +633,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. */ diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAscendingSortIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAscendingSortIcon.java index 4cdaf81e..1b9c5edc 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAscendingSortIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAscendingSortIcon.java @@ -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 { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatDescendingSortIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatDescendingSortIcon.java index 02109889..4146d4ab 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatDescendingSortIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatDescendingSortIcon.java @@ -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 { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameAbstractIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameAbstractIcon.java new file mode 100644 index 00000000..cc455c6a --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameAbstractIcon.java @@ -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 ); + } + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java index 3471eece..2461480d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java @@ -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 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameIconifyIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameIconifyIcon.java index 2f59b283..cd166878 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameIconifyIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameIconifyIcon.java @@ -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 ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameMaximizeIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameMaximizeIcon.java index 3439e3de..f28a784f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameMaximizeIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameMaximizeIcon.java @@ -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 ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameMinimizeIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameMinimizeIcon.java index d829cfcc..7256d1a2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameMinimizeIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameMinimizeIcon.java @@ -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 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java new file mode 100644 index 00000000..5704135c --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java @@ -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() ); + } + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopIconUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopIconUI.java new file mode 100644 index 00000000..51382592 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopIconUI.java @@ -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}. + * + * + * + * @uiDefault DesktopIcon.border Border + * + * + * + * @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 ); + } + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopPaneUI.java new file mode 100644 index 00000000..eb5b72e9 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopPaneUI.java @@ -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}. + * + * + * + * @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(); + } + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEmptyBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEmptyBorder.java index 72d62e05..9a51c9c5 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEmptyBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEmptyBorder.java @@ -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; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatFormattedTextFieldUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatFormattedTextFieldUI.java index 3bbcbbc6..8322ba64 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatFormattedTextFieldUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatFormattedTextFieldUI.java @@ -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 */ diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameTitlePane.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameTitlePane.java new file mode 100644 index 00000000..30596cf6 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameTitlePane.java @@ -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 ); + } + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java new file mode 100644 index 00000000..5d60fd17 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java @@ -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}. + * + * + * + * @uiDefault control Color + * @uiDefault InternalFrame.icon Icon + * @uiDefault InternalFrame.border Border + * @uiDefault InternalFrame.layoutTitlePaneAtOrigin boolean + * + * + * + * @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 + * + * + * + * @uiDefault InternalFrame.activeBorderColor Color + * @uiDefault InternalFrame.inactiveBorderColor Color + * @uiDefault InternalFrame.borderLineWidth int + * @uiDefault InternalFrame.borderMargins Insets + * + * + * + * @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(); + } + } + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemBorder.java new file mode 100644 index 00000000..9d51a5af --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemBorder.java @@ -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 ); + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java index 3706b564..aa282875 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java @@ -17,11 +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; @@ -51,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 * + * + * + * @uiDefault MenuBar.hoverBackground Color + * * @author Karl Tauber */ public class FlatMenuUI extends BasicMenuUI { + private Color hoverBackground; + public static ComponentUI createUI( JComponent c ) { return new FlatMenuUI(); } @@ -64,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. */ @@ -81,6 +104,43 @@ public class FlatMenuUI }; } + @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 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java index 40fe9586..d915aec1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java @@ -27,6 +27,7 @@ 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; @@ -55,6 +56,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 */ @@ -116,6 +118,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 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java index 29337781..ce1b314e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java @@ -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 ); + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java index 45d2c0ef..705725fd 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java @@ -193,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(); + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index d248d685..f1c47ef6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -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() ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index 7d6415fb..5466dc0a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -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" ); @@ -307,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 ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java index 42ad87e3..e5c7754e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java @@ -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; + } + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java index 47f97005..35deedbb 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java @@ -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 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java index e8e1dec1..68e005e6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java @@ -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; @@ -109,7 +110,11 @@ 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 ) { diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties index e3245f58..4fdbfc5c 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -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 ---- diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties index e7505ba1..7dac36c8 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -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 ---- @@ -117,10 +121,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 +151,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 +208,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,23 +243,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}-1 +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 ---- @@ -265,7 +302,8 @@ PasswordField.placeholderForeground=@disabledText #---- PopupMenu ---- PopupMenu.border=com.formdev.flatlaf.ui.FlatPopupMenuBorder -PopupMenu.borderInsets=1,1,1,1 +PopupMenu.borderInsets=4,1,4,1 +PopupMenu.background=@menuBackground #---- PopupMenuSeparator ---- @@ -281,6 +319,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 ---- @@ -295,10 +335,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 ---- @@ -407,6 +449,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 diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties index 91bc1207..4b84cc72 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -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 ---- diff --git a/flatlaf-demo/build.gradle.kts b/flatlaf-demo/build.gradle.kts index 7eb88a8b..2fbc4811 100644 --- a/flatlaf-demo/build.gradle.kts +++ b/flatlaf-demo/build.gradle.kts @@ -14,8 +14,6 @@ * limitations under the License. */ -version = rootProject.version - plugins { `java-library` id( "com.jfrog.bintray" ) version "1.8.4" diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java index b7ca8714..2e73567c 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java @@ -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 diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd index 469a8884..81c6bb83 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd @@ -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 ) } ) } } diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java index 9a7c5208..3b365b21 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java @@ -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.*; @@ -175,21 +176,18 @@ class DemoFrame cutMenuItem.setText("Cut"); cutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); cutMenuItem.setMnemonic('C'); - cutMenuItem.addActionListener(e -> menuItemActionPerformed(e)); editMenu.add(cutMenuItem); //---- copyMenuItem ---- copyMenuItem.setText("Copy"); copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); copyMenuItem.setMnemonic('O'); - copyMenuItem.addActionListener(e -> menuItemActionPerformed(e)); editMenu.add(copyMenuItem); //---- pasteMenuItem ---- pasteMenuItem.setText("Paste"); pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); pasteMenuItem.setMnemonic('P'); - pasteMenuItem.addActionListener(e -> menuItemActionPerformed(e)); editMenu.add(pasteMenuItem); editMenu.addSeparator(); @@ -385,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 diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.jfd b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.jfd index 4912b254..179c618a 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.jfd +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.jfd @@ -179,21 +179,18 @@ new FormModel { "text": "Cut" "accelerator": static javax.swing.KeyStroke getKeyStroke( 88, 4226, false ) "mnemonic": 67 - addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) ) } ) add( new FormComponent( "javax.swing.JMenuItem" ) { name: "copyMenuItem" "text": "Copy" "accelerator": static javax.swing.KeyStroke getKeyStroke( 67, 4226, false ) "mnemonic": 79 - addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) ) } ) add( new FormComponent( "javax.swing.JMenuItem" ) { name: "pasteMenuItem" "text": "Paste" "accelerator": static javax.swing.KeyStroke getKeyStroke( 86, 4226, false ) "mnemonic": 80 - addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) ) } ) add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) { name: "separator3" diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/arc-theme-orange.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/arc-theme-orange.theme.json index f432833d..a41ba271 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/arc-theme-orange.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/arc-theme-orange.theme.json @@ -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" }, diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/arc-theme.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/arc-theme.theme.json index d04664ff..b149b721 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/arc-theme.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/arc-theme.theme.json @@ -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" }, diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Arc Dark Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Arc Dark Contrast.theme.json index cbc7b980..32924dbe 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Arc Dark Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Arc Dark Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Arc Dark.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Arc Dark.theme.json index ea2806af..0a55ff34 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Arc Dark.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Arc Dark.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Dark Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Dark Contrast.theme.json index 48c3e072..72f1631a 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Dark Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Dark Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Dark.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Dark.theme.json index d62bac34..74ec3f0a 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Dark.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Dark.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Light Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Light Contrast.theme.json index e5ecc3c9..86eca7ce 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Light Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Light Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Light.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Light.theme.json index 2b9ac237..8b0b41a3 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Light.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Atom One Light.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Dracula Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Dracula Contrast.theme.json index 97561c5f..44eed77e 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Dracula Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Dracula Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Dracula.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Dracula.theme.json index fea5d31a..93c7bef2 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Dracula.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Dracula.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/GitHub Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/GitHub Contrast.theme.json index 1706d1ff..156d5d14 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/GitHub Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/GitHub Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/GitHub.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/GitHub.theme.json index fa83c69b..ccaeb0f0 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/GitHub.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/GitHub.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Light Owl Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Light Owl Contrast.theme.json index 50012dad..12f49866 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Light Owl Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Light Owl Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Light Owl.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Light Owl.theme.json index bd72ec1d..7644edce 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Light Owl.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Light Owl.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Darker Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Darker Contrast.theme.json index 226b14d3..b461afb3 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Darker Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Darker Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Darker.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Darker.theme.json index 9b1c3dc6..8f12cfd8 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Darker.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Darker.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Deep Ocean Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Deep Ocean Contrast.theme.json index 8012bf05..4a47a650 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Deep Ocean Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Deep Ocean Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Deep Ocean.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Deep Ocean.theme.json index 6c229e25..53044940 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Deep Ocean.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Deep Ocean.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Lighter Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Lighter Contrast.theme.json index 054f7a40..51b7f57e 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Lighter Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Lighter Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Lighter.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Lighter.theme.json index c2994fb9..b1a26e3d 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Lighter.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Lighter.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Oceanic Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Oceanic Contrast.theme.json index c1a6ecdf..cc83b1f1 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Oceanic Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Oceanic Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Oceanic.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Oceanic.theme.json index 21a6762c..ba77a74e 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Oceanic.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Oceanic.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Palenight Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Palenight Contrast.theme.json index 95638985..e97f403e 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Palenight Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Palenight Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Palenight.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Palenight.theme.json index 38e4fc3f..21a1fdb2 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Palenight.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Material Palenight.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Monokai Pro Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Monokai Pro Contrast.theme.json index 50e4f111..16de21cd 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Monokai Pro Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Monokai Pro Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Monokai Pro.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Monokai Pro.theme.json index 6730e306..a80d2be7 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Monokai Pro.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Monokai Pro.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Night Owl Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Night Owl Contrast.theme.json index fad9dd49..d3953e6b 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Night Owl Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Night Owl Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Night Owl.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Night Owl.theme.json index cd666916..df4362e0 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Night Owl.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Night Owl.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Dark Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Dark Contrast.theme.json index 7af69ed7..e7ef5824 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Dark Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Dark Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Dark.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Dark.theme.json index 81d11a16..eada1284 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Dark.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Dark.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Light Contrast.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Light Contrast.theme.json index 1a6deefc..90692773 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Light Contrast.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Light Contrast.theme.json @@ -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", diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Light.theme.json b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Light.theme.json index b07c9efe..5a7de378 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Light.theme.json +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/intellijthemes/material-theme-ui-lite/Solarized Light.theme.json @@ -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", diff --git a/flatlaf-extras/build.gradle.kts b/flatlaf-extras/build.gradle.kts index ad3cabc1..8e169238 100644 --- a/flatlaf-extras/build.gradle.kts +++ b/flatlaf-extras/build.gradle.kts @@ -14,8 +14,6 @@ * limitations under the License. */ -version = rootProject.version - plugins { `java-library` } diff --git a/flatlaf-jide-oss/README.md b/flatlaf-jide-oss/README.md index 04416ec4..0a37c978 100644 --- a/flatlaf-jide-oss/README.md +++ b/flatlaf-jide-oss/README.md @@ -26,7 +26,7 @@ build script: groupId: com.formdev artifactId: flatlaf-jide-oss - version: 0.25.1 + version: (see button below) Otherwise download `flatlaf-jide-oss-.jar` here: diff --git a/flatlaf-jide-oss/build.gradle.kts b/flatlaf-jide-oss/build.gradle.kts index c1394ef9..ceec2488 100644 --- a/flatlaf-jide-oss/build.gradle.kts +++ b/flatlaf-jide-oss/build.gradle.kts @@ -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.artifactory" ) version "4.13.0" } dependencies { @@ -119,3 +118,25 @@ bintray { publish = true } } + +artifactory { + setContextUrl( "https://oss.jfrog.org" ) + + publish( closureOf { + repository( delegateClosureOf { + setProperty( "repoKey", "oss-snapshot-local" ) + setProperty( "username", System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" ) ) + setProperty( "password", System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" ) ) + } ) + + defaults( delegateClosureOf { + invokeMethod( "publications", "maven" ) + setProperty( "publishArtifacts", true ) + setProperty( "publishPom", true ) + } ) + } ) + + resolve( delegateClosureOf { + setProperty( "repoKey", "jcenter" ) + } ) +} diff --git a/flatlaf-swingx/README.md b/flatlaf-swingx/README.md index 871f6068..72d7fca4 100644 --- a/flatlaf-swingx/README.md +++ b/flatlaf-swingx/README.md @@ -33,7 +33,7 @@ build script: groupId: com.formdev artifactId: flatlaf-swingx - version: 0.25.1 + version: (see button below) Otherwise download `flatlaf-swingx-.jar` here: diff --git a/flatlaf-swingx/build.gradle.kts b/flatlaf-swingx/build.gradle.kts index 25d2a07f..34df709e 100644 --- a/flatlaf-swingx/build.gradle.kts +++ b/flatlaf-swingx/build.gradle.kts @@ -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.artifactory" ) version "4.13.0" } dependencies { @@ -119,3 +118,25 @@ bintray { publish = true } } + +artifactory { + setContextUrl( "https://oss.jfrog.org" ) + + publish( closureOf { + repository( delegateClosureOf { + setProperty( "repoKey", "oss-snapshot-local" ) + setProperty( "username", System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" ) ) + setProperty( "password", System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" ) ) + } ) + + defaults( delegateClosureOf { + invokeMethod( "publications", "maven" ) + setProperty( "publishArtifacts", true ) + setProperty( "publishPom", true ) + } ) + } ) + + resolve( delegateClosureOf { + setProperty( "repoKey", "jcenter" ) + } ) +} diff --git a/flatlaf-testing/build.gradle.kts b/flatlaf-testing/build.gradle.kts index e88cf2bf..886a17a4 100644 --- a/flatlaf-testing/build.gradle.kts +++ b/flatlaf-testing/build.gradle.kts @@ -14,8 +14,6 @@ * limitations under the License. */ -version = rootProject.version - plugins { `java-library` } diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.java index 9c3c9ffe..c27a556b 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.java @@ -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(); @@ -90,6 +99,7 @@ public class FlatComponentsTest JRadioButton radioButton2 = new JRadioButton(); JRadioButton radioButton3 = new JRadioButton(); JRadioButton radioButton4 = new JRadioButton(); + contentAreaFilledCheckBox = new JCheckBox(); JLabel comboBoxLabel = new JLabel(); JComboBox comboBox1 = new JComboBox<>(); JComboBox comboBox2 = new JComboBox<>(); @@ -408,6 +418,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"); @@ -974,6 +990,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; diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.jfd index 48ccc963..07d7784f 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.jfd +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.jfd @@ -258,6 +258,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:" diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInternalFrameTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInternalFrameTest.java index 634fe7b6..4c2a7567 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInternalFrameTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInternalFrameTest.java @@ -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; diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInternalFrameTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInternalFrameTest.jfd index fef36b35..e74e2a14 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInternalFrameTest.jfd +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInternalFrameTest.jfd @@ -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 ) { diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java index 97f8c5da..87ef3afc 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java @@ -403,8 +403,8 @@ public class FlatTestFrame private void updateComponentsRecur( Container container, BiConsumer 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; } diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.java new file mode 100644 index 00000000..06f722cd --- /dev/null +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.java @@ -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 comboBox1 = new JComboBox<>(); + JComboBox 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 +} diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.jfd new file mode 100644 index 00000000..abb9aa08 --- /dev/null +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.jfd @@ -0,0 +1,259 @@ +JFDML JFormDesigner: "7.0.0.0.194" Java: "13.0.1" encoding: "UTF-8" + +new FormModel { + contentType: "form/swing" + root: new FormRoot { + "$setComponentNames": true + auxiliary() { + "JavaCodeGenerator.defaultVariableLocal": true + } + add( new FormContainer( "com.formdev.flatlaf.testing.FlatTestPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { + "$layoutConstraints": "ltr,insets dialog,hidemode 3" + "$columnConstraints": "[][][::100][100,fill][fill]" + "$rowConstraints": "[][][][50,fill][50,fill][50,fill][][]" + } ) { + name: "this" + 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 0" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField1" + "text": "editable" + "componentPopupMenu": &FormReference0 new FormReference( "popupMenu1" ) + auxiliary() { + "JavaCodeGenerator.variableLocal": false + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 0,growx" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField3" + "text": "longer text for testing horizontal scrolling" + "componentPopupMenu": #FormReference0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 0,growx" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField2" + "text": "partly selected" + "selectionStart": 1 + "selectionEnd": 4 + "componentPopupMenu": #FormReference0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 0" + } ) + add( new FormComponent( "javax.swing.JButton" ) { + name: "button1" + "text": "change text" + addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "changeText", false ) ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 0" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "formattedTextFieldLabel" + "text": "JFormattedTextField:" + "displayedMnemonic": 70 + "labelFor": new FormReference( "formattedTextField1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 1" + } ) + add( new FormComponent( "javax.swing.JFormattedTextField" ) { + name: "formattedTextField1" + "text": "editable" + "componentPopupMenu": #FormReference0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 1,growx" + } ) + add( new FormComponent( "javax.swing.JFormattedTextField" ) { + name: "formattedTextField3" + "text": "longer text for testing horizontal scrolling" + "componentPopupMenu": #FormReference0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 1,growx" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "passwordFieldLabel" + "text": "JPasswordField:" + "displayedMnemonic": 80 + "labelFor": new FormReference( "passwordField1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 2" + } ) + add( new FormComponent( "javax.swing.JPasswordField" ) { + name: "passwordField1" + "text": "editable" + "componentPopupMenu": #FormReference0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 2,growx" + } ) + add( new FormComponent( "javax.swing.JPasswordField" ) { + name: "passwordField3" + "text": "longer text for testing horizontal scrolling" + "componentPopupMenu": #FormReference0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 2,growx" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "textAreaLabel" + "text": "JTextArea:" + "displayedMnemonic": 65 + "labelFor": new FormReference( "textArea1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 3" + } ) + add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { + name: "scrollPane1" + add( new FormComponent( "javax.swing.JTextArea" ) { + name: "textArea1" + "text": "editable" + "componentPopupMenu": #FormReference0 + } ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 3,growx" + } ) + add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { + name: "scrollPane3" + add( new FormComponent( "javax.swing.JTextArea" ) { + name: "textArea3" + "text": "longer text for testing horizontal scrolling" + "componentPopupMenu": #FormReference0 + } ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 3,growx" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "editorPaneLabel" + "text": "JEditorPane" + "displayedMnemonic": 74 + "labelFor": new FormReference( "editorPane1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 4" + } ) + add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { + name: "scrollPane5" + add( new FormComponent( "javax.swing.JEditorPane" ) { + name: "editorPane1" + "text": "editable" + "componentPopupMenu": #FormReference0 + } ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 4,growx" + } ) + add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { + name: "scrollPane7" + add( new FormComponent( "javax.swing.JEditorPane" ) { + name: "editorPane3" + "text": "longer text for testing horizontal scrolling" + "componentPopupMenu": #FormReference0 + } ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 4,growx" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "textPaneLabel" + "text": "JTextPane:" + "displayedMnemonic": 78 + "labelFor": new FormReference( "textPane1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 5" + } ) + add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { + name: "scrollPane9" + add( new FormComponent( "javax.swing.JTextPane" ) { + name: "textPane1" + "text": "editable" + "componentPopupMenu": #FormReference0 + } ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 5,growx" + } ) + add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { + name: "scrollPane11" + add( new FormComponent( "javax.swing.JTextPane" ) { + name: "textPane3" + "text": "longer text for testing horizontal scrolling" + "componentPopupMenu": #FormReference0 + } ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 5,growx" + } ) + 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 6" + } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox1" + "editable": true + "model": new javax.swing.DefaultComboBoxModel { + selectedItem: "editable" + addElement( "editable" ) + addElement( "a" ) + addElement( "bb" ) + addElement( "ccc" ) + } + "componentPopupMenu": #FormReference0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 6,growx" + } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox3" + "model": new javax.swing.DefaultComboBoxModel { + selectedItem: "longer text for testing horizontal scrolling" + addElement( "longer text for testing horizontal scrolling" ) + addElement( "a" ) + addElement( "bb" ) + addElement( "ccc" ) + } + "editable": true + "prototypeDisplayValue": "12345" + "componentPopupMenu": #FormReference0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 6,growx" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "spinnerLabel" + "text": "JSpinner:" + "displayedMnemonic": 83 + "labelFor": new FormReference( "spinner1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 7" + } ) + add( new FormComponent( "javax.swing.JSpinner" ) { + name: "spinner1" + "componentPopupMenu": #FormReference0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 7,growx" + } ) + }, new FormLayoutConstraints( null ) { + "location": new java.awt.Point( 0, 0 ) + "size": new java.awt.Dimension( 530, 340 ) + } ) + 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, 390 ) + "size": new java.awt.Dimension( 91, 87 ) + } ) + } +} diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties index f3fa729e..b70f564d 100644 --- a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties +++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties @@ -24,6 +24,7 @@ @selectionInactiveForeground=#ffffff @disabledText=#000088 @textComponentBackground=#ffffff +@menuBackground=#fff @cellFocusColor=#ff0000 @icon=#afafaf @@ -129,11 +130,39 @@ Component.focusColor=#97c3f3 #Component.arc=8 +#---- Desktop ---- + +Desktop.background=#afe + + +#---- DesktopIcon ---- + +DesktopIcon.background=darken($Desktop.background,20%) + + #---- HelpButton ---- HelpButton.questionMarkColor=#0000ff +#---- InternalFrame ---- + +InternalFrame.activeTitleBackground=#800 +InternalFrame.activeTitleForeground=#faa +InternalFrame.inactiveTitleBackground=#080 +InternalFrame.inactiveTitleForeground=#afa + +InternalFrame.activeBorderColor=#f00 +InternalFrame.inactiveBorderColor=#0f0 + +InternalFrame.buttonHoverBackground=#060 +InternalFrame.buttonPressedBackground=#0a0 +InternalFrame.closeHoverBackground=#008 +InternalFrame.closePressedBackground=#00f +InternalFrame.closeHoverForeground=#fff +InternalFrame.closePressedForeground=#fff + + #---- Label ---- Label.foreground=#008800 @@ -157,6 +186,7 @@ Menu.icon.disabledArrowColor=#ABABAB #---- MenuBar ---- MenuBar.borderColor=#4444ff +MenuBar.hoverBackground=#fdd #---- MenuItemCheckBox ---- diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ba94df84..1b16c34a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists