/*******************************************************************************
* Copyright (c) 2008, 2009 QNX Software Systems 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:
* 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.dsf.gdb.IGDBLaunchConfigurationConstants;
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.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
/**
* 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;
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);
}
protected void createConnectionTab(TabFolder tabFolder) {
TabItem tabItem = new TabItem(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, 2, GridData.FILL_BOTH);
((GridLayout)comp.getLayout()).makeColumnsEqualWidth = false;
comp.setFont(comp1.getFont());
fConnectionField.doFillIntoGrid(comp, 2);
((GridData)fConnectionField.getComboControl(null).getLayoutData()).horizontalAlignment = GridData.BEGINNING;
fConnectionStack = ControlFactory.createCompositeEx(comp, 1, GridData.FILL_BOTH);
StackLayout stackLayout = new StackLayout();
fConnectionStack.setLayout(stackLayout);
((GridData)fConnectionStack.getLayoutData()).horizontalSpan = 2;
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() {
public void dialogFieldChanged(DialogField f) {
if (!isInitializing())
connectionTypeChanged();
}
});
return field;
}
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;
}
}
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);
connectionTypeChanged0();
setInitializing(false);
}
@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);
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
super.setDefaults(configuration);
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP, true);
fTCPBlock.setDefaults(configuration);
fSerialBlock.setDefaults(configuration);
}
@Override
protected boolean isInitializing() {
return fIsInitializing;
}
private void setInitializing(boolean isInitializing) {
fIsInitializing = isInitializing;
}
@Override
public void createTabs(TabFolder tabFolder) {
super.createTabs(tabFolder);
createConnectionTab(tabFolder);
}
}