blob: 91dc773c4bfd5da0848d2eb1530e840aaf068132 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource
*******************************************************************************/
package org.eclipse.equinox.internal.p2.installer.ui;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.net.proxy.IProxyData;
import org.eclipse.core.net.proxy.IProxyService;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.installer.InstallerActivator;
import org.eclipse.equinox.internal.p2.installer.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
public final class ProxiesDialog {
private IProxyData data;
private Label typeLabel;
private Combo typeCombo;
private Label hostLabel;
private Text hostText;
private Label portLabel;
private Text portText;
private Label userIdLabel;
private Text userIdText;
private Label passwordLabel;
private Text passwordText;
private Button okButton;
private Button cancelButton;
private final IProxyService service;
private Shell shell;
private List<String> types;
private Label statuslabel;
public ProxiesDialog(IProxyService service) {
if (service == null) {
throw new IllegalArgumentException();
}
this.service = service;
initTypes();
}
public IProxyData getValue() {
return data;
}
public void open() {
this.data = service.getProxyData(IProxyData.HTTP_PROXY_TYPE);
if (data == null) {
openMessage(Messages.ProxiesDialog_FailedToReadProxySettingsMessage, SWT.ICON_ERROR | SWT.OK);
return;
}
Shell activeShell = Display.getDefault().getActiveShell();
shell = new Shell(activeShell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.MIN | SWT.RESIZE);
//Computes the bounds
Rectangle bounds = null;
if (activeShell == null) {
bounds = new Rectangle(300, 200, 600, 400);
} else {
Rectangle parentBounds = activeShell.getBounds();
bounds = new Rectangle(parentBounds.x + 100, parentBounds.y + 100, 600, 400);
}
shell.setBounds(bounds);
shell.setText(Messages.ProxiesDialog_DialogTitle);
shell.setLayout(new GridLayout());
createDialogArea(shell);
createButtonBar(shell);
shell.pack();
shell.open();
}
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(4, false));
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
typeLabel = new Label(composite, SWT.NONE);
typeLabel.setText(Messages.ProxiesDialog_ShemaLabel);
typeLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
typeCombo = new Combo(composite, SWT.BORDER);
typeCombo.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 3, 1));
//Currently only these three proxy types are supported.
for (int i = 0; i < types.size(); i++) {
typeCombo.add(types.get(i));
}
typeCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String selection = typeCombo.getText();
IProxyData selectedProxy = service.getProxyData(selection);
if (selectedProxy == null) {
updateStatus(new Status(IStatus.ERROR, InstallerActivator.PI_INSTALLER, IStatus.OK, Messages.ProxiesDialog_UnknownProxyTypeMessage, null));
} else {
data = selectedProxy;
applyData();
}
}
});
hostLabel = new Label(composite, SWT.NONE);
hostLabel.setText(Messages.ProxiesDialog_HostLabel);
hostLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
hostText = new Text(composite, SWT.BORDER);
GridData gdata = new GridData(SWT.FILL, SWT.TOP, true, false);
gdata.widthHint = 250;
hostText.setLayoutData(gdata);
portLabel = new Label(composite, SWT.NONE);
portLabel.setText(Messages.ProxiesDialog_PortLabel);
portText = new Text(composite, SWT.BORDER);
gdata = new GridData();
gdata.widthHint = 30;
portText.setLayoutData(gdata);
userIdLabel = new Label(composite, SWT.NONE);
userIdLabel.setText(Messages.ProxiesDialog_UserLabel);
userIdLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
userIdText = new Text(composite, SWT.BORDER);
userIdText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1));
passwordLabel = new Label(composite, SWT.NONE);
passwordLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, true, 1, 1));
passwordLabel.setText(Messages.ProxiesDialog_PasswordLabel);
passwordText = new Text(composite, SWT.BORDER);
passwordText.setEchoChar('*');
passwordText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true, 3, 1));
ModifyListener validationListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateStatus();
}
};
typeCombo.addModifyListener(validationListener);
hostText.addModifyListener(validationListener);
portText.addModifyListener(validationListener);
userIdText.addModifyListener(validationListener);
passwordText.addModifyListener(validationListener);
//Initialize the UI with the selected data
applyData();
hostText.setFocus();
updateStatus();
return composite;
}
private void createButtonBar(Composite parent) {
Composite buttonBar = new Composite(parent, SWT.NONE);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalAlignment = SWT.RIGHT;
buttonBar.setLayoutData(gridData);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
layout.makeColumnsEqualWidth = false;
layout.marginHeight = 0;
layout.marginWidth = 0;
buttonBar.setLayout(layout);
statuslabel = new Label(buttonBar, SWT.NONE);
gridData = new GridData(300, SWT.DEFAULT);
statuslabel.setLayoutData(gridData);
okButton = new Button(buttonBar, SWT.PUSH);
gridData = new GridData(100, SWT.DEFAULT);
okButton.setLayoutData(gridData);
okButton.setText(Messages.ProxiesDialog_OkLabel);
okButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
okPressed();
shell.dispose();
}
});
cancelButton = new Button(buttonBar, SWT.PUSH);
cancelButton.setLayoutData(gridData);
cancelButton.setText(Messages.Dialog_CancelButton);
cancelButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
shell.dispose();
}
});
}
public void create() {
validateHostName();
}
private String toString(String str) {
return str == null ? "" : str; //$NON-NLS-1$
}
private void applyData() {
typeCombo.setText(toString(data.getType()));
hostText.setText(toString(data.getHost()));
if (data.getPort() != -1) {
portText.setText(toString(Integer.toString(data.getPort())));
} else {
portText.setText(""); //$NON-NLS-1$
}
userIdText.setText(toString(data.getUserId()));
passwordText.setText(toString(data.getPassword()));
}
private boolean validateHostName() {
try {
new URI(hostText.getText());
} catch (URISyntaxException e) {
updateStatus(new Status(IStatus.ERROR, InstallerActivator.PI_INSTALLER, IStatus.OK, Messages.ProxiesDialog_InvalitHostMessage, null));
return false;
}
return true;
}
protected void okPressed() {
data.setHost(hostText.getText());
data.setPort(Integer.parseInt(portText.getText()));
data.setUserid(userIdText.getText());
data.setPassword(passwordText.getText());
try {
if (service != null) {
service.setProxyData(new IProxyData[] {data});
} else {
openMessage(Messages.ProxiesDialog_ServiceNotAvailableMessage, SWT.ICON_ERROR | SWT.OK);
}
} catch (Exception e) {
openMessage(Messages.ProxiesDialog_FailedToSetProxyMessage + e.getLocalizedMessage(), SWT.ICON_ERROR | SWT.OK);
}
}
protected void updateStatus() {
if (!validateHostName()) {
return;
}
if (hostText.getText().length() == 0) {
updateStatus(new Status(IStatus.ERROR, InstallerActivator.PI_INSTALLER, IStatus.OK, Messages.ProxiesDialog_EmptyHostMessage, null));
return;
}
if (userIdText.getText().length() == 0) {
updateStatus(new Status(IStatus.ERROR, InstallerActivator.PI_INSTALLER, IStatus.OK, Messages.ProxiesDialog_EmptyUserMessage, null));
return;
}
if (passwordText.getText().length() == 0) {
updateStatus(new Status(IStatus.ERROR, InstallerActivator.PI_INSTALLER, IStatus.OK, Messages.ProxiesDialog_EmptyPasswordMessage, null));
return;
}
try {
//Port checks
String portAsString = portText.getText();
if (portAsString == null || portAsString.length() == 0) {
updateStatus(new Status(IStatus.ERROR, InstallerActivator.PI_INSTALLER, IStatus.OK, Messages.ProxiesDialog_EmptyProtMessage, null));
return;
}
int port = Integer.parseInt(portAsString);
if (port < 0) {
updateStatus(new Status(IStatus.ERROR, InstallerActivator.PI_INSTALLER, IStatus.OK, Messages.ProxiesDialog_NegativValue, null));
return;
}
} catch (NumberFormatException e) {
updateStatus(new Status(IStatus.ERROR, InstallerActivator.PI_INSTALLER, IStatus.OK, Messages.ProxiesDialog_WrongFormat, null));
return;
}
updateStatus(Status.OK_STATUS);
}
private void updateStatus(IStatus status) {
if (okButton != null) {
okButton.setEnabled(status.isOK());
}
if (statuslabel != null) {
String statusText = status.isOK() ? "" : Messages.ProxiesDialog_StatusPrefix + status.getMessage(); //$NON-NLS-1$
statuslabel.setText(statusText);
}
}
private void openMessage(String msg, int style) {
MessageBox messageBox = new MessageBox(Display.getDefault().getActiveShell(), style);
messageBox.setMessage(msg);
messageBox.open();
}
private void initTypes() {
types = new ArrayList<String>();
types.add(IProxyData.HTTP_PROXY_TYPE);
types.add(IProxyData.HTTPS_PROXY_TYPE);
types.add(IProxyData.SOCKS_PROXY_TYPE);
}
}