package org.jabref.gui.preftabs;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.net.ProxyPreferences;
import org.jabref.logic.net.ProxyRegisterer;
import org.jabref.preferences.JabRefPreferences;
import com.jgoodies.forms.builder.FormBuilder;
import com.jgoodies.forms.layout.FormLayout;
public class NetworkTab extends JPanel implements PrefsTab {
private final JCheckBox useProxyCheckBox;
private final JTextField hostnameTextField;
private final JTextField portTextField;
private final JCheckBox useAuthenticationCheckBox;
private final JTextField usernameTextField;
private final JPasswordField passwordTextField;
private final JabRefPreferences preferences;
private ProxyPreferences oldProxyPreferences;
public NetworkTab(JabRefPreferences preferences) {
this.preferences = preferences;
setLayout(new BorderLayout());
useProxyCheckBox = new JCheckBox(Localization.lang("Use custom proxy configuration"));
hostnameTextField = new JTextField();
hostnameTextField.setEnabled(false);
portTextField = new JTextField();
portTextField.setEnabled(false);
useAuthenticationCheckBox = new JCheckBox(Localization.lang("Proxy requires authentication"));
useAuthenticationCheckBox.setEnabled(false);
usernameTextField = new JTextField();
usernameTextField.setEnabled(false);
passwordTextField = new JPasswordField();
passwordTextField.setEnabled(false);
JLabel passwordWarningLabel = new JLabel(Localization.lang("Attention: Password is stored in plain text!"));
passwordWarningLabel.setEnabled(false);
passwordWarningLabel.setForeground(Color.RED);
Insets margin = new Insets(0, 12, 3, 0);
useProxyCheckBox.setMargin(margin);
portTextField.setMargin(margin);
useAuthenticationCheckBox.setMargin(margin);
// Listener on useProxyCheckBox to enable and disable the proxy related settings;
useProxyCheckBox.addChangeListener(event -> {
hostnameTextField.setEnabled(useProxyCheckBox.isSelected());
portTextField.setEnabled(useProxyCheckBox.isSelected());
useAuthenticationCheckBox.setEnabled(useProxyCheckBox.isSelected());
});
useAuthenticationCheckBox.addChangeListener(event -> {
usernameTextField.setEnabled(useProxyCheckBox.isSelected() && useAuthenticationCheckBox.isSelected());
passwordTextField.setEnabled(useProxyCheckBox.isSelected() && useAuthenticationCheckBox.isSelected());
passwordWarningLabel.setEnabled(useProxyCheckBox.isSelected() && useAuthenticationCheckBox.isSelected());
});
FormLayout layout = new FormLayout("8dlu, left:pref, 4dlu, left:pref, 4dlu, fill:150dlu",
"p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, p");
FormBuilder builder = FormBuilder.create().layout(layout);
builder.addSeparator(Localization.lang("Network")).xyw(1, 1, 6);
builder.add(useProxyCheckBox).xyw(2, 3, 5);
builder.add(Localization.lang("Hostname") + ':').xy(2, 5);
builder.add(hostnameTextField).xyw(4, 5, 3);
builder.add(Localization.lang("Port") + ':').xy(2, 7);
builder.add(portTextField).xyw(4, 7, 3);
builder.add(useAuthenticationCheckBox).xyw(4, 9, 3);
builder.add(Localization.lang("Username") + ':').xy(4, 11);
builder.add(usernameTextField).xy(6, 11);
builder.add(Localization.lang("Password") + ':').xy(4, 13);
builder.add(passwordTextField).xy(6, 13);
builder.add(passwordWarningLabel).xy(6, 14);
JPanel pan = builder.getPanel();
pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
add(pan, BorderLayout.CENTER);
}
@Override
public void setValues() {
ProxyPreferences proxyPreferences = preferences.getProxyPreferences();
useProxyCheckBox.setSelected(proxyPreferences.isUseProxy());
hostnameTextField.setText(proxyPreferences.getHostname());
portTextField.setText(proxyPreferences.getPort());
useAuthenticationCheckBox.setSelected(proxyPreferences.isUseAuthentication());
usernameTextField.setText(proxyPreferences.getUsername());
passwordTextField.setText(proxyPreferences.getPassword());
oldProxyPreferences = proxyPreferences;
}
@Override
public void storeSettings() {
Boolean useProxy = useProxyCheckBox.isSelected();
String hostname = hostnameTextField.getText().trim();
String port = portTextField.getText().trim();
Boolean useAuthentication = useAuthenticationCheckBox.isSelected();
String username = usernameTextField.getText().trim();
String password = new String(passwordTextField.getPassword());
ProxyPreferences proxyPreferences = new ProxyPreferences(useProxy, hostname, port, useAuthentication, username,
password);
if (!proxyPreferences.equals(oldProxyPreferences)) {
ProxyRegisterer.register(proxyPreferences);
}
preferences.storeProxyPreferences(proxyPreferences);
}
@Override
public boolean validateSettings() {
boolean validSetting;
boolean validAuthenticationSetting = false;
if (useProxyCheckBox.isSelected()) {
String host = hostnameTextField.getText();
String port = portTextField.getText();
if ((host == null) || host.trim().isEmpty() || (port == null) || port.trim().isEmpty()) {
validSetting = false;
} else {
Integer p;
try {
p = Integer.parseInt(port);
validSetting = p > 0;
} catch (NumberFormatException e) {
validSetting = false;
}
}
if (useAuthenticationCheckBox.isSelected()) {
String userName = usernameTextField.getText();
char[] password = passwordTextField.getPassword();
// no empty proxy passwords currently supported (they make no sense in this case anyway)
if ((userName == null) || userName.trim().isEmpty() || (password == null) || (password.length == 0)) {
validAuthenticationSetting = false;
validSetting = false;
} else {
validAuthenticationSetting = true;
}
}
} else {
validSetting = true;
}
if (!validSetting) {
if (validAuthenticationSetting) {
JOptionPane.showMessageDialog(null, Localization.lang("Please specify both hostname and port"),
Localization.lang("Invalid setting"), JOptionPane.ERROR_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, Localization.lang("Please specify both username and password"),
Localization.lang("Invalid setting"), JOptionPane.ERROR_MESSAGE);
}
}
return validSetting;
}
@Override
public String getTabName() {
return Localization.lang("Network");
}
}