LTTNG: Bug 436857: Keep process selection in CPU Usage tree viewer
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Mon, 9 Jun 2014 13:43:50 +0000 (09:43 -0400)
committerGenevieve Bastien <gbastien+lttng@versatic.net>
Thu, 26 Jun 2014 13:01:42 +0000 (09:01 -0400)
After a refresh to the tree's elements, the selected process was lost. Added
a method to set the selection in the abstract tree viewer.

Change-Id: Idc1ff4866593799e6f7571bbd0671364cae0ced1
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/28199
Tested-by: Hudson CI
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageView.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageXYViewer.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/tree/AbstractTmfTreeViewer.java

index 1d4b09bd5d29500bbaf7f5b2cc38b2ac28f1bfff..8a5c5de5aef91030dc23bc3986853fa916e65f59 100644 (file)
 package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.cpuusage;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerComparator;
 import org.eclipse.linuxtools.internal.lttng2.kernel.core.Attributes;
@@ -51,6 +53,7 @@ public class CpuUsageComposite extends AbstractTmfTreeViewer {
     private static final long BUILD_UPDATE_TIMEOUT = 500;
 
     private LttngKernelCpuUsageAnalysis fModule = null;
+    private String fSelectedThread = null;
 
     private static final String[] COLUMN_NAMES = new String[] {
             Messages.CpuUsageComposite_ColumnTID,
@@ -169,6 +172,24 @@ public class CpuUsageComposite extends AbstractTmfTreeViewer {
     // Operations
     // ------------------------------------------------------------------------
 
+    @Override
+    protected void contentChanged(ITmfTreeViewerEntry rootEntry) {
+        String selectedThread = fSelectedThread;
+        if (selectedThread != null) {
+            /* Find the selected thread among the inputs */
+            for (ITmfTreeViewerEntry entry : rootEntry.getChildren()) {
+                if (entry instanceof CpuUsageEntry) {
+                    if (selectedThread.equals(((CpuUsageEntry) entry).getTid())) {
+                        @SuppressWarnings("null")
+                        @NonNull List<ITmfTreeViewerEntry> list = Collections.singletonList(entry);
+                        super.setSelection(list);
+                        return;
+                    }
+                }
+            }
+        }
+    }
+
     @Override
     public void initializeDataSource() {
         fModule = getTrace().getAnalysisModuleOfClass(LttngKernelCpuUsageAnalysis.class, LttngKernelCpuUsageAnalysis.ID);
@@ -291,4 +312,14 @@ public class CpuUsageComposite extends AbstractTmfTreeViewer {
         return tid;
     }
 
+    /**
+     * Set the currently selected thread ID
+     *
+     * @param tid
+     *            The selected thread ID
+     */
+    public void setSelectedThread(String tid) {
+        fSelectedThread = tid;
+    }
+
 }
index fa13572d4a746b2abd9d4c1bafdb60ba3914103a..d2d8a1ed2320134f315da27b6e415b9f2d3f8cd1 100644 (file)
 
 package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.cpuusage;
 
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.linuxtools.tmf.core.signal.TmfTraceSelectedSignal;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
-import org.eclipse.linuxtools.tmf.ui.viewers.xycharts.TmfXYChartViewer;
 import org.eclipse.linuxtools.tmf.ui.views.TmfView;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.SashForm;
@@ -35,7 +38,7 @@ public class CpuUsageView extends TmfView {
     public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.cpuusage"; //$NON-NLS-1$
 
     private CpuUsageComposite fTreeViewer = null;
-    private TmfXYChartViewer fXYViewer = null;
+    private CpuUsageXYViewer fXYViewer = null;
 
     /**
      * Constructor
@@ -52,7 +55,23 @@ public class CpuUsageView extends TmfView {
         fTreeViewer = new CpuUsageComposite(sash);
 
         /* Build the XY chart part of the view */
-        fXYViewer = new CpuUsageXYViewer(sash, fTreeViewer);
+        fXYViewer = new CpuUsageXYViewer(sash);
+
+        /* Add selection listener to tree viewer */
+        fTreeViewer.addSelectionChangeListener(new ISelectionChangedListener() {
+            @Override
+            public void selectionChanged(SelectionChangedEvent event) {
+                ISelection selection = event.getSelection();
+                if (selection instanceof IStructuredSelection) {
+                    Object structSelection = ((IStructuredSelection) selection).getFirstElement();
+                    if (structSelection instanceof CpuUsageEntry) {
+                        CpuUsageEntry entry = (CpuUsageEntry) structSelection;
+                        fTreeViewer.setSelectedThread(entry.getTid());
+                        fXYViewer.setSelectedThread(Long.valueOf(entry.getTid()));
+                    }
+                }
+            }
+        });
 
         sash.setLayout(new FillLayout());
 
index a3864e035336f2a9d2b9bbb9427ffe1364163977..e2167ef59403351cbf17e63635a32cfbc8536f21 100644 (file)
@@ -19,9 +19,6 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Activator;
 import org.eclipse.linuxtools.lttng2.kernel.core.cpuusage.LttngKernelCpuUsageAnalysis;
 import org.eclipse.linuxtools.statesystem.core.ITmfStateSystem;
@@ -57,28 +54,10 @@ public class CpuUsageXYViewer extends TmfCommonXLineChartViewer {
      *
      * @param parent
      *            parent composite
-     * @param treeViewer
-     *            The tree viewer containing the list of threads with CPU usage.
-     *            A listener will be added to that viewer so it can synchronize
-     *            with the selection from the viewer.
      */
-    public CpuUsageXYViewer(Composite parent, CpuUsageComposite treeViewer) {
+    public CpuUsageXYViewer(Composite parent) {
         super(parent, Messages.CpuUsageXYViewer_Title, Messages.CpuUsageXYViewer_TimeXAxis, Messages.CpuUsageXYViewer_CpuYAxis);
         setResolution(RESOLUTION);
-
-        /* Add selection listener to tree viewer */
-        treeViewer.addSelectionChangeListener(new ISelectionChangedListener() {
-            @Override
-            public void selectionChanged(SelectionChangedEvent event) {
-                if (event.getSelection() instanceof IStructuredSelection) {
-                    Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
-                    if (selection instanceof CpuUsageEntry) {
-                        CpuUsageEntry entry = (CpuUsageEntry) selection;
-                        setSelectedThread(Long.valueOf(entry.getTid()));
-                    }
-                }
-            }
-        });
     }
 
     @Override
index 0261d791f34ffaf434bc45bee42bd010aa6744a8..b7ef9251b7ca6a991588d3560eac9f52a666f417 100644 (file)
@@ -14,14 +14,17 @@ package org.eclipse.linuxtools.tmf.ui.viewers.tree;
 
 import java.util.List;
 
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jface.viewers.AbstractTreeViewer;
 import org.eclipse.jface.viewers.IBaseLabelProvider;
 import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITableColorProvider;
 import org.eclipse.jface.viewers.ITableFontProvider;
 import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;
@@ -317,6 +320,18 @@ public abstract class AbstractTmfTreeViewer extends TmfTimeViewer {
     // Operations
     // ------------------------------------------------------------------------
 
+    /**
+     * Set the currently selected items in the treeviewer
+     *
+     * @param selection
+     *            The list of selected items
+     * @since 3.1
+     */
+    public void setSelection(@NonNull List<ITmfTreeViewerEntry> selection) {
+        IStructuredSelection sel = new StructuredSelection(selection);
+        fTreeViewer.setSelection(sel, true);
+    }
+
     /**
      * Add a selection listener to the tree viewer. This will be called when the
      * selection changes and contain all the selected items.
@@ -360,6 +375,18 @@ public abstract class AbstractTmfTreeViewer extends TmfTimeViewer {
         fTreeViewer.setInput(null);
     }
 
+    /**
+     * Method called after the content has been updated and the new input has
+     * been set on the tree.
+     *
+     * @param rootEntry
+     *            The new input of this viewer, or null if none
+     * @since 3.1
+     */
+    protected void contentChanged(ITmfTreeViewerEntry rootEntry) {
+
+    }
+
     /**
      * Requests an update of the viewer's content in a given time range or
      * selection time range. An extra parameter defines whether these times
@@ -386,6 +413,7 @@ public abstract class AbstractTmfTreeViewer extends TmfTimeViewer {
                         public void run() {
                             if (rootEntry != fTreeViewer.getInput()) {
                                 fTreeViewer.setInput(rootEntry);
+                                contentChanged(rootEntry);
                             } else {
                                 fTreeViewer.refresh();
                             }
This page took 0.040108 seconds and 5 git commands to generate.