diff --git a/src/org/omegat/Bundle.properties b/src/org/omegat/Bundle.properties index b1848b08dd..2bfe302ad7 100644 --- a/src/org/omegat/Bundle.properties +++ b/src/org/omegat/Bundle.properties @@ -2326,6 +2326,7 @@ TEAM_26_to_36_CONVERT_FAILED=Project conversion failed.\n\ TEAM_USERPASS_TITLE=Authentication TEAM_USERPASS_FIRST=Enter your credentials for {0} TEAM_USERPASS_WRONG=Incorrect username/password for {0} +TEAM_USERPASS_EXTRA_SPACE=Username or password has extra space character(s) TEAM_USER_FIRST=Enter the username for {0} TEAM_PASS_FIRST=Enter the password for {0} TEAM_PASSPHRASE_FIRST=Enter the passphrase for SSH key {0} diff --git a/src/org/omegat/core/team2/gui/UserPassDialog.java b/src/org/omegat/core/team2/gui/UserPassDialog.java index 8f7b29dcbc..43475f235c 100644 --- a/src/org/omegat/core/team2/gui/UserPassDialog.java +++ b/src/org/omegat/core/team2/gui/UserPassDialog.java @@ -28,12 +28,14 @@ package org.omegat.core.team2.gui; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import javax.swing.Action; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; @@ -41,6 +43,8 @@ import javax.swing.JPasswordField; import javax.swing.JTextArea; import javax.swing.JTextField; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import org.omegat.util.OStrings; import org.omegat.util.gui.StaticUIUtils; @@ -66,6 +70,7 @@ public UserPassDialog(java.awt.Frame parent) { initComponents(); getRootPane().setDefaultButton(okButton); + setActions(); invalidate(); pack(); @@ -74,6 +79,60 @@ public UserPassDialog(java.awt.Frame parent) { usernameField.requestFocusInWindow(); } + private void setActions() { + usernameField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + checkCredentials(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + checkCredentials(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + checkCredentials(); + } + }); + passwordField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + checkCredentials(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + checkCredentials(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + checkCredentials(); + } + }); + } + + private void checkCredentials() { + String username = usernameField.getText(); + char[] password = passwordField.getPassword(); + boolean isValid = !username.trim().isEmpty() && password.length > 0; + + if (isValid) { + isValid = username.trim().length() == username.length() && password[0] != ' ' + && password[password.length - 1] != ' '; + if (!isValid) { + setMessage(OStrings.getString("TEAM_USERPASS_EXTRA_SPACE")); + } + } + if (isValid) { + resetMessage(); + } + + okButton.setEnabled(isValid); + } + /** * @return the return status of this dialog - one of RET_OK or RET_CANCEL */ @@ -88,7 +147,7 @@ private void initComponents() { GridBagConstraints gridBagConstraints; JPanel northPanel = new JPanel(); - JPanel mainPanel = new JPanel(); + mainPanel = new JPanel(); JPanel buttonPanel = new JPanel(); JPanel southPanel = new JPanel(); descriptionTextArea = new JTextArea(); @@ -97,6 +156,7 @@ private void initComponents() { JLabel passwordLabel = new JLabel(); passwordField = new JPasswordField(); perHostCheckBox = new JCheckBox(); + messageArea = new JTextArea(); okButton = new JButton(); JButton cancelButton = new JButton(); @@ -172,6 +232,16 @@ public void windowClosing(WindowEvent evt) { gridBagConstraints.insets = new java.awt.Insets(4, 16, 4, 4); mainPanel.add(perHostCheckBox, gridBagConstraints); + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 8; + gridBagConstraints.gridwidth = 2; + gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; + gridBagConstraints.anchor = GridBagConstraints.WEST; + gridBagConstraints.insets = new java.awt.Insets(4, 16, 4, 4); + messageArea.setBackground(mainPanel.getBackground()); + mainPanel.add(messageArea, gridBagConstraints); + getContentPane().add(mainPanel, BorderLayout.CENTER); southPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10)); @@ -210,11 +280,13 @@ private void doClose(int retStatus) { dispose(); } + private JPanel mainPanel; private JButton okButton; private JTextArea descriptionTextArea; private JTextField usernameField; private JPasswordField passwordField; - private javax.swing.JCheckBox perHostCheckBox; + private JCheckBox perHostCheckBox; + private JTextArea messageArea; private int returnStatus = RET_CANCEL; @@ -246,4 +318,14 @@ public void setDescription(String description) { public void setPerHostCheckBoxText(String text) { org.openide.awt.Mnemonics.setLocalizedText(perHostCheckBox, text); } + + public void setMessage(String text) { + messageArea.setText(text); + messageArea.setBackground(Color.red); + } + + public void resetMessage() { + messageArea.setText(""); + messageArea.setBackground(mainPanel.getBackground()); + } }