From c330728ac3d798afcb44461c5aa4a35c1279c0ef Mon Sep 17 00:00:00 2001 From: Maarten Billemont Date: Mon, 16 Feb 2015 23:56:58 -0500 Subject: [PATCH] UI Improvements for Windows and system L&F. --- .idea/encodings.xml | 11 +++-- .../com/lyndir/masterpassword/gui/GUI.java | 11 ++++- .../gui/ModelAuthenticationPanel.java | 10 +++++ .../masterpassword/gui/PasswordFrame.java | 11 ++--- .../masterpassword/gui/UnlockFrame.java | 24 +++++++--- .../gui/platform/mac/AppleGUI.java | 45 +++++++++++++++++++ .../masterpassword/gui/util/Components.java | 22 ++++++--- 7 files changed, 112 insertions(+), 22 deletions(-) create mode 100644 MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/platform/mac/AppleGUI.java diff --git a/.idea/encodings.xml b/.idea/encodings.xml index e206d70d..4c94b2e6 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,5 +1,10 @@ - - - + + + + + + + + \ No newline at end of file diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/GUI.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/GUI.java index f5eefe44..2b4a6e10 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/GUI.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/GUI.java @@ -21,6 +21,7 @@ import com.google.common.base.Charsets; import com.google.common.io.*; import com.lyndir.lhunath.opal.system.logging.Logger; import com.lyndir.lhunath.opal.system.util.TypeUtils; + import java.io.*; import java.net.URI; import java.net.URL; @@ -48,7 +49,13 @@ public class GUI implements UnlockFrame.SignInCallback { if (Config.get().checkForUpdates()) checkUpdate(); - TypeUtils.newInstance( AppleGUI.class ).or( new GUI() ).open(); + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } + catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException | IllegalAccessException ignored) { + } + + TypeUtils.newInstance( "com.lyndir.masterpassword.gui.platform.mac.AppleGUI" ).or( new GUI() ).open(); } private static void checkUpdate() { @@ -80,7 +87,7 @@ public class GUI implements UnlockFrame.SignInCallback { } } - void open() { + protected void open() { SwingUtilities.invokeLater( new Runnable() { @Override public void run() { diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/ModelAuthenticationPanel.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/ModelAuthenticationPanel.java index 56037f9e..b78aac31 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/ModelAuthenticationPanel.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/ModelAuthenticationPanel.java @@ -13,6 +13,7 @@ import javax.annotation.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.plaf.metal.MetalComboBoxEditor; /** @@ -51,6 +52,15 @@ public class ModelAuthenticationPanel extends AuthenticationPanel implements Ite userField.setFont( Res.valueFont().deriveFont( 12f ) ); userField.addItemListener( this ); userField.addActionListener( this ); + userField.setEditor(new MetalComboBoxEditor() { + @Override + protected JTextField createEditorComponent() { + JTextField editorComponents = Components.textField(); + editorComponents.setForeground(Color.red); + return editorComponents; + } + }); + add( userField ); add( Components.stud() ); diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/PasswordFrame.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/PasswordFrame.java index be6f9314..c6fd071e 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/PasswordFrame.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/PasswordFrame.java @@ -149,11 +149,12 @@ public class PasswordFrame extends JFrame implements DocumentListener { } ); // Password - passwordField = new JPasswordField(); - passwordField.setAlignmentX( Component.CENTER_ALIGNMENT ); - passwordField.setEditable( false ); - passwordField.setHorizontalAlignment( JTextField.CENTER ); - passwordField.putClientProperty( "JPasswordField.cutCopyAllowed", true ); + passwordField = Components.passwordField(); + passwordField.setAlignmentX(Component.CENTER_ALIGNMENT); + passwordField.setHorizontalAlignment(JTextField.CENTER); + passwordField.putClientProperty("JPasswordField.cutCopyAllowed", true); + passwordField.setEditable(false); + passwordField.setBackground(null); passwordField.setBorder( null ); passwordEchoChar = passwordField.getEchoChar(); passwordEchoFont = passwordField.getFont().deriveFont( 40f ); diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/UnlockFrame.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/UnlockFrame.java index 469c5a8f..5df63855 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/UnlockFrame.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/UnlockFrame.java @@ -27,9 +27,21 @@ public class UnlockFrame extends JFrame { super( "Unlock Master Password" ); this.signInCallback = signInCallback; - setDefaultCloseOperation( DISPOSE_ON_CLOSE ); - setContentPane( root = Components.gradientPanel( new BorderLayout( 20, 20 ), Res.colors().frameBg() ) ); - root.setBorder( BorderFactory.createEmptyBorder( 20, 20, 20, 20 ) ); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + setContentPane(root = Components.gradientPanel(new BorderLayout(20, 20), Res.colors().frameBg())); + root.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + + addWindowFocusListener(new WindowAdapter() { + @Override + public void windowGainedFocus(WindowEvent e) { + root.setGradientColor(Res.colors().frameBg()); + } + + @Override + public void windowLostFocus(WindowEvent e) { + root.setGradientColor(Color.RED); + } + }); authenticationContainer = Components.boxLayout( BoxLayout.PAGE_AXIS ); authenticationContainer.setOpaque( true ); @@ -91,10 +103,10 @@ public class UnlockFrame extends JFrame { JComponent toolsPanel = Components.boxLayout( BoxLayout.LINE_AXIS, incognitoCheckBox, Box.createGlue() ); authenticationContainer.add( toolsPanel ); for (JButton button : authenticationPanel.getButtons()) { - button.setMargin( new Insets( 0, 0, 0, 0 ) ); - button.setAlignmentX( RIGHT_ALIGNMENT ); - button.setBorder( null ); toolsPanel.add( button ); + button.setMargin( new Insets( 0, 0, 0, 0 ) ); + button.setAlignmentX(RIGHT_ALIGNMENT); + button.setContentAreaFilled(false); } checkSignIn(); diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/platform/mac/AppleGUI.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/platform/mac/AppleGUI.java new file mode 100644 index 00000000..0e6559c6 --- /dev/null +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/platform/mac/AppleGUI.java @@ -0,0 +1,45 @@ +package com.lyndir.masterpassword.gui.platform.mac; + +import com.apple.eawt.*; +import com.lyndir.masterpassword.gui.GUI; +import com.lyndir.masterpassword.gui.PasswordFrame; +import com.lyndir.masterpassword.gui.User; + +import javax.swing.*; + + +/** + * @author lhunath, 2014-06-10 + */ +public class AppleGUI extends GUI { + + public AppleGUI() { + + Application application = Application.getApplication(); + application.addAppEventListener( new AppForegroundListener() { + + @Override + public void appMovedToBackground(AppEvent.AppForegroundEvent arg0) { + } + + @Override + public void appRaisedToForeground(AppEvent.AppForegroundEvent arg0) { + open(); + } + } ); + application.addAppEventListener( new AppReOpenedListener() { + @Override + public void appReOpened(AppEvent.AppReOpenedEvent arg0) { + open(); + } + } ); + } + + @Override + protected PasswordFrame newPasswordFrame(final User user) { + PasswordFrame frame = super.newPasswordFrame( user ); + frame.setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE ); + + return frame; + } +} diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/util/Components.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/util/Components.java index 6b167437..1874349e 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/util/Components.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/util/Components.java @@ -70,10 +70,10 @@ public abstract class Components { public static JPasswordField passwordField() { return new JPasswordField() { { - setBorder( BorderFactory.createCompoundBorder( BorderFactory.createLineBorder( Res.colors().controlBorder(), 1, true ), - BorderFactory.createEmptyBorder( 4, 4, 4, 4 ) ) ); - setAlignmentX( LEFT_ALIGNMENT ); - setAlignmentY( BOTTOM_ALIGNMENT ); + setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Res.colors().controlBorder(), 1, true), + BorderFactory.createEmptyBorder(4, 4, 4, 4))); + setAlignmentX(LEFT_ALIGNMENT); + setAlignmentY(BOTTOM_ALIGNMENT); } @Override @@ -116,6 +116,7 @@ public abstract class Components { ((DefaultEditor) getEditor()).getTextField().setBorder( editorBorder ); setAlignmentX( LEFT_ALIGNMENT ); setAlignmentY( BOTTOM_ALIGNMENT ); + setBorder(null); } @Override @@ -147,7 +148,8 @@ public abstract class Components { public static JCheckBox checkBox(final String label) { return new JCheckBox( label ) { { - setFont( Res.controlFont().deriveFont( 12f ) ); + setFont(Res.controlFont().deriveFont(12f)); + setBackground(null); setAlignmentX( LEFT_ALIGNMENT ); setAlignmentY( BOTTOM_ALIGNMENT ); } @@ -162,9 +164,14 @@ public abstract class Components { public static JComboBox comboBox(final ComboBoxModel model) { return new JComboBox( model ) { { +// CompoundBorder editorBorder = BorderFactory.createCompoundBorder( +// BorderFactory.createLineBorder( Res.colors().controlBorder(), 1, true ), +// BorderFactory.createEmptyBorder( 4, 4, 4, 4 ) ); +// ((JComponent) ((BasicComboBoxEditor) getEditor()).getEditorComponent()).setBorder(editorBorder); setFont( Res.controlFont().deriveFont( 12f ) ); setAlignmentX( LEFT_ALIGNMENT ); setAlignmentY( BOTTOM_ALIGNMENT ); +// setBorder(null); } @Override @@ -195,14 +202,17 @@ public abstract class Components { public void setGradientColor(@Nullable final Color gradientColor) { this.gradientColor = gradientColor; + revalidate(); } @Override public void doLayout() { super.doLayout(); - if (gradientColor != null) + if (gradientColor != null) { paint = new GradientPaint( new Point( 0, 0 ), gradientColor, new Point( getWidth(), getHeight() ), gradientColor.darker() ); + repaint(); + } } @Override