diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog index c87bc09fc9d..660800d7eef 100644 --- a/debug/org.eclipse.cdt.debug.ui/ChangeLog +++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog @@ -1,3 +1,21 @@ +2004-04-30 Mikhail Khodjaiants + Added ruler breakpoint actions to the Disassembly view. + * ICDebugHelpContextIds.java + * IInternalCDebugUIConstants.java + * ActionMessages.properties + * AbstractBreakpointRulerAction.java + * CBreakpointPropertiesRulerAction.java + * EnableDisableBreakpointRulerAction.java + * EnableDisableBreakpointRulerActionDelegate.java + * ManageBreakpointRulerActionDelegate.java + * ManageFunctionBreakpointActionDelegate.java + * ToggleBreakpointAdapter.java + * ManageBreakpointRulerAction.java: deleted + * ToggleBreakpointRulerAction.java: new + * DisassemblyAnnotationModel.java + * DisassemblyDocumentProvider.java + * DisassemblyView.java + 2004-04-28 Mikhail Khodjaiants Added support of context menu to the Disassembly view. * DisassemblyView.java diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java index 267da2a22b4..7e0fe7abe96 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java @@ -6,7 +6,7 @@ package org.eclipse.cdt.debug.internal.ui; -import org.eclipse.cdt.debug.ui.ICDebugUIConstants; +import org.eclipse.cdt.debug.ui.CDebugUIPlugin; /** * @@ -20,7 +20,12 @@ import org.eclipse.cdt.debug.ui.ICDebugUIConstants; */ public interface ICDebugHelpContextIds { - public static final String PREFIX = ICDebugUIConstants.PLUGIN_ID + "."; //$NON-NLS-1$ + /** + * C/C++ Debug UI plug-in identifier (value "org.eclipse.cdt.debug.ui"). + */ + public static final String PLUGIN_ID = CDebugUIPlugin.getUniqueIdentifier(); + + public static final String PREFIX = PLUGIN_ID + "."; //$NON-NLS-1$ // Actions public static final String CHANGE_REGISTER_VALUE_ACTION = PREFIX + "change_register_value_action_context"; //$NON-NLS-1$ @@ -35,6 +40,9 @@ public interface ICDebugHelpContextIds public static final String LOAD_SYMBOLS_FOR_ALL = PREFIX + "load_symbols_for_all_action_context"; //$NON-NLS-1$ public static final String REFRESH_REGISTERS_ACTION = PREFIX + "refresh_registers_action_context"; //$NON-NLS-1$ public static final String AUTO_REFRESH_REGISTERS_ACTION = PREFIX + "auto_refresh_registers_action_context"; //$NON-NLS-1$ + public static final String TOGGLE_BREAKPOINT_ACTION = PREFIX + "manage_breakpoint_action_context"; //$NON-NLS-1$ + public static final String ENABLE_DISABLE_BREAKPOINT_ACTION = PREFIX + "enable_disable_breakpoint_action_context"; //$NON-NLS-1$ + public static final String BREAKPOINT_PROPERTIES_ACTION = PREFIX + "breakpoint_properties_action_context"; //$NON-NLS-1$ // Views public static final String MEMORY_VIEW = PREFIX + "memory_view_context"; //$NON-NLS-1$ diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/IInternalCDebugUIConstants.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/IInternalCDebugUIConstants.java index 9c4b00ce753..797f304a570 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/IInternalCDebugUIConstants.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/IInternalCDebugUIConstants.java @@ -10,26 +10,40 @@ ***********************************************************************/ package org.eclipse.cdt.debug.internal.ui; +import org.eclipse.cdt.debug.ui.CDebugUIPlugin; + public interface IInternalCDebugUIConstants { + /** + * C/C++ Debug UI plug-in identifier (value "org.eclipse.cdt.debug.ui"). + */ + public static final String PLUGIN_ID = CDebugUIPlugin.getUniqueIdentifier(); + + public static final String PREFIX = PLUGIN_ID + "."; //$NON-NLS-1$ + /** * The name of the font to use for disassembly view. This font is managed via * the workbench font preference page. */ - public static final String DISASSEMBLY_FONT = "org.eclipse.cdt.debug.ui.DisassemblyFont"; //$NON-NLS-1$ + public static final String DISASSEMBLY_FONT = PREFIX + "DisassemblyFont"; //$NON-NLS-1$ //Current stack frame instruction pointer - public static final String DISASM_INSTRUCTION_POINTER = "org.eclipse.cdt.debug.ui.disassemblyInstructionPointer"; //$NON-NLS-1$ + public static final String DISASM_INSTRUCTION_POINTER = PREFIX + "disassemblyInstructionPointer"; //$NON-NLS-1$ // marker types for instruction pointer annotations - top stack frame, and secondary - public static final String DISASM_INSTRUCTION_POINTER_CURRENT = "org.eclipse.cdt.debug.ui.disassemblyInstructionPointer.current"; //$NON-NLS-1$ - public static final String DISASM_INSTRUCTION_POINTER_SECONDARY = "org.eclipse.cdt.debug.ui.disassemblyInstructionPointer.secondary"; //$NON-NLS-1$ + public static final String DISASM_INSTRUCTION_POINTER_CURRENT = PREFIX + "disassemblyInstructionPointer.current"; //$NON-NLS-1$ + public static final String DISASM_INSTRUCTION_POINTER_SECONDARY = PREFIX + "disassemblyInstructionPointer.secondary"; //$NON-NLS-1$ // annotation types for instruction pointers - public static final String ANN_DISASM_INSTR_POINTER_CURRENT = "org.eclipse.cdt.debug.ui.currentDisassemblyIP"; //$NON-NLS-1$ - public static final String ANN_DISASM_INSTR_POINTER_SECONDARY = "org.eclipse.cdt.debug.ui.secondaryDisassemblyIP"; //$NON-NLS-1$ + public static final String ANN_DISASM_INSTR_POINTER_CURRENT = PREFIX + "currentDisassemblyIP"; //$NON-NLS-1$ + public static final String ANN_DISASM_INSTR_POINTER_SECONDARY = PREFIX + "secondaryDisassemblyIP"; //$NON-NLS-1$ // object images public static final String IMG_OBJS_DISASM_INSTRUCTION_POINTER_TOP = "IMG_OBJS_DISASM_INSTRUCTION_POINTER_TOP"; //$NON-NLS-1$ public static final String IMG_OBJS_DISASM_INSTRUCTION_POINTER = "IMG_OBJS_DISASM_INSTRUCTION_POINTER"; //$NON-NLS-1$ + + // action ids + public static final String ACTION_TOGGLE_BREAKPOINT = PREFIX + "toggleBreakpoint"; //$NON-NLS-1$ + public static final String ACTION_ENABLE_DISABLE_BREAKPOINT = PREFIX + "enableDisableBreakpoint"; //$NON-NLS-1$ + public static final String ACTION_BREAKPOINT_PROPERTIES = PREFIX + "breakpointProperties"; //$NON-NLS-1$ } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractBreakpointRulerAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractBreakpointRulerAction.java index ac498d62664..ef83a0448d9 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractBreakpointRulerAction.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractBreakpointRulerAction.java @@ -1,15 +1,20 @@ -/* - *(c) Copyright QNX Software Systems Ltd. 2002. - * All Rights Reserved. +/********************************************************************** + * 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 java.util.Iterator; + import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.model.ICLineBreakpoint; -import org.eclipse.cdt.debug.ui.CDebugUIPlugin; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; +import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyView; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.model.IBreakpoint; @@ -17,147 +22,141 @@ import org.eclipse.jface.action.Action; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.Position; +import org.eclipse.jface.text.source.Annotation; import org.eclipse.jface.text.source.IAnnotationModel; import org.eclipse.jface.text.source.IVerticalRulerInfo; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel; +import org.eclipse.ui.ISaveablePart; +import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.IUpdate; +import org.eclipse.ui.texteditor.MarkerAnnotation; /** - * - * Enter type comment. - * - * @since Aug 26, 2002 + * Abstract base implementation of the breakpoint ruler actions. */ -public abstract class AbstractBreakpointRulerAction extends Action implements IUpdate -{ +public abstract class AbstractBreakpointRulerAction extends Action implements IUpdate { + private IVerticalRulerInfo fInfo; - private ITextEditor fTextEditor; + private IWorkbenchPart fTargetPart; private IBreakpoint fBreakpoint; - protected IBreakpoint determineBreakpoint() - { + protected IBreakpoint determineBreakpoint() { IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints( CDebugCorePlugin.getUniqueIdentifier() ); - for ( int i = 0; i < breakpoints.length; i++ ) - { + for( int i = 0; i < breakpoints.length; i++ ) { IBreakpoint breakpoint = breakpoints[i]; - if ( breakpoint instanceof ICLineBreakpoint ) - { + if ( breakpoint instanceof ICLineBreakpoint ) { ICLineBreakpoint cBreakpoint = (ICLineBreakpoint)breakpoint; - try - { - if ( breakpointAtRulerLine( cBreakpoint ) ) - { - return cBreakpoint; - } - } - catch( CoreException ce ) - { - CDebugUIPlugin.log( ce ); - continue; + if ( breakpointAtRulerLine( cBreakpoint ) ) { + return cBreakpoint; } } } return null; } - protected IVerticalRulerInfo getInfo() - { + protected IVerticalRulerInfo getInfo() { return fInfo; } - protected void setInfo( IVerticalRulerInfo info ) - { + protected void setInfo( IVerticalRulerInfo info ) { fInfo = info; } - protected ITextEditor getTextEditor() - { - return fTextEditor; + protected IWorkbenchPart getTargetPart() { + return this.fTargetPart; + } + protected void setTargetPart( IWorkbenchPart targetPart ) { + this.fTargetPart = targetPart; } - protected void setTextEditor( ITextEditor textEditor ) - { - fTextEditor = textEditor; - } - - /** - * Returns the resource for which to create the marker, - * or null if there is no applicable resource. - * - * @return the resource for which to create the marker or null - */ - protected IResource getResource() - { - IEditorInput input = fTextEditor.getEditorInput(); - IResource resource = (IResource)input.getAdapter( IFile.class ); - if ( resource == null ) - { - resource = (IResource)input.getAdapter( IResource.class ); - } - return resource; - } - - protected boolean breakpointAtRulerLine( ICLineBreakpoint cBreakpoint ) throws CoreException - { - AbstractMarkerAnnotationModel model = getAnnotationModel(); - if ( model != null ) - { - Position position = model.getMarkerPosition( cBreakpoint.getMarker() ); - if ( position != null ) - { - IDocumentProvider provider = getTextEditor().getDocumentProvider(); - IDocument doc = provider.getDocument( getTextEditor().getEditorInput() ); - try - { - int markerLineNumber = doc.getLineOfOffset( position.getOffset() ); - int rulerLine = getInfo().getLineOfLastMouseButtonActivity(); - if ( rulerLine == markerLineNumber ) - { - if ( getTextEditor().isDirty() ) - { - return cBreakpoint.getLineNumber() == markerLineNumber + 1; - } - return true; - } - } - catch ( BadLocationException x ) - { - CDebugUIPlugin.log( x ); - } - } - } - - return false; - } - - protected IBreakpoint getBreakpoint() - { + protected IBreakpoint getBreakpoint() { return fBreakpoint; } - protected void setBreakpoint( IBreakpoint breakpoint ) - { + protected void setBreakpoint( IBreakpoint breakpoint ) { fBreakpoint = breakpoint; } - /** - * Returns the AbstractMarkerAnnotationModel of the editor's input. - * - * @return the marker annotation model - */ - protected AbstractMarkerAnnotationModel getAnnotationModel() - { - IDocumentProvider provider = fTextEditor.getDocumentProvider(); - IAnnotationModel model = provider.getAnnotationModel( getTextEditor().getEditorInput() ); - if ( model instanceof AbstractMarkerAnnotationModel ) - { - return (AbstractMarkerAnnotationModel)model; + protected boolean breakpointAtRulerLine( ICLineBreakpoint cBreakpoint ) { + int lineNumber = getBreakpointLine( cBreakpoint ); + int rulerLine = getInfo().getLineOfLastMouseButtonActivity(); + return ( rulerLine == lineNumber ); + } + + private int getBreakpointLine( ICLineBreakpoint breakpoint ) { + if ( getTargetPart() instanceof ISaveablePart && ((ISaveablePart)getTargetPart()).isDirty() ) { + try { + return breakpoint.getLineNumber(); + } + catch( CoreException e ) { + DebugPlugin.log( e ); + } + } + else { + Position position = getBreakpointPosition( breakpoint ); + if ( position != null ) { + IDocument doc = getDocument(); + if ( doc != null ) { + try { + return doc.getLineOfOffset( position.getOffset() ); + } + catch ( BadLocationException x ) { + DebugPlugin.log( x ); + } + } + } + } + return -1; + } + + private Position getBreakpointPosition( ICLineBreakpoint breakpoint ) { + IAnnotationModel model = getAnnotationModel(); + if ( model != null ) { + Iterator it = model.getAnnotationIterator(); + while( it.hasNext() ) { + Annotation ann = (Annotation)it.next(); + if ( ann instanceof MarkerAnnotation && ((MarkerAnnotation)ann).getMarker().equals( breakpoint.getMarker() ) ) { + return model.getPosition( ann ); + } + } } return null; } -} + + private IDocument getDocument() { + IWorkbenchPart targetPart = getTargetPart(); + if ( targetPart instanceof ITextEditor ) { + ITextEditor textEditor = (ITextEditor)targetPart; + IDocumentProvider provider = textEditor.getDocumentProvider(); + if ( provider != null ) + return provider.getDocument( textEditor.getEditorInput() ); + } + else if ( targetPart instanceof DisassemblyView ) { + DisassemblyView dv = (DisassemblyView)targetPart; + IDocumentProvider provider = dv.getDocumentProvider(); + if ( provider != null ) + return provider.getDocument( dv.getInput() ); + } + return null; + } + + private IAnnotationModel getAnnotationModel() { + IWorkbenchPart targetPart = getTargetPart(); + if ( targetPart instanceof ITextEditor ) { + ITextEditor textEditor = (ITextEditor)targetPart; + IDocumentProvider provider = textEditor.getDocumentProvider(); + if ( provider != null ) + return provider.getAnnotationModel( textEditor.getEditorInput() ); + } + else if ( targetPart instanceof DisassemblyView ) { + DisassemblyView dv = (DisassemblyView)targetPart; + IDocumentProvider provider = dv.getDocumentProvider(); + if ( provider != null ) + return provider.getAnnotationModel( dv.getInput() ); + } + return null; + } +} \ No newline at end of file diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ActionMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ActionMessages.properties index 8b572fac8c4..df41002f518 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ActionMessages.properties +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ActionMessages.properties @@ -23,3 +23,11 @@ ToggleBreakpointAdapter.Missing_document_2=Missing document ToggleBreakpointAdapter.Missing_resource_2=Missing resource ToggleBreakpointAdapter.Invalid_expression_1=Invalid expression: RunToLineAdapter.Operation_is_not_supported_1=Operation is not supported. +EnableDisableBreakpointRulerAction.Enable_Breakpoint_1=&Enable Breakpoint +EnableDisableBreakpointRulerAction.Enabling_disabling_breakpoints_1=Enabling/disabling breakpoints +EnableDisableBreakpointRulerAction.Exceptions_occurred_enabling_or_disabling_breakpoint_1=Exceptions occurred enabling or disabling the breakpoint +EnableDisableBreakpointRulerAction.Disable_Breakpoint_1=&Disable Breakpoint +ToggleBreakpointRulerAction.Toggle_Breakpoint_1=Toggle &Breakpoint +ToggleBreakpointRulerAction.Error_1=Error +ToggleBreakpointRulerAction.Operation_failed_1=Operation failed +CBreakpointPropertiesRulerAction.Breakpoint_Properties=Breakpoint &Properties... diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/CBreakpointPropertiesRulerAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/CBreakpointPropertiesRulerAction.java index c9cbab96be5..3f76c2488a5 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/CBreakpointPropertiesRulerAction.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/CBreakpointPropertiesRulerAction.java @@ -1,59 +1,60 @@ -/* - *(c) Copyright QNX Software Systems Ltd. 2002. - * All Rights Reserved. +/********************************************************************** + * 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.debug.core.model.ICBreakpoint; +import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds; +import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.text.source.IVerticalRulerInfo; -import org.eclipse.ui.texteditor.ITextEditor; -import org.eclipse.cdt.debug.ui.CDebugUIPlugin; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.help.WorkbenchHelp; /** - * - * Presents a custom properties dialog to configure the attibutes of - * a C/C++ breakpoint from the ruler popup menu of a text editor. - * - * @since Aug 29, 2002 + * Opens a custom properties dialog to configure the attibutes of a C/C++ breakpoint + * from the ruler popup menu. */ -public class CBreakpointPropertiesRulerAction extends AbstractBreakpointRulerAction -{ - /** - * Creates the action to enable/disable breakpoints - */ - public CBreakpointPropertiesRulerAction( ITextEditor editor, IVerticalRulerInfo info ) - { - setInfo( info ); - setTextEditor( editor ); - setText( CDebugUIPlugin.getResourceString("internal.ui.actions.CBreakpointPropertiesRulerAction.Breakpoint_Properties") ); //$NON-NLS-1$ - } +public class CBreakpointPropertiesRulerAction extends AbstractBreakpointRulerAction { /** + * Creates the action to modify the breakpoint properties. + */ + public CBreakpointPropertiesRulerAction( IWorkbenchPart part, IVerticalRulerInfo info ) { + setInfo( info ); + setTargetPart( part ); + setText( ActionMessages.getString( "CBreakpointPropertiesRulerAction.Breakpoint_Properties" ) ); //$NON-NLS-1$ + WorkbenchHelp.setHelp( this, ICDebugHelpContextIds.BREAKPOINT_PROPERTIES_ACTION ); + setId( IInternalCDebugUIConstants.ACTION_BREAKPOINT_PROPERTIES ); + } + + /* (non-Javadoc) * @see Action#run() */ - public void run() - { - if ( getBreakpoint() != null ) - { - Dialog d = new CBreakpointPropertiesDialog( getTextEditor().getEditorSite().getShell(), (ICBreakpoint)getBreakpoint() ); + public void run() { + if ( getBreakpoint() != null ) { + Dialog d = new CBreakpointPropertiesDialog( getTargetPart().getSite().getShell(), (ICBreakpoint)getBreakpoint() ); d.open(); } } - /** + /* (non-Javadoc) * @see IUpdate#update() */ - public void update() - { + public void update() { setBreakpoint( determineBreakpoint() ); - if ( getBreakpoint() == null || !( getBreakpoint() instanceof ICBreakpoint ) ) - { + if ( getBreakpoint() == null || !(getBreakpoint() instanceof ICBreakpoint) ) { setBreakpoint( null ); setEnabled( false ); return; } setEnabled( true ); } -} +} \ No newline at end of file diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/EnableDisableBreakpointRulerAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/EnableDisableBreakpointRulerAction.java index e69642c8d71..a6a06a16bd2 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/EnableDisableBreakpointRulerAction.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/EnableDisableBreakpointRulerAction.java @@ -1,39 +1,50 @@ +/********************************************************************** + * 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.debug.ui.CDebugUIPlugin; +import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds; +import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants; import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.text.source.IVerticalRulerInfo; -import org.eclipse.ui.texteditor.ITextEditor; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.help.WorkbenchHelp; +import org.eclipse.ui.texteditor.IUpdate; + +public class EnableDisableBreakpointRulerAction extends AbstractBreakpointRulerAction { -public class EnableDisableBreakpointRulerAction extends AbstractBreakpointRulerAction -{ /** * Creates the action to enable/disable breakpoints */ - public EnableDisableBreakpointRulerAction( ITextEditor editor, IVerticalRulerInfo info ) - { + public EnableDisableBreakpointRulerAction( IWorkbenchPart part, IVerticalRulerInfo info ) { setInfo( info ); - setTextEditor( editor ); - setText( CDebugUIPlugin.getResourceString("internal.ui.actions.EnableDisableBreakpointRulerAction.Enable_Breakpoint") ); //$NON-NLS-1$ + setTargetPart( part ); + setText( ActionMessages.getString( "EnableDisableBreakpointRulerAction.Enable_Breakpoint_1" ) ); //$NON-NLS-1$ + WorkbenchHelp.setHelp( this, ICDebugHelpContextIds.ENABLE_DISABLE_BREAKPOINT_ACTION ); + setId( IInternalCDebugUIConstants.ACTION_ENABLE_DISABLE_BREAKPOINT ); } /** * @see Action#run() */ - public void run() - { - if (getBreakpoint() != null) - { - try - { + public void run() { + if ( getBreakpoint() != null ) { + try { getBreakpoint().setEnabled( !getBreakpoint().isEnabled() ); } - catch (CoreException e) - { - ErrorDialog.openError( getTextEditor().getEditorSite().getShell(), - CDebugUIPlugin.getResourceString("internal.ui.actions.EnableDisableBreakpointRulerAction.Enabling_disabling_breakpoints"), //$NON-NLS-1$ - CDebugUIPlugin.getResourceString("internal.ui.actions.EnableDisableBreakpointRulerAction.Exceptions_occured_enabling_disabling_breakpoint"), //$NON-NLS-1$ + catch( CoreException e ) { + ErrorDialog.openError( getTargetPart().getSite().getShell(), ActionMessages.getString( "EnableDisableBreakpointRulerAction.Enabling_disabling_breakpoints_1" ), //$NON-NLS-1$ + ActionMessages.getString( "EnableDisableBreakpointRulerAction.Exceptions_occurred_enabling_or_disabling_breakpoint_1" ), //$NON-NLS-1$ e.getStatus() ); } } @@ -42,24 +53,19 @@ public class EnableDisableBreakpointRulerAction extends AbstractBreakpointRulerA /** * @see IUpdate#update() */ - public void update() - { - setBreakpoint(determineBreakpoint()); - if ( getBreakpoint() == null ) - { + public void update() { + setBreakpoint( determineBreakpoint() ); + if ( getBreakpoint() == null ) { setEnabled( false ); return; } setEnabled( true ); - try - { + try { boolean enabled = getBreakpoint().isEnabled(); - setText( enabled ? CDebugUIPlugin.getResourceString("internal.ui.actions.EnableDisableBreakpointRulerAction.Disable_breakpoint") : //$NON-NLS-1$ - CDebugUIPlugin.getResourceString("internal.ui.actions.EnableDisableBreakpointRulerAction.Enable_Breakpoint") ); //$NON-NLS-1$ + setText( enabled ? ActionMessages.getString( "EnableDisableBreakpointRulerAction.Disable_Breakpoint_1" ) : ActionMessages.getString( "EnableDisableBreakpointRulerAction.Enable_Breakpoint_1" ) ); //$NON-NLS-1$ //$NON-NLS-2$ } - catch( CoreException ce ) - { - CDebugUIPlugin.log( ce ); + catch( CoreException e ) { + DebugPlugin.log( e ); } } -} +} \ No newline at end of file diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/EnableDisableBreakpointRulerActionDelegate.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/EnableDisableBreakpointRulerActionDelegate.java index ae6d4f68f47..4d8dcbdfe59 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/EnableDisableBreakpointRulerActionDelegate.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/EnableDisableBreakpointRulerActionDelegate.java @@ -1,3 +1,13 @@ +/********************************************************************** + * 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.jface.action.IAction; @@ -5,13 +15,12 @@ import org.eclipse.jface.text.source.IVerticalRulerInfo; import org.eclipse.ui.texteditor.AbstractRulerActionDelegate; import org.eclipse.ui.texteditor.ITextEditor; -public class EnableDisableBreakpointRulerActionDelegate extends AbstractRulerActionDelegate -{ - /** +public class EnableDisableBreakpointRulerActionDelegate extends AbstractRulerActionDelegate { + + /* * @see AbstractRulerActionDelegate#createAction(ITextEditor, IVerticalRulerInfo) */ - protected IAction createAction( ITextEditor editor, IVerticalRulerInfo rulerInfo ) - { + protected IAction createAction( ITextEditor editor, IVerticalRulerInfo rulerInfo ) { return new EnableDisableBreakpointRulerAction( editor, rulerInfo ); } -} +} \ No newline at end of file diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerAction.java deleted file mode 100644 index 074823883d9..00000000000 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerAction.java +++ /dev/null @@ -1,217 +0,0 @@ -/********************************************************************** - * 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 java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.cdt.debug.ui.CDebugUIPlugin; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.IBreakpointManager; -import org.eclipse.debug.core.model.IBreakpoint; -import org.eclipse.debug.internal.ui.DebugUIPlugin; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.ITextSelection; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.TextSelection; -import org.eclipse.jface.text.source.IAnnotationModel; -import org.eclipse.jface.text.source.IVerticalRulerInfo; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel; -import org.eclipse.ui.texteditor.IDocumentProvider; -import org.eclipse.ui.texteditor.ITextEditor; - -public class ManageBreakpointRulerAction extends Action { - - private IVerticalRulerInfo fRuler; - private ITextEditor fTextEditor; - private ToggleBreakpointAdapter fBreakpointAdapter; - - /** - * Constructor for ManageBreakpointRulerAction. - * - * @param ruler - * @param editor - */ - public ManageBreakpointRulerAction( IVerticalRulerInfo ruler, ITextEditor editor ) { - super( "Toggle &Breakpoint" ); - fRuler = ruler; - fTextEditor = editor; - fBreakpointAdapter = new ToggleBreakpointAdapter(); - } - - /** - * Disposes this action - */ - public void dispose() { - fTextEditor = null; - fRuler = null; - } - - /** - * @see Action#run() - */ - public void run() { - try { - List list = getMarkers(); - if ( list.isEmpty() ) { - // create new markers - IDocument document = getDocument(); - int lineNumber = getVerticalRulerInfo().getLineOfLastMouseButtonActivity(); - IRegion line = document.getLineInformation( lineNumber ); - ITextSelection selection = new TextSelection( document, line.getOffset(), line.getLength() ); - fBreakpointAdapter.toggleLineBreakpoints( fTextEditor, selection ); - } - else { - // remove existing breakpoints of any type - IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager(); - Iterator iterator = list.iterator(); - while( iterator.hasNext() ) { - IMarker marker = (IMarker)iterator.next(); - IBreakpoint breakpoint = manager.getBreakpoint( marker ); - if ( breakpoint != null ) { - breakpoint.delete(); - } - } - } - } - catch( BadLocationException e ) { - DebugUIPlugin.errorDialog( getTextEditor().getSite().getShell(), - "Error", - "Operation failed", - e ); - } - catch( CoreException e ) { - DebugUIPlugin.errorDialog( getTextEditor().getSite().getShell(), - "Error", - "Operation failed", - e.getStatus() ); - } - } - - protected List getMarkers() { - List breakpoints = new ArrayList(); - IResource resource = ToggleBreakpointAdapter.getResource( fTextEditor ); - IDocument document = getDocument(); - AbstractMarkerAnnotationModel model = getAnnotationModel(); - if ( model != null ) { - try { - IMarker[] markers = null; - if ( resource instanceof IFile ) - markers = resource.findMarkers( IBreakpoint.BREAKPOINT_MARKER, true, IResource.DEPTH_INFINITE ); - else { - IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - markers = root.findMarkers( IBreakpoint.BREAKPOINT_MARKER, true, IResource.DEPTH_INFINITE ); - } - if ( markers != null ) { - IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager(); - for( int i = 0; i < markers.length; i++ ) { - IBreakpoint breakpoint = breakpointManager.getBreakpoint( markers[i] ); - if ( breakpoint != null && breakpointManager.isRegistered( breakpoint ) && includesRulerLine( model.getMarkerPosition( markers[i] ), document ) ) - breakpoints.add( markers[i] ); - } - } - } - catch( CoreException x ) { - CDebugUIPlugin.log( x.getStatus() ); - } - } - return breakpoints; - } - - /** - * Returns the resource for which to create the marker, - * or null if there is no applicable resource. - * - * @return the resource for which to create the marker or null - */ - protected IResource getResource() { - IEditorInput input = fTextEditor.getEditorInput(); - IResource resource = (IResource)input.getAdapter( IFile.class ); - if ( resource == null ) - resource = (IResource)input.getAdapter( IResource.class ); - return resource; - } - - /** - * Checks whether a position includes the ruler's line of activity. - * - * @param position the position to be checked - * @param document the document the position refers to - * @return true if the line is included by the given position - */ - protected boolean includesRulerLine( Position position, IDocument document ) { - if ( position != null ) { - try { - int markerLine = document.getLineOfOffset( position.getOffset() ); - int line = fRuler.getLineOfLastMouseButtonActivity(); - if ( line == markerLine ) { - return true; - } - } - catch( BadLocationException x ) { - } - } - return false; - } - - /** - * Returns this action's vertical ruler info. - * - * @return this action's vertical ruler - */ - protected IVerticalRulerInfo getVerticalRulerInfo() { - return fRuler; - } - - /** - * Returns this action's editor. - * - * @return this action's editor - */ - protected ITextEditor getTextEditor() { - return fTextEditor; - } - - /** - * Returns the AbstractMarkerAnnotationModel of the editor's input. - * - * @return the marker annotation model - */ - protected AbstractMarkerAnnotationModel getAnnotationModel() { - IDocumentProvider provider = fTextEditor.getDocumentProvider(); - IAnnotationModel model = provider.getAnnotationModel( fTextEditor.getEditorInput() ); - if ( model instanceof AbstractMarkerAnnotationModel ) { - return (AbstractMarkerAnnotationModel)model; - } - return null; - } - - /** - * Returns the IDocument of the editor's input. - * - * @return the document of the editor's input - */ - protected IDocument getDocument() { - IDocumentProvider provider = fTextEditor.getDocumentProvider(); - return provider.getDocument( fTextEditor.getEditorInput() ); - } -} \ No newline at end of file diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerActionDelegate.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerActionDelegate.java index 84154f578c8..14ae2a9092e 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerActionDelegate.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerActionDelegate.java @@ -18,14 +18,14 @@ import org.eclipse.ui.texteditor.ITextEditor; public class ManageBreakpointRulerActionDelegate extends AbstractRulerActionDelegate { - private ManageBreakpointRulerAction fTargetAction; + private ToggleBreakpointRulerAction fTargetAction; private IEditorPart fActiveEditor; /* (non-Javadoc) * @see org.eclipse.ui.texteditor.AbstractRulerActionDelegate#createAction(ITextEditor, IVerticalRulerInfo) */ public IAction createAction( ITextEditor editor, IVerticalRulerInfo rulerInfo ) { - fTargetAction = new ManageBreakpointRulerAction( rulerInfo, editor ); + fTargetAction = new ToggleBreakpointRulerAction( editor, rulerInfo ); return fTargetAction; } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageFunctionBreakpointActionDelegate.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageFunctionBreakpointActionDelegate.java index b1d316c07f7..a904776ec88 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageFunctionBreakpointActionDelegate.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageFunctionBreakpointActionDelegate.java @@ -9,11 +9,6 @@ package org.eclipse.cdt.debug.internal.ui.actions; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IFunction; import org.eclipse.cdt.core.model.IMethod; -import org.eclipse.cdt.debug.core.CDebugModel; -import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint; -import org.eclipse.cdt.debug.ui.CDebugUIPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.debug.core.DebugPlugin; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java index 46b33eb1be4..14439d3295b 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java @@ -233,16 +233,14 @@ public class ToggleBreakpointAdapter implements IToggleBreakpointsTarget { } } - protected static IResource getResource( IEditorPart editor ) { - IResource resource; - IEditorInput editorInput = editor.getEditorInput(); - if ( editorInput instanceof IFileEditorInput ) { - resource = ((IFileEditorInput)editorInput).getFile(); + protected static IResource getResource( IWorkbenchPart part ) { + if ( part instanceof IEditorPart ) { + IEditorInput editorInput = ((IEditorPart)part).getEditorInput(); + if ( editorInput instanceof IFileEditorInput ) { + return ((IFileEditorInput)editorInput).getFile(); + } } - else { - resource = ResourcesPlugin.getWorkspace().getRoot(); - } - return resource; + return ResourcesPlugin.getWorkspace().getRoot(); } private String getSourceHandle( IEditorInput input ) throws CoreException { diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointRulerAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointRulerAction.java new file mode 100644 index 00000000000..b11c3cc4019 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointRulerAction.java @@ -0,0 +1,137 @@ +/********************************************************************** + * 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.debug.internal.ui.ICDebugHelpContextIds; +import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants; +import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyView; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.TextSelection; +import org.eclipse.jface.text.source.IVerticalRulerInfo; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.help.WorkbenchHelp; +import org.eclipse.ui.texteditor.IDocumentProvider; +import org.eclipse.ui.texteditor.ITextEditor; + +public class ToggleBreakpointRulerAction extends Action { + + static class EmptySelection implements ISelection { + + public boolean isEmpty() { + return true; + } + } + + private IVerticalRulerInfo fRuler; + private IWorkbenchPart fTargetPart; + private ToggleBreakpointAdapter fBreakpointAdapter; + private static final ISelection EMPTY_SELECTION = new EmptySelection(); + + /** + * Constructor for ToggleBreakpointRulerAction. + * + * @param ruler + * @param editor + */ + public ToggleBreakpointRulerAction( IWorkbenchPart part, IVerticalRulerInfo ruler ) { + super( ActionMessages.getString( "ToggleBreakpointRulerAction.Toggle_Breakpoint_1" ) ); //$NON-NLS-1$ + fRuler = ruler; + setTargetPart( part ); + fBreakpointAdapter = new ToggleBreakpointAdapter(); + WorkbenchHelp.setHelp( this, ICDebugHelpContextIds.TOGGLE_BREAKPOINT_ACTION ); + setId( IInternalCDebugUIConstants.ACTION_TOGGLE_BREAKPOINT ); + } + + /** + * Disposes this action + */ + public void dispose() { + setTargetPart( null ); + fRuler = null; + } + + /** + * @see Action#run() + */ + public void run() { + try { + fBreakpointAdapter.toggleLineBreakpoints( getTargetPart(), getTargetSelection() ); + } + catch( CoreException e ) { + DebugUIPlugin.errorDialog( getTargetPart().getSite().getShell(), + ActionMessages.getString( "ToggleBreakpointRulerAction.Error_1" ), //$NON-NLS-1$ + ActionMessages.getString( "ToggleBreakpointRulerAction.Operation_failed_1" ), //$NON-NLS-1$ + e.getStatus() ); + } + } + + /** + * Returns this action's vertical ruler info. + * + * @return this action's vertical ruler + */ + protected IVerticalRulerInfo getVerticalRulerInfo() { + return fRuler; + } + + private IWorkbenchPart getTargetPart() { + return this.fTargetPart; + } + + private void setTargetPart( IWorkbenchPart targetPart ) { + this.fTargetPart = targetPart; + } + + /** + * Returns the current selection in the active part, possibly + * and empty selection, but never null. + * + * @return the selection in the active part, possibly empty + */ + private ISelection getTargetSelection() { + IDocument doc = getDocument(); + if ( doc != null ) { + int line = getVerticalRulerInfo().getLineOfLastMouseButtonActivity(); + try { + IRegion region = doc.getLineInformation( line ); + return new TextSelection( doc, region.getOffset(), region.getLength() ); + } + catch( BadLocationException e ) { + DebugPlugin.log( e ); + } + } + return EMPTY_SELECTION; + } + + private IDocument getDocument() { + IWorkbenchPart targetPart = getTargetPart(); + if ( targetPart instanceof ITextEditor ) { + ITextEditor textEditor = (ITextEditor)targetPart; + IDocumentProvider provider = textEditor.getDocumentProvider(); + if ( provider != null ) + return provider.getDocument( textEditor.getEditorInput() ); + } + else if ( targetPart instanceof DisassemblyView ) { + DisassemblyView dv = (DisassemblyView)targetPart; + IDocumentProvider provider = dv.getDocumentProvider(); + if ( provider != null ) + return provider.getDocument( dv.getInput() ); + } + return null; + } +} \ No newline at end of file diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyAnnotationModel.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyAnnotationModel.java index f0c598c3864..7f044c000ce 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyAnnotationModel.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyAnnotationModel.java @@ -17,9 +17,7 @@ import java.util.List; import org.eclipse.cdt.debug.core.model.ICLineBreakpoint; import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.IBreakpointsListener; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.jface.text.BadLocationException; @@ -33,77 +31,66 @@ import org.eclipse.ui.texteditor.MarkerAnnotation; /** * Annotation model for Disassembly view. */ -public class DisassemblyAnnotationModel extends AnnotationModel implements IBreakpointsListener { +public class DisassemblyAnnotationModel extends AnnotationModel { private DisassemblyEditorInput fInput; - private IDocument fDisassemblyDocument; +// private IDocument fDisassemblyDocument; /** * Constructor for DisassemblyAnnotationModel. */ - public DisassemblyAnnotationModel( IDocument document ) { + public DisassemblyAnnotationModel() { super(); - fDisassemblyDocument = document; - DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener( this ); } - /* (non-Javadoc) - * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[]) - */ - public void breakpointsAdded( final IBreakpoint[] breakpoints ) { + protected void breakpointsAdded( final IBreakpoint[] breakpoints, final IDocument document ) { if ( getInput().equals( DisassemblyEditorInput.EMPTY_EDITOR_INPUT ) || getInput().equals( DisassemblyEditorInput.PENDING_EDITOR_INPUT ) ) return; asyncExec( new Runnable() { public void run() { - breakpointsAdded0( breakpoints ); + breakpointsAdded0( breakpoints, document ); } } ); } - /* (non-Javadoc) - * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsRemoved(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[]) - */ - public void breakpointsRemoved( final IBreakpoint[] breakpoints, IMarkerDelta[] deltas ) { + protected void breakpointsRemoved( final IBreakpoint[] breakpoints, final IDocument document ) { if ( getInput().equals( DisassemblyEditorInput.EMPTY_EDITOR_INPUT ) || getInput().equals( DisassemblyEditorInput.PENDING_EDITOR_INPUT ) ) return; asyncExec( new Runnable() { public void run() { - breakpointsRemoved0( breakpoints ); + breakpointsRemoved0( breakpoints, document ); } } ); } - /* (non-Javadoc) - * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsChanged(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[]) - */ - public void breakpointsChanged( final IBreakpoint[] breakpoints, IMarkerDelta[] deltas ) { + protected void breakpointsChanged( final IBreakpoint[] breakpoints, final IDocument document ) { if ( getInput().equals( DisassemblyEditorInput.EMPTY_EDITOR_INPUT ) || getInput().equals( DisassemblyEditorInput.PENDING_EDITOR_INPUT ) ) return; asyncExec( new Runnable() { public void run() { - breakpointsChanged0( breakpoints ); + breakpointsChanged0( breakpoints, document ); } } ); } - protected void breakpointsAdded0( IBreakpoint[] breakpoints ) { + protected void breakpointsAdded0( IBreakpoint[] breakpoints, IDocument document ) { for ( int i = 0; i < breakpoints.length; ++i ) { if ( breakpoints[i] instanceof ICLineBreakpoint && isApplicable( breakpoints[i] ) ) { - addBreakpointAnnotation( (ICLineBreakpoint)breakpoints[i] ); + addBreakpointAnnotation( (ICLineBreakpoint)breakpoints[i], document ); } } fireModelChanged(); } - protected void breakpointsRemoved0( IBreakpoint[] breakpoints ) { + protected void breakpointsRemoved0( IBreakpoint[] breakpoints, IDocument document ) { removeAnnotations( findAnnotationsforBreakpoints( breakpoints ), true, false ); } - protected void breakpointsChanged0( IBreakpoint[] breakpoints ) { + protected void breakpointsChanged0( IBreakpoint[] breakpoints, IDocument document ) { List annotations = findAnnotationsforBreakpoints( breakpoints ); List markers = new ArrayList( annotations.size() ); Iterator it = annotations.iterator(); @@ -114,7 +101,7 @@ public class DisassemblyAnnotationModel extends AnnotationModel implements IBrea } for ( int i = 0; i < breakpoints.length; ++i ) { if ( breakpoints[i] instanceof ICLineBreakpoint && !markers.contains( breakpoints[i].getMarker() ) ) { - addBreakpointAnnotation( (ICLineBreakpoint)breakpoints[i] ); + addBreakpointAnnotation( (ICLineBreakpoint)breakpoints[i], document ); } } fireModelChanged(); @@ -124,19 +111,19 @@ public class DisassemblyAnnotationModel extends AnnotationModel implements IBrea return this.fInput; } - protected void setInput( DisassemblyEditorInput input ) { + protected void setInput( DisassemblyEditorInput input, IDocument document ) { DisassemblyEditorInput oldInput = this.fInput; this.fInput = input; if ( this.fInput != null && !this.fInput.equals( oldInput ) ) - updateAnnotations(); + updateAnnotations( document ); } private boolean isApplicable( IBreakpoint breakpoint ) { return true; } - private void addBreakpointAnnotation( ICLineBreakpoint breakpoint ) { - Position position = createBreakpointPosition( breakpoint ); + private void addBreakpointAnnotation( ICLineBreakpoint breakpoint, IDocument document ) { + Position position = createBreakpointPosition( breakpoint, document ); if ( position != null ) { try { addAnnotation( createMarkerAnnotation( breakpoint ), position, false ); @@ -146,19 +133,19 @@ public class DisassemblyAnnotationModel extends AnnotationModel implements IBrea } } - private Position createBreakpointPosition( ICLineBreakpoint breakpoint ) { + private Position createBreakpointPosition( ICLineBreakpoint breakpoint, IDocument document ) { Position position = null; DisassemblyEditorInput input = getInput(); if ( input != null ) { long address = input.getBreakpointAddress( breakpoint ); int start = -1; - if ( address > 0 && fDisassemblyDocument != null ) { + if ( address > 0 && document != null ) { int instrNumber = input.getInstructionNumber( address ); if ( instrNumber > 0 ) { try { start = fDocument.getLineOffset( instrNumber - 1 ); if ( start > -1 ) { - return new Position( start, fDisassemblyDocument.getLineLength( instrNumber - 1 ) ); + return new Position( start, document.getLineLength( instrNumber - 1 ) ); } } catch( BadLocationException e ) { @@ -174,7 +161,6 @@ public class DisassemblyAnnotationModel extends AnnotationModel implements IBrea } protected void dispose() { - DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener( this ); } private List findAnnotationsforBreakpoints( IBreakpoint[] breakpoints ) { @@ -202,15 +188,15 @@ public class DisassemblyAnnotationModel extends AnnotationModel implements IBrea display.asyncExec( r ); } - private void updateAnnotations() { + private void updateAnnotations( final IDocument document ) { asyncExec( new Runnable() { public void run() { - doUpdateAnnotations(); + doUpdateAnnotations( document ); } } ); } - protected void doUpdateAnnotations() { - breakpointsAdded0( DebugPlugin.getDefault().getBreakpointManager().getBreakpoints() ); + protected void doUpdateAnnotations( IDocument document ) { + breakpointsAdded0( DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(), document ); } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyDocumentProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyDocumentProvider.java index cfef96f49d1..a8ab26daba8 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyDocumentProvider.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyDocumentProvider.java @@ -10,8 +10,12 @@ ***********************************************************************/ package org.eclipse.cdt.debug.internal.ui.views.disassembly; +import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.IBreakpointsListener; +import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.source.IAnnotationModel; @@ -21,38 +25,24 @@ import org.eclipse.ui.texteditor.IElementStateListener; /** * Document provider for disassembly view. */ -public class DisassemblyDocumentProvider implements IDocumentProvider { +public class DisassemblyDocumentProvider implements IDocumentProvider, IBreakpointsListener { private IDocument fDocument; - -// private DisassemblyMarkerAnnotationModel fAnnotationModel; private DisassemblyAnnotationModel fAnnotationModel; /** * Constructor for DisassemblyDocumentProvider. */ public DisassemblyDocumentProvider() { + fDocument = new Document(); + fAnnotationModel = new DisassemblyAnnotationModel(); + DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener( this ); } /* (non-Javadoc) * @see org.eclipse.ui.texteditor.IDocumentProvider#connect(java.lang.Object) */ public void connect( Object element ) throws CoreException { - } - - /* (non-Javadoc) - * @see org.eclipse.ui.texteditor.IDocumentProvider#disconnect(java.lang.Object) - */ - public void disconnect( Object element ) { - } - - /* (non-Javadoc) - * @see org.eclipse.ui.texteditor.IDocumentProvider#getDocument(java.lang.Object) - */ - public IDocument getDocument( Object element ) { - if ( fDocument == null ) { - fDocument = new Document(); - } if ( element instanceof DisassemblyEditorInput ) { String contents = ((DisassemblyEditorInput)element).getContents(); fDocument.set( contents ); @@ -60,6 +50,21 @@ public class DisassemblyDocumentProvider implements IDocumentProvider { else { fDocument.set( "" ); //$NON-NLS-1$ } + fAnnotationModel.setInput( ( element instanceof DisassemblyEditorInput ) ? (DisassemblyEditorInput)element : null, fDocument ); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.texteditor.IDocumentProvider#disconnect(java.lang.Object) + */ + public void disconnect( Object element ) { + fDocument.set( "" ); //$NON-NLS-1$ + fAnnotationModel.setInput( null, fDocument ); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.texteditor.IDocumentProvider#getDocument(java.lang.Object) + */ + public IDocument getDocument( Object element ) { return fDocument; } @@ -121,11 +126,6 @@ public class DisassemblyDocumentProvider implements IDocumentProvider { * @see org.eclipse.ui.texteditor.IDocumentProvider#getAnnotationModel(java.lang.Object) */ public IAnnotationModel getAnnotationModel( Object element ) { - if ( fAnnotationModel == null ) { -// fAnnotationModel = new DisassemblyMarkerAnnotationModel( getDocument( element ) ); - fAnnotationModel = new DisassemblyAnnotationModel( getDocument( element ) ); - } - fAnnotationModel.setInput( ( element instanceof DisassemblyEditorInput ) ? (DisassemblyEditorInput)element : null ); return fAnnotationModel; } @@ -158,8 +158,32 @@ public class DisassemblyDocumentProvider implements IDocumentProvider { } protected void dispose() { + fDocument = null; if ( fAnnotationModel != null ) { fAnnotationModel.dispose(); + fAnnotationModel = null; } + DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener( this ); + } + + /* (non-Javadoc) + * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[]) + */ + public void breakpointsAdded( IBreakpoint[] breakpoints ) { + fAnnotationModel.breakpointsAdded( breakpoints, fDocument ); + } + + /* (non-Javadoc) + * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsChanged(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[]) + */ + public void breakpointsChanged( IBreakpoint[] breakpoints, IMarkerDelta[] deltas ) { + fAnnotationModel.breakpointsChanged( breakpoints, fDocument ); + } + + /* (non-Javadoc) + * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsRemoved(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[]) + */ + public void breakpointsRemoved( IBreakpoint[] breakpoints, IMarkerDelta[] deltas ) { + fAnnotationModel.breakpointsRemoved( breakpoints, fDocument ); } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyView.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyView.java index afaa40d2086..2ef8f094e77 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyView.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyView.java @@ -11,16 +11,23 @@ package org.eclipse.cdt.debug.internal.ui.views.disassembly; import java.util.Iterator; +import java.util.Map; +import java.util.HashMap; import org.eclipse.cdt.debug.core.model.IAsmInstruction; import org.eclipse.cdt.debug.core.model.ICDebugTarget; import org.eclipse.cdt.debug.core.model.ICStackFrame; import org.eclipse.cdt.debug.core.model.IDisassembly; import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds; +import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants; +import org.eclipse.cdt.debug.internal.ui.actions.CBreakpointPropertiesRulerAction; +import org.eclipse.cdt.debug.internal.ui.actions.EnableDisableBreakpointRulerAction; +import org.eclipse.cdt.debug.internal.ui.actions.ToggleBreakpointRulerAction; import org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandler; import org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandlerView; import org.eclipse.cdt.debug.internal.ui.views.IDebugExceptionHandler; import org.eclipse.cdt.debug.ui.CDebugUIPlugin; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.DebugException; @@ -43,6 +50,7 @@ import org.eclipse.jface.text.source.IOverviewRuler; import org.eclipse.jface.text.source.ISharedTextColors; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.IVerticalRuler; +import org.eclipse.jface.text.source.IVerticalRulerInfo; import org.eclipse.jface.text.source.OverviewRuler; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.text.source.VerticalRuler; @@ -143,7 +151,7 @@ public class DisassemblyView extends AbstractDebugEventHandlerView public void mouseDoubleClick( MouseEvent e ) { if ( 1 == e.button ) { fDoubleClicked = true; - triggerAction( ITextEditorActionConstants.RULER_DOUBLE_CLICK ); + triggerAction( IInternalCDebugUIConstants.ACTION_TOGGLE_BREAKPOINT ); } } @@ -246,6 +254,11 @@ public class DisassemblyView extends AbstractDebugEventHandlerView */ private Menu fTextContextMenu; + /** + * The actions registered with the view. + */ + private Map fActions = new HashMap( 10 ); + /** * Constructor for DisassemblyView. */ @@ -285,6 +298,17 @@ public class DisassemblyView extends AbstractDebugEventHandlerView * @see org.eclipse.debug.ui.AbstractDebugView#createActions() */ protected void createActions() { + IAction action; + IVerticalRuler ruler = getVerticalRuler(); + if ( ruler instanceof IVerticalRulerInfo ) { + IVerticalRulerInfo info = (IVerticalRulerInfo)ruler; + action= new ToggleBreakpointRulerAction( this, info ); + setAction( IInternalCDebugUIConstants.ACTION_TOGGLE_BREAKPOINT, action ); + action= new EnableDisableBreakpointRulerAction( this, info ); + setAction( IInternalCDebugUIConstants.ACTION_ENABLE_DISABLE_BREAKPOINT, action ); + action= new CBreakpointPropertiesRulerAction( this, info ); + setAction( IInternalCDebugUIConstants.ACTION_BREAKPOINT_PROPERTIES, action ); + } } /* (non-Javadoc) @@ -420,6 +444,12 @@ public class DisassemblyView extends AbstractDebugEventHandlerView setInput( input ); showViewer(); + try { + getDocumentProvider().connect( input ); + } + catch( CoreException e ) { + // never happens + } getSourceViewer().setDocument( getDocumentProvider().getDocument( input ), getDocumentProvider().getAnnotationModel( input ) ); updateObjects(); @@ -443,6 +473,11 @@ public class DisassemblyView extends AbstractDebugEventHandlerView fDocumentProvider = null; } + if ( fActions != null ) { + fActions.clear(); + fActions = null; + } + super.dispose(); } @@ -627,7 +662,7 @@ public class DisassemblyView extends AbstractDebugEventHandlerView return EditorsPlugin.getDefault().getPreferenceStore(); } - protected DisassemblyDocumentProvider getDocumentProvider() { + public DisassemblyDocumentProvider getDocumentProvider() { if ( this.fDocumentProvider == null ) this.fDocumentProvider = new DisassemblyDocumentProvider(); return this.fDocumentProvider; @@ -681,6 +716,12 @@ public class DisassemblyView extends AbstractDebugEventHandlerView IEditorInput input = DisassemblyEditorInput.EMPTY_EDITOR_INPUT; setInput( input ); showViewer(); + try { + getDocumentProvider().connect( input ); + } + catch( CoreException e ) { + // never happens + } IAnnotationModel model = getDocumentProvider().getAnnotationModel( input ); getSourceViewer().setDocument( getDocumentProvider().getDocument( input ), model ); removeCurrentInstructionPointer( model ); @@ -745,6 +786,9 @@ public class DisassemblyView extends AbstractDebugEventHandlerView protected void rulerContextMenuAboutToShow( IMenuManager menu ) { menu.add( new Separator( ITextEditorActionConstants.GROUP_REST ) ); menu.add( new Separator( IWorkbenchActionConstants.MB_ADDITIONS ) ); + addAction( menu, IInternalCDebugUIConstants.ACTION_TOGGLE_BREAKPOINT ); + addAction( menu, IInternalCDebugUIConstants.ACTION_ENABLE_DISABLE_BREAKPOINT ); + addAction( menu, IInternalCDebugUIConstants.ACTION_BREAKPOINT_PROPERTIES ); } /** @@ -776,6 +820,20 @@ public class DisassemblyView extends AbstractDebugEventHandlerView } } + /** + * Convenience method to add the action installed under the given action id to the given menu. + * @param menu the menu to add the action to + * @param actionId the id of the action to be added + */ + protected final void addAction( IMenuManager menu, String actionId ) { + IAction action = getAction( actionId ); + if ( action != null ) { + if ( action instanceof IUpdate ) + ((IUpdate)action).update(); + menu.add( action ); + } + } + protected Menu getRulerContextMenu() { return this.fRulerContextMenu; } @@ -812,4 +870,23 @@ public class DisassemblyView extends AbstractDebugEventHandlerView private void setTextContextMenu( Menu textContextMenu ) { this.fTextContextMenu = textContextMenu; } + + public void setAction( String actionID, IAction action ) { + Assert.isNotNull( actionID ); + if ( action == null ) { + action = (IAction)fActions.remove( actionID ); + } + else { + fActions.put( actionID, action ); + } + } + + public IAction getAction( String actionID ) { + Assert.isNotNull( actionID ); + return (IAction)fActions.get( actionID ); + } + + private IVerticalRuler getVerticalRuler() { + return this.fVerticalRuler; + } }