tmf: Bug 494767: Events in selection not updated in Statistics view
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / internal / tmf / ui / viewers / statistics / TmfStatisticsViewer.java
index 87121e93534f7a03b4fd67ae4883476e2f62358b..1369baccfd8b8265db048c44644d1f8794634f98 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * 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;
@@ -153,10 +153,18 @@ public class TmfStatisticsViewer extends TmfViewer {
 
         initContent(parent);
         initInput();
+
+        fSash.addDisposeListener((e) -> {
+            internalDispose();
+        });
     }
 
     @Override
     public void dispose() {
+        fSash.dispose();
+    }
+
+    private void internalDispose() {
         super.dispose();
         if (fWaitCursor != null) {
             fWaitCursor.dispose();
@@ -221,7 +229,12 @@ public class TmfStatisticsViewer extends TmfViewer {
         }
         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);
     }
 
@@ -265,11 +278,11 @@ public class TmfStatisticsViewer extends TmfViewer {
      * @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;
     }
 
     /**
@@ -296,7 +309,7 @@ public class TmfStatisticsViewer extends TmfViewer {
     /**
      * Only refreshes the Tree viewer
      */
-    private void refreshTree(){
+    private void refreshTree() {
         final Control viewerControl = getControl();
         // Ignore update if disposed
         if (viewerControl.isDisposed()) {
@@ -315,8 +328,11 @@ public class TmfStatisticsViewer extends TmfViewer {
 
     /**
      * 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) {
@@ -326,6 +342,21 @@ public class TmfStatisticsViewer extends TmfViewer {
             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() {
@@ -384,12 +415,32 @@ public class TmfStatisticsViewer extends TmfViewer {
 
         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);
@@ -462,12 +513,14 @@ public class TmfStatisticsViewer extends TmfViewer {
                         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;
                     }
@@ -663,9 +716,7 @@ public class TmfStatisticsViewer extends TmfViewer {
             updateJobs = fUpdateJobsPartial;
         }
 
-        setPieChartsVisible(true);
         for (ITmfTrace aTrace : TmfTraceManager.getTraceSet(trace)) {
-            aTrace = checkNotNull(aTrace);
             if (!isListeningTo(aTrace)) {
                 continue;
             }
@@ -766,8 +817,10 @@ public class TmfStatisticsViewer extends TmfViewer {
     }
 
     /**
-     * @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;
This page took 0.028356 seconds and 5 git commands to generate.