/******************************************************************************* * 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 *******************************************************************************/ package org.eclipse.cdt.debug.mi.internal.ui; import java.io.File; import java.util.Observable; import java.util.Observer; import org.eclipse.cdt.debug.mi.core.IMILaunchConfigurationConstants; import org.eclipse.cdt.debug.mi.core.MIPlugin; import org.eclipse.cdt.debug.mi.ui.IMILaunchConfigurationComponent; import org.eclipse.cdt.debug.mi.ui.MIUIUtils; import org.eclipse.cdt.debug.ui.AbstractCDebuggerPage; 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.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Text; /** * The dynamic tab for gdb-based debugger implementations. */ public class GDBDebuggerPage extends AbstractCDebuggerPage implements Observer { final private static String DEFAULT_MI_PROTOCOL = MIUIMessages.getString( "GDBDebuggerPage.12" ); //$NON-NLS-1$ final protected String[] protocolItems = new String[] { DEFAULT_MI_PROTOCOL, "mi1", "mi2", "mi3" }; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ protected TabFolder fTabFolder; protected Text fGDBCommandText; protected Text fGDBInitText; protected Combo fProtocolCombo; private IMILaunchConfigurationComponent fSolibBlock; private boolean fIsInitializing = false; private Button fBreakpointsFullPath; public void createControl( Composite parent ) { Composite comp = new Composite( parent, SWT.NONE ); comp.setLayout( new GridLayout() ); comp.setLayoutData( new GridData( GridData.FILL_BOTH ) ); fTabFolder = new TabFolder( comp, SWT.NONE ); fTabFolder.setLayoutData( new GridData( GridData.FILL_BOTH | GridData.GRAB_VERTICAL ) ); createTabs( fTabFolder ); fTabFolder.setSelection( 0 ); setControl( parent ); } public void setDefaults( ILaunchConfigurationWorkingCopy configuration ) { configuration.setAttribute( IMILaunchConfigurationConstants.ATTR_DEBUG_NAME, "gdb" ); //$NON-NLS-1$ configuration.setAttribute( IMILaunchConfigurationConstants.ATTR_GDB_INIT, IMILaunchConfigurationConstants.DEBUGGER_GDB_INIT_DEFAULT ); configuration.setAttribute( IMILaunchConfigurationConstants.ATTR_DEBUGGER_PROTOCOL, "mi" ); //$NON-NLS-1$ if ( fSolibBlock != null ) fSolibBlock.setDefaults( configuration ); } public boolean isValid( ILaunchConfiguration launchConfig ) { boolean valid = fGDBCommandText.getText().length() != 0; if ( valid ) { setErrorMessage( null ); setMessage( null ); } else { setErrorMessage( MIUIMessages.getString( "GDBDebuggerPage.0" ) ); //$NON-NLS-1$ setMessage( null ); } return valid; } public void initializeFrom( ILaunchConfiguration configuration ) { setInitializing( true ); String gdbCommand = "gdb"; //$NON-NLS-1$ String gdbInit = IMILaunchConfigurationConstants.DEBUGGER_GDB_INIT_DEFAULT; try { gdbCommand = configuration.getAttribute( IMILaunchConfigurationConstants.ATTR_DEBUG_NAME, "gdb" ); //$NON-NLS-1$ } catch( CoreException e ) { } try { gdbInit = configuration.getAttribute( IMILaunchConfigurationConstants.ATTR_GDB_INIT, IMILaunchConfigurationConstants.DEBUGGER_GDB_INIT_DEFAULT ); } catch( CoreException e ) { } String miVersion = MIPlugin.getMIVersion( configuration ); if ( miVersion.compareTo( "mi" ) == 0 ) { //$NON-NLS-1$ miVersion = DEFAULT_MI_PROTOCOL; } if ( fSolibBlock != null ) fSolibBlock.initializeFrom( configuration ); fGDBCommandText.setText( gdbCommand ); fGDBInitText.setText( gdbInit ); int index = 0; if ( miVersion.length() > 0 ) { for( int i = 0; i < protocolItems.length; ++i ) { if ( protocolItems[i].equals( miVersion ) ) { index = i; break; } } } fProtocolCombo.select( index ); boolean useFullPath = IMILaunchConfigurationConstants.DEBUGGER_FULLPATH_BREAKPOINTS_DEFAULT; try { useFullPath = configuration.getAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_FULLPATH_BREAKPOINTS, useFullPath); } catch (CoreException e) {} fBreakpointsFullPath.setSelection(useFullPath); setInitializing( false ); } public void performApply( ILaunchConfigurationWorkingCopy configuration ) { String str = fGDBCommandText.getText(); str.trim(); configuration.setAttribute( IMILaunchConfigurationConstants.ATTR_DEBUG_NAME, str ); str = fGDBInitText.getText(); str.trim(); configuration.setAttribute( IMILaunchConfigurationConstants.ATTR_GDB_INIT, str ); str = fProtocolCombo.getText(); if ( str.compareTo( DEFAULT_MI_PROTOCOL ) == 0 ) { str = "mi"; //$NON-NLS-1$ } configuration.setAttribute( IMILaunchConfigurationConstants.ATTR_DEBUGGER_PROTOCOL, str ); configuration.setAttribute( IMILaunchConfigurationConstants.ATTR_DEBUGGER_FULLPATH_BREAKPOINTS, fBreakpointsFullPath.getSelection() ); if ( fSolibBlock != null ) fSolibBlock.performApply( configuration ); } public String getName() { return MIUIMessages.getString( "GDBDebuggerPage.1" ); //$NON-NLS-1$ } /** * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getShell() */ protected Shell getShell() { return super.getShell(); } /** * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#updateLaunchConfigurationDialog() */ protected void updateLaunchConfigurationDialog() { super.updateLaunchConfigurationDialog(); } /* * (non-Javadoc) * * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ public void update( Observable o, Object arg ) { if ( !isInitializing() ) updateLaunchConfigurationDialog(); } public IMILaunchConfigurationComponent createSolibBlock( Composite parent ) { IMILaunchConfigurationComponent block = MIUIUtils.createGDBSolibBlock( true, true ); block.createControl( parent ); return block; } public void createTabs( TabFolder tabFolder ) { createMainTab( tabFolder ); createSolibTab( tabFolder ); } public void createMainTab( TabFolder tabFolder ) { TabItem tabItem = new TabItem( tabFolder, SWT.NONE ); tabItem.setText( MIUIMessages.getString( "GDBDebuggerPage.2" ) ); //$NON-NLS-1$ Composite comp = ControlFactory.createCompositeEx( tabFolder, 1, GridData.FILL_BOTH ); ((GridLayout)comp.getLayout()).makeColumnsEqualWidth = false; comp.setFont( tabFolder.getFont() ); tabItem.setControl( comp ); Composite subComp = ControlFactory.createCompositeEx( comp, 3, GridData.FILL_HORIZONTAL ); ((GridLayout)subComp.getLayout()).makeColumnsEqualWidth = false; subComp.setFont( tabFolder.getFont() ); Label label = ControlFactory.createLabel( subComp, MIUIMessages.getString( "GDBDebuggerPage.3" ) ); //$NON-NLS-1$ 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 ) { if ( !isInitializing() ) updateLaunchConfigurationDialog(); } } ); Button button = createPushButton( subComp, MIUIMessages.getString( "GDBDebuggerPage.4" ), null ); //$NON-NLS-1$ button.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent evt ) { handleGDBButtonSelected(); updateLaunchConfigurationDialog(); } private void handleGDBButtonSelected() { FileDialog dialog = new FileDialog( getShell(), SWT.NONE ); dialog.setText( MIUIMessages.getString( "GDBDebuggerPage.5" ) ); //$NON-NLS-1$ 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, MIUIMessages.getString( "GDBDebuggerPage.6" ) ); //$NON-NLS-1$ 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 ) { if ( !isInitializing() ) updateLaunchConfigurationDialog(); } } ); button = createPushButton( subComp, MIUIMessages.getString( "GDBDebuggerPage.7" ), null ); //$NON-NLS-1$ button.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent evt ) { handleGDBInitButtonSelected(); updateLaunchConfigurationDialog(); } private void handleGDBInitButtonSelected() { FileDialog dialog = new FileDialog( getShell(), SWT.NONE ); dialog.setText( MIUIMessages.getString( "GDBDebuggerPage.8" ) ); //$NON-NLS-1$ 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 ); } } ); label = ControlFactory.createLabel( subComp, MIUIMessages.getString( "GDBDebuggerPage.9" ), //$NON-NLS-1$ 200, SWT.DEFAULT, SWT.WRAP ); gd = new GridData( GridData.FILL_HORIZONTAL ); gd.horizontalSpan = 3; gd.widthHint = 200; label.setLayoutData( gd ); createProtocolCombo( subComp ); createBreakpointFullPathName(subComp); GridData gd2 = new GridData(); gd2.horizontalSpan = 3; fBreakpointsFullPath.setLayoutData(gd2); } public void createSolibTab( TabFolder tabFolder ) { TabItem tabItem = new TabItem( tabFolder, SWT.NONE ); tabItem.setText( MIUIMessages.getString( "GDBDebuggerPage.10" ) ); //$NON-NLS-1$ Composite comp = ControlFactory.createCompositeEx( fTabFolder, 1, GridData.FILL_BOTH ); comp.setFont( tabFolder.getFont() ); tabItem.setControl( comp ); fSolibBlock = createSolibBlock( comp ); if ( fSolibBlock instanceof Observable ) ((Observable)fSolibBlock).addObserver( this ); } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose() */ public void dispose() { if ( fSolibBlock != null ) { if ( fSolibBlock instanceof Observable ) ((Observable)fSolibBlock).deleteObserver( this ); fSolibBlock.dispose(); } super.dispose(); } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void activated( ILaunchConfigurationWorkingCopy workingCopy ) { // Override the default behavior } protected boolean isInitializing() { return fIsInitializing; } private void setInitializing( boolean isInitializing ) { fIsInitializing = isInitializing; } protected void createProtocolCombo( Composite parent ) { Label label = new Label( parent, SWT.NONE ); label.setText( MIUIMessages.getString( "GDBDebuggerPage.11" ) ); //$NON-NLS-1$ fProtocolCombo = new Combo( parent, SWT.READ_ONLY | SWT.DROP_DOWN ); fProtocolCombo.setItems( protocolItems ); fProtocolCombo.addSelectionListener( new SelectionListener() { public void widgetDefaultSelected( SelectionEvent e ) { if ( !isInitializing() ) updateLaunchConfigurationDialog(); } public void widgetSelected( SelectionEvent e ) { if ( !isInitializing() ) updateLaunchConfigurationDialog(); } } ); } protected void createBreakpointFullPathName( Composite parent ) { fBreakpointsFullPath = createCheckButton( parent, MIUIMessages.getString( "StandardGDBDebuggerPage.14" ) ); //$NON-NLS-1$ fBreakpointsFullPath.addSelectionListener( new SelectionListener() { public void widgetDefaultSelected( SelectionEvent e ) { if ( !isInitializing() ) updateLaunchConfigurationDialog(); } public void widgetSelected( SelectionEvent e ) { if ( !isInitializing() ) updateLaunchConfigurationDialog(); } } ); } }