blob: 6e2a3bce8b5f3e8ae95d5c5804dae73e85bbd1aa [file] [log] [blame]
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.mi.internal.ui;
import java.util.Observable;
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.debug.mi.internal.ui.dialogfields.StringDialogField;
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.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
/**
* Enter type comment.
*
* @since Nov 20, 2003
*/
public class SerialPortSettingsBlock extends Observable
{
private final static String DEFAULT_ASYNC_DEVICE = "/dev/ttyS0";
private final static String DEFAULT_ASYNC_DEVICE_SPEED = "115200";
private Shell fShell;
private StringDialogField fDeviceField;
private ComboDialogField fSpeedField;
private String fSpeedChoices[] = { "9600", "19200", "38400", "57600", "115200" };
private Control fControl;
private String fErrorMessage = null;
public SerialPortSettingsBlock()
{
super();
fDeviceField = createDeviceField();
fSpeedField = createSpeedField();
}
public void createBlock( Composite parent )
{
fShell = parent.getShell();
Composite comp = ControlFactory.createCompositeEx( parent, 2, GridData.FILL_BOTH );
((GridLayout)comp.getLayout()).makeColumnsEqualWidth = false;
((GridLayout)comp.getLayout()).marginHeight = 0;
((GridLayout)comp.getLayout()).marginWidth = 0;
comp.setFont( JFaceResources.getDialogFont() );
PixelConverter converter = new PixelConverter( comp );
fDeviceField.doFillIntoGrid( comp, 2 );
LayoutUtil.setWidthHint( fDeviceField.getTextControl( null ), converter.convertWidthInCharsToPixels( 20 ) );
fSpeedField.doFillIntoGrid( comp, 2 );
((GridData)fSpeedField.getComboControl( null ).getLayoutData()).horizontalAlignment = GridData.BEGINNING;
setControl( comp );
}
protected Shell getShell()
{
return fShell;
}
public void dispose()
{
deleteObservers();
}
public void initializeFrom( ILaunchConfiguration configuration )
{
initializeDevice( configuration );
initializeSpeed( configuration );
}
public void setDefaults( ILaunchConfigurationWorkingCopy configuration )
{
configuration.setAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_DEV, DEFAULT_ASYNC_DEVICE );
configuration.setAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_DEV_SPEED, DEFAULT_ASYNC_DEVICE_SPEED );
}
public void performApply( ILaunchConfigurationWorkingCopy configuration )
{
if ( fDeviceField != null )
configuration.setAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_DEV, fDeviceField.getText().trim() );
if ( fSpeedField != null )
{
int index = fSpeedField.getSelectionIndex();
configuration.setAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_DEV_SPEED, getSpeedItem( index ) );
}
}
private StringDialogField createDeviceField()
{
StringDialogField field = new StringDialogField();
field.setLabelText( "Device: " );
field.setDialogFieldListener(
new IDialogFieldListener()
{
public void dialogFieldChanged( DialogField field )
{
deviceFieldChanged();
}
} );
return field;
}
private ComboDialogField createSpeedField()
{
ComboDialogField field = new ComboDialogField( SWT.DROP_DOWN | SWT.READ_ONLY );
field.setLabelText( "Speed: " );
field.setItems( fSpeedChoices );
field.setDialogFieldListener(
new IDialogFieldListener()
{
public void dialogFieldChanged( DialogField field )
{
speedFieldChanged();
}
} );
return field;
}
protected void deviceFieldChanged()
{
updateErrorMessage();
setChanged();
notifyObservers();
}
protected void speedFieldChanged()
{
updateErrorMessage();
setChanged();
notifyObservers();
}
private void initializeDevice( ILaunchConfiguration configuration )
{
if ( fDeviceField != null )
{
try
{
fDeviceField.setText( configuration.getAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_DEV, DEFAULT_ASYNC_DEVICE ) );
}
catch( CoreException e )
{
}
}
}
private void initializeSpeed( ILaunchConfiguration configuration )
{
if ( fSpeedField != null )
{
int index = 0;
try
{
index = getSpeedItemIndex( configuration.getAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_DEV_SPEED, DEFAULT_ASYNC_DEVICE_SPEED ) );
}
catch( CoreException e )
{
}
fSpeedField.selectItem( index );
}
}
private String getSpeedItem( int index )
{
return ( index >= 0 && index < fSpeedChoices.length ) ? fSpeedChoices[index] : null;
}
private int getSpeedItemIndex( String item )
{
for ( int i = 0; i < fSpeedChoices.length; ++i )
if ( fSpeedChoices[i].equals( item ) )
return i;
return 0;
}
public Control getControl()
{
return fControl;
}
protected void setControl( Control control )
{
fControl = control;
}
public boolean isValid( ILaunchConfiguration configuration )
{
updateErrorMessage();
return ( getErrorMessage() == null );
}
private void updateErrorMessage()
{
setErrorMessage( null );
if ( fDeviceField != null && fSpeedField != null )
{
if ( fDeviceField.getText().trim().length() == 0 )
setErrorMessage( "Device must be specified." );
else if ( !deviceIsValid( fDeviceField.getText().trim() ) )
setErrorMessage( "Invalid device." );
else if ( fSpeedField.getSelectionIndex() < 0 )
setErrorMessage( "Speed must be specified." );
}
}
public String getErrorMessage()
{
return fErrorMessage;
}
private void setErrorMessage( String string )
{
fErrorMessage = string;
}
private boolean deviceIsValid( String hostName )
{
return true;
}
}