mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-07 22:40:53 +03:00
PasswordField: warn about enabled Caps Lock
This commit is contained in:
@@ -3,6 +3,7 @@ FlatLaf Change Log
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
- PasswordField: Warn about enabled Caps Lock.
|
||||||
- TextField, FormattedTextField and PasswordField: Support round borders (see UI
|
- TextField, FormattedTextField and PasswordField: Support round borders (see UI
|
||||||
default value `TextComponent.arc`). (issue #65)
|
default value `TextComponent.arc`). (issue #65)
|
||||||
- IntelliJ Themes: Added Gradianto themes to demo.
|
- IntelliJ Themes: Added Gradianto themes to demo.
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* 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.icons;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.geom.Path2D;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.awt.geom.RoundRectangle2D;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import com.formdev.flatlaf.ui.FlatUIUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "caps lock" icon for {@link javax.swing.JPasswordField}.
|
||||||
|
*
|
||||||
|
* @uiDefault PasswordField.capsLockIconColor Color
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatCapsLockIcon
|
||||||
|
extends FlatAbstractIcon
|
||||||
|
{
|
||||||
|
public FlatCapsLockIcon() {
|
||||||
|
super( 16, 16, UIManager.getColor( "PasswordField.capsLockIconColor" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paintIcon( Component c, Graphics2D g ) {
|
||||||
|
/*
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<rect width="16" height="16" fill="#6E6E6E" rx="3"/>
|
||||||
|
<rect width="6" height="2" x="5" y="12" fill="#FFF"/>
|
||||||
|
<path fill="#FFF" d="M2,8 L8,2 L14,8 L11,8 L11,10 L5,10 L5,8 L2,8 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
*/
|
||||||
|
|
||||||
|
Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
|
||||||
|
path.append( new RoundRectangle2D.Float( 0, 0, 16, 16, 6, 6 ), false );
|
||||||
|
path.append( new Rectangle2D.Float( 5, 12, 6, 2 ), false );
|
||||||
|
path.append( FlatUIUtils.createPath( 2,8, 8,2, 14,8, 11,8, 11,10, 5,10, 5,8 ), false );
|
||||||
|
g.fill( path );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,14 +20,20 @@ import static com.formdev.flatlaf.util.UIScale.scale;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Toolkit;
|
||||||
import java.awt.event.FocusListener;
|
import java.awt.event.FocusListener;
|
||||||
|
import java.awt.event.KeyAdapter;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.KeyListener;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import javax.swing.Icon;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicPasswordFieldUI;
|
import javax.swing.plaf.basic.BasicPasswordFieldUI;
|
||||||
import javax.swing.text.Caret;
|
import javax.swing.text.Caret;
|
||||||
|
import javax.swing.text.JTextComponent;
|
||||||
import com.formdev.flatlaf.FlatClientProperties;
|
import com.formdev.flatlaf.FlatClientProperties;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,6 +62,7 @@ import com.formdev.flatlaf.FlatClientProperties;
|
|||||||
* @uiDefault Component.minimumWidth int
|
* @uiDefault Component.minimumWidth int
|
||||||
* @uiDefault Component.isIntelliJTheme boolean
|
* @uiDefault Component.isIntelliJTheme boolean
|
||||||
* @uiDefault PasswordField.placeholderForeground Color
|
* @uiDefault PasswordField.placeholderForeground Color
|
||||||
|
* @uiDefault PasswordField.capsLockIcon Icon
|
||||||
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
|
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
@@ -68,8 +75,10 @@ public class FlatPasswordFieldUI
|
|||||||
protected int minimumWidth;
|
protected int minimumWidth;
|
||||||
protected boolean isIntelliJTheme;
|
protected boolean isIntelliJTheme;
|
||||||
protected Color placeholderForeground;
|
protected Color placeholderForeground;
|
||||||
|
protected Icon capsLockIcon;
|
||||||
|
|
||||||
private FocusListener focusListener;
|
private FocusListener focusListener;
|
||||||
|
private KeyListener capsLockListener;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatPasswordFieldUI();
|
return new FlatPasswordFieldUI();
|
||||||
@@ -85,6 +94,7 @@ public class FlatPasswordFieldUI
|
|||||||
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
|
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
|
||||||
isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" );
|
isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" );
|
||||||
placeholderForeground = UIManager.getColor( prefix + ".placeholderForeground" );
|
placeholderForeground = UIManager.getColor( prefix + ".placeholderForeground" );
|
||||||
|
capsLockIcon = UIManager.getIcon( "PasswordField.capsLockIcon" );
|
||||||
|
|
||||||
LookAndFeel.installProperty( getComponent(), "opaque", focusWidth == 0 );
|
LookAndFeel.installProperty( getComponent(), "opaque", focusWidth == 0 );
|
||||||
|
|
||||||
@@ -96,6 +106,7 @@ public class FlatPasswordFieldUI
|
|||||||
super.uninstallDefaults();
|
super.uninstallDefaults();
|
||||||
|
|
||||||
placeholderForeground = null;
|
placeholderForeground = null;
|
||||||
|
capsLockIcon = null;
|
||||||
|
|
||||||
MigLayoutVisualPadding.uninstall( getComponent() );
|
MigLayoutVisualPadding.uninstall( getComponent() );
|
||||||
}
|
}
|
||||||
@@ -105,7 +116,23 @@ public class FlatPasswordFieldUI
|
|||||||
super.installListeners();
|
super.installListeners();
|
||||||
|
|
||||||
focusListener = new FlatUIUtils.RepaintFocusListener( getComponent() );
|
focusListener = new FlatUIUtils.RepaintFocusListener( getComponent() );
|
||||||
|
capsLockListener = new KeyAdapter() {
|
||||||
|
@Override
|
||||||
|
public void keyPressed( KeyEvent e ) {
|
||||||
|
repaint( e );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void keyReleased( KeyEvent e ) {
|
||||||
|
repaint( e );
|
||||||
|
}
|
||||||
|
private void repaint( KeyEvent e ) {
|
||||||
|
if( e.getKeyCode() == KeyEvent.VK_CAPS_LOCK )
|
||||||
|
e.getComponent().repaint();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
getComponent().addFocusListener( focusListener );
|
getComponent().addFocusListener( focusListener );
|
||||||
|
getComponent().addKeyListener( capsLockListener );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -113,7 +140,9 @@ public class FlatPasswordFieldUI
|
|||||||
super.uninstallListeners();
|
super.uninstallListeners();
|
||||||
|
|
||||||
getComponent().removeFocusListener( focusListener );
|
getComponent().removeFocusListener( focusListener );
|
||||||
|
getComponent().removeKeyListener( capsLockListener );
|
||||||
focusListener = null;
|
focusListener = null;
|
||||||
|
capsLockListener = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -133,9 +162,21 @@ public class FlatPasswordFieldUI
|
|||||||
protected void paintSafely( Graphics g ) {
|
protected void paintSafely( Graphics g ) {
|
||||||
FlatTextFieldUI.paintBackground( g, getComponent(), focusWidth, arc, isIntelliJTheme );
|
FlatTextFieldUI.paintBackground( g, getComponent(), focusWidth, arc, isIntelliJTheme );
|
||||||
FlatTextFieldUI.paintPlaceholder( g, getComponent(), placeholderForeground );
|
FlatTextFieldUI.paintPlaceholder( g, getComponent(), placeholderForeground );
|
||||||
|
paintCapsLock( g );
|
||||||
super.paintSafely( g );
|
super.paintSafely( g );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void paintCapsLock( Graphics g ) {
|
||||||
|
JTextComponent c = getComponent();
|
||||||
|
if( !c.isFocusOwner() ||
|
||||||
|
!Toolkit.getDefaultToolkit().getLockingKeyState( KeyEvent.VK_CAPS_LOCK ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
int y = (c.getHeight() - capsLockIcon.getIconHeight()) / 2;
|
||||||
|
int x = c.getWidth() - capsLockIcon.getIconWidth() - y;
|
||||||
|
capsLockIcon.paintIcon( c, g, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintBackground( Graphics g ) {
|
protected void paintBackground( Graphics g ) {
|
||||||
// background is painted elsewhere
|
// background is painted elsewhere
|
||||||
|
|||||||
@@ -182,6 +182,11 @@ MenuItemCheckBox.icon.checkmarkColor=#A7A7A7
|
|||||||
MenuItemCheckBox.icon.disabledCheckmarkColor=#606060
|
MenuItemCheckBox.icon.disabledCheckmarkColor=#606060
|
||||||
|
|
||||||
|
|
||||||
|
#---- PasswordField ----
|
||||||
|
|
||||||
|
PasswordField.capsLockIconColor=#ffffff64
|
||||||
|
|
||||||
|
|
||||||
#---- PopupMenu ----
|
#---- PopupMenu ----
|
||||||
|
|
||||||
PopupMenu.borderColor=#5e5e5e
|
PopupMenu.borderColor=#5e5e5e
|
||||||
|
|||||||
@@ -345,6 +345,7 @@ PasswordField.margin=@textComponentMargin
|
|||||||
PasswordField.background=@textComponentBackground
|
PasswordField.background=@textComponentBackground
|
||||||
PasswordField.placeholderForeground=@disabledText
|
PasswordField.placeholderForeground=@disabledText
|
||||||
PasswordField.echoChar=\u2022
|
PasswordField.echoChar=\u2022
|
||||||
|
PasswordField.capsLockIcon=com.formdev.flatlaf.icons.FlatCapsLockIcon
|
||||||
|
|
||||||
|
|
||||||
#---- PopupMenu ----
|
#---- PopupMenu ----
|
||||||
|
|||||||
@@ -189,6 +189,11 @@ MenuItemCheckBox.icon.checkmarkColor=#4F9EE3
|
|||||||
MenuItemCheckBox.icon.disabledCheckmarkColor=#ABABAB
|
MenuItemCheckBox.icon.disabledCheckmarkColor=#ABABAB
|
||||||
|
|
||||||
|
|
||||||
|
#---- PasswordField ----
|
||||||
|
|
||||||
|
PasswordField.capsLockIconColor=#00000064
|
||||||
|
|
||||||
|
|
||||||
#---- PopupMenu ----
|
#---- PopupMenu ----
|
||||||
|
|
||||||
PopupMenu.borderColor=#adadad
|
PopupMenu.borderColor=#adadad
|
||||||
|
|||||||
7
flatlaf-core/svg/CapsLockIcon.svg
Normal file
7
flatlaf-core/svg/CapsLockIcon.svg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<rect width="16" height="16" fill="#6E6E6E" rx="3"/>
|
||||||
|
<rect width="6" height="2" x="5" y="12" fill="#FFF"/>
|
||||||
|
<path fill="#FFF" d="M2,8 L8,2 L14,8 L11,8 L11,10 L5,10 L5,8 L2,8 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 326 B |
Binary file not shown.
@@ -599,6 +599,8 @@ PanelUI com.formdev.flatlaf.ui.FlatPanelUI
|
|||||||
|
|
||||||
PasswordField.background #45494a javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.background #45494a javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatTextBorder [UI]
|
PasswordField.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatTextBorder [UI]
|
||||||
|
PasswordField.capsLockIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatCapsLockIcon [UI]
|
||||||
|
PasswordField.capsLockIconColor #64ffffff javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.caretBlinkRate 500
|
PasswordField.caretBlinkRate 500
|
||||||
PasswordField.caretForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.caretForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
|
||||||
|
|||||||
@@ -598,6 +598,8 @@ PanelUI com.formdev.flatlaf.ui.FlatPanelUI
|
|||||||
|
|
||||||
PasswordField.background #45494a javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.background #45494a javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatTextBorder [UI]
|
PasswordField.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatTextBorder [UI]
|
||||||
|
PasswordField.capsLockIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatCapsLockIcon [UI]
|
||||||
|
PasswordField.capsLockIconColor #64ffffff javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.caretBlinkRate 500
|
PasswordField.caretBlinkRate 500
|
||||||
PasswordField.caretForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.caretForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
|
||||||
|
|||||||
@@ -601,6 +601,8 @@ PanelUI com.formdev.flatlaf.ui.FlatPanelUI
|
|||||||
|
|
||||||
PasswordField.background #ffffff javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.background #ffffff javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatTextBorder [UI]
|
PasswordField.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatTextBorder [UI]
|
||||||
|
PasswordField.capsLockIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatCapsLockIcon [UI]
|
||||||
|
PasswordField.capsLockIconColor #64000000 javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.caretBlinkRate 500
|
PasswordField.caretBlinkRate 500
|
||||||
PasswordField.caretForeground #000000 javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.caretForeground #000000 javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.disabledBackground #f2f2f2 javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.disabledBackground #f2f2f2 javax.swing.plaf.ColorUIResource [UI]
|
||||||
|
|||||||
@@ -600,6 +600,8 @@ PanelUI com.formdev.flatlaf.ui.FlatPanelUI
|
|||||||
|
|
||||||
PasswordField.background #ffffff javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.background #ffffff javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatTextBorder [UI]
|
PasswordField.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatTextBorder [UI]
|
||||||
|
PasswordField.capsLockIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatCapsLockIcon [UI]
|
||||||
|
PasswordField.capsLockIconColor #64000000 javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.caretBlinkRate 500
|
PasswordField.caretBlinkRate 500
|
||||||
PasswordField.caretForeground #000000 javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.caretForeground #000000 javax.swing.plaf.ColorUIResource [UI]
|
||||||
PasswordField.disabledBackground #f2f2f2 javax.swing.plaf.ColorUIResource [UI]
|
PasswordField.disabledBackground #f2f2f2 javax.swing.plaf.ColorUIResource [UI]
|
||||||
|
|||||||
Reference in New Issue
Block a user