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
.GdbEventAspects
;
27 import org
.eclipse
.tracecompass
.internal
.gdbtrace
.core
.trace
.GdbTrace
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalHandler
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTimeSynchSignal
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceUpdatedSignal
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.experiment
.TmfExperiment
;
33 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.events
.TmfEventsTable
;
38 * @author Patrick Tasse
40 public class GdbEventsTable
extends TmfEventsTable
{
42 // ------------------------------------------------------------------------
44 // ------------------------------------------------------------------------
46 private GdbTrace fSelectedTrace
= null;
47 private long fSelectedFrame
= 0;
49 // ------------------------------------------------------------------------
51 // ------------------------------------------------------------------------
61 public GdbEventsTable(Composite parent
, int cacheSize
) {
62 super(parent
, cacheSize
, GdbEventAspects
.getAspects());
63 // Set the alignment of the first two columns
64 fTable
.getColumns()[0].setAlignment(SWT
.RIGHT
);
65 fTable
.getColumns()[1].setAlignment(SWT
.RIGHT
);
67 // Synchronize currently selected frame in GDB with table selection
68 addSelectionChangedListener(new ISelectionChangedListener() {
70 public void selectionChanged(SelectionChangedEvent e
) {
71 TableItem
[] selection
= fTable
.getSelection();
72 if (selection
.length
> 0) {
73 TableItem selectedTableItem
= selection
[0];
74 if (selectedTableItem
!= null) {
75 Object data
= selectedTableItem
.getData();
76 if (data
instanceof GdbTraceEvent
) {
77 GdbTraceEvent event
= (GdbTraceEvent
) data
;
78 GdbTrace gdbTrace
= (GdbTrace
) event
.getTrace();
79 GdbTraceEventContent content
= event
.getContent();
80 selectFrame(gdbTrace
, content
.getFrameNumber());
85 fSelectedTrace
= null;
91 public void setTrace(ITmfTrace trace
, boolean disposeOnClose
) {
92 super.setTrace(trace
, disposeOnClose
);
93 if (trace
instanceof GdbTrace
) {
94 fSelectedTrace
= (GdbTrace
) trace
;
96 } else if (trace
instanceof TmfExperiment
) {
97 TmfExperiment experiment
= (TmfExperiment
) trace
;
98 if (experiment
.getTraces().length
> 0) {
99 fSelectedTrace
= (GdbTrace
) experiment
.getTraces()[0];
107 public void currentTimeUpdated(final TmfTimeSynchSignal signal
) {
108 // do not synchronize on time
111 private void selectFrame(final GdbTrace gdbTrace
, final long frameNumber
) {
112 Job b
= new Job("GDB Trace select frame") { //$NON-NLS-1$
114 protected IStatus
run(IProgressMonitor monitor
) {
115 // This sends commands to GDB and can potentially wait on the UI
116 // thread (gdb traces console buffer full) so it needs to be
117 // exectued on a non-UI thread
118 gdbTrace
.selectFrame(frameNumber
);
119 fSelectedTrace
= gdbTrace
;
120 fSelectedFrame
= frameNumber
;
121 return Status
.OK_STATUS
;
130 public void traceUpdated(TmfTraceUpdatedSignal signal
) {
131 super.traceUpdated(signal
);
132 if (fSelectedTrace
.getNbFrames() == fSelectedTrace
.getNbEvents()) {
133 selectFrame(fSelectedTrace
, fSelectedFrame
);