From 48bdd5c3dfcae394f8a9a5208843c833f186e9fe Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 19 Jan 2020 18:05:12 +0100 Subject: [PATCH 01/28] TextField, FormattedTextField and PasswordField: select all text when a text field gains focus for the first time and selection was not set explicitly --- CHANGELOG.md | 8 + .../formdev/flatlaf/FlatClientProperties.java | 36 +- .../com/formdev/flatlaf/ui/FlatCaret.java | 128 +++++++ .../flatlaf/ui/FlatFormattedTextFieldUI.java | 1 + .../flatlaf/ui/FlatPasswordFieldUI.java | 7 + .../formdev/flatlaf/ui/FlatTextFieldUI.java | 7 + .../com/formdev/flatlaf/FlatLaf.properties | 6 + .../flatlaf/demo/BasicComponentsPanel.java | 35 ++ .../flatlaf/demo/BasicComponentsPanel.jfd | 30 +- .../com/formdev/flatlaf/demo/DemoFrame.java | 8 +- .../com/formdev/flatlaf/demo/DemoFrame.jfd | 3 - .../testing/FlatTextComponentsTest.java | 339 ++++++++++++++++++ .../testing/FlatTextComponentsTest.jfd | 259 +++++++++++++ 13 files changed, 859 insertions(+), 8 deletions(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java create mode 100644 flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.java create mode 100644 flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.jfd diff --git a/CHANGELOG.md b/CHANGELOG.md index dd42c9df..b48ca658 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ FlatLaf Change Log ================== +## Unreleased + +- 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`). + + ## 0.25.1 Re-release of 0.25 because of problems with Maven Central. 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..33065d19 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -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/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/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/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/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/resources/com/formdev/flatlaf/FlatLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties index e7505ba1..e1ea0c5b 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -407,6 +407,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-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-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 ) + } ) + } +} From 409a773e3685bab8a9d0343715ccc561de633863 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 20 Jan 2020 14:58:39 +0100 Subject: [PATCH 02/28] IntelliJ Themes Demo: updated Arc, Arc Orange, and Material UI Lite themes (used IJThemesUpdater) --- .../arc-theme-orange.theme.json | 37 ++++++++++++++++--- .../demo/intellijthemes/arc-theme.theme.json | 37 ++++++++++++++++--- .../Arc Dark Contrast.theme.json | 2 +- .../Arc Dark.theme.json | 2 +- .../Atom One Dark Contrast.theme.json | 2 +- .../Atom One Dark.theme.json | 2 +- .../Atom One Light Contrast.theme.json | 2 +- .../Atom One Light.theme.json | 2 +- .../Dracula Contrast.theme.json | 2 +- .../material-theme-ui-lite/Dracula.theme.json | 2 +- .../GitHub Contrast.theme.json | 2 +- .../material-theme-ui-lite/GitHub.theme.json | 2 +- .../Light Owl Contrast.theme.json | 2 +- .../Light Owl.theme.json | 2 +- .../Material Darker Contrast.theme.json | 2 +- .../Material Darker.theme.json | 2 +- .../Material Deep Ocean Contrast.theme.json | 2 +- .../Material Deep Ocean.theme.json | 2 +- .../Material Lighter Contrast.theme.json | 2 +- .../Material Lighter.theme.json | 2 +- .../Material Oceanic Contrast.theme.json | 2 +- .../Material Oceanic.theme.json | 2 +- .../Material Palenight Contrast.theme.json | 2 +- .../Material Palenight.theme.json | 2 +- .../Monokai Pro Contrast.theme.json | 2 +- .../Monokai Pro.theme.json | 2 +- .../Night Owl Contrast.theme.json | 2 +- .../Night Owl.theme.json | 2 +- .../Solarized Dark Contrast.theme.json | 2 +- .../Solarized Dark.theme.json | 2 +- .../Solarized Light Contrast.theme.json | 2 +- .../Solarized Light.theme.json | 2 +- 32 files changed, 92 insertions(+), 42 deletions(-) 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", From 7433dc9cf32eb74e5100f30337f54a04b2ceb6f2 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 20 Jan 2020 17:55:21 +0100 Subject: [PATCH 03/28] Menus: changed menu bar and popup menu background colors (made brighter in light themes and darker in dark themes) made `JMenu`, `JMenuItem`, `JCheckBoxMenuItem` and `JRadioButtonMenuItem` non-opaque --- CHANGELOG.md | 6 ++++++ .../flatlaf/ui/FlatPopupMenuBorder.java | 19 +++++++++++++++++++ .../formdev/flatlaf/FlatDarkLaf.properties | 1 + .../com/formdev/flatlaf/FlatLaf.properties | 14 ++++++++++++-- .../formdev/flatlaf/FlatLightLaf.properties | 1 + 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b48ca658..c5652239 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ FlatLaf Change Log ## Unreleased +- Menus: + - Changed menu bar and popup menu background colors (made brighter in light + themes and darker in dark themes). + - Popup menus now have empty space at the top and bottom. + - 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 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/resources/com/formdev/flatlaf/FlatDarkLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties index e3245f58..47ab98dd 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 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 e1ea0c5b..ec48c381 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -121,6 +121,8 @@ CheckBoxMenuItem.border=com.formdev.flatlaf.ui.FlatMarginBorder CheckBoxMenuItem.checkIcon=com.formdev.flatlaf.icons.FlatCheckBoxMenuItemIcon CheckBoxMenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon CheckBoxMenuItem.margin=2,2,2,2 +CheckBoxMenuItem.opaque=false +CheckBoxMenuItem.background=@menuBackground #---- ColorChooser ---- @@ -216,12 +218,15 @@ Menu.border=com.formdev.flatlaf.ui.FlatMarginBorder Menu.arrowIcon=com.formdev.flatlaf.icons.FlatMenuArrowIcon Menu.margin=2,2,2,2 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 #---- MenuItem ---- @@ -229,6 +234,8 @@ MenuBar.border=com.formdev.flatlaf.ui.FlatMenuBarBorder MenuItem.border=com.formdev.flatlaf.ui.FlatMarginBorder MenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon MenuItem.margin=2,2,2,2 +MenuItem.opaque=false +MenuItem.background=@menuBackground #---- OptionPane ---- @@ -265,7 +272,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 ---- @@ -299,6 +307,8 @@ RadioButtonMenuItem.border=com.formdev.flatlaf.ui.FlatMarginBorder RadioButtonMenuItem.checkIcon=com.formdev.flatlaf.icons.FlatRadioButtonMenuItemIcon RadioButtonMenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon RadioButtonMenuItem.margin=2,2,2,2 +RadioButtonMenuItem.opaque=false +RadioButtonMenuItem.background=@menuBackground #---- ScrollBar ---- 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..cfac801c 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 From 4e266483bac2606d70d7528bdcc0f493b21ca7f1 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 20 Jan 2020 20:13:37 +0100 Subject: [PATCH 04/28] Menus: menu items now have larger left and right margins --- CHANGELOG.md | 1 + .../flatlaf/ui/FlatMenuItemBorder.java | 49 +++++++++++++++++++ .../com/formdev/flatlaf/FlatLaf.properties | 18 ++++--- 3 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemBorder.java diff --git a/CHANGELOG.md b/CHANGELOG.md index c5652239..ee19ebb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ FlatLaf Change Log - Changed menu bar and popup menu background colors (made brighter in light themes and darker in dark themes). - 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 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/resources/com/formdev/flatlaf/FlatLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties index ec48c381..0b716bb5 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -59,6 +59,7 @@ ViewportUI=com.formdev.flatlaf.ui.FlatViewportUI #---- variables ---- @textComponentMargin=2,6,2,6 +@menuItemMargin=2,8,2,8 #---- system colors ---- @@ -117,10 +118,10 @@ 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 @@ -214,9 +215,9 @@ List.dropLineColor=@dropLineColor #---- Menu ---- -Menu.border=com.formdev.flatlaf.ui.FlatMarginBorder +Menu.border=com.formdev.flatlaf.ui.FlatMenuItemBorder Menu.arrowIcon=com.formdev.flatlaf.icons.FlatMenuArrowIcon -Menu.margin=2,2,2,2 +Menu.margin=@menuItemMargin Menu.submenuPopupOffsetX={scaledInteger}-4 Menu.submenuPopupOffsetY={scaledInteger}-4 Menu.opaque=false @@ -227,13 +228,14 @@ Menu.background=@menuBackground 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 @@ -303,10 +305,10 @@ 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 From 8f4f5d8c92b86a7bda20e108a01e420315c57b63 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 20 Jan 2020 20:17:58 +0100 Subject: [PATCH 05/28] FlatClientProperties: fixed javadoc error --- .../src/main/java/com/formdev/flatlaf/FlatClientProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 33065d19..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"; From 757b0812bac7e90bbc4915fae507b903f3e8f4dd Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 20 Jan 2020 23:35:50 +0100 Subject: [PATCH 06/28] Menu: highlight items in menu bar on mouse hover (issue #49) --- CHANGELOG.md | 1 + .../com/formdev/flatlaf/ui/FlatMenuUI.java | 60 +++++++++++++++++++ .../formdev/flatlaf/FlatDarkLaf.properties | 1 + .../formdev/flatlaf/FlatLightLaf.properties | 1 + .../flatlaf/testing/FlatTestLaf.properties | 2 + 5 files changed, 65 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee19ebb6..7bb6465d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ FlatLaf Change Log - 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` 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/resources/com/formdev/flatlaf/FlatDarkLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties index 47ab98dd..e529f9ff 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -145,6 +145,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/FlatLightLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties index cfac801c..6039030a 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -152,6 +152,7 @@ Menu.icon.disabledArrowColor=#ABABAB #---- MenuBar ---- MenuBar.borderColor=#cdcdcd +MenuBar.hoverBackground=darken($MenuBar.background,10%) #---- MenuItemCheckBox ---- 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..15353a21 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 @@ -157,6 +158,7 @@ Menu.icon.disabledArrowColor=#ABABAB #---- MenuBar ---- MenuBar.borderColor=#4444ff +MenuBar.hoverBackground=#fdd #---- MenuItemCheckBox ---- From 094967f52a74206a028b25f8c0a6af9bb5ed7855 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 22 Jan 2020 14:21:38 +0100 Subject: [PATCH 07/28] ProgressBar: made progress bar paint smooth in indeterminate mode --- CHANGELOG.md | 1 + .../src/main/resources/com/formdev/flatlaf/FlatLaf.properties | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bb6465d..19052446 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ FlatLaf Change Log 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 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 0b716bb5..af9c9d31 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -291,6 +291,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 ---- From a467356437f9afeef356321f18a4bf70004909a7 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 22 Jan 2020 14:54:49 +0100 Subject: [PATCH 08/28] build.gradle.kts: disable javadoc warnings for missing @param or @return --- flatlaf-core/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/flatlaf-core/build.gradle.kts b/flatlaf-core/build.gradle.kts index b09ec33c..4974b9ac 100644 --- a/flatlaf-core/build.gradle.kts +++ b/flatlaf-core/build.gradle.kts @@ -68,6 +68,7 @@ tasks { options { this as StandardJavadocDocletOptions tags = listOf( "uiDefault", "clientProperty" ) + addStringOption( "Xdoclint:all,-missing", "-Xdoclint:all,-missing" ) } isFailOnError = false } From 5a29753912044b70ae2f9e9ed4584f29f4bb9752 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 22 Jan 2020 15:07:56 +0100 Subject: [PATCH 09/28] release 0.26 --- CHANGELOG.md | 2 +- README.md | 2 +- build.gradle.kts | 2 +- flatlaf-jide-oss/README.md | 2 +- flatlaf-swingx/README.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19052446..7d9cdc07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ FlatLaf Change Log ================== -## Unreleased +## 0.26 - Menus: - Changed menu bar and popup menu background colors (made brighter in light diff --git a/README.md b/README.md index 9e2368f0..ed5ac4ad 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ build script: groupId: com.formdev artifactId: flatlaf - version: 0.25.1 + version: (see button below) Otherwise download `flatlaf-.jar` here: diff --git a/build.gradle.kts b/build.gradle.kts index 7bc57e70..5e1fd464 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ * limitations under the License. */ -version = "0.25.1" +version = "0.26" allprojects { repositories { 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-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: From 0910bd23c43e26361339d541437ed303e21dde71 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 23 Jan 2020 10:33:01 +0100 Subject: [PATCH 10/28] ProgressBar: fixed visual artifacts in indeterminate mode, on HiDPI screens at 125%, 150% and 175% scaling, when the progress moves around --- CHANGELOG.md | 6 ++++++ .../com/formdev/flatlaf/ui/FlatProgressBarUI.java | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d9cdc07..6f589655 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ FlatLaf Change Log ================== +## Unreleased + +- ProgressBar: Fixed visual artifacts in indeterminate mode, on HiDPI screens at + 125%, 150% and 175% scaling, when the progress moves around. + + ## 0.26 - Menus: 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(); + } } From 7e61d6a85078c2bb5174e89e4540ee3458d65d70 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 26 Jan 2020 17:31:48 +0100 Subject: [PATCH 11/28] README.md: added some projects that use FlatLaf --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index ed5ac4ad..681d83fb 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,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 ------------- From df4f51eff329c4865a51a3365e90a939eba62d0b Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 27 Jan 2020 15:23:03 +0100 Subject: [PATCH 12/28] InternalFrame: basic implementation (issues #39 and #11) --- CHANGELOG.md | 1 + .../java/com/formdev/flatlaf/FlatLaf.java | 3 +- .../icons/FlatInternalFrameAbstractIcon.java | 60 ++++++ .../icons/FlatInternalFrameCloseIcon.java | 17 +- .../icons/FlatInternalFrameIconifyIcon.java | 11 +- .../icons/FlatInternalFrameMaximizeIcon.java | 11 +- .../icons/FlatInternalFrameMinimizeIcon.java | 10 +- .../formdev/flatlaf/ui/FlatDesktopPaneUI.java | 39 ++++ .../ui/FlatInternalFrameTitlePane.java | 190 ++++++++++++++++++ .../flatlaf/ui/FlatInternalFrameUI.java | 155 ++++++++++++++ .../com/formdev/flatlaf/ui/FlatUIUtils.java | 9 +- .../formdev/flatlaf/FlatDarkLaf.properties | 23 +++ .../com/formdev/flatlaf/FlatLaf.properties | 18 ++ .../formdev/flatlaf/FlatLightLaf.properties | 23 +++ .../testing/FlatInternalFrameTest.java | 35 +++- .../flatlaf/testing/FlatInternalFrameTest.jfd | 18 +- .../flatlaf/testing/FlatTestFrame.java | 4 +- .../flatlaf/testing/FlatTestLaf.properties | 23 +++ 18 files changed, 612 insertions(+), 38 deletions(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameAbstractIcon.java create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopPaneUI.java create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameTitlePane.java create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f589655..3e137af1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ FlatLaf Change Log ## Unreleased +- Support `JInternalFrame`. (issues #39 and #11) - ProgressBar: Fixed visual artifacts in indeterminate mode, on HiDPI screens at 125%, 150% and 175% scaling, when the progress moves around. 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 09e6d512..eb13d56b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -294,10 +294,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/icons/FlatInternalFrameAbstractIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameAbstractIcon.java new file mode 100644 index 00000000..c1d4b982 --- /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.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 + * @uiDefault Button.arc int + * + * @author Karl Tauber + */ +public abstract class FlatInternalFrameAbstractIcon + extends FlatAbstractIcon +{ + private final Color hoverBackground; + private final Color pressedBackground; + private final int arc = UIManager.getInt( "Button.arc" ); + + public FlatInternalFrameAbstractIcon() { + this( UIManager.getColor( "InternalFrame.buttonHoverBackground" ), + UIManager.getColor( "InternalFrame.buttonPressedBackground" ) ); + } + + public FlatInternalFrameAbstractIcon( Color hoverBackground, Color pressedBackground ) { + super( 16, 16, 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.fillRoundRect( 0, 0, width, height, arc, arc ); + } + } +} 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..3d3b56d2 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,28 +17,39 @@ 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.getColor( "InternalFrame.closeHoverBackground" ), + UIManager.getColor( "InternalFrame.closePressedBackground" ) ); } @Override protected void paintIcon( Component c, Graphics2D g ) { + paintBackground( c, g ); + + g.setColor( FlatButtonUI.buttonStateColor( c, null, null, null, hoverForeground, pressedForeground ) ); + float mx = 8; float my = 8; float r = 3.25f; 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..b82b7225 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( 4, 8, 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..99239ce4 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( 4, 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..0745cec0 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,25 +21,25 @@ 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 ) { + paintBackground( c, g ); + + g.setColor( c.getForeground() ); + Path2D r1 = FlatUIUtils.createRectangle( 5, 3, 8, 8, 1 ); Path2D r2 = FlatUIUtils.createRectangle( 3, 5, 8, 8, 1 ); 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..bcaa0896 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopPaneUI.java @@ -0,0 +1,39 @@ +/* + * 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.JComponent; +import javax.swing.plaf.ComponentUI; +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(); + } +} 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/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 e529f9ff..41153a26 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -131,6 +131,29 @@ Component.focusColor=#3d6185 Component.linkColor=#589df6 +#---- Desktop ---- + +Desktop.background=#3E434C + + +#---- 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 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 af9c9d31..adb54bea 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,11 @@ CheckBoxUI=com.formdev.flatlaf.ui.FlatCheckBoxUI CheckBoxMenuItemUI=com.formdev.flatlaf.ui.FlatCheckBoxMenuItemUI ColorChooserUI=com.formdev.flatlaf.ui.FlatColorChooserUI ComboBoxUI=com.formdev.flatlaf.ui.FlatComboBoxUI +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 @@ -197,6 +199,22 @@ 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.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=4,8,4,4 + + #---- List ---- List.border=1,0,1,0 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 6039030a..c8c66dc0 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -133,11 +133,34 @@ Component.focusColor=#97c3f3 Component.linkColor=#2470B3 +#---- Desktop ---- + +Desktop.background=#E6EBF0 + + #---- 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 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/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties index 15353a21..439f3322 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 @@ -130,11 +130,34 @@ Component.focusColor=#97c3f3 #Component.arc=8 +#---- Desktop ---- + +Desktop.background=#afe + + #---- 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=#080 +InternalFrame.buttonPressedBackground=#0a0 +InternalFrame.closeHoverBackground=#008 +InternalFrame.closePressedBackground=#00f +InternalFrame.closeHoverForeground=#fff +InternalFrame.closePressedForeground=#fff + + #---- Label ---- Label.foreground=#008800 From f421659fea6f0c779c4284afa9f6b0fb62d6d420 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 27 Jan 2020 15:33:30 +0100 Subject: [PATCH 13/28] update to Gradle 6.1.1 ./gradlew wrapper --gradle-version=6.1.1 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 10695ff51bb031a333008410fd8e5aed732ad567 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 27 Jan 2020 15:52:04 +0100 Subject: [PATCH 14/28] InternalFrame: fixed exception on macOS when minimizing internal frame (#39) --- .../src/main/resources/com/formdev/flatlaf/FlatLaf.properties | 1 + 1 file changed, 1 insertion(+) 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 adb54bea..f3760d05 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -21,6 +21,7 @@ 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=javax.swing.plaf.basic.BasicDesktopIconUI DesktopPaneUI=com.formdev.flatlaf.ui.FlatDesktopPaneUI EditorPaneUI=com.formdev.flatlaf.ui.FlatEditorPaneUI FileChooserUI=com.formdev.flatlaf.ui.FlatFileChooserUI From 5853bd4a96d6d07f4aab98f1340dfcc5f961c15e Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 2 Feb 2020 17:12:34 +0100 Subject: [PATCH 15/28] InternalFrame: made buttons larger and square (issue #39) --- .../flatlaf/icons/FlatInternalFrameAbstractIcon.java | 12 ++++++------ .../flatlaf/icons/FlatInternalFrameCloseIcon.java | 7 ++++--- .../flatlaf/icons/FlatInternalFrameIconifyIcon.java | 2 +- .../flatlaf/icons/FlatInternalFrameMaximizeIcon.java | 2 +- .../flatlaf/icons/FlatInternalFrameMinimizeIcon.java | 8 +++++--- .../java/com/formdev/flatlaf/ui/FlatEmptyBorder.java | 5 +++-- .../resources/com/formdev/flatlaf/FlatLaf.properties | 3 ++- .../formdev/flatlaf/testing/FlatTestLaf.properties | 2 +- 8 files changed, 23 insertions(+), 18 deletions(-) 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 index c1d4b982..cc455c6a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameAbstractIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameAbstractIcon.java @@ -18,6 +18,7 @@ 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; @@ -28,7 +29,6 @@ import com.formdev.flatlaf.ui.FlatUIUtils; * * @uiDefault InternalFrame.buttonHoverBackground Color * @uiDefault InternalFrame.buttonPressedBackground Color - * @uiDefault Button.arc int * * @author Karl Tauber */ @@ -37,15 +37,15 @@ public abstract class FlatInternalFrameAbstractIcon { private final Color hoverBackground; private final Color pressedBackground; - private final int arc = UIManager.getInt( "Button.arc" ); public FlatInternalFrameAbstractIcon() { - this( UIManager.getColor( "InternalFrame.buttonHoverBackground" ), + this( UIManager.getDimension( "InternalFrame.buttonSize" ), + UIManager.getColor( "InternalFrame.buttonHoverBackground" ), UIManager.getColor( "InternalFrame.buttonPressedBackground" ) ); } - public FlatInternalFrameAbstractIcon( Color hoverBackground, Color pressedBackground ) { - super( 16, 16, null ); + public FlatInternalFrameAbstractIcon( Dimension size, Color hoverBackground, Color pressedBackground ) { + super( size.width, size.height, null ); this.hoverBackground = hoverBackground; this.pressedBackground = pressedBackground; } @@ -54,7 +54,7 @@ public abstract class FlatInternalFrameAbstractIcon Color background = FlatButtonUI.buttonStateColor( c, null, null, null, hoverBackground, pressedBackground ); if( background != null ) { FlatUIUtils.setColor( g, background, c.getBackground() ); - g.fillRoundRect( 0, 0, width, height, arc, arc ); + 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 3d3b56d2..3203d7d1 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 @@ -40,7 +40,8 @@ public class FlatInternalFrameCloseIcon private final Color pressedForeground = UIManager.getColor( "InternalFrame.closePressedForeground" ); public FlatInternalFrameCloseIcon() { - super( UIManager.getColor( "InternalFrame.closeHoverBackground" ), + super( UIManager.getDimension( "InternalFrame.buttonSize" ), + UIManager.getColor( "InternalFrame.closeHoverBackground" ), UIManager.getColor( "InternalFrame.closePressedBackground" ) ); } @@ -50,8 +51,8 @@ public class FlatInternalFrameCloseIcon g.setColor( FlatButtonUI.buttonStateColor( c, null, null, null, hoverForeground, pressedForeground ) ); - float mx = 8; - float my = 8; + 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 b82b7225..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 @@ -35,6 +35,6 @@ public class FlatInternalFrameIconifyIcon paintBackground( c, g ); g.setColor( c.getForeground() ); - g.fillRect( 4, 8, 8, 1 ); + 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 99239ce4..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 @@ -36,6 +36,6 @@ public class FlatInternalFrameMaximizeIcon paintBackground( c, g ); g.setColor( c.getForeground() ); - g.fill( FlatUIUtils.createRectangle( 4, 4, 8, 8, 1 ) ); + 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 0745cec0..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 @@ -40,11 +40,13 @@ public class FlatInternalFrameMinimizeIcon g.setColor( c.getForeground() ); - Path2D r1 = FlatUIUtils.createRectangle( 5, 3, 8, 8, 1 ); - Path2D r2 = FlatUIUtils.createRectangle( 3, 5, 8, 8, 1 ); + 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/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/resources/com/formdev/flatlaf/FlatLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties index f3760d05..76871291 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -205,6 +205,7 @@ HelpButton.disabledQuestionMarkColor=$CheckBox.icon.disabledCheckmarkColor 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 @@ -213,7 +214,7 @@ InternalFrame.minimizeIcon=com.formdev.flatlaf.icons.FlatInternalFrameMinimizeIc #---- InternalFrameTitlePane ---- -InternalFrameTitlePane.border=4,8,4,4 +InternalFrameTitlePane.border=0,8,0,0 #---- List ---- 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 439f3322..3ce5b3f6 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 @@ -150,7 +150,7 @@ InternalFrame.inactiveTitleForeground=#afa InternalFrame.activeBorderColor=#f00 InternalFrame.inactiveBorderColor=#0f0 -InternalFrame.buttonHoverBackground=#080 +InternalFrame.buttonHoverBackground=#060 InternalFrame.buttonPressedBackground=#0a0 InternalFrame.closeHoverBackground=#008 InternalFrame.closePressedBackground=#00f From 030e1809f35d7bf9ece0f481ca515c62dfc23886 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 3 Feb 2020 21:27:08 +0100 Subject: [PATCH 16/28] Table: support positioning the column sort arrow in header right, left, top or bottom (issue #34) --- CHANGELOG.md | 2 + .../formdev/flatlaf/ui/FlatTableHeaderUI.java | 107 ++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e137af1..1c83fc7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ FlatLaf Change Log ## Unreleased - Support `JInternalFrame`. (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. 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..0926d86a 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,81 @@ 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() - UIScale.scale( 1 ); + 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; + } + } } From 9d046ecd1d24c4b4ec8d44b8ea8c3bbcf68acc0f Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 5 Feb 2020 12:34:07 +0100 Subject: [PATCH 17/28] build.gradle.kts: added snapshot publishing to oss.jfrog.org --- build.gradle.kts | 2 +- flatlaf-core/build.gradle.kts | 25 ++++++++++++++++++++++++- flatlaf-jide-oss/build.gradle.kts | 23 +++++++++++++++++++++++ flatlaf-swingx/build.gradle.kts | 23 +++++++++++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5e1fd464..ed8b52ed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ * limitations under the License. */ -version = "0.26" +version = "0.26.1-SNAPSHOT" allprojects { repositories { diff --git a/flatlaf-core/build.gradle.kts b/flatlaf-core/build.gradle.kts index 4974b9ac..3f486b9d 100644 --- a/flatlaf-core/build.gradle.kts +++ b/flatlaf-core/build.gradle.kts @@ -20,6 +20,7 @@ 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 +54,7 @@ tasks { targetCompatibility = "9" } } - + jar { archiveBaseName.set( "flatlaf" ) @@ -146,3 +147,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-jide-oss/build.gradle.kts b/flatlaf-jide-oss/build.gradle.kts index c1394ef9..22db4a99 100644 --- a/flatlaf-jide-oss/build.gradle.kts +++ b/flatlaf-jide-oss/build.gradle.kts @@ -20,6 +20,7 @@ plugins { `java-library` `maven-publish` id( "com.jfrog.bintray" ) version "1.8.4" + id( "com.jfrog.artifactory" ) version "4.13.0" } dependencies { @@ -119,3 +120,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/build.gradle.kts b/flatlaf-swingx/build.gradle.kts index 25d2a07f..f44a367b 100644 --- a/flatlaf-swingx/build.gradle.kts +++ b/flatlaf-swingx/build.gradle.kts @@ -20,6 +20,7 @@ plugins { `java-library` `maven-publish` id( "com.jfrog.bintray" ) version "1.8.4" + id( "com.jfrog.artifactory" ) version "4.13.0" } dependencies { @@ -119,3 +120,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" ) + } ) +} From 84d05603ef831ffb946fffd0d1914d39b32821e0 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 5 Feb 2020 15:21:01 +0100 Subject: [PATCH 18/28] build.gradle.kts: separate versions for release and development (snapshot) --- build.gradle.kts | 7 ++++++- flatlaf-core/build.gradle.kts | 2 -- flatlaf-demo/build.gradle.kts | 2 -- flatlaf-extras/build.gradle.kts | 2 -- flatlaf-jide-oss/build.gradle.kts | 2 -- flatlaf-swingx/build.gradle.kts | 2 -- flatlaf-testing/build.gradle.kts | 2 -- 7 files changed, 6 insertions(+), 13 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index ed8b52ed..af9fde3f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,9 +14,14 @@ * limitations under the License. */ -version = "0.26.1-SNAPSHOT" +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 3f486b9d..e2d814e4 100644 --- a/flatlaf-core/build.gradle.kts +++ b/flatlaf-core/build.gradle.kts @@ -14,8 +14,6 @@ * limitations under the License. */ -version = rootProject.version - plugins { `java-library` `maven-publish` 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-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/build.gradle.kts b/flatlaf-jide-oss/build.gradle.kts index 22db4a99..ceec2488 100644 --- a/flatlaf-jide-oss/build.gradle.kts +++ b/flatlaf-jide-oss/build.gradle.kts @@ -14,8 +14,6 @@ * limitations under the License. */ -version = rootProject.version - plugins { `java-library` `maven-publish` diff --git a/flatlaf-swingx/build.gradle.kts b/flatlaf-swingx/build.gradle.kts index f44a367b..34df709e 100644 --- a/flatlaf-swingx/build.gradle.kts +++ b/flatlaf-swingx/build.gradle.kts @@ -14,8 +14,6 @@ * limitations under the License. */ -version = rootProject.version - plugins { `java-library` `maven-publish` 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` } From a000c8fd9997661a26a76eca54d01abeabdd3f67 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 5 Feb 2020 15:29:00 +0100 Subject: [PATCH 19/28] travis: use stages and added snapshot upload --- .travis.yml | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index a27d5275..a1a2b06d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,11 +19,25 @@ 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: build + - 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: + # run gradle build + - stage: build + script: ./gradlew build + + # 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 From cd69d9a1a70851627d9eb8191bd334347b4e92d4 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 5 Feb 2020 15:54:29 +0100 Subject: [PATCH 20/28] travis: moved JDKs to build job --- .travis.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index a1a2b06d..3d04e2eb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,6 @@ language: java sudo: false -jdk: - - openjdk8 - - openjdk9 - - openjdk11 - - openjdk13 - before_cache: - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ @@ -30,6 +24,11 @@ jobs: include: # run gradle build - stage: build + jdk: + - openjdk8 + - openjdk9 + - openjdk11 + - openjdk13 script: ./gradlew build # publish snapshot to oss.jfrog.org From 1f3c264afec78971c10685869eb73319452054be Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 5 Feb 2020 16:12:56 +0100 Subject: [PATCH 21/28] travis: moved JDKs back to top-level and execute "test" stage first (replaces "build" stage) --- .travis.yml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3d04e2eb..89a008a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,12 @@ language: java sudo: false +jdk: + - openjdk8 + - openjdk9 + - openjdk11 + - openjdk13 + before_cache: - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ @@ -14,7 +20,7 @@ before_install: - java -version stages: - - name: build + - name: test - name: snapshot if: branch = master AND type IN (push) AND tag IS blank - name: release @@ -22,15 +28,6 @@ stages: jobs: include: - # run gradle build - - stage: build - jdk: - - openjdk8 - - openjdk9 - - openjdk11 - - openjdk13 - script: ./gradlew build - # publish snapshot to oss.jfrog.org - stage: snapshot jdk: openjdk11 From 409840aef9edaaefc47486f701e0a89a61ca31a9 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 5 Feb 2020 18:23:27 +0100 Subject: [PATCH 22/28] README.md: added snapshots --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 681d83fb..0dca7306 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,19 @@ 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 ------ From 26d603db5db82acc33e9ed8937a11195352307df Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 7 Feb 2020 17:25:14 +0100 Subject: [PATCH 23/28] UIDefaultsLoader: support scaling float, insets and dimension --- .../com/formdev/flatlaf/UIDefaultsLoader.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) 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. */ From 686d667c4f9a75c6845a0af17dee77f73a3cde91 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sat, 8 Feb 2020 10:38:48 +0100 Subject: [PATCH 24/28] Table: optimized position of column sort arrow (issue #34) --- .../java/com/formdev/flatlaf/icons/FlatAscendingSortIcon.java | 2 +- .../com/formdev/flatlaf/icons/FlatDescendingSortIcon.java | 2 +- .../main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) 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/ui/FlatTableHeaderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java index 0926d86a..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 @@ -307,7 +307,9 @@ public class FlatTableHeaderUI int xi = x + ((width - sortIcon.getIconWidth()) / 2); int yi = (sortIconPosition == SwingConstants.TOP) ? y + UIScale.scale( 1 ) - : y + height - sortIcon.getIconHeight() - UIScale.scale( 1 ); + : y + height - sortIcon.getIconHeight() + - 1 // for gap + - (int) (1 * UIScale.getUserScaleFactor()); // for bottom border sortIcon.paintIcon( c, g, xi, yi ); } } From b6789e14a49364011e8dedc314dbacb42b5a3ae7 Mon Sep 17 00:00:00 2001 From: Bill Culp Date: Mon, 10 Feb 2020 22:32:11 -0800 Subject: [PATCH 25/28] Option to allow tabbed pane separator to take full height --- .../java/com/formdev/flatlaf/FlatClientProperties.java | 8 ++++++++ .../java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) 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..035038c4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -133,6 +133,14 @@ public interface FlatClientProperties */ String TABBED_PANE_HAS_FULL_BORDER = "JTabbedPane.hasFullBorder"; + /** + * Specifies whether tab separators (if enabled) extend to tab height. + *

+ * Component {@link javax.swing.JTabbedPane}
+ * Value type {@link java.lang.Boolean} + */ + String TABBED_PANE_TAB_SEPARATORS_FULL_HEIGHT = "JTabbedPane.tabSeparatorsFullHeight"; + /** * Specifies the height of a tab. *

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..96e23dab 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 @@ -48,6 +48,7 @@ import com.formdev.flatlaf.util.UIScale; * * @clientProperty JTabbedPane.showTabSeparators boolean * @clientProperty JTabbedPane.hasFullBorder boolean + * @clientProperty JTabbedPane.tabSeparatorsFullHeight boolean * * * @@ -83,6 +84,7 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault TabbedPane.contentSeparatorHeight int * @uiDefault TabbedPane.showTabSeparators boolean * @uiDefault TabbedPane.hasFullBorder boolean + * @uiDefault TabbedPane.tabSeparatorsFullHeight boolean * * @author Karl Tauber */ @@ -105,6 +107,7 @@ public class FlatTabbedPaneUI protected boolean showTabSeparators; protected boolean hasFullBorder; protected boolean tabsOverlapBorder; + protected boolean tabSeparatorsFullHeight; public static ComponentUI createUI( JComponent c ) { return new FlatTabbedPaneUI(); @@ -130,6 +133,7 @@ public class FlatTabbedPaneUI showTabSeparators = UIManager.getBoolean( "TabbedPane.showTabSeparators" ); hasFullBorder = UIManager.getBoolean( "TabbedPane.hasFullBorder" ); tabsOverlapBorder = UIManager.getBoolean( "TabbedPane.tabsOverlapBorder" ); + tabSeparatorsFullHeight = UIManager.getBoolean( "TabbedPane.tabSeparatorsFullHeight" ); // scale textIconGap = scale( textIconGap ); @@ -307,7 +311,7 @@ public class FlatTabbedPaneUI !isLastInRun( tabIndex ) ) { float sepWidth = UIScale.scale( 1f ); - float offset = UIScale.scale( 5f ); + float offset = tabSeparatorsFullHeight ? 0.0f : UIScale.scale( 5f ); g.setColor( (tabSeparatorColor != null) ? tabSeparatorColor : contentAreaColor ); if( tabPlacement == LEFT || tabPlacement == RIGHT ) { From a1d5f65588a85f72a8de8f201e8248e2d60fb2ec Mon Sep 17 00:00:00 2001 From: Bill Culp Date: Mon, 10 Feb 2020 23:37:27 -0800 Subject: [PATCH 26/28] bug: AbstractButton's ContentAreaFilled=false not honored when parent is a CellRendererPane docs: AbstractButton:setContentAreaFilled Sets the contentAreaFilled property. If true the button will paint the content area. If you wish to have a transparent button, such as an icon only button, for example, then you should set this to false. Do not call setOpaque(false). The default value for the the contentAreaFilled property is true. This function may cause the component's opaque property to change. The exact behavior of calling this function varies on a component-by-component and L&F-by-L&F basis. Parameters: b - if true, the content should be filled; if false the content area is not filled --- .../main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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..ecfbb037 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 @@ -121,8 +121,9 @@ public class FlatRadioButtonUI // fill background even if opaque if // - used as cell renderer (because of selection background) // - if background was explicitly set to a non-UIResource color - if( !c.isOpaque() && - (c.getParent() instanceof CellRendererPane || !(c.getBackground() instanceof UIResource)) ) + if( ( !c.isOpaque() && + (c.getParent() instanceof CellRendererPane || !(c.getBackground() instanceof UIResource))) + || c instanceof AbstractButton && ((AbstractButton) c).isContentAreaFilled() ) { g.setColor( c.getBackground() ); g.fillRect( 0, 0, c.getWidth(), c.getHeight() ); From f0a49c806e68c72efc7edd7bc4e672273a26d0a1 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 11 Feb 2020 15:38:32 +0100 Subject: [PATCH 27/28] DesktopPane support implemented (issues #39 and #11) --- CHANGELOG.md | 2 +- .../icons/FlatInternalFrameCloseIcon.java | 2 +- .../formdev/flatlaf/ui/FlatDesktopIconUI.java | 308 ++++++++++++++++++ .../formdev/flatlaf/ui/FlatDesktopPaneUI.java | 26 ++ .../formdev/flatlaf/FlatDarkLaf.properties | 5 + .../com/formdev/flatlaf/FlatLaf.properties | 10 +- .../formdev/flatlaf/FlatLightLaf.properties | 5 + .../flatlaf/testing/FlatTestLaf.properties | 5 + 8 files changed, 360 insertions(+), 3 deletions(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopIconUI.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c83fc7e..d9ac68e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ FlatLaf Change Log ## Unreleased -- Support `JInternalFrame`. (issues #39 and #11) +- 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 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 3203d7d1..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 @@ -49,7 +49,7 @@ public class FlatInternalFrameCloseIcon protected void paintIcon( Component c, Graphics2D g ) { paintBackground( c, g ); - g.setColor( FlatButtonUI.buttonStateColor( c, null, null, null, hoverForeground, pressedForeground ) ); + g.setColor( FlatButtonUI.buttonStateColor( c, c.getForeground(), null, null, hoverForeground, pressedForeground ) ); float mx = width / 2; float my = height / 2; 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 index bcaa0896..eb5b72e9 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDesktopPaneUI.java @@ -16,8 +16,11 @@ 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; /** @@ -36,4 +39,27 @@ public class FlatDesktopPaneUI 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/resources/com/formdev/flatlaf/FlatDarkLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties index 41153a26..4fdbfc5c 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -136,6 +136,11 @@ Component.linkColor=#589df6 Desktop.background=#3E434C +#---- DesktopIcon ---- + +DesktopIcon.background=lighten($Desktop.background,10%) + + #---- InternalFrame ---- InternalFrame.activeTitleBackground=darken(@background,10%) 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 76871291..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,7 +21,7 @@ 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=javax.swing.plaf.basic.BasicDesktopIconUI +DesktopIconUI=com.formdev.flatlaf.ui.FlatDesktopIconUI DesktopPaneUI=com.formdev.flatlaf.ui.FlatDesktopPaneUI EditorPaneUI=com.formdev.flatlaf.ui.FlatEditorPaneUI FileChooserUI=com.formdev.flatlaf.ui.FlatFileChooserUI @@ -151,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 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 c8c66dc0..4b84cc72 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -138,6 +138,11 @@ Component.linkColor=#2470B3 Desktop.background=#E6EBF0 +#---- DesktopIcon ---- + +DesktopIcon.background=darken($Desktop.background,10%) + + #---- HelpButton ---- HelpButton.questionMarkColor=#4F9EE3 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 3ce5b3f6..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 @@ -135,6 +135,11 @@ Component.focusColor=#97c3f3 Desktop.background=#afe +#---- DesktopIcon ---- + +DesktopIcon.background=darken($Desktop.background,20%) + + #---- HelpButton ---- HelpButton.questionMarkColor=#0000ff From 23c30ec46d4a88379951cb9bc034135458a8ebae Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 11 Feb 2020 18:44:35 +0100 Subject: [PATCH 28/28] FlatComponentsTest: add checkbox to change `contentAreaFilled` of all buttons (for issue #58) --- .../flatlaf/testing/FlatComponentsTest.java | 17 +++++++++++++++++ .../flatlaf/testing/FlatComponentsTest.jfd | 11 +++++++++++ 2 files changed, 28 insertions(+) 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:"