blob: 1de67d7bee485f78923f39145281a951126f34b8 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2003, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
 *
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.wst.internet.monitor.ui.internal;
import java.net.InetAddress;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.wst.internet.monitor.core.IMonitorWorkingCopy;
import org.eclipse.wst.internet.monitor.core.IProtocolAdapter;
import org.eclipse.wst.internet.monitor.core.MonitorCore;
/**
*
*/
public class MonitorDialog extends Dialog {
protected IMonitorWorkingCopy monitor;
protected boolean isEdit;
private Button okButton;
private Text monitorPort;
private Text remoteHostname;
private Text remotePort;
interface StringModifyListener {
public void valueChanged(String s);
}
interface BooleanModifyListener {
public void valueChanged(boolean b);
}
interface TypeModifyListener {
public void valueChanged(IProtocolAdapter type);
}
/**
* @param parentShell
*/
public MonitorDialog(Shell parentShell, IMonitorWorkingCopy monitor) {
super(parentShell);
this.monitor = monitor;
isEdit = true;
}
public MonitorDialog(Shell parentShell) {
super(parentShell);
monitor = MonitorCore.createMonitor();
isEdit = false;
}
protected void configureShell(Shell shell) {
super.configureShell(shell);
if (isEdit)
shell.setText(MonitorUIPlugin.getResource("%editMonitor"));
else
shell.setText(MonitorUIPlugin.getResource("%newMonitor"));
}
protected Label createLabel(Composite comp, String txt) {
Label label = new Label(comp, SWT.NONE);
label.setText(txt);
label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
return label;
}
protected Text createText(Composite comp, String txt, final StringModifyListener listener) {
final Text text = new Text(comp, SWT.BORDER);
if (txt != null)
text.setText(txt);
GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
data.widthHint = 150;
text.setLayoutData(data);
if (listener != null)
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
listener.valueChanged(text.getText());
}
});
return text;
}
protected Combo createTypeCombo(Composite comp, final IProtocolAdapter[] types, IProtocolAdapter sel, final TypeModifyListener listener) {
final Combo combo = new Combo(comp, SWT.DROP_DOWN | SWT.READ_ONLY);
int size = types.length;
String[] items = new String[size];
int index = -1;
for (int i = 0; i < size; i++) {
items[i] = types[i].getName();
if (types[i].equals(sel))
index = i;
}
combo.setItems(items);
if (index >= 0)
combo.select(index);
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
data.widthHint = 150;
combo.setLayoutData(data);
if (listener != null)
combo.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
listener.valueChanged(types[combo.getSelectionIndex()]);
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
return combo;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
((GridLayout)composite.getLayout()).numColumns = 2;
WorkbenchHelp.setHelp(composite, ContextIds.PREF_DIALOG);
createLabel(composite, MonitorUIPlugin.getResource("%localPort"));
monitorPort = createText(composite, monitor.getLocalPort() + "", new StringModifyListener() {
public void valueChanged(String s) {
try {
monitor.setLocalPort(Integer.parseInt(s));
} catch (Exception e) {
// ignore
}
validateFields();
}
});
Group group = new Group(composite, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
group.setLayout(layout);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 2;
group.setLayoutData(data);
group.setText(MonitorUIPlugin.getResource("%remoteGroup"));
createLabel(group, MonitorUIPlugin.getResource("%remoteHost"));
remoteHostname = createText(group, monitor.getRemoteHost(), new StringModifyListener() {
public void valueChanged(String s) {
monitor.setRemoteHost(s);
validateFields();
}
});
createLabel(group, MonitorUIPlugin.getResource("%remotePort"));
remotePort = createText(group, monitor.getRemotePort() + "", new StringModifyListener() {
public void valueChanged(String s) {
try {
monitor.setRemotePort(Integer.parseInt(s));
} catch (Exception e) {
// ignore
}
validateFields();
}
});
createLabel(group, MonitorUIPlugin.getResource("%parseType"));
createTypeCombo(group, MonitorCore.getProtocolAdapters(), monitor.getProtocolAdapter(), new TypeModifyListener() {
public void valueChanged(IProtocolAdapter type) {
monitor.setProtocolAdapter(type);
}
});
return composite;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
monitor.save();
super.okPressed();
}
protected Control createButtonBar(Composite parent) {
Control buttonControl = super.createButtonBar(parent);
validateFields();
return buttonControl;
}
private void setOKButtonEnabled(boolean curIsEnabled) {
if (okButton == null)
okButton = getButton(IDialogConstants.OK_ID);
if (okButton != null)
okButton.setEnabled(curIsEnabled);
}
protected void validateFields() {
if (monitorPort == null)
return;
boolean result = true;
String currHostname = remoteHostname.getText();
if (!isValidHostname(currHostname))
result = false;
String currHostnamePort = remotePort.getText();
try {
Integer.parseInt(currHostnamePort);
} catch (Exception any) {
result = false;
}
String currMonitorPort = monitorPort.getText();
try {
Integer.parseInt(currMonitorPort);
} catch (Exception any) {
result = false;
}
if (result && isLocalhost(currHostname)) {
if (currHostnamePort.equals(currMonitorPort))
result = false;
}
setOKButtonEnabled(result);
}
protected static boolean isValidHostname(String host) {
if (host == null || host.trim().length() < 1)
return false;
int length = host.length();
for (int i = 0; i < length; i++) {
char c = host.charAt(i);
if (!Character.isLetterOrDigit(c) && c != ':' && c != '.')
return false;
}
if (host.endsWith(":"))
return false;
return true;
}
protected static boolean isLocalhost(String host) {
if (host == null)
return false;
try {
if ("localhost".equals(host) || "127.0.0.1".equals(host))
return true;
InetAddress localHostaddr = InetAddress.getLocalHost();
if (localHostaddr.getHostName().equals(host))
return true;
} catch (Exception e) {
Trace.trace(Trace.WARNING, "Error checking for localhost", e);
}
return false;
}
}