blob: 8d5ad8630d7f4819ab6f28f736bf8ea345eafcaa [file] [log] [blame]
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.mi.internal.ui;
import java.io.File;
import org.eclipse.cdt.debug.mi.core.IGDBServerMILaunchConfigurationConstants;
import org.eclipse.cdt.debug.mi.internal.ui.dialogfields.ComboDialogField;
import org.eclipse.cdt.debug.mi.internal.ui.dialogfields.DialogField;
import org.eclipse.cdt.debug.mi.internal.ui.dialogfields.IDialogFieldListener;
import org.eclipse.cdt.debug.mi.internal.ui.dialogfields.LayoutUtil;
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.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
/**
* Enter type comment.
*
* @since Nov 20, 2003
*/
public class GDBServerDebuggerPage extends GDBDebuggerPage
{
private final static String CONNECTION_TCP = "TCP";
private final static String CONNECTION_SERIAL = "Serial";
private ComboDialogField fConnectionField;
private String[] fConnections = new String[] { CONNECTION_TCP, CONNECTION_SERIAL };
private TCPSettingsBlock fTCPBlock;
private SerialPortSettingsBlock fSerialBlock;
private Composite fConnectionStack;
public GDBServerDebuggerPage()
{
super();
fConnectionField = createConnectionField();
fTCPBlock = new TCPSettingsBlock();
fSerialBlock = new SerialPortSettingsBlock();
fTCPBlock.addObserver( this );
fSerialBlock.addObserver( this );
}
public void createMainTab( TabFolder tabFolder )
{
TabItem tabItem = new TabItem( tabFolder, SWT.NONE );
tabItem.setText( "Main" );
Composite comp = ControlFactory.createCompositeEx( fTabFolder, 1, GridData.FILL_BOTH );
((GridLayout)comp.getLayout()).makeColumnsEqualWidth = false;
tabItem.setControl( comp );
Composite subComp = ControlFactory.createCompositeEx( comp, 3, GridData.FILL_HORIZONTAL );
((GridLayout)subComp.getLayout()).makeColumnsEqualWidth = false;
Label label = ControlFactory.createLabel( subComp, "GDB debugger:" );
GridData gd = new GridData();
// gd.horizontalSpan = 2;
label.setLayoutData( gd );
fGDBCommandText = ControlFactory.createTextField( subComp, SWT.SINGLE | SWT.BORDER );
fGDBCommandText.addModifyListener(
new ModifyListener()
{
public void modifyText( ModifyEvent evt )
{
updateLaunchConfigurationDialog();
}
} );
Button button = createPushButton( subComp, "&Browse...", null );
button.addSelectionListener(
new SelectionAdapter()
{
public void widgetSelected( SelectionEvent evt )
{
handleGDBButtonSelected();
updateLaunchConfigurationDialog();
}
private void handleGDBButtonSelected()
{
FileDialog dialog = new FileDialog( getShell(), SWT.NONE );
dialog.setText( "GDB Command File" );
String gdbCommand = fGDBCommandText.getText().trim();
int lastSeparatorIndex = gdbCommand.lastIndexOf( File.separator );
if ( lastSeparatorIndex != -1 )
{
dialog.setFilterPath( gdbCommand.substring( 0, lastSeparatorIndex ) );
}
String res = dialog.open();
if ( res == null )
{
return;
}
fGDBCommandText.setText( res );
}
} );
label = ControlFactory.createLabel( subComp, "GDB command file:" );
gd = new GridData();
// gd.horizontalSpan = 2;
label.setLayoutData( gd );
fGDBInitText = ControlFactory.createTextField( subComp, SWT.SINGLE | SWT.BORDER );
gd = new GridData( GridData.FILL_HORIZONTAL );
fGDBInitText.setLayoutData( gd );
fGDBInitText.addModifyListener( new ModifyListener()
{
public void modifyText( ModifyEvent evt )
{
updateLaunchConfigurationDialog();
}
} );
button = createPushButton( subComp, "&Browse...", null );
button.addSelectionListener(
new SelectionAdapter()
{
public void widgetSelected( SelectionEvent evt )
{
handleGDBInitButtonSelected();
updateLaunchConfigurationDialog();
}
private void handleGDBInitButtonSelected()
{
FileDialog dialog = new FileDialog( getShell(), SWT.NONE );
dialog.setText( "GDB command file" );
String gdbCommand = fGDBInitText.getText().trim();
int lastSeparatorIndex = gdbCommand.lastIndexOf( File.separator );
if ( lastSeparatorIndex != -1 )
{
dialog.setFilterPath( gdbCommand.substring( 0, lastSeparatorIndex ) );
}
String res = dialog.open();
if ( res == null )
{
return;
}
fGDBInitText.setText( res );
}
} );
extendMainTab( comp );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.mi.internal.ui.GDBDebuggerPage#extendMainTab(org.eclipse.swt.widgets.Composite)
*/
protected void extendMainTab( Composite parent )
{
Composite comp = ControlFactory.createCompositeEx( parent, 2, GridData.FILL_BOTH );
((GridLayout)comp.getLayout()).makeColumnsEqualWidth = false;
fConnectionField.doFillIntoGrid( comp, 2 );
((GridData)fConnectionField.getComboControl( null ).getLayoutData()).horizontalAlignment = GridData.BEGINNING;
PixelConverter converter = new PixelConverter( comp );
LayoutUtil.setWidthHint( fConnectionField.getComboControl( null ), converter.convertWidthInCharsToPixels( 15 ) );
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 );
connectionTypeChanged();
}
private ComboDialogField createConnectionField()
{
ComboDialogField field = new ComboDialogField( SWT.DROP_DOWN | SWT.READ_ONLY );
field.setLabelText( "Connection: " );
field.setItems( fConnections );
field.setDialogFieldListener(
new IDialogFieldListener()
{
public void dialogFieldChanged( DialogField field )
{
connectionTypeChanged();
}
} );
return field;
}
protected void connectionTypeChanged()
{
((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();
updateLaunchConfigurationDialog();
}
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;
}
public void initializeFrom( ILaunchConfiguration configuration )
{
super.initializeFrom( configuration );
boolean isTcp = false;
try
{
isTcp = configuration.getAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_REMOTE_TCP, false );
}
catch( CoreException e )
{
}
fTCPBlock.initializeFrom( configuration );
fSerialBlock.initializeFrom( configuration );
fConnectionField.selectItem( ( isTcp ) ? 0 : 1 );
}
public void performApply( ILaunchConfigurationWorkingCopy configuration )
{
super.performApply( configuration );
if ( fConnectionField != null )
configuration.setAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_REMOTE_TCP, fConnectionField.getSelectionIndex() == 0 );
fTCPBlock.performApply( configuration );
fSerialBlock.performApply( configuration );
}
public void setDefaults( ILaunchConfigurationWorkingCopy configuration )
{
super.setDefaults( configuration );
configuration.setAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_REMOTE_TCP, false );
fTCPBlock.setDefaults( configuration );
fSerialBlock.setDefaults( configuration );
}
}