1 /*******************************************************************************
2 * Copyright (c) 2009 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 * Francois Chouinard - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.tmf
.ui
.views
;
15 import org
.eclipse
.linuxtools
.tmf
.event
.TmfEvent
;
16 import org
.eclipse
.linuxtools
.tmf
.event
.TmfTimestamp
;
17 import org
.eclipse
.linuxtools
.tmf
.request
.TmfDataRequest
;
18 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfSignalHandler
;
19 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfSignalManager
;
20 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfTimeSynchSignal
;
21 import org
.eclipse
.linuxtools
.tmf
.trace
.TmfExperiment
;
22 import org
.eclipse
.linuxtools
.tmf
.trace
.TmfExperimentSelectedSignal
;
23 import org
.eclipse
.linuxtools
.tmf
.trace
.TmfTraceUpdatedSignal
;
24 import org
.eclipse
.swt
.SWT
;
25 import org
.eclipse
.swt
.events
.SelectionEvent
;
26 import org
.eclipse
.swt
.events
.SelectionListener
;
27 import org
.eclipse
.swt
.layout
.GridData
;
28 import org
.eclipse
.swt
.widgets
.Composite
;
29 import org
.eclipse
.swt
.widgets
.Event
;
30 import org
.eclipse
.swt
.widgets
.Listener
;
31 import org
.eclipse
.swt
.widgets
.Table
;
32 import org
.eclipse
.swt
.widgets
.TableColumn
;
33 import org
.eclipse
.swt
.widgets
.TableItem
;
36 * <b><u>TmfEventsView</u></b>
39 * TODO: Implement me. Please.
40 * TODO: Handle column selection, sort, ... generically (nothing less...)
41 * TODO: Implement hide/display columns
43 public class TmfEventsView
extends TmfView
{
45 public static final String ID
= "org.eclipse.linuxtools.tmf.ui.viewer.events";
47 private TmfExperiment fExperiment
;
48 private String fTitlePrefix
;
50 // ========================================================================
52 // ========================================================================
57 private final String TIMESTAMP_COLUMN
= "Timestamp";
58 private final String SOURCE_COLUMN
= "Source";
59 private final String TYPE_COLUMN
= "Type";
60 private final String REFERENCE_COLUMN
= "File";
61 private final String CONTENT_COLUMN
= "Content";
62 private final String
[] columnProperties
= new String
[] {
71 private class ColumnData
{
72 public final String header
;
73 public final int width
;
74 public final int alignment
;
76 public ColumnData(String h
, int w
, int a
) {
83 private ColumnData
[] columnData
= new ColumnData
[] {
84 new ColumnData(columnProperties
[0], 100, SWT
.LEFT
),
85 new ColumnData(columnProperties
[1], 100, SWT
.LEFT
),
86 new ColumnData(columnProperties
[2], 100, SWT
.LEFT
),
87 new ColumnData(columnProperties
[3], 100, SWT
.LEFT
),
88 new ColumnData(columnProperties
[4], 100, SWT
.LEFT
)
91 // ========================================================================
93 // ========================================================================
95 public TmfEventsView() {
100 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
103 public void createPartControl(Composite parent
) {
105 // Create a virtual table
106 // TODO: change SINGLE to MULTI line selection and adjust the selection listener
107 final int style
= SWT
.SINGLE
| SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.BORDER
| SWT
.VIRTUAL
;
108 fTable
= new Table(parent
, style
);
110 // Set the table layout
111 GridData layoutData
= new GridData(SWT
.FILL
, SWT
.FILL
, true, true);
112 layoutData
.horizontalSpan
= columnData
.length
;
113 fTable
.setLayoutData(layoutData
);
115 // Some cosmetic enhancements
116 fTable
.setHeaderVisible(true);
117 fTable
.setLinesVisible(true);
120 setColumnHeaders(fTable
);
122 // Handle the table item requests
123 fTable
.addSelectionListener(new SelectionListener() {
125 public void widgetDefaultSelected(SelectionEvent e
) {
126 // TODO Auto-generated method stub
129 public void widgetSelected(SelectionEvent e
) {
130 // Get the timestamp string
131 String time
= fTable
.getSelection()[0].getText();
133 // Compose a timestamp
134 int pos
= time
.indexOf('.');
135 String integer
= time
.substring(0, pos
);
136 String fraction
= time
.substring(pos
+ 1);
138 byte exponent
= (byte) -fraction
.length();
139 String value
= integer
+ fraction
;
140 TmfTimestamp ts
= new TmfTimestamp(new Long(value
), exponent
);
142 // Generate the synchronization event
143 TmfSignalManager
.dispatchSignal(new TmfTimeSynchSignal(fTable
, ts
));
147 // Handle the table item requests
148 fTable
.addListener(SWT
.SetData
, new Listener() {
149 public void handleEvent(Event event
) {
150 TableItem item
= (TableItem
) event
.item
;
151 int index
= fTable
.indexOf(item
);
152 final TmfEvent
[] evt
= new TmfEvent
[1];
153 TmfDataRequest
<TmfEvent
> request
= new TmfDataRequest
<TmfEvent
>(index
, 0, 1) {
155 public void handleData() {
156 TmfEvent
[] result
= getData();
157 evt
[0] = (result
.length
> 0) ? result
[0] : null;
160 fExperiment
.processRequest(request
, true);
161 item
.setText(extractItemFields(evt
[0]));
165 fTable
.setItemCount(0);
166 fTitlePrefix
= getTitle();
172 * FIXME: Add support for column selection
174 protected void setColumnHeaders(Table table
) {
175 for (int i
= 0; i
< columnData
.length
; i
++) {
176 TableColumn column
= new TableColumn(table
, columnData
[i
].alignment
, i
);
177 column
.setText(columnData
[i
].header
);
178 column
.setWidth(columnData
[i
].width
);
186 * FIXME: Add support for column selection
188 protected String
[] extractItemFields(TmfEvent event
) {
189 String
[] fields
= new String
[0];
191 fields
= new String
[] {
192 new Long(event
.getTimestamp().getValue()).toString(),
193 event
.getSource().getSourceId().toString(),
194 event
.getType().getTypeId().toString(),
195 event
.getReference().getValue().toString(),
196 event
.getContent().getContent()
203 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
206 public void setFocus() {
209 // ========================================================================
211 // ========================================================================
214 public void experimentSelected(TmfExperimentSelectedSignal signal
) {
215 // Update the trace reference
216 if (fExperiment
!= null)
217 fExperiment
.dispose();
218 fExperiment
= signal
.getExperiment();
219 setPartName(fTitlePrefix
+ " - " + fExperiment
.getExperimentId());
221 // Perform the updates on the UI thread
222 fTable
.getDisplay().asyncExec(new Runnable() {
225 fTable
.setItemCount(fExperiment
.getNbEvents());
231 public void traceUpdated(TmfTraceUpdatedSignal signal
) {
232 // Perform the refresh on the UI thread
233 fTable
.getDisplay().asyncExec(new Runnable() {
235 if (!fTable
.isDisposed()) {
236 fTable
.setItemCount(fExperiment
.getNbEvents());
243 public void currentTimeUpdated(TmfTimeSynchSignal signal
) {
244 if (signal
.getSource() != fTable
) {
245 final int index
= fExperiment
.getIndex(signal
.getCurrentTime());
246 // Perform the updates on the UI thread
247 fTable
.getDisplay().asyncExec(new Runnable() {
249 fTable
.setSelection(index
);