mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
The UI part of the prompting source locator.
This commit is contained in:
parent
9a7b5690eb
commit
8771229edc
6 changed files with 611 additions and 236 deletions
|
@ -1,3 +1,10 @@
|
|||
2002-12-17 Mikhail Khodjaiants
|
||||
The UI part of the prompting source locator.
|
||||
* AttachSourceLocationBlock.java
|
||||
* AttachSourceLocationDialog.java
|
||||
* CUISourceLocator.java
|
||||
* plugin.xml
|
||||
|
||||
2002-12-16 Mikhail Khodjaiants
|
||||
New formating actions for variables, registers, and expressions
|
||||
* VariableFormatActionDelegate.java
|
||||
|
|
|
@ -667,14 +667,6 @@
|
|||
id="org.eclipse.cdt.debug.internal.ui.editors.DebugTextHover">
|
||||
</textHover>
|
||||
</extension>
|
||||
<extension
|
||||
point="org.eclipse.debug.core.sourceLocators">
|
||||
<sourceLocator
|
||||
name="Prompting C/C++ Source Locator"
|
||||
class="org.eclipse.cdt.debug.ui.CUISourceLocator"
|
||||
id="org.eclipse.cdt.debug.ui.cSourceLocator">
|
||||
</sourceLocator>
|
||||
</extension>
|
||||
<extension
|
||||
point="org.eclipse.debug.core.statusHandlers">
|
||||
<statusHandler
|
||||
|
|
|
@ -1,228 +0,0 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
package org.eclipse.cdt.debug.ui;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
|
||||
import org.eclipse.cdt.debug.core.model.IStackFrameInfo;
|
||||
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLocator;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||
import org.eclipse.debug.core.model.IPersistableSourceLocator;
|
||||
import org.eclipse.debug.core.model.IStackFrame;
|
||||
import org.eclipse.jface.dialogs.Dialog;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.graphics.FontMetrics;
|
||||
import org.eclipse.swt.graphics.GC;
|
||||
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.Control;
|
||||
import org.eclipse.swt.widgets.Label;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
|
||||
/**
|
||||
*
|
||||
* A source locator that prompts the user to find source when source cannot
|
||||
* be found on the current source lookup path.
|
||||
*
|
||||
* @since Sep 24, 2002
|
||||
*/
|
||||
public class CUISourceLocator implements IPersistableSourceLocator
|
||||
{
|
||||
/**
|
||||
* Identifier for the 'Prompting C/C++ Source Locator' extension
|
||||
* (value <code>"org.eclipse.cdt.debug.ui.cSourceLocator"</code>).
|
||||
*/
|
||||
public static final String ID_PROMPTING_C_SOURCE_LOCATOR = CDebugUIPlugin.getUniqueIdentifier() + ".cSourceLocator"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* The project being debugged.
|
||||
*/
|
||||
private IProject fProject = null;
|
||||
|
||||
/**
|
||||
* Underlying source locator.
|
||||
*/
|
||||
private CSourceLocator fSourceLocator;
|
||||
|
||||
/**
|
||||
* Whether the user should be prompted for source.
|
||||
* Initially true, until the user checks the 'do not
|
||||
* ask again' box.
|
||||
*/
|
||||
protected boolean fAllowedToAsk;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor for CUISourceLocator.
|
||||
*/
|
||||
public CUISourceLocator()
|
||||
{
|
||||
fSourceLocator = new CSourceLocator();
|
||||
fAllowedToAsk = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor for CUISourceLocator.
|
||||
*/
|
||||
public CUISourceLocator( IProject project )
|
||||
{
|
||||
fProject = project;
|
||||
fSourceLocator = new CSourceLocator( project );
|
||||
fAllowedToAsk = true;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento()
|
||||
*/
|
||||
public String getMemento() throws CoreException
|
||||
{
|
||||
return fSourceLocator.getMemento();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeFromMemento(String)
|
||||
*/
|
||||
public void initializeFromMemento( String memento ) throws CoreException
|
||||
{
|
||||
fSourceLocator.initializeFromMemento( memento );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(ILaunchConfiguration)
|
||||
*/
|
||||
public void initializeDefaults( ILaunchConfiguration configuration ) throws CoreException
|
||||
{
|
||||
fSourceLocator.initializeDefaults( configuration );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(IStackFrame)
|
||||
*/
|
||||
public Object getSourceElement( IStackFrame stackFrame )
|
||||
{
|
||||
Object res = fSourceLocator.getSourceElement( stackFrame );
|
||||
if ( res == null && fAllowedToAsk )
|
||||
{
|
||||
IStackFrameInfo frameInfo = (IStackFrameInfo)stackFrame.getAdapter( IStackFrameInfo.class );
|
||||
if ( frameInfo != null )
|
||||
{
|
||||
showDebugSourcePage( frameInfo.getFile(), stackFrame.getLaunch().getLaunchConfiguration() );
|
||||
res = fSourceLocator.getSourceElement( stackFrame );
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompts to locate the source of the given type.
|
||||
*
|
||||
* @param frameInfo the frame information for which source
|
||||
* could not be located
|
||||
*/
|
||||
private void showDebugSourcePage( final String fileName, final ILaunchConfiguration lc )
|
||||
{
|
||||
Runnable prompter = new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
SourceLookupDialog dialog = new SourceLookupDialog( CDebugUIPlugin.getActiveWorkbenchShell(), fileName, lc, CUISourceLocator.this );
|
||||
dialog.open();
|
||||
fAllowedToAsk = !dialog.isNotAskAgain();
|
||||
}
|
||||
};
|
||||
CDebugUIPlugin.getStandardDisplay().syncExec( prompter );
|
||||
}
|
||||
|
||||
/**
|
||||
* Dialog that prompts for source lookup path.
|
||||
*/
|
||||
private static class SourceLookupDialog extends Dialog
|
||||
{
|
||||
|
||||
private CUISourceLocator fLocator;
|
||||
private ILaunchConfiguration fConfiguration;
|
||||
private String fFileName;
|
||||
private boolean fNotAskAgain;
|
||||
private Button fAskAgainCheckBox;
|
||||
|
||||
public SourceLookupDialog( Shell shell,
|
||||
String fileName,
|
||||
ILaunchConfiguration configuration,
|
||||
CUISourceLocator locator )
|
||||
{
|
||||
super( shell );
|
||||
fFileName = fileName;
|
||||
fNotAskAgain = false;
|
||||
fAskAgainCheckBox = null;
|
||||
fLocator = locator;
|
||||
fConfiguration = configuration;
|
||||
}
|
||||
|
||||
public boolean isNotAskAgain()
|
||||
{
|
||||
return fNotAskAgain;
|
||||
}
|
||||
|
||||
protected Control createDialogArea( Composite parent )
|
||||
{
|
||||
getShell().setText( "Debugger Source Lookup" );
|
||||
|
||||
Composite composite = (Composite)super.createDialogArea( parent );
|
||||
composite.setLayout( new GridLayout() );
|
||||
Label message = new Label( composite, SWT.LEFT + SWT.WRAP );
|
||||
message.setText( MessageFormat.format( "The source could not be shown as the file ''{0}'' was not found.", new String[] { fFileName } ) );
|
||||
GridData data = new GridData();
|
||||
data.widthHint = convertWidthInCharsToPixels( message, 70 );
|
||||
message.setLayoutData( data );
|
||||
fAskAgainCheckBox = new Button( composite, SWT.CHECK + SWT.WRAP );
|
||||
data = new GridData();
|
||||
data.widthHint = convertWidthInCharsToPixels( fAskAgainCheckBox, 70 );
|
||||
fAskAgainCheckBox.setLayoutData(data);
|
||||
fAskAgainCheckBox.setText( "Do ¬ ask again" );
|
||||
|
||||
return composite;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Dialog#convertWidthInCharsToPixels(FontMetrics, int)
|
||||
*/
|
||||
protected int convertWidthInCharsToPixels( Control control, int chars )
|
||||
{
|
||||
GC gc = new GC( control );
|
||||
gc.setFont( control.getFont() );
|
||||
FontMetrics fontMetrics = gc.getFontMetrics();
|
||||
gc.dispose();
|
||||
return Dialog.convertWidthInCharsToPixels( fontMetrics, chars );
|
||||
}
|
||||
|
||||
protected void okPressed()
|
||||
{
|
||||
try
|
||||
{
|
||||
if ( fAskAgainCheckBox != null )
|
||||
{
|
||||
fNotAskAgain = fAskAgainCheckBox.getSelection();
|
||||
}
|
||||
ILaunchConfigurationWorkingCopy wc = fConfiguration.getWorkingCopy();
|
||||
if ( !fConfiguration.contentsEqual( wc ) )
|
||||
{
|
||||
fConfiguration = wc.doSave();
|
||||
fLocator.initializeDefaults( fConfiguration );
|
||||
}
|
||||
}
|
||||
catch( CoreException e )
|
||||
{
|
||||
CDebugUIPlugin.log( e );
|
||||
}
|
||||
super.okPressed();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,200 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
package org.eclipse.cdt.debug.ui.sourcelookup;
|
||||
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.jface.dialogs.Dialog;
|
||||
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||
import org.eclipse.jface.resource.JFaceResources;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.events.SelectionAdapter;
|
||||
import org.eclipse.swt.events.SelectionEvent;
|
||||
import org.eclipse.swt.graphics.FontMetrics;
|
||||
import org.eclipse.swt.graphics.GC;
|
||||
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.Control;
|
||||
import org.eclipse.swt.widgets.DirectoryDialog;
|
||||
import org.eclipse.swt.widgets.Label;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
import org.eclipse.swt.widgets.Text;
|
||||
|
||||
/**
|
||||
* Enter type comment.
|
||||
*
|
||||
* @since: Dec 12, 2002
|
||||
*/
|
||||
public class AttachSourceLocationBlock
|
||||
{
|
||||
private Composite fControl = null;
|
||||
private Text fLocationText = null;
|
||||
private Text fAssociationText = null;
|
||||
private Button fAssocitedCheckButton = null;
|
||||
private FontMetrics fFontMetrics;
|
||||
private Shell fShell = null;
|
||||
|
||||
/**
|
||||
* Constructor for AttachSourceLocationBlock.
|
||||
*/
|
||||
public AttachSourceLocationBlock()
|
||||
{
|
||||
}
|
||||
|
||||
public void createControl( Composite parent )
|
||||
{
|
||||
fShell = parent.getShell();
|
||||
fControl = new Composite( parent, SWT.NONE );
|
||||
fControl.setLayout( new GridLayout() );
|
||||
fControl.setLayoutData( new GridData( GridData.FILL_BOTH ) );
|
||||
fControl.setFont( JFaceResources.getDialogFont() );
|
||||
initializeDialogUnits( fControl );
|
||||
|
||||
createLocationControls( fControl );
|
||||
createAssociationControls( fControl );
|
||||
}
|
||||
|
||||
public void setInitialLocationPath( IPath path )
|
||||
{
|
||||
if ( path != null )
|
||||
{
|
||||
fLocationText.setText( path.toOSString() );
|
||||
}
|
||||
}
|
||||
|
||||
public void setInitialAssociationPath( IPath path )
|
||||
{
|
||||
if ( path != null )
|
||||
{
|
||||
fAssocitedCheckButton.setSelection( true );
|
||||
fAssociationText.setText( path.toOSString() );
|
||||
}
|
||||
}
|
||||
|
||||
public Control getControl()
|
||||
{
|
||||
return fControl;
|
||||
}
|
||||
|
||||
protected void createLocationControls( Composite parent )
|
||||
{
|
||||
Label label = new Label( parent, SWT.NONE );
|
||||
label.setText( "Select location directory:" );
|
||||
label.setLayoutData( new GridData( GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL ) );
|
||||
Composite composite = new Composite( parent, SWT.NONE );
|
||||
composite.setLayout( new GridLayout( 2, false ) );
|
||||
GridData data = new GridData( GridData.FILL_BOTH );
|
||||
data.widthHint = Dialog.convertWidthInCharsToPixels( fFontMetrics, 70 );
|
||||
composite.setLayoutData( data );
|
||||
fLocationText = new Text( composite, SWT.SINGLE | SWT.BORDER );
|
||||
fLocationText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL ) );
|
||||
Button button = createButton( composite, "&Browse..." );
|
||||
button.addSelectionListener( new SelectionAdapter()
|
||||
{
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(SelectionEvent)
|
||||
*/
|
||||
public void widgetSelected( SelectionEvent e )
|
||||
{
|
||||
selectLocation();
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
protected void selectLocation()
|
||||
{
|
||||
DirectoryDialog dialog = new DirectoryDialog( fShell );
|
||||
dialog.setMessage( "Select Location Directory" );
|
||||
String result = dialog.open();
|
||||
if ( result != null )
|
||||
{
|
||||
fLocationText.setText( result );
|
||||
}
|
||||
}
|
||||
|
||||
protected void createAssociationControls( Composite parent )
|
||||
{
|
||||
Composite composite = new Composite( parent, SWT.NONE );
|
||||
composite.setLayout( new GridLayout() );
|
||||
GridData data = new GridData( GridData.FILL_BOTH );
|
||||
composite.setLayoutData( data );
|
||||
fAssocitedCheckButton = new Button( composite, SWT.CHECK );
|
||||
fAssocitedCheckButton.setText( "&Associate with" );
|
||||
fAssociationText = new Text( composite, SWT.SINGLE | SWT.BORDER );
|
||||
fAssociationText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
|
||||
fAssocitedCheckButton.addSelectionListener( new SelectionAdapter()
|
||||
{
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(SelectionEvent)
|
||||
*/
|
||||
public void widgetSelected(SelectionEvent e)
|
||||
{
|
||||
associationSelectionChanged();
|
||||
}
|
||||
|
||||
} );
|
||||
}
|
||||
|
||||
protected void associationSelectionChanged()
|
||||
{
|
||||
boolean checked = fAssocitedCheckButton.getSelection();
|
||||
fAssociationText.setEnabled( checked );
|
||||
if ( !checked )
|
||||
fAssociationText.setText( "" );
|
||||
}
|
||||
|
||||
protected Button createButton( Composite parent, String label )
|
||||
{
|
||||
Button button = new Button( parent, SWT.PUSH );
|
||||
button.setText( label );
|
||||
GridData data = new GridData( GridData.END );
|
||||
data.heightHint = convertVerticalDLUsToPixels( IDialogConstants.BUTTON_HEIGHT );
|
||||
int widthHint = convertHorizontalDLUsToPixels( IDialogConstants.BUTTON_WIDTH );
|
||||
data.widthHint = Math.max( widthHint, button.computeSize( SWT.DEFAULT, SWT.DEFAULT, true ).x );
|
||||
button.setLayoutData( data );
|
||||
button.setFont( parent.getFont() );
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
protected int convertVerticalDLUsToPixels( int dlus )
|
||||
{
|
||||
if ( fFontMetrics == null )
|
||||
return 0;
|
||||
return Dialog.convertVerticalDLUsToPixels( fFontMetrics, dlus );
|
||||
}
|
||||
|
||||
protected int convertHorizontalDLUsToPixels( int dlus )
|
||||
{
|
||||
if ( fFontMetrics == null )
|
||||
return 0;
|
||||
return Dialog.convertHorizontalDLUsToPixels( fFontMetrics, dlus );
|
||||
}
|
||||
|
||||
protected void initializeDialogUnits( Control control )
|
||||
{
|
||||
// Compute and store a font metric
|
||||
GC gc = new GC( control );
|
||||
gc.setFont( control.getFont() );
|
||||
fFontMetrics = gc.getFontMetrics();
|
||||
gc.dispose();
|
||||
}
|
||||
|
||||
public String getLocationPath()
|
||||
{
|
||||
return fLocationText.getText().trim();
|
||||
}
|
||||
|
||||
public String getAssociationPath()
|
||||
{
|
||||
if ( fAssocitedCheckButton.getSelection() )
|
||||
{
|
||||
return fAssociationText.getText().trim();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
package org.eclipse.cdt.debug.ui.sourcelookup;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.jface.dialogs.Dialog;
|
||||
import org.eclipse.jface.dialogs.MessageDialog;
|
||||
import org.eclipse.swt.widgets.Composite;
|
||||
import org.eclipse.swt.widgets.Control;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
|
||||
/**
|
||||
* Enter type comment.
|
||||
*
|
||||
* @since: Dec 12, 2002
|
||||
*/
|
||||
public class AttachSourceLocationDialog extends Dialog
|
||||
{
|
||||
private IPath fLocationPath = null;
|
||||
private IPath fAssociationPath = null;
|
||||
private AttachSourceLocationBlock fAttachBlock;
|
||||
|
||||
/**
|
||||
* Constructor for AttachSourceLocationDialog.
|
||||
* @param parentShell
|
||||
*/
|
||||
public AttachSourceLocationDialog( Shell parentShell )
|
||||
{
|
||||
super( parentShell );
|
||||
fAttachBlock = new AttachSourceLocationBlock();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(Composite)
|
||||
*/
|
||||
protected Control createDialogArea( Composite parent )
|
||||
{
|
||||
Composite composite = (Composite)super.createDialogArea( parent );
|
||||
getShell().setText( "Attach Source Location" );
|
||||
fAttachBlock.createControl( composite );
|
||||
fAttachBlock.setInitialAssociationPath( fAssociationPath );
|
||||
|
||||
return composite;
|
||||
}
|
||||
|
||||
public void setInitialPath( IPath path )
|
||||
{
|
||||
fAssociationPath = path;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
|
||||
*/
|
||||
protected void okPressed()
|
||||
{
|
||||
String locationString = fAttachBlock.getLocationPath();
|
||||
if ( locationString.length() == 0 )
|
||||
{
|
||||
MessageDialog.openError( getShell(), getShell().getText(), "Location directory is not selected" );
|
||||
return;
|
||||
}
|
||||
if ( !isLocationPathValid( locationString ) )
|
||||
{
|
||||
MessageDialog.openError( getShell(), getShell().getText(), MessageFormat.format( "Invalid path: ''{0}''", new String[] { locationString } ) );
|
||||
return;
|
||||
}
|
||||
String associationString = fAttachBlock.getAssociationPath();
|
||||
if ( !isAssociationPathValid( associationString ) )
|
||||
{
|
||||
MessageDialog.openError( getShell(), getShell().getText(), MessageFormat.format( "Invalid path: ''{0}''", new String[] { associationString } ) );
|
||||
return;
|
||||
}
|
||||
fLocationPath = getLocation0();
|
||||
fAssociationPath = getAssociation0();
|
||||
super.okPressed();
|
||||
}
|
||||
|
||||
public boolean isLocationPathValid( String pathString )
|
||||
{
|
||||
if ( Path.EMPTY.isValidPath( pathString ) )
|
||||
{
|
||||
Path path = new Path( pathString );
|
||||
return path.toFile().exists();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isAssociationPathValid( String pathString )
|
||||
{
|
||||
if ( pathString.length() > 0 )
|
||||
{
|
||||
return Path.EMPTY.isValidPath( pathString );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public IPath getLocation()
|
||||
{
|
||||
return fLocationPath;
|
||||
}
|
||||
|
||||
private IPath getLocation0()
|
||||
{
|
||||
if ( Path.EMPTY.isValidPath( fAttachBlock.getLocationPath() ) )
|
||||
{
|
||||
return new Path( fAttachBlock.getLocationPath() );
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public IPath getAssociation()
|
||||
{
|
||||
return fAssociationPath;
|
||||
}
|
||||
|
||||
private IPath getAssociation0()
|
||||
{
|
||||
if ( Path.EMPTY.isValidPath( fAttachBlock.getAssociationPath() ) )
|
||||
{
|
||||
return new Path( fAttachBlock.getAssociationPath() );
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,274 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
package org.eclipse.cdt.debug.ui.sourcelookup;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
|
||||
import org.eclipse.cdt.debug.core.model.IStackFrameInfo;
|
||||
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
|
||||
import org.eclipse.cdt.debug.core.sourcelookup.ISourceMode;
|
||||
import org.eclipse.cdt.debug.internal.core.sourcelookup.CDirectorySourceLocation;
|
||||
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLocator;
|
||||
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceManager;
|
||||
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.IAdaptable;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.debug.core.model.IStackFrame;
|
||||
import org.eclipse.jface.dialogs.Dialog;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.events.SelectionAdapter;
|
||||
import org.eclipse.swt.events.SelectionEvent;
|
||||
import org.eclipse.swt.graphics.FontMetrics;
|
||||
import org.eclipse.swt.graphics.GC;
|
||||
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.Control;
|
||||
import org.eclipse.swt.widgets.Label;
|
||||
import org.eclipse.swt.widgets.Layout;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
|
||||
/**
|
||||
*
|
||||
* A source locator that prompts the user to find source when source cannot
|
||||
* be found on the current source lookup path.
|
||||
*
|
||||
* @since Sep 24, 2002
|
||||
*/
|
||||
public class CUISourceLocator implements IAdaptable
|
||||
{
|
||||
/**
|
||||
* Dialog that prompts for source lookup path.
|
||||
*/
|
||||
private static class SourceLookupDialog extends Dialog
|
||||
{
|
||||
public static final int ATTACH_ID = 1000;
|
||||
public static final int ATTACH = 1000;
|
||||
|
||||
private String fFileName;
|
||||
private boolean fNotAskAgain;
|
||||
private Button fAskAgainCheckBox;
|
||||
|
||||
public SourceLookupDialog( Shell shell,
|
||||
String fileName )
|
||||
{
|
||||
super( shell );
|
||||
fFileName = fileName;
|
||||
fNotAskAgain = false;
|
||||
fAskAgainCheckBox = null;
|
||||
}
|
||||
|
||||
public boolean isNotAskAgain()
|
||||
{
|
||||
return fNotAskAgain;
|
||||
}
|
||||
|
||||
protected Control createDialogArea( Composite parent )
|
||||
{
|
||||
getShell().setText( "Debugger Source Lookup" );
|
||||
|
||||
Composite composite = (Composite)super.createDialogArea( parent );
|
||||
composite.setLayout( new GridLayout() );
|
||||
Composite group = new Composite( composite, SWT.NONE );
|
||||
group.setLayout( new GridLayout() );
|
||||
createMessageControls( group );
|
||||
createControls( group );
|
||||
|
||||
return composite;
|
||||
}
|
||||
|
||||
protected void createMessageControls( Composite parent )
|
||||
{
|
||||
Label message = new Label( parent, SWT.LEFT + SWT.WRAP );
|
||||
message.setText( MessageFormat.format( "The source could not be shown as the file ''{0}'' was not found.", new String[] { fFileName } ) );
|
||||
GridData data = new GridData();
|
||||
data.widthHint = convertWidthInCharsToPixels( message, 70 );
|
||||
message.setLayoutData( data );
|
||||
}
|
||||
|
||||
protected void createControls( Composite parent )
|
||||
{
|
||||
Composite composite = new Composite( parent, SWT.NONE );
|
||||
Layout layout = new GridLayout();
|
||||
composite.setLayout( layout );
|
||||
GridData data = new GridData();
|
||||
data.horizontalAlignment = GridData.FILL;
|
||||
data.grabExcessHorizontalSpace = true;
|
||||
composite.setLayoutData( data );
|
||||
fAskAgainCheckBox = new Button( composite, SWT.CHECK + SWT.WRAP );
|
||||
data = new GridData();
|
||||
data.horizontalAlignment = GridData.FILL;
|
||||
fAskAgainCheckBox.setLayoutData( data );
|
||||
data.grabExcessHorizontalSpace = true;
|
||||
fAskAgainCheckBox.setText( "Do ¬ ask again" );
|
||||
fAskAgainCheckBox.addSelectionListener( new SelectionAdapter()
|
||||
{
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(SelectionEvent)
|
||||
*/
|
||||
public void widgetSelected( SelectionEvent e )
|
||||
{
|
||||
askAgainSelected();
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
protected void askAgainSelected()
|
||||
{
|
||||
getButton( ATTACH_ID ).setEnabled( !fAskAgainCheckBox.getSelection() );
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Dialog#convertWidthInCharsToPixels(FontMetrics, int)
|
||||
*/
|
||||
protected int convertWidthInCharsToPixels( Control control, int chars )
|
||||
{
|
||||
GC gc = new GC( control );
|
||||
gc.setFont( control.getFont() );
|
||||
FontMetrics fontMetrics = gc.getFontMetrics();
|
||||
gc.dispose();
|
||||
return Dialog.convertWidthInCharsToPixels( fontMetrics, chars );
|
||||
}
|
||||
|
||||
protected void okPressed()
|
||||
{
|
||||
if ( fAskAgainCheckBox != null )
|
||||
{
|
||||
fNotAskAgain = fAskAgainCheckBox.getSelection();
|
||||
}
|
||||
super.okPressed();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(Composite)
|
||||
*/
|
||||
protected void createButtonsForButtonBar( Composite parent )
|
||||
{
|
||||
super.createButtonsForButtonBar( parent );
|
||||
Button button = createButton( parent, ATTACH_ID, "&Attach ...", false );
|
||||
button.setToolTipText( "Attach New Source Location" );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
|
||||
*/
|
||||
protected void buttonPressed( int buttonId )
|
||||
{
|
||||
super.buttonPressed( buttonId );
|
||||
if ( buttonId == ATTACH_ID )
|
||||
attachPressed();
|
||||
}
|
||||
|
||||
protected void attachPressed()
|
||||
{
|
||||
setReturnCode( ATTACH );
|
||||
close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The project being debugged.
|
||||
*/
|
||||
private IProject fProject = null;
|
||||
|
||||
/**
|
||||
* Underlying source locator.
|
||||
*/
|
||||
private CSourceManager fSourceLocator;
|
||||
|
||||
/**
|
||||
* Whether the user should be prompted for source.
|
||||
* Initially true, until the user checks the 'do not
|
||||
* ask again' box.
|
||||
*/
|
||||
protected boolean fAllowedToAsk;
|
||||
|
||||
protected boolean fNewLocationAttached;
|
||||
|
||||
/**
|
||||
* Constructor for CUISourceLocator.
|
||||
*/
|
||||
public CUISourceLocator( IProject project )
|
||||
{
|
||||
fProject = project;
|
||||
fSourceLocator = new CSourceManager( new CSourceLocator( project ) );
|
||||
fAllowedToAsk = true;
|
||||
fNewLocationAttached = false;
|
||||
}
|
||||
|
||||
public Object getSourceElement( IStackFrame stackFrame )
|
||||
{
|
||||
Object res = fSourceLocator.getSourceElement( stackFrame );
|
||||
if ( res == null && fAllowedToAsk )
|
||||
{
|
||||
IStackFrameInfo frameInfo = (IStackFrameInfo)stackFrame.getAdapter( IStackFrameInfo.class );
|
||||
if ( frameInfo != null )
|
||||
{
|
||||
showDebugSourcePage( frameInfo.getFile() );
|
||||
if ( fNewLocationAttached )
|
||||
{
|
||||
res = fSourceLocator.getSourceElement( stackFrame );
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompts to locate the source of the given type.
|
||||
*
|
||||
* @param frameInfo the frame information for which source
|
||||
* could not be located
|
||||
*/
|
||||
private void showDebugSourcePage( final String fileName )
|
||||
{
|
||||
Runnable prompter = new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
SourceLookupDialog dialog = new SourceLookupDialog( CDebugUIPlugin.getActiveWorkbenchShell(), fileName );
|
||||
if ( dialog.open() == SourceLookupDialog.ATTACH )
|
||||
{
|
||||
attachSourceLocation( fileName );
|
||||
}
|
||||
fAllowedToAsk = !dialog.isNotAskAgain();
|
||||
}
|
||||
};
|
||||
CDebugUIPlugin.getStandardDisplay().syncExec( prompter );
|
||||
}
|
||||
|
||||
protected void attachSourceLocation( String fileName )
|
||||
{
|
||||
AttachSourceLocationDialog dialog = new AttachSourceLocationDialog( CDebugUIPlugin.getActiveWorkbenchShell() );
|
||||
Path path = new Path( fileName );
|
||||
dialog.setInitialPath( path.removeLastSegments( 1 ) );
|
||||
if ( dialog.open() == Dialog.OK )
|
||||
{
|
||||
if ( dialog.getLocation() != null )
|
||||
{
|
||||
fSourceLocator.addSourceLocation( new CDirectorySourceLocation( dialog.getLocation(), dialog.getAssociation() ) );
|
||||
fNewLocationAttached = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
|
||||
*/
|
||||
public Object getAdapter( Class adapter )
|
||||
{
|
||||
if ( fSourceLocator != null )
|
||||
{
|
||||
if ( adapter.equals( ICSourceLocator.class ) )
|
||||
return fSourceLocator;
|
||||
if ( adapter.equals( ISourceMode.class ) )
|
||||
return fSourceLocator;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue