timing: Add a generic table view for any segment provider
[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.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;
36
37 import com.google.common.annotations.VisibleForTesting;
38 import com.google.common.base.Joiner;
39
40 /**
41 * View for displaying a segment store analysis in a table.
42 *
43 * @author France Lapointe Nguyen
44 * @since 2.0
45 */
46 public abstract class AbstractSegmentStoreTableView extends TmfView {
47
48 // ------------------------------------------------------------------------
49 // Attributes
50 // ------------------------------------------------------------------------
51
52 private final Action fExportAction = new ExportToTsvAction() {
53 @Override
54 protected void exportToTsv(@Nullable OutputStream stream) {
55 AbstractSegmentStoreTableView.this.exportToTsv(stream);
56
57 }
58
59 @Override
60 protected @Nullable Shell getShell() {
61 return getViewSite().getShell();
62 }
63 };
64
65 private @Nullable AbstractSegmentStoreTableViewer fSegmentStoreViewer;
66
67 // ------------------------------------------------------------------------
68 // Constructor
69 // ------------------------------------------------------------------------
70
71 /**
72 * Constructor
73 */
74 public AbstractSegmentStoreTableView() {
75 super(""); //$NON-NLS-1$
76 }
77
78 // ------------------------------------------------------------------------
79 // ViewPart
80 // ------------------------------------------------------------------------
81
82 @Override
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();
90 if (trace != null) {
91 TmfTraceSelectedSignal signal = new TmfTraceSelectedSignal(this, trace);
92 if (fSegmentStoreViewer != null) {
93 fSegmentStoreViewer.traceSelected(signal);
94 }
95 }
96 setInitialData();
97 }
98
99 // ------------------------------------------------------------------------
100 // Operations
101 // ------------------------------------------------------------------------
102
103 @Override
104 public void setFocus() {
105 if (fSegmentStoreViewer != null) {
106 fSegmentStoreViewer.getTableViewer().getControl().setFocus();
107 }
108 }
109
110 @Override
111 public void dispose() {
112 super.dispose();
113 if (fSegmentStoreViewer != null) {
114 fSegmentStoreViewer.dispose();
115 }
116 }
117
118 /**
119 * Returns the latency analysis table viewer instance
120 *
121 * @param tableViewer
122 * the table viewer to use
123 * @return the latency analysis table viewer instance
124 */
125 protected abstract AbstractSegmentStoreTableViewer createSegmentStoreViewer(TableViewer tableViewer);
126
127 /**
128 * Get the table viewer
129 *
130 * @return the table viewer, useful for testing
131 */
132 @Nullable
133 public AbstractSegmentStoreTableViewer getSegmentStoreViewer() {
134 return fSegmentStoreViewer;
135 }
136
137 /**
138 * Set initial data into the viewer
139 */
140 private void setInitialData() {
141 if (fSegmentStoreViewer != null) {
142 fSegmentStoreViewer.setData(fSegmentStoreViewer.getSegmentProvider());
143 }
144 }
145
146 /**
147 * Export a given items's TSV
148 *
149 * @param stream
150 * an output stream to write the TSV to
151 * @since 1.2
152 */
153 @VisibleForTesting
154 protected void exportToTsv(@Nullable OutputStream stream) {
155 try (PrintWriter pw = new PrintWriter(stream)) {
156 AbstractSegmentStoreTableViewer segmentStoreViewer = getSegmentStoreViewer();
157 if (segmentStoreViewer == null) {
158 return;
159 }
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) {
166 return;
167 }
168 String columnName = String.valueOf(column.getText());
169 if (columnName.isEmpty() && i == table.getColumnCount() - 1) {
170 // Linux GTK2 undocumented feature
171 break;
172 }
173 columns.add(columnName);
174 }
175 pw.println(Joiner.on('\t').join(columns));
176 for (int i = 0; i < size; i++) {
177 TableItem item = table.getItem(i);
178 if (item == null) {
179 continue;
180 }
181 List<String> data = new ArrayList<>();
182 for (int col = 0; col < columns.size(); col++) {
183 data.add(String.valueOf(item.getText(col)));
184 }
185 pw.println(Joiner.on('\t').join(data));
186 }
187 }
188 }
189 }
This page took 0.035377 seconds and 5 git commands to generate.