/*******************************************************************************
* Copyright (c) 2000, 2010 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
*******************************************************************************/
package org.eclipse.cdt.debug.mi.internal.ui;
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.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.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 StandardGDBDebuggerPage {
private final static String CONNECTION_TCP = MIUIMessages.getString( "GDBServerDebuggerPage.0" ); //$NON-NLS-1$
private final static String CONNECTION_SERIAL = MIUIMessages.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( MIUIMessages.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;
PixelConverter converter = new PixelConverter( comp );
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( MIUIMessages.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();
}
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 ) {
setInitializing( true );
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 );
connectionTypeChanged0();
setInitializing( false );
}
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 );
}
protected boolean isInitializing() {
return fIsInitializing;
}
private void setInitializing( boolean isInitializing ) {
fIsInitializing = isInitializing;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.mi.internal.ui.GDBDebuggerPage#createTabs(org.eclipse.swt.widgets.TabFolder)
*/
public void createTabs( TabFolder tabFolder ) {
super.createTabs( tabFolder );
createConnectionTab( tabFolder );
}
}