package org.limewire.ui.swing.advanced.connection;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import net.miginfocom.swing.MigLayout;
import org.limewire.core.api.connection.GnutellaConnectionManager;
import org.limewire.io.NetworkUtils;
import org.limewire.ui.swing.components.DropDownListAutoCompleteControl;
import org.limewire.ui.swing.components.NumericTextField;
import org.limewire.ui.swing.components.TextFieldClipboardControl;
import org.limewire.ui.swing.util.I18n;
import com.google.inject.Inject;
/**
* Display panel for the Add Connection function.
*/
public class AddConnectionPanel extends JPanel {
/** Manager instance for connection data. */
private GnutellaConnectionManager gnutellaConnectionManager;
/** Action to add a connection. */
private Action addAction = new AddAction();
private JLabel titleLabel = new JLabel();
private JLabel hostLabel = new JLabel();
private JLabel portLabel = new JLabel();
private JTextField hostTextField = new JTextField(20);
private NumericTextField portTextField = new NumericTextField(4, 1, 0xFFFF);
private JCheckBox tlsCheckBox = new JCheckBox();
private JButton addButton = new JButton();
/**
* Constructs the AddConnectionPanel to display the Add Connection control.
*/
@Inject
public AddConnectionPanel(GnutellaConnectionManager gnutellaConnectionManager) {
this.gnutellaConnectionManager = gnutellaConnectionManager;
setBorder(BorderFactory.createTitledBorder(""));
setLayout(new MigLayout("insets 0 0 0 0",
"[left][left]", // col constraints
"[top]12[top]6[top][top][bottom]")); // row constraints
setOpaque(false);
titleLabel.setText(I18n.tr("Add a Connection"));
hostLabel.setText(I18n.tr("Host"));
hostTextField.setMinimumSize(new Dimension(105, 21));
hostTextField.setPreferredSize(new Dimension(105, 21));
hostTextField.addActionListener(addAction);
hostTextField.getDocument().addDocumentListener(new HostNameListener());
portLabel.setText(I18n.tr("Port"));
portTextField.setMinimumSize(new Dimension(60, 21));
portTextField.setPreferredSize(new Dimension(60, 21));
portTextField.setValue(6346);
portTextField.addActionListener(addAction);
// Install auto-complete list on host field.
DropDownListAutoCompleteControl.install(hostTextField);
// Install clipboard actions on text fields.
TextFieldClipboardControl.install(hostTextField);
TextFieldClipboardControl.install(portTextField);
tlsCheckBox.setText(I18n.tr("Use TLS"));
tlsCheckBox.setOpaque(false);
addButton.setText(I18n.tr("Add"));
addButton.setEnabled(false);
addButton.addActionListener(addAction);
add(titleLabel , "cell 0 0 2 1");
add(hostLabel , "cell 0 1,gaptop 3");
add(hostTextField, "cell 1 1");
add(portLabel , "cell 0 2,gaptop 3");
add(portTextField, "cell 1 2");
add(tlsCheckBox , "cell 0 3 2 1");
add(addButton , "cell 1 4,right");
}
/**
* Resets the input fields.
*/
public void resetInput() {
hostTextField.setText(null);
portTextField.setText(null);
tlsCheckBox.setSelected(false);
}
/**
* Action to add a connection.
*/
private class AddAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
String hostnamestr = hostTextField.getText();
// Look for the port in the host.
int idx = hostnamestr.lastIndexOf(':');
// If it exists, rewrite the host & port.
if (idx != -1) {
portTextField.setText(hostnamestr.substring(idx + 1));
hostTextField.setText(hostnamestr.substring(0, idx));
hostnamestr = hostTextField.getText();
}
// Convert port number to int.
int portnum = portTextField.getValue(6346);
// Verify port number is valid.
if (!NetworkUtils.isValidPort(portnum)) {
portnum = 6346;
}
// Update port number.
portTextField.setValue(portnum);
if (hostnamestr.trim().length() > 0) {
// Establish connection to host and port.
gnutellaConnectionManager.tryConnection(hostnamestr, portnum,
tlsCheckBox.isSelected());
// Reset input fields.
resetInput();
} else {
hostTextField.requestFocusInWindow();
}
}
}
/**
* Document listener for host name changes.
*/
private class HostNameListener implements DocumentListener {
@Override
public void changedUpdate(DocumentEvent e) {
addButton.setEnabled(e.getDocument().getLength() > 0);
}
@Override
public void insertUpdate(DocumentEvent e) {
addButton.setEnabled(e.getDocument().getLength() > 0);
}
@Override
public void removeUpdate(DocumentEvent e) {
addButton.setEnabled(e.getDocument().getLength() > 0);
}
}
}