timing.ui: add Export to TSV to tables and statistics
[deliverable/tracecompass.git] / analysis / org.eclipse.tracecompass.analysis.timing.ui / src / org / eclipse / tracecompass / analysis / timing / ui / views / segmentstore / table / AbstractSegmentStoreTableView.java
1 /*******************************************************************************
2 * Copyright (c) 2015, 2016 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 * France Lapointe Nguyen - Initial API and implementation
11 * Bernd Hufmann - Move abstract class to TMF
12 *******************************************************************************/
13
14 package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.table;
15
16 import java.io.OutputStream;
17 import java.io.PrintWriter;
18 import java.util.ArrayList;
19 import java.util.List;
20
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.ui.views.TmfView;
33
34 import com.google.common.annotations.VisibleForTesting;
35 import com.google.common.base.Joiner;
36
37 /**
38 * View for displaying a segment store analysis in a table.
39 *
40 * @author France Lapointe Nguyen
41 * @since 2.0
42 */
43 public abstract class AbstractSegmentStoreTableView extends TmfView {
44
45 // ------------------------------------------------------------------------
46 // Attributes
47 // ------------------------------------------------------------------------
48
49 private final Action fExportAction = new ExportToTsvAction() {
50 @Override
51 protected void exportToTsv(@Nullable OutputStream stream) {
52 AbstractSegmentStoreTableView.this.exportToTsv(stream);
53
54 }
55
56 @Override
57 protected @Nullable Shell getShell() {
58 return getViewSite().getShell();
59 }
60 };
61
62 private @Nullable AbstractSegmentStoreTableViewer fSegmentStoreViewer;
63
64 // ------------------------------------------------------------------------
65 // Constructor
66 // ------------------------------------------------------------------------
67
68 /**
69 * Constructor
70 */
71 public AbstractSegmentStoreTableView() {
72 super(""); //$NON-NLS-1$
73 }
74
75 // ------------------------------------------------------------------------
76 // ViewPart
77 // ------------------------------------------------------------------------
78
79 @Override
80 public void createPartControl(@Nullable Composite parent) {
81 SashForm sf = new SashForm(parent, SWT.NONE);
82 TableViewer tableViewer = new TableViewer(sf, SWT.FULL_SELECTION | SWT.VIRTUAL);
83 fSegmentStoreViewer = createSegmentStoreViewer(tableViewer);
84 getViewSite().getActionBars().getMenuManager().add(fExportAction);
85 setInitialData();
86 }
87
88 // ------------------------------------------------------------------------
89 // Operations
90 // ------------------------------------------------------------------------
91
92 @Override
93 public void setFocus() {
94 if (fSegmentStoreViewer != null) {
95 fSegmentStoreViewer.getTableViewer().getControl().setFocus();
96 }
97 }
98
99 @Override
100 public void dispose() {
101 super.dispose();
102 if (fSegmentStoreViewer != null) {
103 fSegmentStoreViewer.dispose();
104 }
105 }
106
107 /**
108 * Returns the latency analysis table viewer instance
109 *
110 * @param tableViewer
111 * the table viewer to use
112 * @return the latency analysis table viewer instance
113 */
114 protected abstract AbstractSegmentStoreTableViewer createSegmentStoreViewer(TableViewer tableViewer);
115
116 /**
117 * Get the table viewer
118 *
119 * @return the table viewer, useful for testing
120 */
121 @Nullable
122 public AbstractSegmentStoreTableViewer getSegmentStoreViewer() {
123 return fSegmentStoreViewer;
124 }
125
126 /**
127 * Set initial data into the viewer
128 */
129 private void setInitialData() {
130 if (fSegmentStoreViewer != null) {
131 fSegmentStoreViewer.setData(fSegmentStoreViewer.getSegmentProvider());
132 }
133 }
134
135 /**
136 * Export a given items's TSV
137 *
138 * @param stream
139 * an output stream to write the TSV to
140 * @since 1.2
141 */
142 @VisibleForTesting
143 protected void exportToTsv(@Nullable OutputStream stream) {
144 try (PrintWriter pw = new PrintWriter(stream)) {
145 AbstractSegmentStoreTableViewer segmentStoreViewer = getSegmentStoreViewer();
146 if (segmentStoreViewer == null) {
147 return;
148 }
149 Table table = segmentStoreViewer.getTableViewer().getTable();
150 int size = table.getItemCount();
151 List<String> columns = new ArrayList<>();
152 for (int i = 0; i < table.getColumnCount(); i++) {
153 TableColumn column = table.getColumn(i);
154 if (column == null) {
155 return;
156 }
157 String columnName = String.valueOf(column.getText());
158 if (columnName.isEmpty() && i == table.getColumnCount() - 1) {
159 // Linux GTK2 undocumented feature
160 break;
161 }
162 columns.add(columnName);
163 }
164 pw.println(Joiner.on('\t').join(columns));
165 for (int i = 0; i < size; i++) {
166 TableItem item = table.getItem(i);
167 if (item == null) {
168 continue;
169 }
170 List<String> data = new ArrayList<>();
171 for (int col = 0; col < columns.size(); col++) {
172 data.add(String.valueOf(item.getText(col)));
173 }
174 pw.println(Joiner.on('\t').join(data));
175 }
176 }
177 }
178 }
This page took 0.034884 seconds and 5 git commands to generate.