1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

The extension of CEditor that displays the 'Source Not Found' form.

This commit is contained in:
Mikhail Khodjaiants 2003-03-06 00:13:36 +00:00
parent a895d01561
commit 2ef508ee7f
12 changed files with 850 additions and 480 deletions

View file

@ -1,3 +1,16 @@
2003-03-05 Mikhail Khodjaiants
The extension of CEditor that displays the 'Source Not Found' form.
* plugin.properties
* plugin.xml
* CDTDebugModelPresentation.java
* AttachSourceEditor.java: removed
* AttachSourceEditorInput.java: removed
* FileNotFoundElement.java: new
* CDebugDocumentProvider.java: new
* CDebugEditor.java: new
* EditorInputDelegate.java: new
* ManageBreakpointRulerActionDelegate.java
2003-02-28 Mikhail Khodjaiants 2003-02-28 Mikhail Khodjaiants
Check if part is not null when set the selection. Check if part is not null when set the selection.
* AddExpressionActionDelegate.java * AddExpressionActionDelegate.java

View file

@ -56,6 +56,7 @@ SourcePropertyPage.name=Source Lookup
DisassemblyEditor.name=Disassembly Editor DisassemblyEditor.name=Disassembly Editor
AttachSourceEditor.name= Attach Source Editor AttachSourceEditor.name= Attach Source Editor
CDebugEditor.name= C/C++ Debug Editor
LoadSymbolsAction.label=Load Symbols LoadSymbolsAction.label=Load Symbols
SignalAction.label=Resume With Signal SignalAction.label=Resume With Signal

View file

@ -964,6 +964,22 @@
</enablement> </enablement>
</action> </action>
</editorContribution> </editorContribution>
<editorContribution
targetID="org.eclipse.cdt.debug.ui.editor.CDebugEditor"
id="org.eclipse.cdt.debug.ui.CEditor.BreakpointRulerActions">
<action
label="%Dummy.label"
class="org.eclipse.cdt.debug.internal.ui.actions.ManageBreakpointRulerActionDelegate"
actionID="RulerDoubleClick"
id="org.eclipse.cdt.debug.ui.CEditor.ManageBreakpointRulerAction">
<enablement>
<pluginState
value="activated"
id="org.eclipse.cdt.debug.ui">
</pluginState>
</enablement>
</action>
</editorContribution>
<editorContribution <editorContribution
targetID="org.eclipse.cdt.ui.editor.asm.AsmEditor" targetID="org.eclipse.cdt.ui.editor.asm.AsmEditor"
id="org.eclipse.cdt.ui.editor.asm.AsmEditor.BreakpointRulerActions"> id="org.eclipse.cdt.ui.editor.asm.AsmEditor.BreakpointRulerActions">
@ -1091,10 +1107,10 @@
id="org.eclipse.cdt.debug.ui.DisassemblyEditor"> id="org.eclipse.cdt.debug.ui.DisassemblyEditor">
</editor> </editor>
<editor <editor
name="%AttachSourceEditor.name" name="%CDebugEditor.name"
icon="icons/full/obj16/filenotfound_obj.gif" icon="icons/full/obj16/filenotfound_obj.gif"
class="org.eclipse.cdt.debug.internal.ui.editors.AttachSourceEditor" class="org.eclipse.cdt.debug.internal.ui.editors.CDebugEditor"
id="org.eclipse.cdt.debug.ui.editor.AttachSourceEditor"> id="org.eclipse.cdt.debug.ui.editor.CDebugEditor">
</editor> </editor>
</extension> </extension>

View file

@ -34,9 +34,9 @@ import org.eclipse.cdt.debug.core.model.IState;
import org.eclipse.cdt.debug.core.sourcelookup.IDisassemblyStorage; import org.eclipse.cdt.debug.core.sourcelookup.IDisassemblyStorage;
import org.eclipse.cdt.debug.internal.core.CDebugUtils; import org.eclipse.cdt.debug.internal.core.CDebugUtils;
import org.eclipse.cdt.debug.internal.core.sourcelookup.DisassemblyManager; import org.eclipse.cdt.debug.internal.core.sourcelookup.DisassemblyManager;
import org.eclipse.cdt.debug.internal.ui.editors.AttachSourceEditor; import org.eclipse.cdt.debug.internal.ui.editors.CDebugEditor;
import org.eclipse.cdt.debug.internal.ui.editors.AttachSourceEditorInput;
import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyEditorInput; import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyEditorInput;
import org.eclipse.cdt.debug.internal.ui.editors.EditorInputDelegate;
import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement; import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput; import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
@ -164,7 +164,7 @@ public class CDTDebugModelPresentation extends LabelProvider
} }
if ( element instanceof FileNotFoundElement ) if ( element instanceof FileNotFoundElement )
{ {
return new AttachSourceEditorInput( (FileNotFoundElement)element ); return new EditorInputDelegate( (FileNotFoundElement)element );
} }
return null; return null;
} }
@ -174,17 +174,24 @@ public class CDTDebugModelPresentation extends LabelProvider
*/ */
public String getEditorId( IEditorInput input, Object element ) public String getEditorId( IEditorInput input, Object element )
{ {
if ( input instanceof EditorInputDelegate )
{
if ( ((EditorInputDelegate)input).getDelegate() == null )
return CDebugEditor.EDITOR_ID;
else
return getEditorId( ((EditorInputDelegate)input).getDelegate(), element );
}
String id = null;
if ( input != null ) if ( input != null )
{ {
if ( input instanceof AttachSourceEditorInput )
{
return AttachSourceEditor.EDITOR_ID;
}
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry(); IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
IEditorDescriptor descriptor = registry.getDefaultEditor( input.getName() ); IEditorDescriptor descriptor = registry.getDefaultEditor( input.getName() );
if ( descriptor != null ) id = ( descriptor != null ) ? descriptor.getId() : CUIPlugin.EDITOR_ID;
return descriptor.getId(); }
return CUIPlugin.EDITOR_ID; if ( CUIPlugin.EDITOR_ID.equals( id ) )
{
return CDebugEditor.EDITOR_ID;
} }
return null; return null;
} }

