1 /*******************************************************************************
2 * Copyright (c) 2015, 2016 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 * France Lapointe Nguyen - Initial API and implementation
11 * Bernd Hufmann - Move abstract class to TMF
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.analysis
.timing
.ui
.views
.segmentstore
.table
;
16 import java
.io
.OutputStream
;
17 import java
.io
.PrintWriter
;
18 import java
.util
.ArrayList
;
19 import java
.util
.List
;
21 import org
.eclipse
.jdt
.annotation
.Nullable
;
22 import org
.eclipse
.jface
.action
.Action
;
23 import org
.eclipse
.jface
.viewers
.TableViewer
;
24 import org
.eclipse
.swt
.SWT
;
25 import org
.eclipse
.swt
.custom
.SashForm
;
26 import org
.eclipse
.swt
.widgets
.Composite
;
27 import org
.eclipse
.swt
.widgets
.Shell
;
28 import org
.eclipse
.swt
.widgets
.Table
;
29 import org
.eclipse
.swt
.widgets
.TableColumn
;
30 import org
.eclipse
.swt
.widgets
.TableItem
;
31 import org
.eclipse
.tracecompass
.internal
.analysis
.timing
.ui
.views
.segmentstore
.ExportToTsvAction
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceSelectedSignal
;
33 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
34 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
35 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.TmfView
;
37 import com
.google
.common
.annotations
.VisibleForTesting
;
38 import com
.google
.common
.base
.Joiner
;
41 * View for displaying a segment store analysis in a table.
43 * @author France Lapointe Nguyen
46 public abstract class AbstractSegmentStoreTableView
extends TmfView
{
48 // ------------------------------------------------------------------------
50 // ------------------------------------------------------------------------
52 private final Action fExportAction
= new ExportToTsvAction() {
54 protected void exportToTsv(@Nullable OutputStream stream
) {
55 AbstractSegmentStoreTableView
.this.exportToTsv(stream
);
60 protected @Nullable Shell
getShell() {
61 return getViewSite().getShell();
65 private @Nullable AbstractSegmentStoreTableViewer fSegmentStoreViewer
;
67 // ------------------------------------------------------------------------
69 // ------------------------------------------------------------------------
74 public AbstractSegmentStoreTableView() {
75 super(""); //$NON-NLS-1$
78 // ------------------------------------------------------------------------
80 // ------------------------------------------------------------------------
83 public void createPartControl(@Nullable Composite parent
) {
84 super.createPartControl(parent
);
85 SashForm sf
= new SashForm(parent
, SWT
.NONE
);
86 TableViewer tableViewer
= new TableViewer(sf
, SWT
.FULL_SELECTION
| SWT
.VIRTUAL
);
87 fSegmentStoreViewer
= createSegmentStoreViewer(tableViewer
);
88 getViewSite().getActionBars().getMenuManager().add(fExportAction
);
89 ITmfTrace trace
= TmfTraceManager
.getInstance().getActiveTrace();
91 TmfTraceSelectedSignal signal
= new TmfTraceSelectedSignal(this, trace
);
92 if (fSegmentStoreViewer
!= null) {
93 fSegmentStoreViewer
.traceSelected(signal
);
99 // ------------------------------------------------------------------------
101 // ------------------------------------------------------------------------
104 public void setFocus() {
105 if (fSegmentStoreViewer
!= null) {
106 fSegmentStoreViewer
.getTableViewer().getControl().setFocus();
111 public void dispose() {
113 if (fSegmentStoreViewer
!= null) {
114 fSegmentStoreViewer
.dispose();
119 * Returns the latency analysis table viewer instance
122 * the table viewer to use
123 * @return the latency analysis table viewer instance
125 protected abstract AbstractSegmentStoreTableViewer
createSegmentStoreViewer(TableViewer tableViewer
);
128 * Get the table viewer
130 * @return the table viewer, useful for testing
133 public AbstractSegmentStoreTableViewer
getSegmentStoreViewer() {
134 return fSegmentStoreViewer
;
138 * Set initial data into the viewer
140 private void setInitialData() {
141 if (fSegmentStoreViewer
!= null) {
142 fSegmentStoreViewer
.setData(fSegmentStoreViewer
.getSegmentProvider());
147 * Export a given items's TSV
150 * an output stream to write the TSV to
154 protected void exportToTsv(@Nullable OutputStream stream
) {
155 try (PrintWriter pw
= new PrintWriter(stream
)) {
156 AbstractSegmentStoreTableViewer segmentStoreViewer
= getSegmentStoreViewer();
157 if (segmentStoreViewer
== null) {
160 Table table
= segmentStoreViewer
.getTableViewer().getTable();
161 int size
= table
.getItemCount();
162 List
<String
> columns
= new ArrayList
<>();
163 for (int i
= 0; i
< table
.getColumnCount(); i
++) {
164 TableColumn column
= table
.getColumn(i
);
165 if (column
== null) {
168 String columnName
= String
.valueOf(column
.getText());
169 if (columnName
.isEmpty() && i
== table
.getColumnCount() - 1) {
170 // Linux GTK2 undocumented feature
173 columns
.add(columnName
);
175 pw
.println(Joiner
.on('\t').join(columns
));
176 for (int i
= 0; i
< size
; i
++) {
177 TableItem item
= table
.getItem(i
);
181 List
<String
> data
= new ArrayList
<>();
182 for (int col
= 0; col
< columns
.size(); col
++) {
183 data
.add(String
.valueOf(item
.getText(col
)));
185 pw
.println(Joiner
.on('\t').join(data
));