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
.linuxtools
.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
.linuxtools
.internal
.gdbtrace
.core
.event
.GdbTraceEvent
;
22 import org
.eclipse
.linuxtools
.internal
.gdbtrace
.core
.event
.GdbTraceEventContent
;
23 import org
.eclipse
.linuxtools
.internal
.gdbtrace
.core
.trace
.GdbTrace
;
24 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
25 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEventField
;
26 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfEventField
;
27 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
28 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTimeSynchSignal
;
29 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfTrace
;
30 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.TmfExperiment
;
31 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.events
.TmfEventsTable
;
32 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.virtualtable
.ColumnData
;
33 import org
.eclipse
.swt
.SWT
;
34 import org
.eclipse
.swt
.widgets
.Composite
;
35 import org
.eclipse
.swt
.widgets
.TableItem
;
39 * @author Patrick Tasse
42 public class GdbEventsTable
extends TmfEventsTable
{
44 private static final String TRACE_FRAME_COLUMN
= GdbTraceEventContent
.TRACE_FRAME
;
45 private static final String TRACEPOINT_COLUMN
= GdbTraceEventContent
.TRACEPOINT
;
46 private static final String FILE_COLUMN
= "File"; //$NON-NLS-1$
47 private static final String CONTENT_COLUMN
= "Content"; //$NON-NLS-1$
48 private static final ColumnData
[] COLUMN_DATA
= new ColumnData
[] {
49 new ColumnData(TRACE_FRAME_COLUMN
, 100, SWT
.RIGHT
),
50 new ColumnData(TRACEPOINT_COLUMN
, 100, SWT
.RIGHT
),
51 new ColumnData(FILE_COLUMN
, 100, SWT
.LEFT
),
52 new ColumnData(CONTENT_COLUMN
, 100, SWT
.LEFT
)
55 private GdbTrace fSelectedTrace
= null;
56 private long fSelectedFrame
= 0;
60 * @param parent the parent
61 * @param cacheSize the cache size
63 public GdbEventsTable(Composite parent
, int cacheSize
) {
64 super(parent
, cacheSize
, COLUMN_DATA
);
65 // Set search field ids for event filter
66 fTable
.getColumns()[2].setData(Key
.FIELD_ID
, ITmfEvent
.EVENT_FIELD_REFERENCE
);
67 fTable
.getColumns()[3].setData(Key
.FIELD_ID
, ITmfEvent
.EVENT_FIELD_CONTENT
);
69 // Synchronize currently selected frame in GDB with table selection
70 addSelectionChangedListener(new ISelectionChangedListener() {
72 public void selectionChanged(SelectionChangedEvent e
) {
73 TableItem
[] selection
= fTable
.getSelection();
74 if (selection
.length
> 0) {
75 TableItem selectedTableItem
= selection
[0];
76 if (selectedTableItem
!= null) {
77 Object data
= selectedTableItem
.getData();
78 if (data
instanceof GdbTraceEvent
) {
79 GdbTraceEvent event
= (GdbTraceEvent
) data
;
80 GdbTrace gdbTrace
= (GdbTrace
) event
.getTrace();
81 GdbTraceEventContent content
= (GdbTraceEventContent
) event
.getContent();
82 selectFrame(gdbTrace
, content
.getFrameNumber());
87 fSelectedTrace
= null;
93 public void setTrace(ITmfTrace trace
, boolean disposeOnClose
) {
94 super.setTrace(trace
, disposeOnClose
);
95 if (trace
instanceof GdbTrace
) {
96 fSelectedTrace
= (GdbTrace
) trace
;
98 } else if (trace
instanceof TmfExperiment
) {
99 TmfExperiment experiment
= (TmfExperiment
) trace
;
100 if (experiment
.getTraces().length
> 0) {
101 fSelectedTrace
= (GdbTrace
) experiment
.getTraces()[0];
108 protected void populateCompleted() {
109 if (fSelectedTrace
!= null) {
110 selectFrame(fSelectedTrace
, fSelectedFrame
);
115 protected ITmfEventField
[] extractItemFields(ITmfEvent event
) {
116 ITmfEventField
[] fields
= EMPTY_FIELD_ARRAY
;
118 GdbTraceEventContent content
= (GdbTraceEventContent
) event
.getContent();
119 fields
= new TmfEventField
[] {
120 new TmfEventField(TRACE_FRAME_COLUMN
, content
.getFrameNumber(), null),
121 new TmfEventField(TRACEPOINT_COLUMN
, content
.getTracepointNumber(), null),
122 new TmfEventField(FILE_COLUMN
, event
.getReference(), null),
123 new TmfEventField(CONTENT_COLUMN
, content
.toString(), null)
131 public void currentTimeUpdated(final TmfTimeSynchSignal signal
) {
132 // do not synchronize on time
135 private void selectFrame(final GdbTrace gdbTrace
, final long frameNumber
) {
136 Job b
= new Job("GDB Trace select frame") { //$NON-NLS-1$
138 protected IStatus
run(IProgressMonitor monitor
) {
139 // This sends commands to GDB and can potentially wait on the UI
140 // thread (gdb traces console buffer full) so it needs to be
141 // exectued on a non-UI thread
142 gdbTrace
.selectFrame(frameNumber
);
143 fSelectedTrace
= gdbTrace
;
144 fSelectedFrame
= frameNumber
;
145 return Status
.OK_STATUS
;