1
/*******************************************************************************
2
* Copyright (c) 2010, 2011 Ericsson and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* Ericsson - initial API and implementation
10
*******************************************************************************/
11
package org.eclipse.cdt.dsf.gdb.internal.ui.commands;
13
import java.util.Hashtable;
14
import java.util.concurrent.ExecutionException;
15
import java.util.concurrent.RejectedExecutionException;
17
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
18
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
19
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
20
import org.eclipse.cdt.dsf.concurrent.Query;
21
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
22
import org.eclipse.cdt.dsf.datamodel.DMContexts;
23
import org.eclipse.cdt.dsf.gdb.internal.commands.ISelectPrevTraceRecordHandler;
24
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
25
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl;
26
import org.eclipse.cdt.dsf.gdb.service.GDBTraceControl_7_2.TraceRecordSelectedChangedEvent;
27
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordDMContext;
28
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceStatusDMData;
29
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceTargetDMContext;
30
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
31
import org.eclipse.cdt.dsf.service.DsfSession;
32
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
33
import org.eclipse.core.runtime.CoreException;
34
import org.eclipse.core.runtime.IProgressMonitor;
35
import org.eclipse.debug.core.IRequest;
36
import org.eclipse.debug.core.commands.AbstractDebugCommand;
37
import org.eclipse.debug.core.commands.IDebugCommandRequest;
38
import org.eclipse.debug.core.commands.IEnabledStateRequest;
41
* Command to select the previous trace record
45
@SuppressWarnings("restriction")
46
public class GdbSelectPrevTraceRecordCommand extends AbstractDebugCommand implements ISelectPrevTraceRecordHandler {
47
private final DsfExecutor fExecutor;
48
private final DsfServicesTracker fTracker;
49
private final DsfSession fSession;
51
public GdbSelectPrevTraceRecordCommand(DsfSession session) {
52
fExecutor = session.getExecutor();
53
fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId());
57
public void dispose() {
62
protected void doExecute(Object[] targets, IProgressMonitor monitor, IRequest request) throws CoreException {
63
if (targets.length != 1) {
67
final ITraceTargetDMContext dmc = DMContexts.getAncestorOfType(((IDMVMContext)targets[0]).getDMContext(), ITraceTargetDMContext.class);
72
Query<Object> selectRecordQuery = new Query<Object>() {
74
public void execute(final DataRequestMonitor<Object> rm) {
75
final IGDBTraceControl traceControl = fTracker.getService(IGDBTraceControl.class);
77
if (traceControl != null) {
78
traceControl.getCurrentTraceRecordContext(
80
new DataRequestMonitor<ITraceRecordDMContext>(fExecutor, rm) {
82
protected void handleSuccess() {
83
final ITraceRecordDMContext prevDmc = traceControl.createPrevRecordContext(getData());
84
traceControl.selectTraceRecord(prevDmc, new RequestMonitor(ImmediateExecutor.getInstance(), rm) {
86
protected void handleSuccess() {
87
fSession.dispatchEvent(new TraceRecordSelectedChangedEvent(prevDmc), new Hashtable<String, String>());
99
fExecutor.execute(selectRecordQuery);
100
selectRecordQuery.get();
101
} catch (InterruptedException e) {
102
} catch (ExecutionException e) {
103
} catch (RejectedExecutionException e) {
104
// Can be thrown if the session is shutdown
109
protected boolean isExecutable(Object[] targets, IProgressMonitor monitor, IEnabledStateRequest request)
112
if (targets.length != 1) {
116
final ITraceTargetDMContext dmc = DMContexts.getAncestorOfType(((IDMVMContext)targets[0]).getDMContext(), ITraceTargetDMContext.class);
121
Query<Boolean> canSelectRecordQuery = new Query<Boolean>() {
123
public void execute(final DataRequestMonitor<Boolean> rm) {
124
IGDBTraceControl traceControl = fTracker.getService(IGDBTraceControl.class);
126
if (traceControl != null) {
127
traceControl.getTraceStatus(dmc, new DataRequestMonitor<ITraceStatusDMData>(fExecutor, rm) {
129
protected void handleSuccess() {
130
if (getData().getNumberOfCollectedFrame() > 0) {
131
IGDBTraceControl traceControl = fTracker.getService(IGDBTraceControl.class);
132
if (traceControl != null) {
133
traceControl.isTracing(dmc, new DataRequestMonitor<Boolean>(fExecutor, rm) {
135
protected void handleSuccess() {
136
rm.setData(!getData());
157
fExecutor.execute(canSelectRecordQuery);
158
return canSelectRecordQuery.get();
159
} catch (InterruptedException e) {
160
} catch (ExecutionException e) {
161
} catch (RejectedExecutionException e) {
162
// Can be thrown if the session is shutdown
169
protected Object getTarget(Object element) {
170
if (element instanceof IDMVMContext) {
177
protected boolean isRemainEnabled(IDebugCommandRequest request) {