/*******************************************************************************
- * Copyright (c) 2012, 2015 Ericsson
+ * Copyright (c) 2012, 2016 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
package org.eclipse.tracecompass.internal.tmf.ui.viewers.statistics;
-import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
-
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
initContent(parent);
initInput();
+
+ fSash.addDisposeListener((e) -> {
+ internalDispose();
+ });
}
@Override
public void dispose() {
+ fSash.dispose();
+ }
+
+ private void internalDispose() {
super.dispose();
if (fWaitCursor != null) {
fWaitCursor.dispose();
}
ITmfTimestamp begin = signal.getBeginTime();
ITmfTimestamp end = signal.getEndTime();
- TmfTimeRange timeRange = new TmfTimeRange(begin, end);
+ TmfTimeRange timeRange;
+ if (begin.compareTo(end) <= 0) {
+ timeRange = new TmfTimeRange(begin, end);
+ } else {
+ timeRange = new TmfTimeRange(end, begin);
+ }
requestTimeRangeData(fTrace, timeRange);
}
* @return the model of the piecharts in this viewer
* @since 2.0
*/
- public TmfPieChartStatisticsModel getPieChartModel(){
+ public TmfPieChartStatisticsModel getPieChartModel() {
if (fPieChartModel == null) {
fPieChartModel = new TmfPieChartStatisticsModel();
- }
- return fPieChartModel;
+ }
+ return fPieChartModel;
}
/**
/**
* Only refreshes the Tree viewer
*/
- private void refreshTree(){
+ private void refreshTree() {
final Control viewerControl = getControl();
// Ignore update if disposed
if (viewerControl.isDisposed()) {
/**
* Only refreshes the piecharts depending on the parameters
- * @param refreshGlobal if we have to refresh the global piechart
- * @param refreshSelection if we have to refresh the selection piechart
+ *
+ * @param refreshGlobal
+ * if we have to refresh the global piechart
+ * @param refreshSelection
+ * if we have to refresh the selection piechart
* @since 2.0
*/
protected void refreshPieCharts(final boolean refreshGlobal, final boolean refreshSelection) {
return;
}
+ TmfPieChartStatisticsModel pieChartModel = getPieChartModel();
+ if (pieChartModel == null || pieChartModel.getPieChartGlobalModel() == null) {
+ return;
+ }
+ /* If there's only one event type, don't show any piechart */
+ boolean moreThanOne = false;
+ for (Entry<ITmfTrace, Map<String, Long>> entry : pieChartModel.getPieChartGlobalModel().entrySet()) {
+ if(entry.getValue() != null && entry.getValue().size() > 1) {
+ moreThanOne = true;
+ break;
+ }
+ }
+
+ setPieChartsVisible(moreThanOne);
+
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
final List<TmfBaseColumnData> columnDataList = getColumnDataProvider().getColumnData();
- fSash = new SashForm(parent, SWT.HORIZONTAL );
+ fSash = new SashForm(parent, SWT.HORIZONTAL);
fTreeViewer = new TreeViewer(fSash, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
fPieChartViewer = new TmfPieChartViewer(fSash);
- fPieChartViewer.setVisible(false);
- fSash.setWeights(new int[] { 1, 1 });
+ fPieChartViewer.addEventTypeSelectionListener(new Listener() {
+
+ @Override
+ public void handleEvent(Event event) {
+ String eventTypeName = event.text;
+ if (getStatisticData().getRootNode() == null ||
+ fTreeViewer.getTree() == null) {
+ return;
+ }
+ /* Get all the nodes corresponding to the event name */
+ List<TmfStatisticsTreeNode> nodes = (List<TmfStatisticsTreeNode>) getStatisticData().getRootNode().findChildren(eventTypeName, true);
+ if (nodes.isEmpty()) {
+ /* Shouldn't happen, except for when selecting "Others" */
+ return;
+ }
+ /* Only select the first in the collection */
+ fTreeViewer.setSelection(new StructuredSelection(nodes.get(0)), true);
+ }
+ });
+
+ /* Make sure the sash is split in 2 equal parts */
+ fSash.setWeights(new int[] { 100, 100 });
fTreeViewer.setContentProvider(new TmfTreeContentProvider());
fTreeViewer.getTree().setHeaderVisible(true);
return;
}
- // Otherwise, get percentage and draw bar and text if applicable.
+ // Otherwise, get percentage and draw bar and text if
+ // applicable.
double percentage = columnDataList.get(event.index).getPercentageProvider().getPercentage(node);
// The item is selected.
if ((event.detail & SWT.SELECTED) > 0) {
- // Draws our own background to avoid overwriting the bar.
+ // Draws our own background to avoid overwriting the
+ // bar.
event.gc.fillRectangle(event.x, event.y, event.width, event.height);
event.detail &= ~SWT.SELECTED;
}
updateJobs = fUpdateJobsPartial;
}
- setPieChartsVisible(true);
for (ITmfTrace aTrace : TmfTraceManager.getTraceSet(trace)) {
- aTrace = checkNotNull(aTrace);
if (!isListeningTo(aTrace)) {
continue;
}
}
/**
- * @param isGlobal if the job to remove is global or partial
- * @param jobTrace The trace
+ * @param isGlobal
+ * if the job to remove is global or partial
+ * @param jobTrace
+ * The trace
*/
void removeFromJobs(boolean isGlobal, ITmfTrace jobTrace) {
Map<ITmfTrace, Job> updateJobs = isGlobal ? fUpdateJobsGlobal : fUpdateJobsPartial;