diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CStackFrame.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CStackFrame.java index d0d0bbde286..aa37f32a36b 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CStackFrame.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CStackFrame.java @@ -13,6 +13,7 @@ import java.util.Iterator; import java.util.List; import org.eclipse.cdt.debug.core.CDebugCorePlugin; +import org.eclipse.cdt.debug.core.IRestart; import org.eclipse.cdt.debug.core.IStackFrameInfo; import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.ICDILocation; @@ -35,7 +36,8 @@ import org.eclipse.debug.core.model.IVariable; */ public class CStackFrame extends CDebugElement implements IStackFrame, - IStackFrameInfo, + IStackFrameInfo, + IRestart, ICDIEventListener { /** @@ -716,4 +718,22 @@ public class CStackFrame extends CDebugElement } return null; } + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.IRestart#canRestart() + */ + public boolean canRestart() + { + return getDebugTarget() instanceof IRestart && ((IRestart)getDebugTarget()).canRestart(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.IRestart#restart() + */ + public void restart() throws DebugException + { + if ( canRestart() ) + { + ((IRestart)getDebugTarget()).restart(); + } + } } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CThread.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CThread.java index fb0a0261b2e..ba6a3ebb2f6 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CThread.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CThread.java @@ -13,6 +13,7 @@ import java.util.Iterator; import java.util.List; import org.eclipse.cdt.debug.core.IInstructionStep; +import org.eclipse.cdt.debug.core.IRestart; import org.eclipse.cdt.debug.core.IState; import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.ICDIBreakpoint; @@ -47,6 +48,7 @@ import org.eclipse.debug.core.model.IThread; public class CThread extends CDebugElement implements IThread, IState, + IRestart, IInstructionStep, ICDIEventListener { @@ -901,4 +903,22 @@ public class CThread extends CDebugElement { return fRefreshChildren; } + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.IRestart#canRestart() + */ + public boolean canRestart() + { + return getDebugTarget() instanceof IRestart && ((IRestart)getDebugTarget()).canRestart(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.IRestart#restart() + */ + public void restart() throws DebugException + { + if ( canRestart() ) + { + ((IRestart)getDebugTarget()).restart(); + } + } } diff --git a/debug/org.eclipse.cdt.debug.ui/icons/full/clcl16/restart.gif b/debug/org.eclipse.cdt.debug.ui/icons/full/clcl16/restart.gif new file mode 100644 index 00000000000..0ca0683909c Binary files /dev/null and b/debug/org.eclipse.cdt.debug.ui/icons/full/clcl16/restart.gif differ diff --git a/debug/org.eclipse.cdt.debug.ui/icons/full/dlcl16/restart.gif b/debug/org.eclipse.cdt.debug.ui/icons/full/dlcl16/restart.gif new file mode 100644 index 00000000000..fe2b2c32580 Binary files /dev/null and b/debug/org.eclipse.cdt.debug.ui/icons/full/dlcl16/restart.gif differ diff --git a/debug/org.eclipse.cdt.debug.ui/icons/full/elcl16/restart.gif b/debug/org.eclipse.cdt.debug.ui/icons/full/elcl16/restart.gif new file mode 100644 index 00000000000..adcbec69525 Binary files /dev/null and b/debug/org.eclipse.cdt.debug.ui/icons/full/elcl16/restart.gif differ diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.properties b/debug/org.eclipse.cdt.debug.ui/plugin.properties index 2063975fc82..e50ecc117c5 100644 --- a/debug/org.eclipse.cdt.debug.ui/plugin.properties +++ b/debug/org.eclipse.cdt.debug.ui/plugin.properties @@ -9,4 +9,8 @@ RegistersView.name=Registers MemoryView.name=Memory MemoryPreferencePage.name=Memory Views -CDebuggerPage.name=C Debugger UI Page \ No newline at end of file +CDebuggerPage.name=C Debugger UI Page + +DebugActionSet.label=DebugActionSet +RestartAction.label=Restart +RestartAction.tooltip=Restart diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.xml b/debug/org.eclipse.cdt.debug.ui/plugin.xml index e75cd90ed3d..b0304951fbb 100644 --- a/debug/org.eclipse.cdt.debug.ui/plugin.xml +++ b/debug/org.eclipse.cdt.debug.ui/plugin.xml @@ -73,5 +73,68 @@ id="org.eclipse.cdt.debug.ui.MemoryViewPreferencePage"> + + + + + + + + + + + + + + + + + + + + + + diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractDebugActionDelegate.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractDebugActionDelegate.java new file mode 100644 index 00000000000..9769e3a3d14 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractDebugActionDelegate.java @@ -0,0 +1,331 @@ +package org.eclipse.cdt.debug.internal.ui.actions; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import java.util.Iterator; + +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.IViewActionDelegate; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; + +public abstract class AbstractDebugActionDelegate implements IWorkbenchWindowActionDelegate, IViewActionDelegate, ISelectionListener { + + /** + * The underlying action for this delegate + */ + private IAction fAction; + /** + * This action's view part, or null + * if not installed in a view. + */ + private IViewPart fViewPart; + + /** + * Cache of the most recent seletion + */ + private IStructuredSelection fSelection; + + /** + * Whether this delegate has been initialized + */ + private boolean fInitialized = false; + + /** + * The window associated with this action delegate + * May be null + */ + protected IWorkbenchWindow fWindow; + + /** + * It's crucial that delegate actions have a zero-arg constructor so that + * they can be reflected into existence when referenced in an action set + * in the plugin's plugin.xml file. + */ + public AbstractDebugActionDelegate() { + } + + /** + * @see IWorkbenchWindowActionDelegate#dispose() + */ + public void dispose(){ + if (getWindow() != null) { + getWindow().getSelectionService().removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this); + } + } + + /** + * @see IWorkbenchWindowActionDelegate#init(IWorkbenchWindow) + */ + public void init(IWorkbenchWindow window){ + // listen to selection changes in the debug view + setWindow(window); + window.getSelectionService().addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this); + } + + /** + * @see IActionDelegate#run(IAction) + */ + public void run(IAction action){ + IStructuredSelection selection= getSelection(); + + final Iterator enum= selection.iterator(); + String pluginId= DebugUIPlugin.getUniqueIdentifier(); + final MultiStatus ms= + new MultiStatus(pluginId, DebugException.REQUEST_FAILED, getStatusMessage(), null); + BusyIndicator.showWhile(Display.getCurrent(), new Runnable() { + public void run() { + while (enum.hasNext()) { + Object element= enum.next(); + try { + doAction(element); + } catch (DebugException e) { + ms.merge(e.getStatus()); + } + } + } + }); + if (!ms.isOK()) { + IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow(); + if (window != null) { + DebugUIPlugin.errorDialog(window.getShell(), getErrorDialogTitle(), getErrorDialogMessage(), ms); + } else { + DebugUIPlugin.log(ms); + } + } + } + + /** + * Set the icons for this action on the first selection changed + * event. This is necessary because the XML currently only + * supports setting the enabled icon. + *

+ * AbstractDebugActionDelegates come in 2 flavors: IViewActionDelegate, + * IWorkbenchWindowActionDelegate delegates. + *

+ * + *

+ * Only want to call update(action, selection) for IViewActionDelegates. + * An initialize call to update(action, selection) is made for all flavors to set the initial + * enabled state of the underlying action. + * IWorkbenchWindowActionDelegate's listen to selection changes + * in the debug view only. + *

+ * + * @see IActionDelegate#selectionChanged(IAction, ISelection) + */ + public void selectionChanged(IAction action, ISelection s) { + boolean wasInitialized= initialize(action, s); + if (!wasInitialized) { + if (getView() != null) { + update(action, s); + } + } + } + + protected void update(IAction action, ISelection s) { + if (s instanceof IStructuredSelection) { + IStructuredSelection ss = (IStructuredSelection)s; + action.setEnabled(getEnableStateForSelection(ss)); + setSelection(ss); + } else { + action.setEnabled(false); + setSelection(StructuredSelection.EMPTY); + } + } + + /** + * Return whether the action should be enabled or not based on the given selection. + */ + protected boolean getEnableStateForSelection(IStructuredSelection selection) { + if (selection.size() == 0) { + return false; + } + Iterator enum= selection.iterator(); + int count= 0; + while (enum.hasNext()) { + count++; + if (count > 1 && !enableForMultiSelection()) { + return false; + } + Object element= enum.next(); + if (!isEnabledFor(element)) { + return false; + } + } + return true; + } + + /** + * Returns whether this action should be enabled if there is + * multi selection. + */ + protected boolean enableForMultiSelection() { + return true; + } + + /** + * Performs the specific action on this element. + */ + protected abstract void doAction(Object element) throws DebugException; + + /** + * Returns whether this action will work for the given element + */ + protected abstract boolean isEnabledFor(Object element); + + /** + * Returns the String to use as an error dialog title for + * a failed action. Default is to return null. + */ + protected String getErrorDialogTitle(){ + return null; + } + /** + * Returns the String to use as an error dialog message for + * a failed action. This message appears as the "Message:" in + * the error dialog for this action. + * Default is to return null. + */ + protected String getErrorDialogMessage(){ + return null; + } + /** + * Returns the String to use as a status message for + * a failed action. This message appears as the "Reason:" + * in the error dialog for this action. + * Default is to return the empty String. + */ + protected String getStatusMessage(){ + return ""; //$NON-NLS-1$ + } + + /** + * @see IViewActionDelegate#init(IViewPart) + */ + public void init(IViewPart view) { + fViewPart = view; + } + + /** + * Returns this action's view part, or null + * if not installed in a view. + * + * @return view part or null + */ + protected IViewPart getView() { + return fViewPart; + } + + /** + * Initialize this delegate, updating this delegate's + * presentation. + * As well, all of the flavors of AbstractDebugActionDelegates need to + * have the initial enabled state set with a call to update(IAction, ISelection). + * + * @param action the presentation for this action + * @return whether the action was initialized + */ + protected boolean initialize(IAction action, ISelection selection) { + if (!isInitialized()) { + setAction(action); + if (getView() == null) { + //update on the selection in the debug view + IWorkbenchWindow window= getWindow(); + if (window != null && window.getShell() != null && !window.getShell().isDisposed()) { + IWorkbenchPage page= window.getActivePage(); + if (page != null) { + selection= page.getSelection(IDebugUIConstants.ID_DEBUG_VIEW); + } + } + } + update(action, selection); + setInitialized(true); + return true; + } + return false; + } + + /** + * Returns the most recent selection + * + * @return structured selection + */ + protected IStructuredSelection getSelection() { + if (getView() != null) { + //cannot used the cached selection in a view + //as the selection can be out of date for context menu + //actions. See bug 14556 + ISelection s= getView().getViewSite().getSelectionProvider().getSelection(); + if (s instanceof IStructuredSelection) { + return (IStructuredSelection)s; + } else { + return StructuredSelection.EMPTY; + } + } + return fSelection; + } + + /** + * Sets the most recent selection + * + * @parm selection structured selection + */ + private void setSelection(IStructuredSelection selection) { + fSelection = selection; + } + + /** + * @see ISelectionListener#selectionChanged(IWorkbenchPart, ISelection) + */ + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + update(getAction(), selection); + } + + protected void setAction(IAction action) { + fAction = action; + } + + protected IAction getAction() { + return fAction; + } + + protected void setView(IViewPart viewPart) { + fViewPart = viewPart; + } + + protected boolean isInitialized() { + return fInitialized; + } + + protected void setInitialized(boolean initialized) { + fInitialized = initialized; + } + + protected IWorkbenchWindow getWindow() { + return fWindow; + } + + protected void setWindow(IWorkbenchWindow window) { + fWindow = window; + } +} \ No newline at end of file diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractListenerActionDelegate.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractListenerActionDelegate.java new file mode 100644 index 00000000000..87c6dd76e26 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/AbstractListenerActionDelegate.java @@ -0,0 +1,189 @@ +package org.eclipse.cdt.debug.internal.ui.actions; + +/* + * (c) Copyright IBM Corp. 2002. + * All Rights Reserved. + */ + +import org.eclipse.debug.core.DebugEvent; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.IDebugEventSetListener; +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IPageListener; +import org.eclipse.ui.IPartListener; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; + +public abstract class AbstractListenerActionDelegate extends AbstractDebugActionDelegate implements IDebugEventSetListener, IPartListener, IPageListener { + + /** + * @see IPartListener#partActivated(IWorkbenchPart) + */ + public void partActivated(IWorkbenchPart part) { + } + + /** + * @see IPartListener#partBroughtToTop(IWorkbenchPart) + */ + public void partBroughtToTop(IWorkbenchPart part) { + } + + /** + * @see IPartListener#partClosed(IWorkbenchPart) + */ + public void partClosed(IWorkbenchPart part) { + if (part.equals(getView())) { + dispose(); + } + } + + /** + * @see IPartListener#partDeactivated(IWorkbenchPart) + */ + public void partDeactivated(IWorkbenchPart part) { + } + + /** + * @see IPartListener#partOpened(IWorkbenchPart) + */ + public void partOpened(IWorkbenchPart part) { + } + + /** + * @see IWorkbenchWindowActionDelegate#dispose() + */ + public void dispose() { + super.dispose(); + DebugPlugin.getDefault().removeDebugEventListener(this); + getWindow().removePageListener(this); + if (getView() != null) { + getView().getViewSite().getPage().removePartListener(this); + } + } + + /** + * @see IDebugEventSetListener#handleDebugEvents(DebugEvent[]) + */ + public void handleDebugEvents(final DebugEvent[] events) { + if (getPage() == null || getAction() == null) { + return; + } + Shell shell= getWindow().getShell(); + if (shell == null || shell.isDisposed()) { + return; + } + Runnable r= new Runnable() { + public void run() { + Shell shell= getWindow().getShell(); + if (shell == null || shell.isDisposed()) { + return; + } + for (int i = 0; i < events.length; i++) { + if (events[i].getSource() != null) { + doHandleDebugEvent(events[i]); + } + } + } + }; + + getPage().getWorkbenchWindow().getShell().getDisplay().asyncExec(r); + } + + /** + * Returns the page that this action works in. + */ + protected IWorkbenchPage getPage() { + if (getWindow() != null) { + return getWindow().getActivePage(); + } else { + IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow(); + if (window != null) { + return window.getActivePage(); + } + } + return null; + } + + /** + * Default implementation to update on specific debug events. + * Subclasses should override to handle events differently. + */ + protected void doHandleDebugEvent(DebugEvent event) { + switch (event.getKind()) { + case DebugEvent.TERMINATE : + update(getAction(), getSelection()); + break; + case DebugEvent.RESUME : + if (!event.isEvaluation() || !((event.getDetail() & DebugEvent.EVALUATION_IMPLICIT) != 0)) { + update(getAction(), getSelection()); + } + break; + case DebugEvent.SUSPEND : + // Update on suspend events (even for evaluations), in case the user changed + // the selection during an implicit evaluation. + update(getAction(), getSelection()); + break; + } + } + + /** + * @see IWorkbenchWindowActionDelegate#init(IWorkbenchWindow) + */ + public void init(IWorkbenchWindow window){ + super.init(window); + DebugPlugin.getDefault().addDebugEventListener(this); + window.addPageListener(this); + } + + /** + * @see IViewActionDelegate#init(IViewPart) + */ + public void init(IViewPart view) { + super.init(view); + DebugPlugin.getDefault().addDebugEventListener(this); + setWindow(view.getViewSite().getWorkbenchWindow()); + getPage().addPartListener(this); + getPage().getWorkbenchWindow().addPageListener(this); + } + + /** + * @see IPageListener#pageActivated(IWorkbenchPage) + */ + public void pageActivated(IWorkbenchPage page) { + if (getAction() != null && getView() != null && getPage() != null && getPage().equals(page)) { + Runnable r= new Runnable() { + public void run() { + if (getPage() != null) { + IWorkbenchWindow window= getPage().getWorkbenchWindow(); + if (window != null && window.getShell() != null && !window.getShell().isDisposed()) { + ISelection selection= getPage().getSelection(IDebugUIConstants.ID_DEBUG_VIEW); + update(getAction(), selection); + } + } + } + }; + + getPage().getWorkbenchWindow().getShell().getDisplay().asyncExec(r); + } + } + + /** + * @see IPageListener#pageClosed(IWorkbenchPage) + */ + public void pageClosed(IWorkbenchPage page) { + if (page.equals(getPage())) { + dispose(); + } + } + + /** + * @see IPageListener#pageOpened(IWorkbenchPage) + */ + public void pageOpened(IWorkbenchPage page) { + } +} 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 new file mode 100644 index 00000000000..0bd8edf6397 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerAction.java @@ -0,0 +1,251 @@ +/* + *(c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ +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.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.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; +import org.eclipse.ui.texteditor.IUpdate; + +/** + * + * Enter type comment. + * + * @since Aug 23, 2002 + */ +public class ManageBreakpointRulerAction extends Action implements IUpdate +{ + private IVerticalRulerInfo fRuler; + private ITextEditor fTextEditor; + private String fMarkerType; + private List fMarkers; + + private String fAddLabel; + private String fRemoveLabel; + + /** + * Constructor for ManageBreakpointRulerAction. + * + * @param ruler + * @param editor + */ + public ManageBreakpointRulerAction( IVerticalRulerInfo ruler, ITextEditor editor ) + { + fRuler = ruler; + fTextEditor = editor; + fMarkerType = IBreakpoint.BREAKPOINT_MARKER; + fAddLabel = "Add Breakpoint"; + fRemoveLabel = "Remove Breakpoint"; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.texteditor.IUpdate#update() + */ + public void update() + { + fMarkers = getMarkers(); + setText( fMarkers.isEmpty() ? fAddLabel : fRemoveLabel ); + } + + /** + * @see Action#run() + */ + public void run() + { + if ( fMarkers.isEmpty() ) + { + addMarker(); + } + else + { + removeMarkers( fMarkers ); + } + } + + protected List getMarkers() + { + List breakpoints = new ArrayList(); + + IResource resource = getResource(); + 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() ); + } + + protected void addMarker() + { + IEditorInput editorInput = getTextEditor().getEditorInput(); + IDocument document = getDocument(); + int rulerLine = getVerticalRulerInfo().getLineOfLastMouseButtonActivity(); + // create breakpoint + } + + protected void removeMarkers( List markers ) + { + IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager(); + try + { + Iterator e = markers.iterator(); + while( e.hasNext() ) + { + IBreakpoint breakpoint = breakpointManager.getBreakpoint( (IMarker)e.next() ); + breakpointManager.removeBreakpoint( breakpoint, true ); + } + } + catch( CoreException e ) + { +// CDebugUIPlugin.errorDialog( ActionMessages.getString("ManageBreakpointRulerAction.error.removing.message1"), e); //$NON-NLS-1$ + } + } +} 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 new file mode 100644 index 00000000000..cc2a72777d2 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerActionDelegate.java @@ -0,0 +1,45 @@ +/* + *(c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ + +package org.eclipse.cdt.debug.internal.ui.actions; + +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.text.source.IVerticalRulerInfo; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.texteditor.AbstractRulerActionDelegate; +import org.eclipse.ui.texteditor.ITextEditor; + +/** + * + * Enter type comment. + * + * @since Aug 23, 2002 + */ +public class ManageBreakpointRulerActionDelegate extends AbstractRulerActionDelegate +{ + static final private String C_EDITOR_ID = "org.eclipse.cdt.ui.editor.CEditor"; //$NON-NLS-1$ + /** + * @see IEditorActionDelegate#setActiveEditor(IAction, IEditorPart) + */ + public void setActiveEditor(IAction callerAction, IEditorPart targetEditor) + { + if ( targetEditor != null ) + { + String id = targetEditor.getSite().getId(); + if ( !id.equals( C_EDITOR_ID ) ) + targetEditor = null; + } + super.setActiveEditor( callerAction, targetEditor ); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.texteditor.AbstractRulerActionDelegate#createAction(ITextEditor, IVerticalRulerInfo) + */ + protected IAction createAction( ITextEditor editor, IVerticalRulerInfo rulerInfo ) + { + return new ManageBreakpointRulerAction( rulerInfo, editor ); + } +} diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/RestartActionDelegate.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/RestartActionDelegate.java new file mode 100644 index 00000000000..80d67deeb57 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/RestartActionDelegate.java @@ -0,0 +1,78 @@ +/* + *(c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ +package org.eclipse.cdt.debug.internal.ui.actions; + +import org.eclipse.cdt.debug.core.IRestart; +import org.eclipse.debug.core.DebugException; + +/** + * + * Enter type comment. + * + * @since Aug 23, 2002 + */ +public class RestartActionDelegate extends AbstractListenerActionDelegate +{ + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.internal.ui.actions.AbstractDebugActionDelegate#doAction(Object) + */ + protected void doAction( Object element ) throws DebugException + { + if ( element instanceof IRestart ) + { + ((IRestart)element).restart(); + } + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.internal.ui.actions.AbstractDebugActionDelegate#isEnabledFor(Object) + */ + protected boolean isEnabledFor( Object element ) + { + if ( element instanceof IRestart ) + { + return checkCapability( (IRestart)element ); + } + return false; + } + + protected boolean checkCapability( IRestart element ) + { + return element.canRestart(); + } + + /** + * @see AbstractDebugActionDelegate#enableForMultiSelection() + */ + protected boolean enableForMultiSelection() + { + return false; + } + + /** + * @see AbstractDebugActionDelegate#getStatusMessage() + */ + protected String getStatusMessage() + { + return "Exceptions occurred attempting to restart."; + } + + /** + * @see AbstractDebugActionDelegate#getErrorDialogMessage() + */ + protected String getErrorDialogMessage() + { + return "Restart failed."; + } + + /** + * @see AbstractDebugActionDelegate#getErrorDialogTitle() + */ + protected String getErrorDialogTitle() + { + return "Restart"; + } +}