/********************************************************************** * Copyright (c) 2003 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 net.sourceforge.phpdt.monitor.ui.internal; import java.net.InetAddress; import net.sourceforge.phpdt.monitor.core.IMonitorWorkingCopy; import net.sourceforge.phpdt.monitor.core.IProtocolAdapter; import net.sourceforge.phpdt.monitor.core.MonitorCore; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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; /** * */ 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) { } 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) { } 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; if (host.indexOf("/") >= 0) return false; if (host.indexOf("\\") >= 0) return false; if (host.indexOf(" ") >= 0) 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; } }