blob: 9a6ffe434bb5134f1d1b13985fee0e4ed7152a02 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2018 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* IBM Corporation
* Ericsson - Modified for DSF
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
import org.eclipse.cdt.debug.internal.ui.dialogfields.ComboDialogField;
import org.eclipse.cdt.debug.internal.ui.dialogfields.DialogField;
import org.eclipse.cdt.debug.internal.ui.dialogfields.IDialogFieldListener;
import org.eclipse.cdt.debug.internal.ui.dialogfields.LayoutUtil;
import org.eclipse.cdt.debug.internal.ui.dialogfields.SelectionButtonDialogField;
import org.eclipse.cdt.debug.internal.ui.dialogfields.StringDialogField;
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
import org.eclipse.cdt.dsf.gdb.launching.LaunchUtils;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
/**
* The dynamic debugger tab for remote launches using gdb server.
*/
public class GdbServerDebuggerPage extends GdbDebuggerPage {
private final static String CONNECTION_TCP = LaunchUIMessages.getString("GDBServerDebuggerPage.0"); //$NON-NLS-1$
private final static String CONNECTION_SERIAL = LaunchUIMessages.getString("GDBServerDebuggerPage.1"); //$NON-NLS-1$
private ComboDialogField fConnectionField;
protected SelectionButtonDialogField fRemoteTimeoutEnabledField;
protected StringDialogField fRemoteTimeoutValueField;
private String[] fConnections = new String[] { CONNECTION_TCP, CONNECTION_SERIAL };
private TCPSettingsBlock fTCPBlock;
private SerialPortSettingsBlock fSerialBlock;
private Composite fConnectionStack;
private boolean fIsInitializing = false;
public GdbServerDebuggerPage() {
super();
fConnectionField = createConnectionField();
fTCPBlock = new TCPSettingsBlock();
fSerialBlock = new SerialPortSettingsBlock();
fTCPBlock.addObserver(this);
fSerialBlock.addObserver(this);
createRemoteTimeoutFields();
}
protected void createConnectionTab(CTabFolder tabFolder) {
CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
tabItem.setText(LaunchUIMessages.getString("GDBServerDebuggerPage.10")); //$NON-NLS-1$
Composite comp1 = ControlFactory.createCompositeEx(tabFolder, 1, GridData.FILL_BOTH);
((GridLayout) comp1.getLayout()).makeColumnsEqualWidth = false;
comp1.setFont(tabFolder.getFont());
tabItem.setControl(comp1);
Composite comp = ControlFactory.createCompositeEx(comp1, 3, GridData.FILL_BOTH);
((GridLayout) comp.getLayout()).makeColumnsEqualWidth = false;
comp.setFont(comp1.getFont());
fConnectionField.doFillIntoGrid(comp, 3);
((GridData) fConnectionField.getComboControl(null).getLayoutData()).horizontalAlignment = GridData.BEGINNING;
fRemoteTimeoutEnabledField.doFillIntoGrid(comp, 1);
fRemoteTimeoutEnabledField.getSelectionButton(comp)
.setToolTipText(LaunchUIMessages.getString("GDBServerDebuggerPage.12")); //$NON-NLS-1$
fRemoteTimeoutValueField.doFillIntoGrid(comp, 2);
((GridData) fRemoteTimeoutValueField.getTextControl(null)
.getLayoutData()).horizontalAlignment = GridData.BEGINNING;
PixelConverter converter = new PixelConverter(comp);
LayoutUtil.setWidthHint(fRemoteTimeoutValueField.getTextControl(null),
converter.convertWidthInCharsToPixels(10));
fRemoteTimeoutValueField.getLabelControl(comp)
.setToolTipText(LaunchUIMessages.getString("GDBServerDebuggerPage.12")); //$NON-NLS-1$
fRemoteTimeoutValueField.getTextControl(comp)
.setToolTipText(LaunchUIMessages.getString("GDBServerDebuggerPage.12")); //$NON-NLS-1$
fConnectionStack = ControlFactory.createCompositeEx(comp, 1, GridData.FILL_BOTH);
StackLayout stackLayout = new StackLayout();
fConnectionStack.setLayout(stackLayout);
((GridData) fConnectionStack.getLayoutData()).horizontalSpan = 3;
fTCPBlock.createBlock(fConnectionStack);
fSerialBlock.createBlock(fConnectionStack);
}
private ComboDialogField createConnectionField() {
ComboDialogField field = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY);
field.setLabelText(LaunchUIMessages.getString("GDBServerDebuggerPage.9")); //$NON-NLS-1$
field.setItems(fConnections);
field.setDialogFieldListener(new IDialogFieldListener() {
@Override
public void dialogFieldChanged(DialogField f) {
if (!isInitializing())
connectionTypeChanged();
}
});
return field;
}
private void createRemoteTimeoutFields() {
fRemoteTimeoutEnabledField = new SelectionButtonDialogField(SWT.CHECK);
fRemoteTimeoutEnabledField.setLabelText(LaunchUIMessages.getString("GDBServerDebuggerPage.11")); //$NON-NLS-1$
fRemoteTimeoutEnabledField.setDialogFieldListener(new IDialogFieldListener() {
@Override
public void dialogFieldChanged(DialogField f) {
updateLaunchConfigurationDialog();
}
});
fRemoteTimeoutValueField = new StringDialogField();
fRemoteTimeoutValueField.setDialogFieldListener(new IDialogFieldListener() {
@Override
public void dialogFieldChanged(DialogField f) {
updateLaunchConfigurationDialog();
}
});
fRemoteTimeoutEnabledField.attachDialogField(fRemoteTimeoutValueField);
}
protected void connectionTypeChanged() {
connectionTypeChanged0();
updateLaunchConfigurationDialog();
}
private void connectionTypeChanged0() {
((StackLayout) fConnectionStack.getLayout()).topControl = null;
int index = fConnectionField.getSelectionIndex();
if (index >= 0 && index < fConnections.length) {
String[] connTypes = fConnectionField.getItems();
if (CONNECTION_TCP.equals(connTypes[index]))
((StackLayout) fConnectionStack.getLayout()).topControl = fTCPBlock.getControl();
else if (CONNECTION_SERIAL.equals(connTypes[index]))
((StackLayout) fConnectionStack.getLayout()).topControl = fSerialBlock.getControl();
}
fConnectionStack.layout();
}
@Override
public boolean isValid(ILaunchConfiguration launchConfig) {
if (super.isValid(launchConfig)) {
setErrorMessage(null);
setMessage(null);
int index = fConnectionField.getSelectionIndex();
if (index >= 0 && index < fConnections.length) {
String[] connTypes = fConnectionField.getItems();
if (CONNECTION_TCP.equals(connTypes[index])) {
if (!fTCPBlock.isValid(launchConfig)) {
setErrorMessage(fTCPBlock.getErrorMessage());
return false;
}
} else if (CONNECTION_SERIAL.equals(connTypes[index])) {
if (!fSerialBlock.isValid(launchConfig)) {
setErrorMessage(fSerialBlock.getErrorMessage());
return false;
}
}
}
if (fRemoteTimeoutEnabledField.isSelected()) {
if (fRemoteTimeoutValueField.getText().trim().isEmpty()) {
setErrorMessage(LaunchUIMessages.getString("GDBServerDebuggerPage.13")); //$NON-NLS-1$
return false;
}
}
return true;
}
return false;
}
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
setInitializing(true);
super.initializeFrom(configuration);
boolean isTcp = true;
try {
isTcp = configuration.getAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP, true);
} catch (CoreException e) {
}
fTCPBlock.initializeFrom(configuration);
fSerialBlock.initializeFrom(configuration);
fConnectionField.selectItem((isTcp) ? 0 : 1);
initializeRemoteTimeout(configuration);
connectionTypeChanged0();
setInitializing(false);
}
private void initializeRemoteTimeout(ILaunchConfiguration configuration) {
if (fRemoteTimeoutEnabledField != null && fRemoteTimeoutValueField != null) {
try {
fRemoteTimeoutEnabledField.setSelection(configuration.getAttribute(
IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_TIMEOUT_ENABLED,
LaunchUtils.getRemoteTimeoutEnabledDefault()));
fRemoteTimeoutValueField.setText(
configuration.getAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_TIMEOUT_VALUE,
LaunchUtils.getRemoteTimeoutValueDefault()));
} catch (CoreException e) {
}
}
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
super.performApply(configuration);
if (fConnectionField != null)
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP,
fConnectionField.getSelectionIndex() == 0);
fTCPBlock.performApply(configuration);
fSerialBlock.performApply(configuration);
if (fRemoteTimeoutEnabledField != null)
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_TIMEOUT_ENABLED,
fRemoteTimeoutEnabledField.isSelected());
if (fRemoteTimeoutValueField != null)
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_TIMEOUT_VALUE,
fRemoteTimeoutValueField.getText().trim());
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
super.setDefaults(configuration);
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP, true);
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_TIMEOUT_ENABLED,
LaunchUtils.getRemoteTimeoutEnabledDefault());
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_TIMEOUT_VALUE,
LaunchUtils.getRemoteTimeoutValueDefault());
fTCPBlock.setDefaults(configuration);
fSerialBlock.setDefaults(configuration);
}
@Override
protected boolean isInitializing() {
return fIsInitializing;
}
private void setInitializing(boolean isInitializing) {
fIsInitializing = isInitializing;
}
@Override
public void createTabs(CTabFolder tabFolder) {
super.createTabs(tabFolder);
createConnectionTab(tabFolder);
}
}