1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 09:25:31 +02:00

Fix for bug 82800: Make "Resume At Line" action retargettable.

This commit is contained in:
Mikhail Khodjaiants 2005-01-18 23:24:45 +00:00
parent 03cba52fca
commit 3d4951f408
14 changed files with 889 additions and 592 deletions

View file

@ -1,3 +1,19 @@
2005-01-18 Mikhail Khodjaiants
Fix for bug 82800: Make "Resume At Line" action retargettable.
* plugin.xml
* CDebugImages.java
* EvaluationContextManager.java: new
* ActionMessages.properties
* IResumeAtLineTarget.java: new
* ResumeAtLineActionDelegate.java
* ResumeAtLineAdapter.java: new
* RetargetAction.java: new
* RetargetResumeAtLineAction.java: new
* RetargettableActionAdapterFactory.java
* CDebugUIPlugin.java
* JumpToLineActionDelegate.java: removed
* RunToLineActionDelegate.java: removed
2005-01-12 Mikhail Khodjaiants
Bug 73168: Use memory view provided by Eclipse platform in CDT.
Removed the old memory view.

View file

@ -130,9 +130,9 @@
id="org.eclipse.ui.run">
</menu>
<action
id="org.eclipse.cdt.debug.internal.ui.actions.JumpToLineActionDelegate"
id="org.eclipse.cdt.debug.ui.actions.ResumeAtLine"
hoverIcon="icons/full/clcl16/jump_co.gif"
class="org.eclipse.cdt.debug.internal.ui.actions.ResumeAtLineActionDelegate"
class="org.eclipse.cdt.debug.internal.ui.actions.RetargetResumeAtLineAction"
disabledIcon="icons/full/dlcl16/jump_co.gif"
enablesFor="1"
icon="icons/full/elcl16/jump_co.gif"
@ -256,6 +256,14 @@
<viewerContribution
targetID="#CEditorContext"
id="org.eclipse.cdt.debug.ui.CEditorPopupActions">
<visibility>
<and>
<systemProperty
value="true"
name="org.eclipse.cdt.debug.ui.debuggerActive"/>
<objectClass name="org.eclipse.jface.text.ITextSelection"/>
</and>
</visibility>
<action
label="%AddExpressionAction.label"
icon="icons/full/etool16/watch_exp.gif"
@ -268,31 +276,18 @@
label="%JumpToLineAction.label"
icon="icons/full/clcl16/jump_co.gif"
helpContextId="jump_to_line_action_context"
class="org.eclipse.cdt.debug.internal.ui.actions.JumpToLineActionDelegate"
class="org.eclipse.cdt.debug.internal.ui.actions.ResumeAtLineActionDelegate"
menubarPath="additions"
enablesFor="1"
id="org.eclipse.cdt.debug.internal.ui.actions.JumpToLineActionDelegate">
<enablement>
<pluginState
value="activated"
id="org.eclipse.cdt.debug.ui">
</pluginState>
</enablement>
</action>
<action
label="%RunToLineAction.label"
icon="icons/full/clcl16/runtoline_co.gif"
helpContextId="run_to_line_action_context"
class="org.eclipse.cdt.debug.internal.ui.actions.RunToLineActionDelegate"
label="%RunToLineAction.label"
definitionId="org.eclipse.debug.ui.commands.RunToLine"
class="org.eclipse.debug.ui.actions.RunToLineActionDelegate"
menubarPath="additions"
enablesFor="1"
id="org.eclipse.cdt.debug.internal.ui.actions.RunToLineActionDelegate">
<enablement>
<pluginState
value="activated"
id="org.eclipse.cdt.debug.ui">
</pluginState>
</enablement>
id="org.eclipse.cdt.debug.ui.actions.popup.RunToLine">
</action>
</viewerContribution>
<objectContribution
@ -349,6 +344,14 @@
<viewerContribution
targetID="#ASMEditorContext"
id="org.eclipse.cdt.debug.ui.AsmEditorPopupActions">
<visibility>
<and>
<objectClass name="org.eclipse.jface.text.ITextSelection"/>
<systemProperty
value="true"
name="org.eclipse.cdt.debug.ui.debuggerActive"/>
</and>
</visibility>
<action
label="%AddExpressionAction.label"
icon="icons/full/etool16/watch_exp.gif"
@ -361,31 +364,18 @@
label="%JumpToLineAction.label"
icon="icons/full/clcl16/jump_co.gif"
helpContextId="jump_to_line_action_context"
class="org.eclipse.cdt.debug.internal.ui.actions.JumpToLineActionDelegate"
class="org.eclipse.cdt.debug.internal.ui.actions.ResumeAtLineActionDelegate"
menubarPath="additions"
enablesFor="1"
id="org.eclipse.cdt.debug.internal.ui.actions.JumpToLineActionDelegate">
<enablement>
<pluginState
value="activated"
id="org.eclipse.cdt.debug.ui">
</pluginState>
</enablement>
</action>
<action
label="%RunToLineAction.label"
icon="icons/full/clcl16/runtoline_co.gif"
helpContextId="run_to_line_action_context"
class="org.eclipse.cdt.debug.internal.ui.actions.RunToLineActionDelegate"
label="%RunToLineAction.label"
definitionId="org.eclipse.debug.ui.commands.RunToLine"
class="org.eclipse.debug.ui.actions.RunToLineActionDelegate"
menubarPath="additions"
enablesFor="1"
id="org.eclipse.cdt.debug.internal.ui.actions.RunToLineActionDelegate">
<enablement>
<pluginState
value="activated"
id="org.eclipse.cdt.debug.ui">
</pluginState>
</enablement>
id="org.eclipse.cdt.debug.ui.actions.popup.RunToLine">
</action>
</viewerContribution>
<objectContribution
@ -1093,6 +1083,7 @@
<adapter
type="org.eclipse.debug.ui.actions.IRunToLineTarget">
</adapter>
<adapter type="org.eclipse.cdt.debug.internal.ui.actions.IResumeAtLineTarget"/>
</factory>
<factory
class="org.eclipse.cdt.debug.internal.ui.actions.RetargettableActionAdapterFactory"
@ -1103,6 +1094,7 @@
<adapter
type="org.eclipse.debug.ui.actions.IRunToLineTarget">
</adapter>
<adapter type="org.eclipse.cdt.debug.internal.ui.actions.IResumeAtLineTarget"/>
</factory>
<factory
class="org.eclipse.cdt.debug.internal.ui.actions.RetargettableActionAdapterFactory"
@ -1113,6 +1105,7 @@
<adapter
type="org.eclipse.debug.ui.actions.IRunToLineTarget">
</adapter>
<adapter type="org.eclipse.cdt.debug.internal.ui.actions.IResumeAtLineTarget"/>
</factory>
<factory
class="org.eclipse.cdt.debug.internal.ui.actions.RetargettableActionAdapterFactory"

