/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package com.bc.ceres.swing.update;
import com.bc.ceres.core.runtime.ProxyConfig;
import com.bc.ceres.swing.SwingHelper;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.BorderLayout;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ConnectionConfigPane extends JPanel {
private ConnectionConfigData connectionConfigData;
private JTextField repositoryUrl;
private JCheckBox proxyUsed;
private JTextField proxyPort;
private JTextField proxyHost;
private JCheckBox proxyAuthUsed;
private JTextField username;
private JPasswordField password;
private boolean confirmed;
private ValidtationHandler validationHandler;
public ConnectionConfigPane(ConnectionConfigData connectionConfigData) {
initUI();
setConfigData(connectionConfigData);
}
public ValidtationHandler getValidationHandler() {
return validationHandler;
}
public void setValidationHandler(ValidtationHandler validationHandler) {
this.validationHandler = validationHandler;
}
public ConnectionConfigData getConfigData() {
return connectionConfigData;
}
public void setConfigData(ConnectionConfigData connectionConfigData) {
this.connectionConfigData = connectionConfigData;
transferConfigDataToUi();
}
public boolean isConfirmed() {
return confirmed;
}
public void setConfirmed(boolean confirmed) {
this.confirmed = confirmed;
}
public boolean validateUiState() {
if (proxyUsed.isSelected()) {
String ph = proxyHost.getText().trim();
if (ph.length() == 0) {
onValidationError("Invalid proxy host.");
proxyHost.requestFocusInWindow();
return false;
}
String pp = proxyPort.getText().trim();
if (pp.length() == 0) {
onValidationError("Invalid proxy port.");
proxyPort.requestFocusInWindow();
return false;
}
try {
int port = Integer.parseInt(pp);
if (port <= 0) {
onValidationError("Invalid proxy port.");
proxyPort.requestFocusInWindow();
return false;
}
} catch (NumberFormatException e) {
onValidationError("Invalid proxy port.");
proxyPort.requestFocusInWindow();
return false;
}
if (proxyAuthUsed.isSelected()) {
String u = username.getText().trim();
if (u.length() == 0) {
onValidationError("Invalid username.");
username.requestFocusInWindow();
return false;
}
}
}
return true;
}
public void updateUiState() {
boolean pu = proxyUsed.isSelected();
boolean pau = pu && proxyAuthUsed.isSelected();
repositoryUrl.setEnabled(true);
proxyUsed.setEnabled(true);
proxyHost.setEnabled(pu);
proxyPort.setEnabled(pu);
proxyAuthUsed.setEnabled(pu);
username.setEnabled(pau);
password.setEnabled(pau);
}
public void transferConfigDataToUi() {
transferConfigDataToUi(connectionConfigData);
}
public void transferConfigDataToUi(ConnectionConfigData connectionConfigData) {
ProxyConfig proxyConfig = connectionConfigData.getProxyConfig();
repositoryUrl.setText(connectionConfigData.getRepositoryUrl());
proxyUsed.setSelected(connectionConfigData.isProxyUsed());
proxyPort.setText(String.valueOf(proxyConfig.getPort()));
proxyHost.setText(proxyConfig.getHost());
proxyAuthUsed.setSelected(proxyConfig.isAuthorizationUsed());
username.setText(proxyConfig.getUsername());
password.setText(
new String(proxyConfig.getPassword() != null ? proxyConfig.getPassword() : new char[0]));
updateUiState();
}
public void transferUiToConfigData() {
transferUiToConfigData(connectionConfigData);
}
public void transferUiToConfigData(ConnectionConfigData connectionConfigData) {
ProxyConfig proxyConfig = connectionConfigData.getProxyConfig();
connectionConfigData.setProxyUsed(proxyUsed.isSelected());
proxyConfig.setHost(proxyHost.getText());
proxyConfig.setPort(Integer.parseInt(proxyPort.getText()));
proxyConfig.setAuthorizationUsed(proxyAuthUsed.isSelected());
proxyConfig.setUsername(username.getText());
proxyConfig.setPassword(password.getPassword());
}
public boolean showDialog(Window parent, String title, ActionListener helpHandler) {
JDialog dialog = createDialog(parent, title, helpHandler);
dialog.pack();
SwingHelper.centerComponent(dialog, parent);
dialog.setVisible(true);
dialog.dispose();
return confirmed;
}
public JDialog createDialog(Window parent, String title, ActionListener helpHandler) {
final JDialog dialog = new JDialog(parent, title, Dialog.ModalityType.APPLICATION_MODAL);
JPanel buttonPane = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JButton okButton = new JButton("OK");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (validateUiState()) {
transferUiToConfigData();
dialog.setVisible(false);
setConfirmed(true);
}
}
});
buttonPane.add(okButton);
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
}
});
buttonPane.add(cancelButton);
if (helpHandler != null) {
JButton helpButton = new JButton("Help");
helpButton.addActionListener(helpHandler);
buttonPane.add(helpButton);
}
JPanel contentPane = new JPanel(new BorderLayout(4, 4));
contentPane.add(this, BorderLayout.CENTER);
contentPane.add(buttonPane, BorderLayout.SOUTH);
contentPane.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
okButton.setDefaultCapable(true);
dialog.getRootPane().setDefaultButton(okButton);
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dialog.setVisible(false);
}
});
dialog.setContentPane(contentPane);
setConfirmed(false);
return dialog;
}
private void initUI() {
ChangeListener updateStateChangeHandler = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
updateUiState();
}
};
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets.right = 2;
// Repository
c.insets.top = 0;
c.insets.bottom = 2;
c.gridy = 0;
c.gridx = 0;
c.gridwidth = 2;
panel.add(new JLabel("Module repository URL:"), c);
c.gridy = 1;
c.gridx = 0;
c.gridwidth = 2;
repositoryUrl = new JTextField(50);
repositoryUrl.setEditable(false);
panel.add(repositoryUrl, c);
// Proxy
c.insets.top = 10;
c.gridy = 2;
c.gridx = 0;
c.gridwidth = 2;
proxyUsed = new JCheckBox("Use HTTP proxy");
proxyUsed.setAlignmentX(LEFT_ALIGNMENT);
proxyUsed.addChangeListener(updateStateChangeHandler);
panel.add(proxyUsed, c);
c.insets.top = 0;
c.insets.bottom = 2;
c.gridy = 3;
c.gridx = 0;
c.gridwidth = 1;
c.insets.left = 12;
panel.add(new JLabel("Proxy host:"), c);
c.gridx = 1;
c.gridwidth = 1;
c.insets.left = 0;
proxyHost = new JTextField(50);
panel.add(proxyHost, c);
c.gridy = 4;
c.gridx = 0;
c.gridwidth = 1;
c.insets.left = 12;
panel.add(new JLabel("Proxy port:"), c);
c.gridx = 1;
c.gridwidth = 1;
c.insets.left = 0;
proxyPort = new JTextField(6);
panel.add(proxyPort, c);
c.gridy = 5;
c.gridx = 0;
c.gridwidth = 2;
c.insets.left = 12;
proxyAuthUsed = new JCheckBox("Use HTTP proxy authentication");
proxyAuthUsed.addChangeListener(updateStateChangeHandler);
panel.add(proxyAuthUsed, c);
c.gridy = 6;
c.gridx = 0;
c.gridwidth = 1;
c.insets.left = 24;
panel.add(new JLabel("User name:"), c);
c.gridx = 1;
c.gridwidth = 1;
c.insets.left = 0;
username = new JTextField(12);
panel.add(username, c);
c.gridy = 7;
c.gridx = 0;
c.gridwidth = 1;
c.insets.left = 24;
panel.add(new JLabel("Password:"), c);
c.gridx = 1;
c.gridwidth = 1;
c.insets.left = 0;
password = new JPasswordField(12);
panel.add(password, c);
setLayout(new BorderLayout(2, 2));
add(panel, BorderLayout.CENTER);
}
private void onValidationError(String message) {
if (validationHandler != null) {
validationHandler.onError(message);
} else {
JOptionPane.showMessageDialog(this, message, "Update Configuration", JOptionPane.ERROR_MESSAGE);
}
}
public interface ValidtationHandler {
void onError(String message);
}
}