View file

@ -6,6 +6,9 @@
package org.eclipse.cdt.debug.internal.ui.actions; package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.debug.internal.ui.editors.CDebugEditor;
import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyEditor;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.source.IVerticalRulerInfo; import org.eclipse.jface.text.source.IVerticalRulerInfo;
import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorPart;
@ -20,9 +23,7 @@ import org.eclipse.ui.texteditor.ITextEditor;
*/ */
public class ManageBreakpointRulerActionDelegate extends AbstractRulerActionDelegate public class ManageBreakpointRulerActionDelegate extends AbstractRulerActionDelegate
{ {
static final private String C_EDITOR_ID = "org.eclipse.cdt.ui.editor.CEditor"; //$NON-NLS-1$
static final private String ASM_EDITOR_ID = "org.eclipse.cdt.ui.editor.asm.AsmEditor"; //$NON-NLS-1$ static final private String ASM_EDITOR_ID = "org.eclipse.cdt.ui.editor.asm.AsmEditor"; //$NON-NLS-1$
static final private String DISASSEMBLY_EDITOR_ID = "org.eclipse.cdt.debug.ui.DisassemblyEditor"; //$NON-NLS-1$
/** /**
* @see IEditorActionDelegate#setActiveEditor(IAction, IEditorPart) * @see IEditorActionDelegate#setActiveEditor(IAction, IEditorPart)
@ -32,7 +33,10 @@ public class ManageBreakpointRulerActionDelegate extends AbstractRulerActionDele
if ( targetEditor != null ) if ( targetEditor != null )
{ {
String id = targetEditor.getSite().getId(); String id = targetEditor.getSite().getId();
if ( !id.equals( C_EDITOR_ID ) && !id.equals( ASM_EDITOR_ID ) && !id.equals( DISASSEMBLY_EDITOR_ID ) ) if ( !id.equals( CDebugEditor.EDITOR_ID ) &&
!id.equals( CUIPlugin.EDITOR_ID ) &&
!id.equals( ASM_EDITOR_ID ) &&
!id.equals( DisassemblyEditor.DISASSEMBLY_EDITOR_ID ) )
targetEditor = null; targetEditor = null;
} }
super.setActiveEditor( callerAction, targetEditor ); super.setActiveEditor( callerAction, targetEditor );

View file

@ -1,382 +0,0 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.editors;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
import org.eclipse.cdt.debug.internal.ui.wizards.AddDirectorySourceLocationWizard;
import org.eclipse.cdt.debug.internal.ui.wizards.AddSourceLocationWizard;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.sourcelookup.INewSourceLocationWizard;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.model.IPersistableSourceLocator;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Rectangle;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
/**
* Enter type comment.
*
* @since: Feb 21, 2003
*/
public class AttachSourceEditor extends EditorPart
implements IPropertyChangeListener
{
public static final String EDITOR_ID = CDebugUIPlugin.getUniqueIdentifier() + ".editor.AttachSourceEditor";
/** The horizontal scroll increment. */
private static final int HORIZONTAL_SCROLL_INCREMENT = 10;
/** The vertical scroll increment. */
private static final int VERTICAL_SCROLL_INCREMENT = 10;
private ScrolledComposite fScrolledComposite;
private Color fBackgroundColor;
private Color fForegroundColor;
private Color fSeparatorColor;
private List fBannerLabels= new ArrayList();
private List fHeaderLabels= new ArrayList();
private Font fFont;
private Button fAttachButton;
private Label fInputLabel;
/**
* Constructor for AttachSourceEditor.
*/
public AttachSourceEditor()
{
super();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
*/
public void doSave( IProgressMonitor monitor )
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#doSaveAs()
*/
public void doSaveAs()
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#gotoMarker(org.eclipse.core.resources.IMarker)
*/
public void gotoMarker( IMarker marker )
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
*/
public void init( IEditorSite site, IEditorInput input ) throws PartInitException
{
setInput( input );
setSite( site );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#isDirty()
*/
public boolean isDirty()
{
return false;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#isSaveAsAllowed()
*/
public boolean isSaveAsAllowed()
{
return false;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
public void createPartControl( Composite parent )
{
Display display = parent.getDisplay();
fBackgroundColor = display.getSystemColor( SWT.COLOR_LIST_BACKGROUND );
fForegroundColor = display.getSystemColor( SWT.COLOR_LIST_FOREGROUND );
fSeparatorColor = new Color( display, 152, 170, 203 );
JFaceResources.getFontRegistry().addListener( this );
fScrolledComposite = new ScrolledComposite( parent, SWT.H_SCROLL | SWT.V_SCROLL );
fScrolledComposite.setAlwaysShowScrollBars( false );
fScrolledComposite.setExpandHorizontal( true );
fScrolledComposite.setExpandVertical( true );
fScrolledComposite.addDisposeListener(
new DisposeListener()
{
public void widgetDisposed( DisposeEvent e )
{
JFaceResources.getFontRegistry().removeListener( AttachSourceEditor.this );
fScrolledComposite = null;
fSeparatorColor.dispose();
fSeparatorColor = null;
fBannerLabels.clear();
fHeaderLabels.clear();
if ( fFont != null )
{
fFont.dispose();
fFont = null;
}
}
} );
fScrolledComposite.addControlListener(
new ControlListener()
{
public void controlMoved( ControlEvent e )
{
}
public void controlResized( ControlEvent e )
{
Rectangle clientArea = fScrolledComposite.getClientArea();
ScrollBar verticalBar = fScrolledComposite.getVerticalBar();
verticalBar.setIncrement( VERTICAL_SCROLL_INCREMENT );
verticalBar.setPageIncrement( clientArea.height - verticalBar.getIncrement() );
ScrollBar horizontalBar = fScrolledComposite.getHorizontalBar();
horizontalBar.setIncrement( HORIZONTAL_SCROLL_INCREMENT );
horizontalBar.setPageIncrement( clientArea.width - horizontalBar.getIncrement() );
}
});
Composite composite = createComposite( fScrolledComposite );
composite.setLayout( new GridLayout() );
createTitleLabel( composite, "C/C++ File Editor" );
createLabel( composite, null );
createLabel( composite, null );
createHeadingLabel( composite, "Source not found" );
Composite separator = createCompositeSeparator( composite );
GridData data = new GridData( GridData.FILL_HORIZONTAL );
data.heightHint = 2;
separator.setLayoutData( data );
fInputLabel = createLabel( composite, "" );
createLabel( composite, "You can attach the source location by pressing the button below:" );
createLabel( composite, null );
fAttachButton = createButton( composite, "&Attach Source..." );
fAttachButton.addSelectionListener(
new SelectionListener()
{
public void widgetSelected( SelectionEvent event )
{
AttachSourceEditor.this.attachSourceLocation();
}
public void widgetDefaultSelected( SelectionEvent e )
{
}
} );
separator = createCompositeSeparator( composite );
data = new GridData( GridData.FILL_HORIZONTAL );
data.heightHint = 2;
separator.setLayoutData( data );
fScrolledComposite.setContent( composite );
fScrolledComposite.setMinSize( composite.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
if ( getEditorInput() != null )
{
setInputLabelText( getEditorInput().getName() );
}
}
private Composite createComposite( Composite parent )
{
Composite composite = new Composite( parent, SWT.NONE );
composite.setBackground( fBackgroundColor );
return composite;
}
private Label createLabel( Composite parent, String text )
{
Label label = new Label( parent, SWT.NONE );
if ( text != null )
label.setText( text );
label.setBackground( fBackgroundColor );
label.setForeground( fForegroundColor );
return label;
}
private Label createTitleLabel( Composite parent, String text )
{
Label label = new Label( parent, SWT.NONE );
if ( text != null )
label.setText( text );
label.setBackground( fBackgroundColor );
label.setForeground( fForegroundColor );
label.setFont( JFaceResources.getHeaderFont() );
fHeaderLabels.add( label );
return label;
}
private Label createHeadingLabel( Composite parent, String text )
{
Label label = new Label( parent, SWT.NONE );
if ( text != null )
label.setText( text );
label.setBackground( fBackgroundColor );
label.setForeground( fForegroundColor );
label.setFont( JFaceResources.getBannerFont() );
fBannerLabels.add( label );
return label;
}
private Composite createCompositeSeparator( Composite parent )
{
Composite composite = new Composite( parent, SWT.NONE );
composite.setBackground( fSeparatorColor );
return composite;
}
private Button createButton( Composite parent, String text )
{
Button button = new Button( parent, SWT.FLAT );
button.setBackground( fBackgroundColor );
button.setForeground( fForegroundColor );
if ( text != null )
button.setText( text );
return button;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#setFocus()
*/
public void setFocus()
{
if ( fAttachButton != null )
fAttachButton.setFocus();
}
/* (non-Javadoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange( PropertyChangeEvent event )
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
*/
protected void setInput( IEditorInput input )
{
super.setInput( input );
if ( input != null && fInputLabel != null )
setInputLabelText( getEditorInput().getName() );
}
private void setInputLabelText( String inputName )
{
fInputLabel.setText( MessageFormat.format( "There is no source for the file {0}", new String[] { inputName } ) );
}
protected void attachSourceLocation()
{
if ( getEditorInput() != null && getEditorInput().getAdapter( FileNotFoundElement.class ) != null )
{
FileNotFoundElement element = (FileNotFoundElement)getEditorInput().getAdapter( FileNotFoundElement.class );
if ( element.getLaunch() != null && element.getLaunch().getSourceLocator() instanceof IAdaptable )
{
ILaunch launch = element.getLaunch();
ICSourceLocator locator = (ICSourceLocator)((IAdaptable)element.getLaunch().getSourceLocator()).getAdapter( ICSourceLocator.class );
if ( locator != null )
{
IPath path = new Path( element.getName() );
INewSourceLocationWizard wizard = null;
if ( path.isAbsolute() )
{
path = path.removeLastSegments( 1 );
wizard = new AddDirectorySourceLocationWizard( path );
}
else
{
wizard = new AddSourceLocationWizard( locator.getSourceLocations() );
}
WizardDialog dialog = new WizardDialog( CDebugUIPlugin.getActiveWorkbenchShell(), wizard );
if ( dialog.open() == Window.OK )
{
ICSourceLocation[] locations = locator.getSourceLocations();
ArrayList list = new ArrayList( Arrays.asList( locations ) );
list.add( wizard.getSourceLocation() );
locator.setSourceLocations( (ICSourceLocation[])list.toArray( new ICSourceLocation[list.size()] ) );
if ( locator instanceof IPersistableSourceLocator )
{
ILaunchConfiguration configuration = launch.getLaunchConfiguration();
saveChanges( configuration, (IPersistableSourceLocator)launch.getSourceLocator() );
}
}
}
}
}
}
protected void saveChanges( ILaunchConfiguration configuration, IPersistableSourceLocator locator )
{
try
{
ILaunchConfigurationWorkingCopy copy = configuration.copy( configuration.getName() );
copy.setAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, locator.getMemento() );
copy.doSave();
}
catch( CoreException e )
{
CDebugUIPlugin.errorDialog( e.getMessage(), (IStatus)null );
}
}
}

View file

@ -1,78 +0,0 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.editors;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IPersistableElement;
/**
* Enter type comment.
*
* @since: Feb 21, 2003
*/
public class AttachSourceEditorInput implements IEditorInput
{
private FileNotFoundElement fElement = null;
/**
* Constructor for AttachSourceEditorInput.
*/
public AttachSourceEditorInput( FileNotFoundElement element )
{
fElement = element;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorInput#exists()
*/
public boolean exists()
{
return true;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorInput#getImageDescriptor()
*/
public ImageDescriptor getImageDescriptor()
{
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorInput#getName()
*/
public String getName()
{
return ( fElement != null ) ? fElement.getName() : "";
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorInput#getPersistable()
*/
public IPersistableElement getPersistable()
{
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorInput#getToolTipText()
*/
public String getToolTipText()
{
return null;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter( Class adapter )
{
if ( adapter.equals( FileNotFoundElement.class ) )
return fElement;
return null;
}
}

View file

@ -0,0 +1,93 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.editors;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.internal.ui.editor.CDocumentProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.source.IAnnotationModel;
/**
*
* Enter type comment.
*
* @since Mar 4, 2003
*/
public class CDebugDocumentProvider extends CDocumentProvider
{
/**
* @see org.eclipse.ui.texteditor.AbstractDocumentProvider#createDocument(Object)
*/
protected IDocument createDocument( Object element ) throws CoreException
{
if ( element instanceof EditorInputDelegate )
{
if ( ((EditorInputDelegate)element).getDelegate() != null )
{
return super.createDocument( ((EditorInputDelegate)element).getDelegate() );
}
else
{
IDocument document = null;
IStorage storage = ((EditorInputDelegate)element).getStorage();
if ( storage != null )
{
document = new CDocument();
setDocumentContent( document, storage.getContents(), getDefaultEncoding() );
}
else
{
return null;
}
if ( document != null)
{
IDocumentPartitioner partitioner= CUIPlugin.getDefault().getTextTools().createDocumentPartitioner();
partitioner.connect( document );
document.setDocumentPartitioner( partitioner );
}
return document;
}
}
return super.createDocument( element );
}
/**
* @see org.eclipse.ui.texteditor.IDocumentProviderExtension#getStatus(Object)
*/
public IStatus getStatus( Object element )
{
if ( element instanceof EditorInputDelegate )
{
if ( ((EditorInputDelegate)element).getDelegate() != null )
{
return super.getStatus( ((EditorInputDelegate)element).getDelegate() );
}
else
{
return createFileNotFoundStatus( ((EditorInputDelegate)element).getElement() );
}
}
return super.getStatus( element );
}
private IStatus createFileNotFoundStatus( FileNotFoundElement element )
{
return new Status( IStatus.INFO, CDebugUIPlugin.getUniqueIdentifier(), 0, "", null );
}
protected IAnnotationModel createAnnotationModel( Object element ) throws CoreException
{
if ( element instanceof EditorInputDelegate && ((EditorInputDelegate)element).getDelegate() != null )
return super.createAnnotationModel( ((EditorInputDelegate)element).getDelegate() );
return super.createAnnotationModel( element );
}
}

View file

@ -0,0 +1,495 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.editors;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
import org.eclipse.cdt.debug.internal.ui.wizards.AddDirectorySourceLocationWizard;
import org.eclipse.cdt.debug.internal.ui.wizards.AddSourceLocationWizard;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.sourcelookup.INewSourceLocationWizard;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.debug.core.ILaunch;
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.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.IDebugView;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Rectangle;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.part.FileEditorInput;
/**
* Enter type comment.
*
* @since: Feb 26, 2003
*/
public class CDebugEditor extends CEditor
{
public class AttachSourceForm implements IPropertyChangeListener
{
/** The horizontal scroll increment. */
private static final int HORIZONTAL_SCROLL_INCREMENT = 10;
/** The vertical scroll increment. */
private static final int VERTICAL_SCROLL_INCREMENT = 10;
/** The form's root widget */
private Font fFont;
/** The form's root widget */
private ScrolledComposite fScrolledComposite;
/** The background color */
private Color fBackgroundColor;
/** The foreground color */
private Color fForegroundColor;
/** The separator's color */
private Color fSeparatorColor;
/** The form headers */
private List fHeaderLabels = new ArrayList();
/** The form banners */
private List fBannerLabels = new ArrayList();
/** The form text */
private Label fInputLabel;
/** The attach source button */
private Button fAttachButton = null;
/** The preference change listener */
private IPropertyChangeListener fPropertyChangeListener;
private IEditorInput fInput = null;
public AttachSourceForm( Composite parent, IEditorInput input )
{
Display display = parent.getDisplay();
fBackgroundColor = display.getSystemColor( SWT.COLOR_LIST_BACKGROUND );
fForegroundColor = display.getSystemColor( SWT.COLOR_LIST_FOREGROUND );
fSeparatorColor = new Color( display, 152, 170, 203 );
JFaceResources.getFontRegistry().addListener( AttachSourceForm.this );
fScrolledComposite = new ScrolledComposite( parent, SWT.H_SCROLL | SWT.V_SCROLL );
fScrolledComposite.setAlwaysShowScrollBars( false );
fScrolledComposite.setExpandHorizontal( true );
fScrolledComposite.setExpandVertical( true );
fScrolledComposite.addDisposeListener(
new DisposeListener()
{
public void widgetDisposed( DisposeEvent e )
{
JFaceResources.getFontRegistry().removeListener( AttachSourceForm.this );
setScrolledComposite( null );
getSeparatorColor().dispose();
setSeparatorColor( null );
getBannerLabels().clear();
getHeaderLabels().clear();
if ( getFont() != null )
{
getFont().dispose();
setFont( null );
}
}
} );
fScrolledComposite.addControlListener(
new ControlListener()
{
public void controlMoved( ControlEvent e )
{
}
public void controlResized(ControlEvent e)
{
Rectangle clientArea = getScrolledComposite().getClientArea();
ScrollBar verticalBar = getScrolledComposite().getVerticalBar();
verticalBar.setIncrement( VERTICAL_SCROLL_INCREMENT );
verticalBar.setPageIncrement( clientArea.height - verticalBar.getIncrement() );
ScrollBar horizontalBar = getScrolledComposite().getHorizontalBar();
horizontalBar.setIncrement( HORIZONTAL_SCROLL_INCREMENT );
horizontalBar.setPageIncrement( clientArea.width - horizontalBar.getIncrement() );
}
} );
Composite composite = createComposite( fScrolledComposite );
composite.setLayout( new GridLayout() );
createTitleLabel( composite, "C/C++ File Editor" );
createLabel( composite, null );
createLabel( composite, null );
createHeadingLabel( composite, "Source not found" );
Composite separator = createCompositeSeparator( composite );
GridData data = new GridData( GridData.FILL_HORIZONTAL );
data.heightHint = 2;
separator.setLayoutData( data );
fInputLabel = createLabel( composite, "" );
createLabel( composite, "You can attach a new source location by pressing the button below:" );
createLabel( composite, null );
fAttachButton = createButton( composite, "&Attach Source..." );
fAttachButton.addSelectionListener(
new SelectionListener()
{
public void widgetSelected( SelectionEvent event )
{
attachSourceLocation();
}
public void widgetDefaultSelected( SelectionEvent e )
{
}
} );
separator = createCompositeSeparator( composite );
data = new GridData( GridData.FILL_HORIZONTAL );
data.heightHint = 2;
separator.setLayoutData( data );
fScrolledComposite.setContent( composite );
fScrolledComposite.setMinSize( composite.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
if ( getEditorInput() != null )
{
setInputLabelText( getEditorInput() );
}
fInput = input;
}
private Composite createComposite( Composite parent )
{
Composite composite = new Composite( parent, SWT.NONE );
composite.setBackground( fBackgroundColor );
return composite;
}
private Label createLabel( Composite parent, String text )
{
Label label = new Label( parent, SWT.NONE );
if ( text != null )
label.setText( text );
label.setBackground( fBackgroundColor );
label.setForeground( fForegroundColor );
return label;
}
private Label createTitleLabel( Composite parent, String text )
{
Label label = new Label( parent, SWT.NONE );
if ( text != null )
label.setText( text );
label.setBackground( fBackgroundColor );
label.setForeground( fForegroundColor );
label.setFont( JFaceResources.getHeaderFont() );
fHeaderLabels.add( label );
return label;
}
private Label createHeadingLabel( Composite parent, String text )
{
Label label = new Label( parent, SWT.NONE );
if ( text != null )
label.setText( text );
label.setBackground( fBackgroundColor );
label.setForeground( fForegroundColor );
label.setFont( JFaceResources.getBannerFont() );
fBannerLabels.add( label );
return label;
}
private Composite createCompositeSeparator( Composite parent )
{
Composite composite = new Composite( parent, SWT.NONE );
composite.setBackground( fSeparatorColor );
return composite;
}
private Button createButton( Composite parent, String text )
{
Button button = new Button( parent, SWT.FLAT );
button.setBackground( fBackgroundColor );
button.setForeground( fForegroundColor );
if ( text != null )
button.setText( text );
return button;
}
/* (non-Javadoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange( PropertyChangeEvent event )
{
for ( Iterator iterator = fBannerLabels.iterator(); iterator.hasNext(); )
{
Label label = (Label)iterator.next();
label.setFont( JFaceResources.getBannerFont() );
}
for ( Iterator iterator = fHeaderLabels.iterator(); iterator.hasNext(); )
{
Label label = (Label)iterator.next();
label.setFont( JFaceResources.getHeaderFont() );
}
Control control = fScrolledComposite.getContent();
fScrolledComposite.setMinSize( control.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
fScrolledComposite.setContent( control );
fScrolledComposite.layout( true );
fScrolledComposite.redraw();
}
private void setInputLabelText( IEditorInput input )
{
FileNotFoundElement element = (FileNotFoundElement)input.getAdapter( FileNotFoundElement.class );
if ( element != null )
{
IPath path = element.getFullPath();
String message = "";
if ( path.isAbsolute() )
message = MessageFormat.format( "The file ''{0}'' does not exist.", new String[] { element.getFullPath().toOSString() } );
else
message = MessageFormat.format( "The file ''{0}'' not found.", new String[] { element.getFullPath().toOSString() } );
fInputLabel.setText( message );
}
}
protected ScrolledComposite getScrolledComposite()
{
return fScrolledComposite;
}
protected void setScrolledComposite( ScrolledComposite scrolledComposite )
{
fScrolledComposite = scrolledComposite;
}
protected Color getSeparatorColor()
{
return fSeparatorColor;
}
protected void setSeparatorColor( Color separatorColor )
{
fSeparatorColor = separatorColor;
}
protected List getBannerLabels()
{
return fBannerLabels;
}
protected void setBannerLabels( List bannerLabels )
{
fBannerLabels = bannerLabels;
}
protected List getHeaderLabels()
{
return fHeaderLabels;
}
protected void setHeaderLabels( List headerLabels )
{
fHeaderLabels = headerLabels;
}
protected Font getFont()
{
return fFont;
}
protected void setFont( Font font )
{
fFont = font;
}
public Control getControl()
{
return fScrolledComposite;
}
public IEditorInput getInput()
{
return fInput;
}
}
public static final String EDITOR_ID = CDebugUIPlugin.getUniqueIdentifier() + ".editor.CDebugEditor";
private AttachSourceForm fAttachSourceForm = null;
/**
* Constructor for CDebugEditor.
*/
public CDebugEditor()
{
super();
setDocumentProvider( CDebugUIPlugin.getDefault().getDocumentProvider() );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
public void createPartControl( Composite parent )
{
super.createPartControl( parent );
}
/* (non-Javadoc)
* @see org.eclipse.ui.texteditor.AbstractTextEditor#doSetInput(org.eclipse.ui.IEditorInput)
*/
protected void doSetInput( IEditorInput input ) throws CoreException
{
IEditorInput newInput = input;
if ( input instanceof EditorInputDelegate && ((EditorInputDelegate)input).getDelegate() != null )
newInput = ((EditorInputDelegate)input).getDelegate();
super.doSetInput( newInput );
}
protected void attachSourceLocation()
{
if ( getEditorInput() != null && getEditorInput().getAdapter( FileNotFoundElement.class ) != null )
{
FileNotFoundElement element = (FileNotFoundElement)getEditorInput().getAdapter( FileNotFoundElement.class );
if ( element.getLaunch() != null && element.getLaunch().getSourceLocator() instanceof IAdaptable )
{
ILaunch launch = element.getLaunch();
ICSourceLocator locator = (ICSourceLocator)((IAdaptable)element.getLaunch().getSourceLocator()).getAdapter( ICSourceLocator.class );
if ( locator != null )
{
IPath path = element.getFullPath();
INewSourceLocationWizard wizard = null;
if ( path.isAbsolute() )
{
path = path.removeLastSegments( 1 );
wizard = new AddDirectorySourceLocationWizard( path );
}
else
{
wizard = new AddSourceLocationWizard( locator.getSourceLocations() );
}
WizardDialog dialog = new WizardDialog( CDebugUIPlugin.getActiveWorkbenchShell(), wizard );
if ( dialog.open() == Window.OK )
{
ICSourceLocation[] locations = locator.getSourceLocations();
ArrayList list = new ArrayList( Arrays.asList( locations ) );
list.add( wizard.getSourceLocation() );
locator.setSourceLocations( (ICSourceLocation[])list.toArray( new ICSourceLocation[list.size()] ) );
if ( locator instanceof IPersistableSourceLocator )
{
ILaunchConfiguration configuration = launch.getLaunchConfiguration();
saveChanges( configuration, (IPersistableSourceLocator)launch.getSourceLocator() );
}
Object newElement = locator.getSourceElement( element.getStackFrame() );
IEditorInput newInput = null;
if ( newElement instanceof IFile )
{
newInput = new FileEditorInput( (IFile)newElement );
}
else if ( newElement instanceof FileStorage )
{
newInput = new ExternalEditorInput( (IStorage)newElement );
}
((EditorInputDelegate)getEditorInput()).setDelegate( newInput );
resetInput( element.getStackFrame() );
}
}
}
}
}
private void resetInput( IStackFrame frame )
{
setInput( getEditorInput() );
IViewPart view = CDebugUIPlugin.getActivePage().findView( IDebugUIConstants.ID_DEBUG_VIEW );
if ( view instanceof IDebugView )
{
((IDebugView)view).getViewer().setSelection( new StructuredSelection( frame ) );
}
}
protected void saveChanges( ILaunchConfiguration configuration, IPersistableSourceLocator locator )
{
try
{
ILaunchConfigurationWorkingCopy copy = configuration.copy( configuration.getName() );
copy.setAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, locator.getMemento() );
copy.doSave();
}
catch( CoreException e )
{
CDebugUIPlugin.errorDialog( e.getMessage(), (IStatus)null );
}
}
/**
* @see org.eclipse.ui.texteditor.StatusTextEditor#createStatusControl(Composite, IStatus)
*/
protected Control createStatusControl( Composite parent, IStatus status )
{
fAttachSourceForm = new AttachSourceForm( parent, getEditorInput() );
return fAttachSourceForm.getControl();
}
/**
* @see org.eclipse.ui.texteditor.StatusTextEditor#updatePartControl(IEditorInput)
*/
public void updatePartControl( IEditorInput input )
{
if ( fAttachSourceForm != null )
{
if ( fAttachSourceForm.getInput() != null && !fAttachSourceForm.getInput().equals( input ) )
{
fAttachSourceForm = null;
super.updatePartControl( input );
}
}
else
super.updatePartControl( input );
}
}

View file

@ -0,0 +1,173 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.editors;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.IStorageEditorInput;
/**
*
* Enter type comment.
*
* @since Mar 4, 2003
*/
public class EditorInputDelegate implements IEditorInput
{
public static final int TYPE_ATTACH_SOURCE = 0;
public static final int TYPE_WORKSPACE_FILE = 1;
public static final int TYPE_EXTERNAL_FILE = 2;
private int fType = TYPE_ATTACH_SOURCE;
private IEditorInput fDelegate = null;
private FileNotFoundElement fElement = null;
/**
* Constructor for EditorInputDelegate.
*/
public EditorInputDelegate( FileNotFoundElement element )
{
fElement = element;
}
/**
* @see org.eclipse.ui.IEditorInput#exists()
*/
public boolean exists()
{
if ( fDelegate != null )
return fDelegate.exists();
return true;
}
/**
* @see org.eclipse.ui.IEditorInput#getImageDescriptor()
*/
public ImageDescriptor getImageDescriptor()
{
if ( fDelegate != null )
return fDelegate.getImageDescriptor();
return null;
}
/**
* @see org.eclipse.ui.IEditorInput#getName()
*/
public String getName()
{
if ( fDelegate != null )
return fDelegate.getName();
return ( fElement != null ) ? fElement.getName() : "";
}
/**
* @see org.eclipse.ui.IEditorInput#getPersistable()
*/
public IPersistableElement getPersistable()
{
if ( fDelegate != null )
return fDelegate.getPersistable();
return null;
}
/**
* @see org.eclipse.ui.IEditorInput#getToolTipText()
*/
public String getToolTipText()
{
if ( fDelegate != null )
return fDelegate.getToolTipText();
return "";
}
/**
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
*/
public Object getAdapter( Class adapter )
{
if ( adapter.equals( FileNotFoundElement.class ) )
return fElement;
if ( getDelegate() != null )
return getDelegate().getAdapter( adapter );
return null;
}
public int getType()
{
return fType;
}
public void setType( int type )
{
fType = type;
}
public IEditorInput getDelegate()
{
return fDelegate;
}
public void setDelegate( IEditorInput input )
{
fDelegate = input;
}
public IStorage getStorage() throws CoreException
{
if ( getDelegate() instanceof IStorageEditorInput )
return ((IStorageEditorInput)getDelegate()).getStorage();
return getDummyStorage();
}
private IStorage getDummyStorage()
{
return new IStorage()
{
public InputStream getContents() throws CoreException
{
return new ByteArrayInputStream( new byte[0] );
}
public IPath getFullPath()
{
if ( getElement() != null )
return getElement().getFullPath();
return null;
}
public String getName()
{
if ( getElement() != null )
return getElement().getName();
return "";
}
public boolean isReadOnly()
{
return true;
}
public Object getAdapter( Class adapter )
{
if ( adapter.equals( IStorage.class ) )
return this;
return null;
}
};
}
protected FileNotFoundElement getElement()
{
return fElement;
}
}

View file

@ -6,11 +6,13 @@
package org.eclipse.cdt.debug.internal.ui.editors; package org.eclipse.cdt.debug.internal.ui.editors;
import org.eclipse.cdt.debug.core.model.IStackFrameInfo; import org.eclipse.cdt.debug.core.model.IStackFrameInfo;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IStackFrame;
/** /**
* Enter type comment. * The source locator creates an instance of this class if it cannot find the file specified in stack frame.
* *
* @since: Feb 21, 2003 * @since: Feb 21, 2003
*/ */
@ -26,14 +28,24 @@ public class FileNotFoundElement
fStackFrame = stackFrame; fStackFrame = stackFrame;
} }
public String getName() public IPath getFullPath()
{ {
IStackFrameInfo frameInfo = (IStackFrameInfo)fStackFrame.getAdapter( IStackFrameInfo.class ); IStackFrameInfo frameInfo = (IStackFrameInfo)fStackFrame.getAdapter( IStackFrameInfo.class );
if ( frameInfo != null && frameInfo.getFile() != null && frameInfo.getFile().length() > 0 ) if ( frameInfo != null && frameInfo.getFile() != null && frameInfo.getFile().length() > 0 )
{ {
return frameInfo.getFile(); Path path = new Path( frameInfo.getFile() );
if ( path.isValidPath( frameInfo.getFile() ) )
{
return path;
}
} }
return ""; return null;
}
public String getName()
{
IPath path = getFullPath();
return ( path != null ) ? path.lastSegment() : "";
} }
public IStackFrame getStackFrame() public IStackFrame getStackFrame()

View file

@ -13,6 +13,7 @@ import org.eclipse.cdt.debug.core.sourcelookup.IDisassemblyStorage;
import org.eclipse.cdt.debug.internal.ui.CDTDebugModelPresentation; import org.eclipse.cdt.debug.internal.ui.CDTDebugModelPresentation;
import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry; import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
import org.eclipse.cdt.debug.internal.ui.ColorManager; import org.eclipse.cdt.debug.internal.ui.ColorManager;
import org.eclipse.cdt.debug.internal.ui.editors.CDebugDocumentProvider;
import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyDocumentProvider; import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyDocumentProvider;
import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyEditorInput; import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyEditorInput;
import org.eclipse.cdt.debug.internal.ui.preferences.CDebugPreferencePage; import org.eclipse.cdt.debug.internal.ui.preferences.CDebugPreferencePage;
@ -75,6 +76,9 @@ public class CDebugUIPlugin extends AbstractUIPlugin
// Document provider for disassembly editor // Document provider for disassembly editor
private DisassemblyDocumentProvider fDisassemblyDocumentProvider = null; private DisassemblyDocumentProvider fDisassemblyDocumentProvider = null;
// Document provider for C/C++ debug editor
private CDebugDocumentProvider fDocumentProvider;
/** /**
* The constructor. * The constructor.
*/ */
@ -497,4 +501,16 @@ public class CDebugUIPlugin extends AbstractUIPlugin
display.asyncExec( runnable ); display.asyncExec( runnable );
} }
} }
/**
* Returns the used document provider
*/
public CDebugDocumentProvider getDocumentProvider()
{
if (fDocumentProvider == null)
{
fDocumentProvider = new CDebugDocumentProvider();
}
return fDocumentProvider;
}
} }