blob: 534b65fd98f1e4ccb8bcf8e90fa3f4571ebc5635 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Patrick Tasse - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.internal.gdbtrace.ui.views.events;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.tracecompass.internal.gdbtrace.core.event.GdbTraceEvent;
import org.eclipse.tracecompass.internal.gdbtrace.core.event.GdbTraceEventContent;
import org.eclipse.tracecompass.internal.gdbtrace.core.trace.GdbEventAspects;
import org.eclipse.tracecompass.internal.gdbtrace.core.trace.GdbTrace;
import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment;
import org.eclipse.tracecompass.tmf.ui.viewers.events.TmfEventsTable;
/**
* GDB Event Table
*
* @author Patrick Tasse
*/
public class GdbEventsTable extends TmfEventsTable {
// ------------------------------------------------------------------------
// Fields
// ------------------------------------------------------------------------
private GdbTrace fSelectedTrace = null;
private long fSelectedFrame = 0;
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
/**
* Constructor
*
* @param parent
* the parent
* @param cacheSize
* the cache size
*/
public GdbEventsTable(Composite parent, int cacheSize) {
super(parent, cacheSize, GdbEventAspects.getAspects());
// Set the alignment of the first two columns
fTable.getColumns()[0].setAlignment(SWT.RIGHT);
fTable.getColumns()[1].setAlignment(SWT.RIGHT);
// Synchronize currently selected frame in GDB with table selection
addSelectionChangedListener(e -> {
TableItem[] selection = fTable.getSelection();
if (selection.length > 0) {
TableItem selectedTableItem = selection[0];
if (selectedTableItem != null) {
Object data = selectedTableItem.getData();
if (data instanceof GdbTraceEvent) {
GdbTraceEvent event = (GdbTraceEvent) data;
GdbTrace gdbTrace = (GdbTrace) event.getTrace();
GdbTraceEventContent content = event.getContent();
selectFrame(gdbTrace, content.getFrameNumber());
return;
}
}
}
fSelectedTrace = null;
});
}
@Override
public void setTrace(ITmfTrace trace, boolean disposeOnClose) {
super.setTrace(trace, disposeOnClose);
if (trace instanceof GdbTrace) {
fSelectedTrace = (GdbTrace) trace;
fSelectedFrame = 0;
} else if (trace instanceof TmfExperiment) {
TmfExperiment experiment = (TmfExperiment) trace;
List<ITmfTrace> expTraces = experiment.getTraces();
if (!expTraces.isEmpty()) {
fSelectedTrace = (GdbTrace) expTraces.get(0);
fSelectedFrame = 0;
}
}
}
@Override
@TmfSignalHandler
public void selectionRangeUpdated(final TmfSelectionRangeUpdatedSignal signal) {
// do not synchronize on time
}
private void selectFrame(final GdbTrace gdbTrace, final long frameNumber) {
Job b = new Job("GDB Trace select frame") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
// This sends commands to GDB and can potentially wait on the UI
// thread (gdb traces console buffer full) so it needs to be
// exectued on a non-UI thread
gdbTrace.selectFrame(frameNumber);
fSelectedTrace = gdbTrace;
fSelectedFrame = frameNumber;
return Status.OK_STATUS;
}
};
b.setSystem(true);
b.schedule();
}
@Override
@TmfSignalHandler
public void traceUpdated(TmfTraceUpdatedSignal signal) {
super.traceUpdated(signal);
if (fSelectedTrace.getNbFrames() == fSelectedTrace.getNbEvents()) {
selectFrame(fSelectedTrace, fSelectedFrame);
}
}
}