/*******************************************************************************
* Copyright (c) 2009 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:
* IBM Corporation - initial API and implementation
* Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.debug.core.xdebug.dbgp;
import java.net.URL;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.php.internal.debug.core.Logger;
import org.eclipse.php.internal.debug.core.PHPDebugCoreMessages;
import org.eclipse.php.internal.debug.core.PHPDebugPlugin;
import org.eclipse.php.internal.debug.core.launching.PHPLaunchUtilities;
import org.eclipse.php.internal.debug.core.preferences.AbstractDebuggerConfigurationDialog;
import org.eclipse.php.internal.debug.core.xdebug.XDebugPreferenceMgr;
import org.eclipse.php.internal.debug.core.xdebug.communication.XDebugCommunicationDaemon;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.osgi.framework.Bundle;
import org.osgi.service.prefs.BackingStoreException;
/**
* An XDebug configuration dialog for editing/viewing the XDebug debugger
* configurations.
*
* @author Shalom Gibly, Dave Kelsey
*/
public class XDebugConfigurationDialog extends AbstractDebuggerConfigurationDialog {
// general options
private Text portTextBox;
private Button showGlobals;
private Spinner variableDepth;
private Spinner maxChildren;
private Spinner maxData;
private Button useMultiSession;
private Combo acceptRemoteSession;
// output capture options
private Combo captureStdout;
private Combo captureStderr;
// proxy options
private Button useProxy;
private Text idekeyTextBox;
private Text proxyTextBox;
private Image titleImage;
private XDebugDebuggerConfiguration xdebugDebuggerConfiguration;
/**
* Constructs a new XDebug configuration dialog.
*
* @param xdebugDebuggerConfiguration
*
* @param parentShell
*/
public XDebugConfigurationDialog(XDebugDebuggerConfiguration xdebugDebuggerConfiguration, Shell parentShell) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
this.xdebugDebuggerConfiguration = xdebugDebuggerConfiguration;
}
private void toggleProxyFields(boolean selection) {
idekeyTextBox.setEnabled(selection);
proxyTextBox.setEnabled(selection);
}
private Image getDialogImage() {
// TODO - whole dialog should be in debug UI plug-in
ImageDescriptor desc = ImageDescriptor.getMissingImageDescriptor();
Bundle bundle = Platform.getBundle("org.eclipse.php.debug.ui"); //$NON-NLS-1$
URL url = null;
if (bundle != null) {
url = FileLocator.find(bundle, new Path("$nl$/icon/full/wizban/xdebug_conf_wiz.png"), null); //$NON-NLS-1$
desc = ImageDescriptor.createFromURL(url);
return desc.createImage();
}
return null;
}
protected Control createDialogArea(Composite parent) {
parent = (Composite) super.createDialogArea(parent);
GridData ptGridData = (GridData) parent.getLayoutData();
ptGridData.widthHint = convertWidthInCharsToPixels(120);
// Set dialog title. image, etc.
getShell().setText(PHPDebugCoreMessages.XDebugConfigurationDialog_Dialog_title);
setTitle(PHPDebugCoreMessages.XDebugConfigurationDialog_mainTitle);
setMessage(PHPDebugCoreMessages.XDebugConfigurationDialog_Dialog_description);
titleImage = getDialogImage();
if (titleImage != null)
setTitleImage(titleImage);
getShell().addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (titleImage != null)
titleImage.dispose();
}
});
// Create main groups
Composite[] subsections = createSubsections(parent,
PHPDebugCoreMessages.XDebugConfigurationDialog_Connection_settings_group,
PHPDebugCoreMessages.XDebugConfigurationDialog_General_settings_group);
// Connection settings
Composite connectionSettingsGroup = subsections[0];
addLabelControl(connectionSettingsGroup, PHPDebugCoreMessages.DebuggerConfigurationDialog_debugPort,
XDebugPreferenceMgr.XDEBUG_PREF_PORT);
portTextBox = addNumTextField(connectionSettingsGroup, XDebugPreferenceMgr.XDEBUG_PREF_PORT, 5, 2, false);
Group proxyGroup = new Group(connectionSettingsGroup, SWT.SHADOW_NONE);
proxyGroup.setText(PHPDebugCoreMessages.XDebugConfigurationDialog_proxyGroup);
GridData pgGridata = new GridData(SWT.FILL, SWT.FILL, true, true);
pgGridata.horizontalSpan = 2;
proxyGroup.setLayoutData(pgGridata);
GridLayout pgLayout = new GridLayout();
pgLayout.numColumns = 2;
proxyGroup.setLayout(pgLayout);
useProxy = addCheckBox(proxyGroup, PHPDebugCoreMessages.XDebugConfigurationDialog_useProxy,
XDebugPreferenceMgr.XDEBUG_PREF_USEPROXY, 0);
useProxy.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
toggleProxyFields(useProxy.getSelection());
}
public void widgetDefaultSelected(SelectionEvent e) {
toggleProxyFields(useProxy.getSelection());
}
});
addLabelControl(proxyGroup, PHPDebugCoreMessages.XDebugConfigurationDialog_idekey,
XDebugPreferenceMgr.XDEBUG_PREF_IDEKEY);
idekeyTextBox = addATextField(proxyGroup, XDebugPreferenceMgr.XDEBUG_PREF_IDEKEY, 100, 2);
addLabelControl(proxyGroup, PHPDebugCoreMessages.XDebugConfigurationDialog_proxy,
XDebugPreferenceMgr.XDEBUG_PREF_PROXY);
proxyTextBox = addATextField(proxyGroup, XDebugPreferenceMgr.XDEBUG_PREF_PROXY, 100, 2);
createNoteComposite(connectionSettingsGroup.getFont(), connectionSettingsGroup,
PHPDebugCoreMessages.XDebugConfigurationDialog_Note_label,
PHPDebugCoreMessages.XDebugConfigurationDialog_Note_text, 3);
// General settings
Composite generalSettingsGroup = subsections[1];
acceptRemoteSession = addComboField(generalSettingsGroup,
PHPDebugCoreMessages.XDebugConfigurationDialog_remoteSession, XDebugPreferenceMgr.remoteSessionOptions);
useMultiSession = addCheckBox(generalSettingsGroup,
PHPDebugCoreMessages.XDebugConfigurationDialog_useMultisession,
XDebugPreferenceMgr.XDEBUG_PREF_MULTISESSION, 0);
showGlobals = addCheckBox(generalSettingsGroup, PHPDebugCoreMessages.XDebugConfigurationDialog_showSuperGlobals,
XDebugPreferenceMgr.XDEBUG_PREF_SHOWSUPERGLOBALS, 0);
addLabelControl(generalSettingsGroup, PHPDebugCoreMessages.XDebugConfigurationDialog_maxArrayDepth,
XDebugPreferenceMgr.XDEBUG_PREF_ARRAYDEPTH);
variableDepth = addVariableLevel(generalSettingsGroup, XDebugPreferenceMgr.XDEBUG_PREF_ARRAYDEPTH, 1, 150, 2);
addLabelControl(generalSettingsGroup, PHPDebugCoreMessages.XDebugConfigurationDialog_maxChildren,
XDebugPreferenceMgr.XDEBUG_PREF_CHILDREN);
maxChildren = addVariableLevel(generalSettingsGroup, XDebugPreferenceMgr.XDEBUG_PREF_CHILDREN, 1, 500, 2);
addLabelControl(generalSettingsGroup, PHPDebugCoreMessages.XDebugConfigurationDialog_MaxData,
XDebugPreferenceMgr.XDEBUG_PREF_DATA);
maxData = addVariableLevel(generalSettingsGroup, XDebugPreferenceMgr.XDEBUG_PREF_DATA, 1, Integer.MAX_VALUE, 2);
Group captureGroup = new Group(generalSettingsGroup, SWT.SHADOW_NONE);
captureGroup.setText(PHPDebugCoreMessages.XDebugConfigurationDialog_captureGroup);
GridData cGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
cGridData.horizontalSpan = 2;
captureGroup.setLayoutData(cGridData);
GridLayout cLayout = new GridLayout();
cLayout.numColumns = 3;
captureGroup.setLayout(cLayout);
captureStdout = addComboField(captureGroup, PHPDebugCoreMessages.XDebugConfigurationDialog_captureStdout,
XDebugPreferenceMgr.captureOutputOptions);
captureStderr = addComboField(captureGroup, PHPDebugCoreMessages.XDebugConfigurationDialog_captureStderr,
XDebugPreferenceMgr.captureOutputOptions);
// Initialize the dialog's values.
internalInitializeValues();
return parent;
}
private Text addNumTextField(Composite parent, String key, int textLimit, int horizontalIndent, boolean isTimeout) {
Text text = super.addTextField(parent, key, textLimit, horizontalIndent);
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
validate();
}
});
return text;
}
private Text addATextField(Composite parent, String key, int minWidth, int horizontalIndent) {
Text textBox = new Text(parent, SWT.BORDER | SWT.SINGLE);
textBox.setData(key);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalIndent = horizontalIndent;
data.grabExcessHorizontalSpace = true;
data.minimumWidth = minWidth;
textBox.setLayoutData(data);
return textBox;
}
private Combo addComboField(Composite parent, String text, String[] options) {
addLabelControl(parent, text, null);
Combo comboBox = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalIndent = 10;
data.horizontalSpan = 2;
data.grabExcessHorizontalSpace = true;
comboBox.setLayoutData(data);
comboBox.setItems(options);
return comboBox;
}
/**
* Creates a subsection group.
*
* @param parent
* @param label
* @return
*/
protected Composite[] createSubsections(Composite parent, String label, String label2) {
// A cosmetic composite that will add a basic indent
parent = new Composite(parent, SWT.NONE);
parent.setLayout(new GridLayout(1, true));
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
parent.setLayoutData(data);
// subsection 1
Group group = new Group(parent, SWT.SHADOW_NONE);
group.setText(label);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
group.setLayoutData(data);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
group.setLayout(layout);
// subsection 2
Group group2 = new Group(parent, SWT.SHADOW_NONE);
group2.setText(label2);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
group2.setLayoutData(data);
GridLayout layout2 = new GridLayout();
layout2.numColumns = 3;
group2.setLayout(layout2);
return new Group[] { group, group2 };
}
/**
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
// TODO: move to preference manager
IEclipsePreferences prefs = PHPDebugPlugin.getInstancePreferences();
// general
prefs.put(XDebugPreferenceMgr.XDEBUG_PREF_PORT, portTextBox.getText());
prefs.putBoolean(XDebugPreferenceMgr.XDEBUG_PREF_SHOWSUPERGLOBALS, showGlobals.getSelection());
prefs.putInt(XDebugPreferenceMgr.XDEBUG_PREF_ARRAYDEPTH, variableDepth.getSelection());
prefs.putInt(XDebugPreferenceMgr.XDEBUG_PREF_CHILDREN, maxChildren.getSelection());
prefs.putInt(XDebugPreferenceMgr.XDEBUG_PREF_DATA, maxData.getSelection());
prefs.putBoolean(XDebugPreferenceMgr.XDEBUG_PREF_MULTISESSION, useMultiSession.getSelection());
prefs.putInt(XDebugPreferenceMgr.XDEBUG_PREF_REMOTESESSION, acceptRemoteSession.getSelectionIndex());
// capture output
prefs.putInt(XDebugPreferenceMgr.XDEBUG_PREF_CAPTURESTDOUT, captureStdout.getSelectionIndex());
prefs.putInt(XDebugPreferenceMgr.XDEBUG_PREF_CAPTURESTDERR, captureStderr.getSelectionIndex());
// proxy
prefs.putBoolean(XDebugPreferenceMgr.XDEBUG_PREF_USEPROXY, useProxy.getSelection());
prefs.put(XDebugPreferenceMgr.XDEBUG_PREF_IDEKEY, idekeyTextBox.getText());
prefs.put(XDebugPreferenceMgr.XDEBUG_PREF_PROXY, proxyTextBox.getText());
try {
prefs.flush();
} catch (BackingStoreException e) {
Logger.logException(e);
}
super.okPressed();
}
// Initialize the dialog's values.
private void internalInitializeValues() {
IPreferencesService service = Platform.getPreferencesService();
portTextBox.setText(
Integer.toString(service.getInt(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_PORT, 9000, null)));
showGlobals.setSelection(
service.getBoolean(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_SHOWSUPERGLOBALS, false, null));
useMultiSession.setSelection(
service.getBoolean(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_MULTISESSION, false, null));
variableDepth
.setSelection(service.getInt(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_ARRAYDEPTH, 0, null));
maxChildren.setSelection(service.getInt(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_CHILDREN, 0, null));
maxData.setSelection(service.getInt(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_DATA, 0, null));
acceptRemoteSession
.select(service.getInt(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_REMOTESESSION, 0, null));
// capture output
captureStdout.select(service.getInt(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_CAPTURESTDOUT, 0, null));
captureStderr.select(service.getInt(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_CAPTURESTDERR, 0, null));
// proxy defaults
boolean useProxyState = service.getBoolean(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_USEPROXY, false,
null);
useProxy.setSelection(useProxyState);
String ideKey = service.getString(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_IDEKEY, "", null);
if (ideKey == null || ideKey.length() == 0) {
ideKey = ""; //$NON-NLS-1$
}
idekeyTextBox.setText(ideKey);
proxyTextBox.setText(service.getString(PHPDebugPlugin.ID, XDebugPreferenceMgr.XDEBUG_PREF_PROXY, "", null)); //$NON-NLS-1$
toggleProxyFields(useProxyState);
}
/**
* add a spinner control
*
* @param parent
* @param key
* @param min
* @param max
* @param horizontalIndent
* @return
*/
private Spinner addVariableLevel(Composite parent, String key, int min, int max, int horizontalIndent) {
Spinner spin = new Spinner(parent, SWT.VERTICAL);
spin.setData(key);
spin.setMinimum(min);
spin.setMaximum(max);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalIndent = horizontalIndent;
data.horizontalSpan = 2;
spin.setLayoutData(data);
spin.setIncrement(1);
spin.setPageIncrement(3);
return spin;
}
protected void validate() {
// Reset state
setMessage(PHPDebugCoreMessages.XDebugConfigurationDialog_Dialog_description);
String debugPort = portTextBox.getText();
Integer portNumber = null;
try {
portNumber = Integer.valueOf(debugPort);
int i = portNumber.intValue();
if (i < 1 || i > 65535) {
setMessage(PHPDebugCoreMessages.DebugConfigurationDialog_invalidPortRange, IMessageProvider.ERROR);
return;
}
} catch (NumberFormatException ex) {
setMessage(PHPDebugCoreMessages.DebugConfigurationDialog_invalidPort, IMessageProvider.ERROR);
return;
} catch (Exception e) {
setMessage(PHPDebugCoreMessages.DebugConfigurationDialog_invalidPort, IMessageProvider.ERROR);
return;
}
// Check warnings
if (!PHPLaunchUtilities.isPortAvailable(portNumber)
&& !PHPLaunchUtilities.isDebugDaemonActive(portNumber, XDebugCommunicationDaemon.XDEBUG_DEBUGGER_ID)) {
setMessage(NLS.bind(PHPDebugCoreMessages.DebugConfigurationDialog_PortInUse, debugPort),
IMessageProvider.WARNING);
}
}
}