tmf: Restrict GdbTraceEvent's content to GdbTraceEventContent
[deliverable/tracecompass.git] / org.eclipse.linuxtools.gdbtrace.ui / src / org / eclipse / linuxtools / internal / gdbtrace / ui / views / events / GdbEventsTable.java
1 /*******************************************************************************
2 * Copyright (c) 2013 Ericsson
3 *
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
8 *
9 * Contributors:
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.linuxtools.internal.gdbtrace.ui.views.events;
14
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.signal.TmfSignalHandler;
26 import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;
27 import org.eclipse.linuxtools.tmf.core.signal.TmfTraceUpdatedSignal;
28 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
29 import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;
30 import org.eclipse.linuxtools.tmf.ui.viewers.events.TmfEventsTable;
31 import org.eclipse.linuxtools.tmf.ui.widgets.virtualtable.ColumnData;
32 import org.eclipse.swt.SWT;
33 import org.eclipse.swt.widgets.Composite;
34 import org.eclipse.swt.widgets.TableItem;
35
36 /**
37 * GDB Events Table
38 * @author Patrick Tasse
39 *
40 */
41 public class GdbEventsTable extends TmfEventsTable {
42
43 private static final String TRACE_FRAME_COLUMN = GdbTraceEventContent.TRACE_FRAME;
44 private static final String TRACEPOINT_COLUMN = GdbTraceEventContent.TRACEPOINT;
45 private static final String FILE_COLUMN = "File"; //$NON-NLS-1$
46 private static final String CONTENT_COLUMN = "Content"; //$NON-NLS-1$
47 private static final ColumnData[] COLUMN_DATA = new ColumnData[] {
48 new ColumnData(TRACE_FRAME_COLUMN, 100, SWT.RIGHT),
49 new ColumnData(TRACEPOINT_COLUMN, 100, SWT.RIGHT),
50 new ColumnData(FILE_COLUMN, 100, SWT.LEFT),
51 new ColumnData(CONTENT_COLUMN, 100, SWT.LEFT)
52 };
53
54 private GdbTrace fSelectedTrace = null;
55 private long fSelectedFrame = 0;
56
57 /**
58 * Constructor
59 * @param parent the parent
60 * @param cacheSize the cache size
61 */
62 public GdbEventsTable(Composite parent, int cacheSize) {
63 super(parent, cacheSize, COLUMN_DATA);
64 // Set search field ids for event filter
65 fTable.getColumns()[2].setData(Key.FIELD_ID, ITmfEvent.EVENT_FIELD_REFERENCE);
66 fTable.getColumns()[3].setData(Key.FIELD_ID, ITmfEvent.EVENT_FIELD_CONTENT);
67
68 // Synchronize currently selected frame in GDB with table selection
69 addSelectionChangedListener(new ISelectionChangedListener() {
70 @Override
71 public void selectionChanged(SelectionChangedEvent e) {
72 TableItem[] selection = fTable.getSelection();
73 if (selection.length > 0) {
74 TableItem selectedTableItem = selection[0];
75 if (selectedTableItem != null) {
76 Object data = selectedTableItem.getData();
77 if (data instanceof GdbTraceEvent) {
78 GdbTraceEvent event = (GdbTraceEvent) data;
79 GdbTrace gdbTrace = (GdbTrace) event.getTrace();
80 GdbTraceEventContent content = event.getContent();
81 selectFrame(gdbTrace, content.getFrameNumber());
82 return;
83 }
84 }
85 }
86 fSelectedTrace = null;
87 }
88 });
89 }
90
91 @Override
92 public void setTrace(ITmfTrace trace, boolean disposeOnClose) {
93 super.setTrace(trace, disposeOnClose);
94 if (trace instanceof GdbTrace) {
95 fSelectedTrace = (GdbTrace) trace;
96 fSelectedFrame = 0;
97 } else if (trace instanceof TmfExperiment) {
98 TmfExperiment experiment = (TmfExperiment) trace;
99 if (experiment.getTraces().length > 0) {
100 fSelectedTrace = (GdbTrace) experiment.getTraces()[0];
101 fSelectedFrame = 0;
102 }
103 }
104 }
105
106 @Override
107 public String[] getItemStrings(ITmfEvent event) {
108 if (event == null) {
109 return EMPTY_STRING_ARRAY;
110 }
111 // FIXME Unchecked cast. Null check should be replaced with instanceof
112 // GdbTraceEvent check, and its getContent() should be overriden.
113 GdbTraceEventContent content = (GdbTraceEventContent) event.getContent();
114 return new String[] {
115 String.valueOf(content.getFrameNumber()),
116 String.valueOf(content.getTracepointNumber()),
117 event.getReference(),
118 content.toString()
119 };
120 }
121
122 @Override
123 @TmfSignalHandler
124 public void currentTimeUpdated(final TmfTimeSynchSignal signal) {
125 // do not synchronize on time
126 }
127
128 private void selectFrame(final GdbTrace gdbTrace, final long frameNumber) {
129 Job b = new Job("GDB Trace select frame") { //$NON-NLS-1$
130 @Override
131 protected IStatus run(IProgressMonitor monitor) {
132 // This sends commands to GDB and can potentially wait on the UI
133 // thread (gdb traces console buffer full) so it needs to be
134 // exectued on a non-UI thread
135 gdbTrace.selectFrame(frameNumber);
136 fSelectedTrace = gdbTrace;
137 fSelectedFrame = frameNumber;
138 return Status.OK_STATUS;
139 }
140 };
141 b.setSystem(true);
142 b.schedule();
143 }
144
145 @Override
146 @TmfSignalHandler
147 public void traceUpdated(TmfTraceUpdatedSignal signal) {
148 super.traceUpdated(signal);
149 if (fSelectedTrace.getNbFrames() == fSelectedTrace.getNbEvents()) {
150 selectFrame(fSelectedTrace, fSelectedFrame);
151 }
152 }
153 }
This page took 0.034945 seconds and 6 git commands to generate.