View file

@ -111,6 +111,7 @@ public class CDebugImages
public static final String IMG_LCL_LOAD_ALL_SYMBOLS = NAME_PREFIX + "load_all_symbols_co.gif"; //$NON-NLS-1$
public static final String IMG_LCL_CAST_TO_TYPE = NAME_PREFIX + "casttotype_co.gif"; //$NON-NLS-1$
public static final String IMG_LCL_DISPLAY_AS_ARRAY = NAME_PREFIX + "showasarray_co.gif"; //$NON-NLS-1$
public static final String IMG_LCL_RESUME_AT_LINE = NAME_PREFIX + "jump_co.gif"; //$NON-NLS-1$
public static final String IMG_TOOLS_ADD_DIR_SOURCE_LOCATION = NAME_PREFIX + "adddirsource_wiz.gif"; //$NON-NLS-1$
public static final String IMG_TOOLS_ADD_PRJ_SOURCE_LOCATION = NAME_PREFIX + "addprjsource_wiz.gif"; //$NON-NLS-1$
@ -127,6 +128,7 @@ public class CDebugImages
private static final String T_WIZBAN = "wizban"; //$NON-NLS-1$
private static final String T_LCL = "lcl16"; //$NON-NLS-1$
private static final String T_CLCL = "clcl16"; //$NON-NLS-1$
private static final String T_DLCL = "dlcl16"; //$NON-NLS-1$
private static final String T_CTOOL = "ctool16"; //$NON-NLS-1$
// private static final String T_CVIEW = "cview16"; //$NON-NLS-1$
// private static final String T_DTOOL = "dtool16"; //$NON-NLS-1$
@ -174,13 +176,15 @@ public class CDebugImages
public static final ImageDescriptor DESC_OBJS_SIGNAL = createManaged( T_OBJ, IMG_OBJS_SIGNAL );
public static final ImageDescriptor DESC_OBJS_WORKSPACE_SOURCE_FILE = createManaged( T_OBJ, IMG_OBJS_WORKSPACE_SOURCE_FILE );
public static final ImageDescriptor DESC_OBJS_EXTERNAL_SOURCE_FILE = createManaged( T_OBJ, IMG_OBJS_EXTERNAL_SOURCE_FILE );
public static final ImageDescriptor DESC_WIZBAN_ADD_SOURCE_LOCATION = createManaged( T_WIZBAN, IMG_WIZBAN_ADD_SOURCE_LOCATION ); //$NON-NLS-1$
public static final ImageDescriptor DESC_WIZBAN_ADD_PRJ_SOURCE_LOCATION = createManaged( T_WIZBAN, IMG_WIZBAN_ADD_PRJ_SOURCE_LOCATION ); //$NON-NLS-1$
public static final ImageDescriptor DESC_WIZBAN_ADD_DIR_SOURCE_LOCATION = createManaged( T_WIZBAN, IMG_WIZBAN_ADD_DIR_SOURCE_LOCATION ); //$NON-NLS-1$
public static final ImageDescriptor DESC_TOOLS_ADD_PRJ_SOURCE_LOCATION = createManaged( T_CTOOL, IMG_TOOLS_ADD_PRJ_SOURCE_LOCATION ); //$NON-NLS-1$
public static final ImageDescriptor DESC_TOOLS_ADD_DIR_SOURCE_LOCATION = createManaged( T_CTOOL, IMG_TOOLS_ADD_DIR_SOURCE_LOCATION ); //$NON-NLS-1$
public static final ImageDescriptor DESC_LCL_CAST_TO_TYPE = createManaged( T_CLCL, IMG_LCL_CAST_TO_TYPE ); //$NON-NLS-1$
public static final ImageDescriptor DESC_LCL_DISPLAY_AS_ARRAY = createManaged( T_CLCL, IMG_LCL_DISPLAY_AS_ARRAY ); //$NON-NLS-1$
public static final ImageDescriptor DESC_WIZBAN_ADD_SOURCE_LOCATION = createManaged( T_WIZBAN, IMG_WIZBAN_ADD_SOURCE_LOCATION );
public static final ImageDescriptor DESC_WIZBAN_ADD_PRJ_SOURCE_LOCATION = createManaged( T_WIZBAN, IMG_WIZBAN_ADD_PRJ_SOURCE_LOCATION );
public static final ImageDescriptor DESC_WIZBAN_ADD_DIR_SOURCE_LOCATION = createManaged( T_WIZBAN, IMG_WIZBAN_ADD_DIR_SOURCE_LOCATION );
public static final ImageDescriptor DESC_TOOLS_ADD_PRJ_SOURCE_LOCATION = createManaged( T_CTOOL, IMG_TOOLS_ADD_PRJ_SOURCE_LOCATION );
public static final ImageDescriptor DESC_TOOLS_ADD_DIR_SOURCE_LOCATION = createManaged( T_CTOOL, IMG_TOOLS_ADD_DIR_SOURCE_LOCATION );
public static final ImageDescriptor DESC_LCL_CAST_TO_TYPE = createManaged( T_CLCL, IMG_LCL_CAST_TO_TYPE );
public static final ImageDescriptor DESC_LCL_DISPLAY_AS_ARRAY = createManaged( T_CLCL, IMG_LCL_DISPLAY_AS_ARRAY );
public static final ImageDescriptor DESC_LCL_RESUME_AT_LINE = createManaged( T_CLCL, IMG_LCL_RESUME_AT_LINE );
public static final ImageDescriptor DESC_LCL_RESUME_AT_LINE_DISABLED = createManaged( T_DLCL, IMG_LCL_RESUME_AT_LINE );
/**
* Returns the image managed under the given key in this registry.

View file

@ -0,0 +1,228 @@
/**********************************************************************
* Copyright (c) 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.debug.internal.ui;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IPageListener;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
/**
* Manages the current evaluation context (stack frame) for evaluation actions.
* In each page, the selection is tracked in each debug view (if any). When a debug
* target selection exists, the "debuggerActive" System property is set to true.
* This property is used to make the "Run To Line" and "Resume At Line" actions
* visible in editors only if there is a running debug session.
*/
public class EvaluationContextManager implements IWindowListener, IPageListener, ISelectionListener, IPartListener2 {
private final static String DEBUGGER_ACTIVE = CDebugUIPlugin.getUniqueIdentifier() + ".debuggerActive"; //$NON-NLS-1$
protected static EvaluationContextManager fgManager;
private Map fContextsByPage = null;
protected EvaluationContextManager() {
}
public static void startup() {
Runnable r = new Runnable() {
public void run() {
if ( fgManager == null ) {
fgManager = new EvaluationContextManager();
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
for( int i = 0; i < windows.length; i++ ) {
fgManager.windowOpened( windows[i] );
}
workbench.addWindowListener( fgManager );
}
}
};
CDebugUIPlugin.getStandardDisplay().asyncExec( r );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
*/
public void windowActivated( IWorkbenchWindow window ) {
windowOpened( window );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
*/
public void windowDeactivated( IWorkbenchWindow window ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
*/
public void windowClosed( IWorkbenchWindow window ) {
window.removePageListener( this );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
*/
public void windowOpened( IWorkbenchWindow window ) {
IWorkbenchPage[] pages = window.getPages();
for( int i = 0; i < pages.length; i++ ) {
window.addPageListener( this );
pageOpened( pages[i] );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageListener#pageActivated(org.eclipse.ui.IWorkbenchPage)
*/
public void pageActivated( IWorkbenchPage page ) {
pageOpened( page );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageListener#pageClosed(org.eclipse.ui.IWorkbenchPage)
*/
public void pageClosed( IWorkbenchPage page ) {
page.removeSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this );
page.removePartListener( this );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageListener#pageOpened(org.eclipse.ui.IWorkbenchPage)
*/
public void pageOpened( IWorkbenchPage page ) {
page.addSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this );
page.addPartListener( this );
IWorkbenchPartReference ref = page.getActivePartReference();
if ( ref != null ) {
partActivated( ref );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged( IWorkbenchPart part, ISelection selection ) {
IWorkbenchPage page = part.getSite().getPage();
if ( selection instanceof IStructuredSelection ) {
IStructuredSelection ss = (IStructuredSelection)selection;
if ( ss.size() == 1 ) {
Object element = ss.getFirstElement();
if ( element instanceof IAdaptable ) {
ICDebugTarget target = (ICDebugTarget)((IAdaptable)element).getAdapter( ICDebugTarget.class );
if ( target != null ) {
setContext( page, target );
return;
}
}
}
}
// no context in the given view
removeContext( page );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference)
*/
public void partActivated( IWorkbenchPartReference partRef ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference)
*/
public void partBroughtToTop( IWorkbenchPartReference partRef ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
*/
public void partClosed( IWorkbenchPartReference partRef ) {
if ( IDebugUIConstants.ID_DEBUG_VIEW.equals( partRef.getId() ) ) {
removeContext( partRef.getPage() );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
*/
public void partDeactivated( IWorkbenchPartReference partRef ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference)
*/
public void partOpened( IWorkbenchPartReference partRef ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference)
*/
public void partHidden( IWorkbenchPartReference partRef ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference)
*/
public void partVisible( IWorkbenchPartReference partRef ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
*/
public void partInputChanged( IWorkbenchPartReference partRef ) {
}
/**
* Sets the evaluation context for the given page, and notes that
* a valid execution context exists.
*
* @param page
* @param frame
*/
private void setContext( IWorkbenchPage page, ICDebugTarget target ) {
if ( fContextsByPage == null ) {
fContextsByPage = new HashMap();
}
fContextsByPage.put( page, target );
System.setProperty( DEBUGGER_ACTIVE, Boolean.TRUE.toString() );
}
/**
* Removes an evaluation context for the given page, and determines if
* any valid execution context remain.
*
* @param page
*/
private void removeContext( IWorkbenchPage page ) {
if ( fContextsByPage != null ) {
fContextsByPage.remove( page );
if ( fContextsByPage.isEmpty() ) {
System.setProperty( DEBUGGER_ACTIVE, Boolean.FALSE.toString() );
}
}
}
}

View file

@ -46,6 +46,9 @@ ToggleBreakpointRulerAction.Error_1=Error
ToggleBreakpointRulerAction.Operation_failed_1=Operation failed
CBreakpointPropertiesRulerAction.Breakpoint_Properties=Breakpoint &Properties...
ResumeAtLineActionDelegate.Error_1=Error
ResumeAtLineActionDelegate.0=Resume At Li&ne
ResumeAtLineActionDelegate.1=Error
ResumeAtLineActionDelegate.2=Resume at line failed
RestoreDefaultTypeActionDelegate.0=Unable to restore the default type.
ResumeAtLineActionDelegate.Operation_failed_1=Operation failed.
ResumeAtLineActionDelegate.Missing_document=Missing document
@ -85,3 +88,7 @@ AddWatchpointDialog.1=Expression to watch:
AddWatchpointDialog.2=Access
AddWatchpointDialog.3=Write
AddWatchpointDialog.4=Read
ResumeAtLineAdapter.0=Empty editor
ResumeAtLineAdapter.1=Missing document
ResumeAtLineAdapter.2=Empty editor
ResumeAtLineAdapter.3=Operation is not supported.

View file

@ -0,0 +1,43 @@
/**********************************************************************
* Copyright (c) 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.ISuspendResume;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchPart;
/**
* An adapter for a "resume at line" operation.
*/
public interface IResumeAtLineTarget {
/**
* Perform a resume at line operation on the given element that is
* currently selected and suspended in the Debug view.
*
* @param part the part on which the action has been invoked
* @param selection the selection on which the action has been invoked
* @param target suspended element to perform the "resume at line" action on
* @throws CoreException if unable to perform the action
*/
public void resumeAtLine( IWorkbenchPart part, ISelection selection, ISuspendResume target ) throws CoreException;
/**
* Returns whether a resume at line operation can be performed on the given
* element that is currently selected and suspended in the Debug view.
*
* @param part the part on which the action has been invoked
* @param selection the selection on which the action has been invoked
* @param target suspended element to perform the "resume at line" action on
* @throws CoreException if unable to perform the action
*/
public boolean canResumeAtLine( IWorkbenchPart part, ISelection selection, ISuspendResume target );
}

View file

@ -1,200 +0,0 @@
/*******************************************************************************
* Copyright (c) 2000, 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.debug.core.model.IJumpToAddress;
import org.eclipse.cdt.debug.core.model.IJumpToLine;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
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.debug.core.DebugException;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* Enter type comment.
*
* @since: Feb 5, 2003
*/
public class JumpToLineActionDelegate extends AbstractEditorActionDelegate
{
/**
* Constructor for JumpToLineActionDelegate.
*/
public JumpToLineActionDelegate()
{
super();
}
/* (non-Javadoc)
* @see org.eclipse.ui.ISelectionListener#selectionChanged(IWorkbenchPart, ISelection)
*/
public void selectionChanged( IWorkbenchPart part, ISelection selection )
{
IDebugTarget target = null;
if ( part != null && part.getSite().getId().equals( IDebugUIConstants.ID_DEBUG_VIEW ) )
{
if ( selection instanceof IStructuredSelection )
{
Object element = ((IStructuredSelection)selection).getFirstElement();
if ( element != null && element instanceof IDebugElement )
{
IDebugTarget target1 = ((IDebugElement)element).getDebugTarget();
if ( target1 != null &&
( target1 instanceof IJumpToLine || target1 instanceof IJumpToAddress ) )
{
target = target1;
}
}
}
setDebugTarget( target );
update();
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(IAction)
*/
public void run( IAction action )
{
if ( getTargetPart() != null && getTargetPart() instanceof ITextEditor )
{
IEditorInput input = ((ITextEditor)getTargetPart()).getEditorInput();
if ( input != null && input instanceof IFileEditorInput )
{
IFile file = ((IFileEditorInput)input).getFile();
if ( file != null )
{
ITextSelection selection = (ITextSelection)((ITextEditor)getTargetPart()).getSelectionProvider().getSelection();
int lineNumber = selection.getStartLine() + 1;
jumpToLine( file, lineNumber );
}
}
else if ( input != null && input instanceof IStorageEditorInput )
{
try
{
IStorage storage = ((IStorageEditorInput)input).getStorage();
if ( storage instanceof FileStorage )
{
IPath path = storage.getFullPath();
if ( path != null )
{
ITextSelection selection = (ITextSelection)((ITextEditor)getTargetPart()).getSelectionProvider().getSelection();
int lineNumber = selection.getStartLine() + 1;
jumpToLine( path.lastSegment(), lineNumber );
}
}
}
catch( CoreException e )
{
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.internal.ui.actions.AbstractEditorActionDelegate#initializeDebugTarget()
*/
protected void initializeDebugTarget()
{
setDebugTarget( null );
IAdaptable context = DebugUITools.getDebugContext();
if ( context != null && context instanceof IDebugElement )
{
IDebugTarget target = ((IDebugElement)context).getDebugTarget();
if ( target != null &&
( target instanceof IJumpToLine || target instanceof IJumpToAddress ) )
{
setDebugTarget( target );
}
}
}
protected void jumpToLine( IFile file, int lineNumber )
{
IJumpToLine target = (IJumpToLine)getDebugTarget().getAdapter( IJumpToLine.class );
if ( target != null )
{
if ( !target.canJumpToLine( file, lineNumber ) )
{
getTargetPart().getSite().getShell().getDisplay().beep();
return;
}
try
{
target.jumpToLine( file, lineNumber );
}
catch( DebugException e )
{
CDebugUIPlugin.errorDialog( e.getMessage(), e );
}
}
}
protected void jumpToLine( String fileName, int lineNumber )
{
IJumpToLine target = (IJumpToLine)getDebugTarget().getAdapter( IJumpToLine.class );
if ( target != null )
{
if ( !target.canJumpToLine( fileName, lineNumber ) )
{
getTargetPart().getSite().getShell().getDisplay().beep();
return;
}
try
{
target.jumpToLine( fileName, lineNumber );
}
catch( DebugException e )
{
CDebugUIPlugin.errorDialog( e.getMessage(), e );
}
}
}
protected void jumpToAddress( IAddress address )
{
IJumpToAddress target = (IJumpToAddress)getDebugTarget().getAdapter( IJumpToAddress.class );
if ( target != null )
{
if ( !target.canJumpToAddress( address ) )
{
getTargetPart().getSite().getShell().getDisplay().beep();
return;
}
try
{
target.jumpToAddress( address );
}
catch( DebugException e )
{
CDebugUIPlugin.errorDialog( e.getMessage(), e );
}
}
}
}

View file

@ -1,82 +1,65 @@
/**********************************************************************
* Copyright (c) 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
***********************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.model.IJumpToAddress;
import org.eclipse.cdt.debug.core.model.IJumpToLine;
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyEditorInput;
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyView;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.model.ISuspendResume;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.actions.IRunToLineTarget;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IActionDelegate2;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.IUpdate;
import org.eclipse.ui.IWorkbenchPartSite;
/**
* Global retargettable "Resume at Line" action.
* A resume at line action that can be contributed to a an editor. The action
* will perform the "resume at line" operation for editors that provide
* an appropriate <code>IResumeAtLineTarget</code> adapter.
*/
public class ResumeAtLineActionDelegate implements IWorkbenchWindowActionDelegate, IPartListener, IUpdate {
public class ResumeAtLineActionDelegate implements IEditorActionDelegate, IActionDelegate2 {
private IEditorPart fActivePart = null;
private IResumeAtLineTarget fPartTarget = null;
protected IWorkbenchWindow fWindow = null;
private IWorkbenchPart fActivePart = null;
private IAction fAction = null;
private IDebugElement fTargetElement = null;
private static final ISelection EMPTY_SELECTION = new EmptySelection();
static class EmptySelection implements ISelection {
public boolean isEmpty() {
return true;
}
}
private ISelectionListener fSelectionListener = new DebugSelectionListener();
protected ISuspendResume fTargetElement = null;
class DebugSelectionListener implements ISelectionListener {
/* (non-Javadoc)
* @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged( IWorkbenchPart part, ISelection selection ) {
setTargetElement( null );
fTargetElement = null;
if ( selection instanceof IStructuredSelection ) {
IStructuredSelection ss = (IStructuredSelection)selection;
if ( ss.size() == 1 ) {
Object object = ss.getFirstElement();
if ( object instanceof IDebugElement ) {
setTargetElement( (IDebugElement)object );
if ( object instanceof ISuspendResume ) {
fTargetElement = (ISuspendResume)object;
}
}
}
@ -84,98 +67,68 @@ public class ResumeAtLineActionDelegate implements IWorkbenchWindowActionDelegat
}
}
/**
* Returns the current selection in the active part, possibly
* and empty selection, but never <code>null</code>.
*
* @return the selection in the active part, possibly empty
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
*/
private ISelection getTargetSelection() {
if ( fActivePart != null ) {
ISelectionProvider selectionProvider = fActivePart.getSite().getSelectionProvider();
if ( selectionProvider != null ) {
return selectionProvider.getSelection();
public void setActiveEditor( IAction action, IEditorPart targetEditor ) {
init( action );
if ( fActivePart != null && !fActivePart.equals( targetEditor ) ) {
fActivePart.getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, fSelectionListener );
}
fPartTarget = null;
fActivePart = targetEditor;
if ( targetEditor != null ) {
targetEditor.getSite().getWorkbenchWindow().getSelectionService().addSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, fSelectionListener );
fPartTarget = (IResumeAtLineTarget)targetEditor.getAdapter( IResumeAtLineTarget.class );
if ( fPartTarget == null ) {
IAdapterManager adapterManager = Platform.getAdapterManager();
// TODO: we could restrict loading to cases when the debugging context is on
if ( adapterManager.hasAdapter( targetEditor, IRunToLineTarget.class.getName() ) ) {
fPartTarget = (IResumeAtLineTarget)adapterManager.loadAdapter( targetEditor, IResumeAtLineTarget.class.getName() );
}
}
}
return EMPTY_SELECTION;
update();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
* @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
*/
public void init( IAction action ) {
this.fAction = action;
if ( action != null ) {
action.setText( ActionMessages.getString( "ResumeAtLineActionDelegate.0" ) ); //$NON-NLS-1$
action.setImageDescriptor( CDebugImages.DESC_LCL_RESUME_AT_LINE );
action.setDisabledImageDescriptor( CDebugImages.DESC_LCL_RESUME_AT_LINE_DISABLED );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate2#dispose()
*/
public void dispose() {
fWindow.getSelectionService().removeSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, fSelectionListener );
fWindow.getPartService().removePartListener( this );
fActivePart.getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, fSelectionListener );
fActivePart = null;
fPartTarget = null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
* @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
*/
public void init( IWorkbenchWindow window ) {
this.fWindow = window;
IPartService partService = window.getPartService();
partService.addPartListener( this );
fWindow.getSelectionService().addSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, fSelectionListener );
IWorkbenchPart part = partService.getActivePart();
if ( part != null ) {
partActivated( part );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
*/
public void partActivated( IWorkbenchPart part ) {
fActivePart = part;
update();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
*/
public void partBroughtToTop( IWorkbenchPart part ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
*/
public void partClosed( IWorkbenchPart part ) {
clearPart(part);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
*/
public void partDeactivated( IWorkbenchPart part ) {
clearPart(part);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
*/
public void partOpened( IWorkbenchPart part ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.texteditor.IUpdate#update()
*/
public void update() {
if ( fAction == null ) {
return;
}
fAction.setEnabled( canPerformAction( getTargetSelection() ) );
public void runWithEvent( IAction action, Event event ) {
run( action );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
public void run( IAction action ) {
if ( fTargetElement != null ) {
if ( fPartTarget != null && fTargetElement != null ) {
try {
performAction( getTargetSelection() );
} catch( CoreException e ) {
DebugUIPlugin.errorDialog( fWindow.getShell(), ActionMessages.getString( "ResumeAtLineActionDelegate.Error_1" ), ActionMessages.getString( "ResumeAtLineActionDelegate.Operation_failed_1" ), e.getStatus() ); //$NON-NLS-1$ //$NON-NLS-2$
fPartTarget.resumeAtLine( fActivePart, fActivePart.getSite().getSelectionProvider().getSelection(), fTargetElement );
}
catch( CoreException e ) {
DebugUIPlugin.errorDialog( fActivePart.getSite().getWorkbenchWindow().getShell(), ActionMessages.getString( "ResumeAtLineActionDelegate.1" ), ActionMessages.getString( "ResumeAtLineActionDelegate.2" ), e.getStatus() ); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
@ -188,129 +141,21 @@ public class ResumeAtLineActionDelegate implements IWorkbenchWindowActionDelegat
update();
}
/**
* Clears reference to active part and adapter when a relevant part
* is closed or deactivated.
*
* @param part workbench part that has been closed or deactivated
*/
protected void clearPart( IWorkbenchPart part ) {
if ( part.equals( fActivePart ) ) {
fActivePart = null;
protected void update() {
if ( fAction == null ) {
return;
}
}
protected IDebugElement getTargetElement() {
return this.fTargetElement;
}
protected void setTargetElement( IDebugElement targetElement ) {
this.fTargetElement = targetElement;
}
private boolean canPerformAction( ISelection selection ) {
if ( fTargetElement == null ||
!fTargetElement.getModelIdentifier().equals( CDIDebugModel.getPluginIdentifier() ) )
return false;
IDebugTarget debugTarget = fTargetElement.getDebugTarget();
if ( fActivePart instanceof IEditorPart ) {
IJumpToLine jumpToLine = (IJumpToLine)debugTarget.getAdapter( IJumpToLine.class );
if ( jumpToLine == null )
return false;
IEditorPart editorPart = (IEditorPart)fActivePart;
IEditorInput input = editorPart.getEditorInput();
if ( input == null ) {
return false;
}
if ( !(editorPart instanceof ITextEditor) ) {
return false;
}
ITextEditor textEditor = (ITextEditor)editorPart;
IDocument document = textEditor.getDocumentProvider().getDocument( input );
if ( document == null ) {
return false;
}
String fileName;
try {
fileName = getFileName( input );
}
catch( CoreException e ) {
return false;
}
ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1;
return jumpToLine.canJumpToLine( fileName, lineNumber );
}
if ( fActivePart instanceof DisassemblyView ) {
IJumpToAddress jumpToAddress = (IJumpToAddress)debugTarget.getAdapter( IJumpToAddress.class );
if ( jumpToAddress == null )
return false;
IEditorInput input = ((DisassemblyView)fActivePart).getInput();
if ( !(input instanceof DisassemblyEditorInput) ) {
return false;
}
ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1;
IAddress address = ((DisassemblyEditorInput)input).getAddress( lineNumber );
return jumpToAddress.canJumpToAddress( address );
}
return false;
}
private void performAction( ISelection selection ) throws CoreException {
IDebugTarget debugTarget = fTargetElement.getDebugTarget();
String errorMessage = null;
if ( fActivePart instanceof IEditorPart ) {
IEditorPart editorPart = (IEditorPart)fActivePart;
IEditorInput input = editorPart.getEditorInput();
if ( input == null ) {
errorMessage = ActionMessages.getString( "ResumeAtLineActionDelegate.Empty_editor_1" ); //$NON-NLS-1$
}
else {
ITextEditor textEditor = (ITextEditor)editorPart;
IDocument document = textEditor.getDocumentProvider().getDocument( input );
if ( document == null ) {
errorMessage = ActionMessages.getString( "ResumeAtLineActionDelegate.Missing_document" ); //$NON-NLS-1$
}
else {
String fileName = getFileName( input );
ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1;
IJumpToLine jumpToLine = (IJumpToLine)((IAdaptable)debugTarget).getAdapter( IJumpToLine.class );
if ( jumpToLine != null )
jumpToLine.jumpToLine( fileName, lineNumber );
return;
boolean enabled = false;
if ( fPartTarget != null && fTargetElement != null ) {
IWorkbenchPartSite site = fActivePart.getSite();
if ( site != null ) {
ISelectionProvider selectionProvider = site.getSelectionProvider();
if ( selectionProvider != null ) {
ISelection selection = selectionProvider.getSelection();
enabled = fTargetElement.isSuspended() && fPartTarget.canResumeAtLine( fActivePart, selection, fTargetElement );
}
}
}
else if ( fActivePart instanceof DisassemblyView ) {
IEditorInput input = ((DisassemblyView)fActivePart).getInput();
if ( !(input instanceof DisassemblyEditorInput) ) {
errorMessage = ActionMessages.getString( "ResumeAtLineActionDelegate.Empty_editor_1" ); //$NON-NLS-1$
}
else {
ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1;
IAddress address = ((DisassemblyEditorInput)input).getAddress( lineNumber );
IJumpToAddress jumpToAddress = (IJumpToAddress)((IAdaptable)debugTarget).getAdapter( IJumpToAddress.class );
if ( jumpToAddress != null )
jumpToAddress.jumpToAddress( address );
return;
}
}
else {
errorMessage = ActionMessages.getString( "ResumeAtLineActionDelegate.Operation_is_not_supported_1" ); //$NON-NLS-1$
}
throw new CoreException( new Status( IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(), ICDebugUIConstants.INTERNAL_ERROR, errorMessage, null ) );
}
private String getFileName( IEditorInput input ) throws CoreException {
if ( input instanceof IFileEditorInput ) {
return ((IFileEditorInput)input).getFile().getName();
}
if ( input instanceof IStorageEditorInput ) {
return ((IStorageEditorInput)input).getStorage().getName();
}
return null;
fAction.setEnabled( enabled );
}
}

View file

@ -0,0 +1,153 @@
/**********************************************************************
* Copyright (c) 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.model.IJumpToAddress;
import org.eclipse.cdt.debug.core.model.IJumpToLine;
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyEditorInput;
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyView;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.model.ISuspendResume;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* Resume at line target adapter for the CDI debugger
*/
public class ResumeAtLineAdapter implements IResumeAtLineTarget {
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.internal.ui.actions.IResumeAtLineTarget#resumeAtLine(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.debug.core.model.ISuspendResume)
*/
public void resumeAtLine( IWorkbenchPart part, ISelection selection, ISuspendResume target ) throws CoreException {
String errorMessage = null;
if ( part instanceof ITextEditor ) {
ITextEditor textEditor = (ITextEditor)part;
IEditorInput input = textEditor.getEditorInput();
if ( input == null ) {
errorMessage = ActionMessages.getString( "ResumeAtLineAdapter.0" ); //$NON-NLS-1$
}
else {
IDocument document = textEditor.getDocumentProvider().getDocument( input );
if ( document == null ) {
errorMessage = ActionMessages.getString( "ResumeAtLineAdapter.1" ); //$NON-NLS-1$
}
else {
String fileName = getFileName( input );
ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1;
if ( target instanceof IAdaptable ) {
IJumpToLine jumpToLine = (IJumpToLine)((IAdaptable)target).getAdapter( IJumpToLine.class );
if ( jumpToLine != null && jumpToLine.canJumpToLine( fileName, lineNumber ) ) {
jumpToLine.jumpToLine( fileName, lineNumber );
}
}
return;
}
}
}
else if ( part instanceof DisassemblyView ) {
IEditorInput input = ((DisassemblyView)part).getInput();
if ( !(input instanceof DisassemblyEditorInput) ) {
errorMessage = ActionMessages.getString( "ResumeAtLineAdapter.2" ); //$NON-NLS-1$
}
else {
ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1;
IAddress address = ((DisassemblyEditorInput)input).getAddress( lineNumber );
if ( target instanceof IAdaptable ) {
IJumpToAddress jumpToAddress = (IJumpToAddress)((IAdaptable)target).getAdapter( IJumpToAddress.class );
if ( jumpToAddress != null && jumpToAddress.canJumpToAddress( address ) ) {
jumpToAddress.jumpToAddress( address );
}
}
return;
}
}
else {
errorMessage = ActionMessages.getString( "ResumeAtLineAdapter.3" ); //$NON-NLS-1$
}
throw new CoreException( new Status( IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(), ICDebugUIConstants.INTERNAL_ERROR, errorMessage, null ) );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.internal.ui.actions.IResumeAtLineTarget#canResumeAtLine(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.debug.core.model.ISuspendResume)
*/
public boolean canResumeAtLine( IWorkbenchPart part, ISelection selection, ISuspendResume target ) {
if ( target instanceof IAdaptable ) {
if ( part instanceof IEditorPart ) {
IJumpToLine jumpToLine = (IJumpToLine)((IAdaptable)target).getAdapter( IJumpToLine.class );
if ( jumpToLine == null )
return false;
IEditorPart editorPart = (IEditorPart)part;
IEditorInput input = editorPart.getEditorInput();
if ( input == null ) {
return false;
}
if ( !(editorPart instanceof ITextEditor) ) {
return false;
}
ITextEditor textEditor = (ITextEditor)editorPart;
IDocument document = textEditor.getDocumentProvider().getDocument( input );
if ( document == null ) {
return false;
}
String fileName;
try {
fileName = getFileName( input );
}
catch( CoreException e ) {
return false;
}
ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1;
return jumpToLine.canJumpToLine( fileName, lineNumber );
}
if ( part instanceof DisassemblyView ) {
IJumpToAddress jumpToAddress = (IJumpToAddress)((IAdaptable)target).getAdapter( IJumpToAddress.class );
if ( jumpToAddress == null )
return false;
IEditorInput input = ((DisassemblyView)part).getInput();
if ( !(input instanceof DisassemblyEditorInput) ) {
return false;
}
ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1;
IAddress address = ((DisassemblyEditorInput)input).getAddress( lineNumber );
return jumpToAddress.canJumpToAddress( address );
}
}
return false;
}
private String getFileName( IEditorInput input ) throws CoreException {
if ( input instanceof IFileEditorInput ) {
return ((IFileEditorInput)input).getFile().getName();
}
if ( input instanceof IStorageEditorInput ) {
return ((IStorageEditorInput)input).getStorage().getName();
}
return null;
}
}

View file

@ -0,0 +1,215 @@
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.texteditor.IUpdate;
/**
* Global retargettable debug action.
*
* @since 3.0
*/
public abstract class RetargetAction implements IWorkbenchWindowActionDelegate, IPartListener, IUpdate {
protected IWorkbenchWindow fWindow = null;
private IWorkbenchPart fActivePart = null;
private Object fTargetAdapter = null;
private IAction fAction = null;
private static final ISelection EMPTY_SELECTION = new EmptySelection();
static class EmptySelection implements ISelection {
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelection#isEmpty()
*/
public boolean isEmpty() {
return true;
}
}
/**
* Returns the current selection in the active part, possibly
* and empty selection, but never <code>null</code>.
*
* @return the selection in the active part, possibly empty
*/
private ISelection getTargetSelection() {
if (fActivePart != null) {
ISelectionProvider selectionProvider = fActivePart.getSite().getSelectionProvider();
if (selectionProvider != null) {
return selectionProvider.getSelection();
}
}
return EMPTY_SELECTION;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
*/
public void dispose() {
fWindow.getPartService().removePartListener(this);
fActivePart = null;
fTargetAdapter = null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
*/
public void init(IWorkbenchWindow window) {
this.fWindow = window;
IPartService partService = window.getPartService();
partService.addPartListener(this);
IWorkbenchPart part = partService.getActivePart();
if (part != null) {
partActivated(part);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
public void run(IAction action) {
if (fTargetAdapter != null) {
try {
performAction(fTargetAdapter, getTargetSelection(), fActivePart);
} catch (CoreException e) {
DebugUIPlugin.errorDialog(fWindow.getShell(), ActionMessages.getString("RetargetAction.2"), ActionMessages.getString("RetargetAction.3"), e.getStatus()); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
/**
* Performs the specific breakpoint toggling.
*
* @param selection selection in the active part
* @param part active part
* @throws CoreException if an exception occurrs
*/
protected abstract void performAction(Object target, ISelection selection, IWorkbenchPart part) throws CoreException;
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged(IAction action, ISelection selection) {
this.fAction = action;
// if the active part did not provide an adapter, see if the selectoin does
if (fTargetAdapter == null && selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection) selection;
if (!ss.isEmpty()) {
Object object = ss.getFirstElement();
if (object instanceof IAdaptable) {
fTargetAdapter = getAdapter((IAdaptable) object);
}
}
}
update();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
*/
public void partActivated(IWorkbenchPart part) {
fActivePart = part;
fTargetAdapter = getAdapter(part);
update();
}
protected Object getAdapter(IAdaptable adaptable) {
Object adapter = adaptable.getAdapter(getAdapterClass());
if (adapter == null) {
IAdapterManager adapterManager = Platform.getAdapterManager();
if (adapterManager.hasAdapter(adaptable, getAdapterClass().getName())) { //$NON-NLS-1$
fTargetAdapter = adapterManager.loadAdapter(adaptable, getAdapterClass().getName()); //$NON-NLS-1$
}
}
return adapter;
}
/**
* Returns the type of adapter (target) this action works on.
*
* @return the type of adapter this action works on
*/
protected abstract Class getAdapterClass();
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
*/
public void partBroughtToTop(IWorkbenchPart part) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
*/
public void partClosed(IWorkbenchPart part) {
clearPart(part);
}
/**
* Clears reference to active part and adapter when a relevant part
* is closed or deactivated.
*
* @param part workbench part that has been closed or deactivated
*/
protected void clearPart(IWorkbenchPart part) {
if (part.equals(fActivePart)) {
fActivePart = null;
fTargetAdapter = null;
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
*/
public void partDeactivated(IWorkbenchPart part) {
clearPart(part);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
*/
public void partOpened(IWorkbenchPart part) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.texteditor.IUpdate#update()
*/
public void update() {
if (fAction == null) {
return;
}
if (fTargetAdapter != null) {
fAction.setEnabled(canPerformAction(fTargetAdapter, getTargetSelection(), fActivePart));
} else {
fAction.setEnabled(false);
}
}
/**
* Returns whether the specific operation is supported.
*
* @param target the target adapter
* @param selection the selection to verify the operation on
* @param part the part the operation has been requested on
* @return whether the operation can be performed
*/
protected abstract boolean canPerformAction(Object target, ISelection selection, IWorkbenchPart part);
}

View file

@ -0,0 +1,96 @@
/**********************************************************************
* Copyright (c) 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.ISuspendResume;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
/**
* Global retargettable resume at line action.
*/
public class RetargetResumeAtLineAction extends RetargetAction {
private ISelectionListener fSelectionListener = new DebugSelectionListener();
private ISuspendResume fTargetElement = null;
class DebugSelectionListener implements ISelectionListener {
/* (non-Javadoc)
* @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged( IWorkbenchPart part, ISelection selection ) {
setTargetElement( null );
if ( selection instanceof IStructuredSelection ) {
IStructuredSelection ss = (IStructuredSelection)selection;
if ( ss.size() == 1 ) {
Object object = ss.getFirstElement();
if ( object instanceof ISuspendResume ) {
setTargetElement( (ISuspendResume)object );
}
}
}
update();
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
*/
public void dispose() {
fWindow.getSelectionService().removeSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, fSelectionListener );
super.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
*/
public void init( IWorkbenchWindow window ) {
super.init( window );
window.getSelectionService().addSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, fSelectionListener );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.internal.ui.actions.RetargetAction#performAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
*/
protected void performAction( Object target, ISelection selection, IWorkbenchPart part ) throws CoreException {
((IResumeAtLineTarget)target).resumeAtLine( part, selection, getTargetElement() );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.internal.ui.actions.RetargetAction#getAdapterClass()
*/
protected Class getAdapterClass() {
return IResumeAtLineTarget.class;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.internal.ui.actions.RetargetAction#canPerformAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
*/
protected boolean canPerformAction( Object target, ISelection selection, IWorkbenchPart part ) {
return getTargetElement() != null && ((IResumeAtLineTarget)target).canResumeAtLine( part, selection, getTargetElement() );
}
protected ISuspendResume getTargetElement() {
return fTargetElement;
}
protected void setTargetElement( ISuspendResume targetElement ) {
fTargetElement = targetElement;
}
}

View file

@ -31,6 +31,9 @@ public class RetargettableActionAdapterFactory implements IAdapterFactory {
if ( adapterType == IRunToLineTarget.class ) {
return new RunToLineAdapter();
}
if ( adapterType == IResumeAtLineTarget.class ) {
return new ResumeAtLineAdapter();
}
return null;
}
@ -38,6 +41,6 @@ public class RetargettableActionAdapterFactory implements IAdapterFactory {
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
*/
public Class[] getAdapterList() {
return new Class[]{ IRunToLineTarget.class, IToggleBreakpointsTarget.class };
return new Class[]{ IRunToLineTarget.class, IToggleBreakpointsTarget.class, IResumeAtLineTarget.class };
}
}

View file

@ -1,108 +0,0 @@
/*******************************************************************************
* Copyright (c) 2000, 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.debug.core.model.IRunToAddress;
import org.eclipse.cdt.debug.core.model.IRunToLine;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.actions.IRunToLineTarget;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* Run to line action of C editor popup menu.
*/
public class RunToLineActionDelegate extends AbstractEditorActionDelegate {
IRunToLineTarget fRunToLineTarget;
/**
* Constructor for RunToLineActionDelegate.
*/
public RunToLineActionDelegate() {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IActionDelegate#run(IAction)
*/
public void run( IAction action ) {
if ( getTargetPart() instanceof ITextEditor ) {
ITextSelection selection = (ITextSelection)((ITextEditor)getTargetPart()).getSelectionProvider().getSelection();
if ( getRunToLineTarget() != null ) {
try {
getRunToLineTarget().runToLine( getTargetPart(), selection, getDebugTarget() );
}
catch( CoreException e ) {
DebugUIPlugin.errorDialog( getTargetPart().getSite().getShell(), ActionMessages.getString( "RunToLineActionDelegate.Error_1" ), ActionMessages.getString( "RunToLineActionDelegate.Operation_failed_1" ), e.getStatus() ); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.cdt.debug.internal.ui.actions.AbstractEditorActionDelegate#initializeDebugTarget()
*/
protected void initializeDebugTarget() {
setDebugTarget( null );
IAdaptable context = DebugUITools.getDebugContext();
if ( context != null && context instanceof IDebugElement ) {
IDebugTarget target = ((IDebugElement)context).getDebugTarget();
if ( target != null && (target instanceof IRunToLine || target instanceof IRunToAddress) ) {
setDebugTarget( target );
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.ISelectionListener#selectionChanged(IWorkbenchPart,
* ISelection)
*/
public void selectionChanged( IWorkbenchPart part, ISelection selection ) {
IDebugTarget target = null;
if ( part != null && part.getSite().getId().equals( IDebugUIConstants.ID_DEBUG_VIEW ) ) {
if ( selection instanceof IStructuredSelection ) {
Object element = ((IStructuredSelection)selection).getFirstElement();
if ( element != null && element instanceof IDebugElement ) {
IDebugTarget target1 = ((IDebugElement)element).getDebugTarget();
if ( target1 != null && (target1 instanceof IRunToLine || target1 instanceof IRunToAddress) ) {
target = target1;
}
}
}
setDebugTarget( target );
update();
}
}
private IRunToLineTarget getRunToLineTarget() {
if ( fRunToLineTarget == null ) {
fRunToLineTarget = new RunToLineAdapter();
}
return fRunToLineTarget;
}
}

View file

@ -17,6 +17,7 @@ import org.eclipse.cdt.debug.internal.ui.CBreakpointUpdater;
import org.eclipse.cdt.debug.internal.ui.CDTDebugModelPresentation;
import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
import org.eclipse.cdt.debug.internal.ui.ColorManager;
import org.eclipse.cdt.debug.internal.ui.EvaluationContextManager;
import org.eclipse.cdt.debug.ui.sourcelookup.DefaultSourceLocator;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
@ -245,6 +246,7 @@ public class CDebugUIPlugin extends AbstractUIPlugin {
*/
public void start( BundleContext context ) throws Exception {
super.start( context );
EvaluationContextManager.startup();
CDebugCorePlugin.getDefault().addCBreakpointListener( CBreakpointUpdater.getInstance() );
}