mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 09:46:02 +02:00
Implementation of source locator.
This commit is contained in:
parent
14d1b3cd6f
commit
e9d6f16904
2 changed files with 225 additions and 0 deletions
|
@ -325,5 +325,13 @@
|
||||||
id="org.eclipse.cdt.debug.internal.ui.editors.DebugTextHover">
|
id="org.eclipse.cdt.debug.internal.ui.editors.DebugTextHover">
|
||||||
</textHover>
|
</textHover>
|
||||||
</extension>
|
</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>
|
||||||
|
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
/*
|
||||||
|
*(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.IStackFrameInfo;
|
||||||
|
import org.eclipse.cdt.debug.core.sourcelookup.CSourceLocator;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
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_JAVA_SOURCE_LOCATOR = CDebugUIPlugin.getUniqueIdentifier() + ".cSourceLocator"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The project being debugged.
|
||||||
|
*/
|
||||||
|
private IProject fProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
private boolean fAllowedToAsk;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeFromMemento(String)
|
||||||
|
*/
|
||||||
|
public void initializeFromMemento( String memento ) throws CoreException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(ILaunchConfiguration)
|
||||||
|
*/
|
||||||
|
public void initializeDefaults( ILaunchConfiguration configuration ) throws CoreException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue