summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Dumais2012-12-13 13:21:13 (EST)
committer Marc Khouzam2012-12-13 14:50:24 (EST)
commitc2605537bc1c5046d539829aba24c8ac14fa5777 (patch)
tree71660875532b2bf847cd1f5dd2207d8817ad49db
parente58a3323c8d086bc699ece9de857c6335bc76af3 (diff)
downloadorg.eclipse.cdt-c2605537bc1c5046d539829aba24c8ac14fa5777.zip
org.eclipse.cdt-c2605537bc1c5046d539829aba24c8ac14fa5777.tar.gz
org.eclipse.cdt-c2605537bc1c5046d539829aba24c8ac14fa5777.tar.bz2
Bug 365776 - [breakpoints] Add breakpoint action to toggle reverserefs/changes/82/8982/5
debugging. Change-Id: I065297685fefba76df7ad40c578a0ce5d0c40fba Reviewed-on: https://git.eclipse.org/r/8982 IP-Clean: Marc Khouzam <marc.khouzam@ericsson.com> Tested-by: Marc Khouzam <marc.khouzam@ericsson.com> Reviewed-by: Marc Khouzam <marc.khouzam@ericsson.com>
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/breakpointactions/IReverseDebugEnabler.java37
-rw-r--r--debug/org.eclipse.cdt.debug.ui/plugin.properties2
-rw-r--r--debug/org.eclipse.cdt.debug.ui/plugin.xml16
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugAction.java193
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugActionComposite.java58
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugActionPage.java42
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/messages.properties12
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/breakpoint/actions/BreakpointActionAdapter.java7
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/breakpoint/actions/MIReverseDebugEnabler.java89
9 files changed, 454 insertions, 2 deletions
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/breakpointactions/IReverseDebugEnabler.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/breakpointactions/IReverseDebugEnabler.java
new file mode 100644
index 0000000..0388be9
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/breakpointactions/IReverseDebugEnabler.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2012 Nokia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Marc Dumais (Ericsson) - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.core.breakpointactions;
+
+/**
+ * @since 7.3
+ */
+public interface IReverseDebugEnabler {
+
+ /**
+ * Toggles the state of the reverse debugging mode.
+ * @throws Exception
+ */
+ void toggle() throws Exception;
+
+ /**
+ * Enables the reverse debugging mode. No effect if already enabled.
+ * @throws Exception
+ */
+ void enable() throws Exception;
+
+ /**
+ * Disables the reverse debugging mode. No effect if it's not enabled.
+ * @throws Exception
+ */
+ void disable() throws Exception;
+
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.properties b/debug/org.eclipse.cdt.debug.ui/plugin.properties
index a68c817..f2df720 100644
--- a/debug/org.eclipse.cdt.debug.ui/plugin.properties
+++ b/debug/org.eclipse.cdt.debug.ui/plugin.properties
@@ -11,6 +11,7 @@
# Patrick Chuong (Texas Instruments) - Pin and Clone Supports (Bug 331781)
# Dobrin Alexiev (Texas Instruments) - initial API and implementation (bug 336876)
# Marc Khouzam (Ericsson) - Added support for connect command (Bug 365601)
+# Marc Dumais (Ericsson) - Added support for reverse debug action (Bug 365776)
###############################################################################
pluginName=C/C++ Development Tools Debugger UI
@@ -157,6 +158,7 @@ SoundAction.name=Sound Action
LogAction.name=Log Action
ResumeAction.name=Resume Action
ExternalToolAction.name=External Tool Action
+ReverseDebugAction.name=Reverse Debug Action
# Breakpoint Types
breapointType.label=Type
diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.xml b/debug/org.eclipse.cdt.debug.ui/plugin.xml
index d1ae7a9..fa6769b 100644
--- a/debug/org.eclipse.cdt.debug.ui/plugin.xml
+++ b/debug/org.eclipse.cdt.debug.ui/plugin.xml
@@ -1710,6 +1710,14 @@
class="org.eclipse.cdt.debug.ui.breakpointactions.ExternalToolAction"
id="org.eclipse.cdt.debug.ui.breakpointactions.ExternalToolAction"/>
</extension>
+ <extension
+ point="org.eclipse.cdt.debug.core.BreakpointActionType">
+ <actionType
+ class="org.eclipse.cdt.debug.ui.breakpointactions.ReverseDebugAction"
+ id="org.eclipse.cdt.debug.ui.breakpointactions.ReverseDebugAction"
+ name="%ReverseDebugAction.name">
+ </actionType>
+ </extension>
<extension
point="org.eclipse.cdt.debug.ui.BreakpointActionPage">
<actionPage
@@ -1740,6 +1748,14 @@
id="org.eclipse.cdt.debug.ui.breakpointactions.ExternalToolActionPage"
actionType="org.eclipse.cdt.debug.ui.breakpointactions.ExternalToolAction"/>
</extension>
+ <extension
+ point="org.eclipse.cdt.debug.ui.BreakpointActionPage">
+ <actionPage
+ actionType="org.eclipse.cdt.debug.ui.breakpointactions.ReverseDebugAction"
+ class="org.eclipse.cdt.debug.ui.breakpointactions.ReverseDebugActionPage"
+ id="org.eclipse.cdt.debug.ui.breakpointactions.ReverseDebugActionPage">
+ </actionPage>
+ </extension>
<extension point="org.eclipse.debug.ui.detailPaneFactories">
<detailFactories
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugAction.java
new file mode 100644
index 0000000..02ce0ec
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugAction.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2012 Nokia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - initial implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.ui.breakpointactions;
+
+import java.io.ByteArrayOutputStream;
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.cdt.debug.core.CDIDebugModel;
+import org.eclipse.cdt.debug.core.breakpointactions.AbstractBreakpointAction;
+import org.eclipse.cdt.debug.core.breakpointactions.IReverseDebugEnabler;
+import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants;
+import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
+import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.InputSource;
+import org.xml.sax.helpers.DefaultHandler;
+
+
+/**
+ * Implements the reverse debug breakpoint action
+ *
+ *@since 7.3
+ */
+public class ReverseDebugAction extends AbstractBreakpointAction{
+ /**
+ * The available reverse debug action modes: enable, disable and toggle.
+ */
+ public static enum REVERSE_DEBUG_ACTIONS_ENUM {
+
+ ENABLE, DISABLE, TOGGLE;
+
+ /**
+ * @param index
+ * @return the enum value for the given index
+ */
+ public static REVERSE_DEBUG_ACTIONS_ENUM getValue(int index) {
+ return REVERSE_DEBUG_ACTIONS_ENUM.values()[index];
+ }
+ };
+ private REVERSE_DEBUG_ACTIONS_ENUM fOperation;
+
+ /**
+ * @return the currently configured reverse debug mode, for this BP action
+ */
+ public REVERSE_DEBUG_ACTIONS_ENUM getOperation() {
+ return fOperation;
+ }
+
+ /**
+ * Sets the currently configured reverse debug mode, for this BP action
+ * @param operation
+ */
+ public void setOperation(REVERSE_DEBUG_ACTIONS_ENUM operation) {
+ this.fOperation = operation;
+ }
+
+ @Override
+ public IStatus execute(IBreakpoint breakpoint, IAdaptable context, IProgressMonitor monitor) {
+ IStatus errorStatus = null;
+
+ IReverseDebugEnabler enabler = (IReverseDebugEnabler) context.getAdapter(IReverseDebugEnabler.class);
+ if (enabler != null) {
+ try {
+ switch (fOperation) {
+ case TOGGLE:
+ enabler.toggle();
+ break;
+ case ENABLE:
+ enabler.enable();
+ break;
+ case DISABLE:
+ enabler.disable();
+ break;
+ }
+
+ } catch (Exception e) {
+ errorStatus = new Status( IStatus.ERROR, CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, e.getMessage(), e );
+ }
+ }
+ else
+ errorStatus = new Status( IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(), IInternalCDebugUIConstants.INTERNAL_ERROR, Messages.getString("ReverseDebugAction.error.0"), null ); //$NON-NLS-1$
+
+ if (errorStatus != null) {
+ MultiStatus ms = new MultiStatus( CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, Messages.getString("ReverseDebugAction.error.1"), null ); //$NON-NLS-1$
+ ms.add( errorStatus);
+ errorStatus = ms;
+ } else {
+ errorStatus = monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS;
+ }
+
+ return errorStatus;
+ }
+
+ @Override
+ public String getMemento() {
+ String reverseDebugData = ""; //$NON-NLS-1$
+
+ DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = null;
+ try {
+ docBuilder = dfactory.newDocumentBuilder();
+ Document doc = docBuilder.newDocument();
+
+ Element rootElement = doc.createElement("reverseDebugData"); //$NON-NLS-1$
+ rootElement.setAttribute("operation", fOperation.toString()); //$NON-NLS-1$
+
+ doc.appendChild(rootElement);
+
+ ByteArrayOutputStream s = new ByteArrayOutputStream();
+
+ TransformerFactory factory = TransformerFactory.newInstance();
+ Transformer transformer = factory.newTransformer();
+ transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+
+ DOMSource source = new DOMSource(doc);
+ StreamResult outputTarget = new StreamResult(s);
+ transformer.transform(source, outputTarget);
+
+ reverseDebugData = s.toString("UTF8"); //$NON-NLS-1$
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return reverseDebugData;
+
+ }
+
+ @Override
+ public void initializeFromMemento(String data) {
+ Element root = null;
+ DocumentBuilder parser;
+ try {
+ parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ parser.setErrorHandler(new DefaultHandler());
+ root = parser.parse(new InputSource(new StringReader(data))).getDocumentElement();
+ String value = root.getAttribute("operation"); //$NON-NLS-1$
+ if (value == null)
+ throw new Exception();
+ fOperation = REVERSE_DEBUG_ACTIONS_ENUM.valueOf(value);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @Override
+ public String getDefaultName() {
+ return Messages.getString("ReverseDebugAction.UntitledName"); //$NON-NLS-1$
+ }
+
+ @Override
+ public String getSummary() {
+ // get translated operation
+ String operation = Messages.getString("ReverseDebugAction."+fOperation.toString().toLowerCase()); //$NON-NLS-1$
+
+ return operation + " " + Messages.getString("ReverseDebugAction.Summary"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public String getTypeName() {
+ return Messages.getString("ReverseDebugAction.TypeName"); //$NON-NLS-1$
+ }
+
+ @Override
+ public String getIdentifier() {
+ return "org.eclipse.cdt.debug.ui.breakpointactions.ReverseDebugAction"; //$NON-NLS-1$
+ }
+
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugActionComposite.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugActionComposite.java
new file mode 100644
index 0000000..8a85971
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugActionComposite.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2012 Nokia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - initial implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.ui.breakpointactions;
+
+import org.eclipse.cdt.debug.ui.breakpointactions.ReverseDebugAction.REVERSE_DEBUG_ACTIONS_ENUM;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+
+/**
+ * @since 7.3
+ */
+public class ReverseDebugActionComposite extends Composite {
+ private Combo combo;
+
+ public ReverseDebugActionComposite(Composite parent, int style, ReverseDebugActionPage page) {
+ super(parent, style);
+ final GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 3;
+ setLayout(gridLayout);
+
+ final Label reverseDebugActionLabel = new Label(this, SWT.NONE);
+ reverseDebugActionLabel.setText(Messages.getString("ReverseDebugActionComposite.label")); //$NON-NLS-1$
+
+ // combo widget that lets the user select which reverse debug action to set
+ combo = new Combo(this, SWT.READ_ONLY);
+ combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ // add the available reverse debug actions to the combo drop-down list
+ for(REVERSE_DEBUG_ACTIONS_ENUM elem : REVERSE_DEBUG_ACTIONS_ENUM.values()) {
+ String option = elem.toString().toLowerCase();
+ combo.add(Messages.getString("ReverseDebugAction."+option)); //$NON-NLS-1$
+ }
+ combo.select(0);
+ }
+
+ /**
+ * @return The currently selected reverse debug action
+ */
+ public REVERSE_DEBUG_ACTIONS_ENUM getOperation() {
+ int index = combo.getSelectionIndex();
+
+ return REVERSE_DEBUG_ACTIONS_ENUM.getValue(index);
+ }
+
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugActionPage.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugActionPage.java
new file mode 100644
index 0000000..aeab4de
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/ReverseDebugActionPage.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2012 Nokia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ericsson - initial implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.ui.breakpointactions;
+
+import org.eclipse.cdt.debug.core.breakpointactions.IBreakpointAction;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ *@since 7.3
+ */
+public class ReverseDebugActionPage extends PlatformObject implements IBreakpointActionPage{
+
+ private ReverseDebugActionComposite reverseDebugActionComposite;
+ private ReverseDebugAction reverseDebugAction;
+
+ @Override
+ public void actionDialogCanceled() {
+ }
+
+ @Override
+ public void actionDialogOK() {
+ reverseDebugAction.setOperation(reverseDebugActionComposite.getOperation());
+ }
+
+ @Override
+ public Composite createComposite(IBreakpointAction action,
+ Composite composite, int style) {
+ reverseDebugAction = (ReverseDebugAction) action;
+ reverseDebugActionComposite = new ReverseDebugActionComposite(composite, style, this);
+ return reverseDebugActionComposite;
+ }
+
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/messages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/messages.properties
index 4bb871b..e8472f4 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/messages.properties
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/breakpointactions/messages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2005, 2007 Nokia
+# Copyright (c) 2005, 2012 Nokia
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
@@ -60,3 +60,13 @@ ResumeActionComposite.Seconds=seconds
ResumeAction.TypeName=Resume Action
ResumeAction.error.0=IResumeActionEnabler not registered in context.
ResumeAction.error.1=Could not resume.
+
+ReverseDebugAction.UntitledName=Untitled Rev Debug Action
+ReverseDebugAction.TypeName=Rev Debug Action
+ReverseDebugActionComposite.label=Select Reverse Debugging Action
+ReverseDebugAction.Summary= reverse debugging
+ReverseDebugAction.error.0=IReverseToggleEnabler not registered in context.
+ReverseDebugAction.error.1=Could not do reverse debug operation
+ReverseDebugAction.enable=Enable
+ReverseDebugAction.disable=Disable
+ReverseDebugAction.toggle=Toggle
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/breakpoint/actions/BreakpointActionAdapter.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/breakpoint/actions/BreakpointActionAdapter.java
index aa2861b..6577660 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/breakpoint/actions/BreakpointActionAdapter.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/breakpoint/actions/BreakpointActionAdapter.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2010 Ericsson and others.
+ * Copyright (c) 2008, 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,12 +7,14 @@
*
* Contributors:
* Ericsson - Initial API and implementation
+ * Marc Dumais (Ericsson) - Added support for reverse debug action (Bug 365776)
*******************************************************************************/
package org.eclipse.cdt.dsf.mi.service.breakpoint.actions;
import org.eclipse.cdt.debug.core.breakpointactions.ILogActionEnabler;
import org.eclipse.cdt.debug.core.breakpointactions.IResumeActionEnabler;
+import org.eclipse.cdt.debug.core.breakpointactions.IReverseDebugEnabler;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
@@ -42,6 +44,9 @@ public class BreakpointActionAdapter implements IAdaptable {
if (adapter.equals(IResumeActionEnabler.class)) {
return new MIResumeActionEnabler(fExecutor, fServiceTracker, fContext);
}
+ if (adapter.equals(IReverseDebugEnabler.class)) {
+ return new MIReverseDebugEnabler(fExecutor, fServiceTracker, fContext);
+ }
return null;
}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/breakpoint/actions/MIReverseDebugEnabler.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/breakpoint/actions/MIReverseDebugEnabler.java
new file mode 100644
index 0000000..09873dd
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/breakpoint/actions/MIReverseDebugEnabler.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Ericsson and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Marc Dumais (Ericsson) - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.dsf.mi.service.breakpoint.actions;
+
+import org.eclipse.cdt.debug.core.breakpointactions.IReverseDebugEnabler;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
+import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
+import org.eclipse.cdt.dsf.gdb.service.IReverseRunControl;
+import org.eclipse.cdt.dsf.service.DsfServicesTracker;
+
+
+/**
+ *
+ * This class permits to enable, disable or toggle the reverse
+ * debugging mode.
+ *
+ * @since 4.2
+ */
+public class MIReverseDebugEnabler implements IReverseDebugEnabler {
+ private final DsfExecutor fExecutor;
+ private final DsfServicesTracker fServiceTracker;
+ private final ICommandControlDMContext fContext;
+ private static enum REVERSE_DEBUG_MODE {ENABLE, DISABLE, TOGGLE};
+
+ /**
+ * @param executor
+ * @param serviceTracker
+ * @param context
+ */
+ public MIReverseDebugEnabler(DsfExecutor executor, DsfServicesTracker serviceTracker, IDMContext context) {
+ fExecutor = executor;
+ fServiceTracker = serviceTracker;
+ fContext = DMContexts.getAncestorOfType(context, ICommandControlDMContext.class);
+ assert fContext != null;
+ }
+
+ @Override
+ public void enable() throws Exception {
+ setMode(REVERSE_DEBUG_MODE.ENABLE);
+ }
+
+ @Override
+ public void disable() throws Exception {
+ setMode(REVERSE_DEBUG_MODE.DISABLE);
+ }
+
+ @Override
+ public void toggle() throws Exception {
+ setMode(REVERSE_DEBUG_MODE.TOGGLE);
+ }
+
+ private void setMode(final REVERSE_DEBUG_MODE mode) throws Exception {
+ fExecutor.execute(new DsfRunnable() {
+ @Override
+ public void run() {
+ final IReverseRunControl runControl = fServiceTracker.getService(IReverseRunControl.class);
+ if (runControl != null) {
+ runControl.isReverseModeEnabled(fContext, new DataRequestMonitor<Boolean>(fExecutor, null) {
+ @Override
+ public void handleSuccess() {
+ Boolean enabled = getData();
+ if ( (enabled.equals(false) && mode.equals(REVERSE_DEBUG_MODE.ENABLE) ) ||
+ (enabled.equals(true) && mode.equals(REVERSE_DEBUG_MODE.DISABLE) ) ||
+ (mode.equals(REVERSE_DEBUG_MODE.TOGGLE)) )
+ {
+ runControl.enableReverseMode(fContext, !enabled, new RequestMonitor(fExecutor, null));
+ }
+ }
+ });
+ }
+ }
+ });
+ }
+
+}