1 /*******************************************************************************
2 * Copyright (c) 2013 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.tracecompass
.internal
.gdbtrace
.ui
.views
.events
;
15 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
16 import org
.eclipse
.core
.runtime
.IStatus
;
17 import org
.eclipse
.core
.runtime
.Status
;
18 import org
.eclipse
.core
.runtime
.jobs
.Job
;
19 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
20 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
21 import org
.eclipse
.swt
.SWT
;
22 import org
.eclipse
.swt
.widgets
.Composite
;
23 import org
.eclipse
.swt
.widgets
.TableItem
;
24 import org
.eclipse
.tracecompass
.internal
.gdbtrace
.core
.event
.GdbTraceEvent
;
25 import org
.eclipse
.tracecompass
.internal
.gdbtrace
.core
.event
.GdbTraceEventContent
;
26 import org
.eclipse
.tracecompass
.internal
.gdbtrace
.core
.trace
.GdbTrace
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalHandler
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTimeSynchSignal
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceUpdatedSignal
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfExperiment
;
32 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.events
.TmfEventsTable
;
37 * @author Patrick Tasse
39 public class GdbEventsTable
extends TmfEventsTable
{
41 // ------------------------------------------------------------------------
43 // ------------------------------------------------------------------------
45 private GdbTrace fSelectedTrace
= null;
46 private long fSelectedFrame
= 0;
48 // ------------------------------------------------------------------------
50 // ------------------------------------------------------------------------
60 public GdbEventsTable(Composite parent
, int cacheSize
) {
61 super(parent
, cacheSize
, GdbEventTableColumns
.GDB_COLUMNS
);
62 // Set the alignment of the first two columns
63 fTable
.getColumns()[0].setAlignment(SWT
.RIGHT
);
64 fTable
.getColumns()[1].setAlignment(SWT
.RIGHT
);
66 // Synchronize currently selected frame in GDB with table selection
67 addSelectionChangedListener(new ISelectionChangedListener() {
69 public void selectionChanged(SelectionChangedEvent e
) {
70 TableItem
[] selection
= fTable
.getSelection();
71 if (selection
.length
> 0) {
72 TableItem selectedTableItem
= selection
[0];
73 if (selectedTableItem
!= null) {
74 Object data
= selectedTableItem
.getData();
75 if (data
instanceof GdbTraceEvent
) {
76 GdbTraceEvent event
= (GdbTraceEvent
) data
;
77 GdbTrace gdbTrace
= (GdbTrace
) event
.getTrace();
78 GdbTraceEventContent content
= event
.getContent();
79 selectFrame(gdbTrace
, content
.getFrameNumber());
84 fSelectedTrace
= null;
90 public void setTrace(ITmfTrace trace
, boolean disposeOnClose
) {
91 super.setTrace(trace
, disposeOnClose
);
92 if (trace
instanceof GdbTrace
) {
93 fSelectedTrace
= (GdbTrace
) trace
;
95 } else if (trace
instanceof TmfExperiment
) {
96 TmfExperiment experiment
= (TmfExperiment
) trace
;
97 if (experiment
.getTraces().length
> 0) {
98 fSelectedTrace
= (GdbTrace
) experiment
.getTraces()[0];
106 public void currentTimeUpdated(final TmfTimeSynchSignal signal
) {
107 // do not synchronize on time
110 private void selectFrame(final GdbTrace gdbTrace
, final long frameNumber
) {
111 Job b
= new Job("GDB Trace select frame") { //$NON-NLS-1$
113 protected IStatus
run(IProgressMonitor monitor
) {
114 // This sends commands to GDB and can potentially wait on the UI
115 // thread (gdb traces console buffer full) so it needs to be
116 // exectued on a non-UI thread
117 gdbTrace
.selectFrame(frameNumber
);
118 fSelectedTrace
= gdbTrace
;
119 fSelectedFrame
= frameNumber
;
120 return Status
.OK_STATUS
;
129 public void traceUpdated(TmfTraceUpdatedSignal signal
) {
130 super.traceUpdated(signal
);
131 if (fSelectedTrace
.getNbFrames() == fSelectedTrace
.getNbEvents()) {
132 selectFrame(fSelectedTrace
, fSelectedFrame
);