From e9a0d1cb57d1b2f50a80b6b6bb9fdaaa4012f1f1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Genevi=C3=A8ve=20Bastien?= Date: Mon, 9 Jun 2014 09:43:50 -0400 Subject: [PATCH] LTTNG: Bug 436857: Keep process selection in CPU Usage tree viewer MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-on: https://git.eclipse.org/r/28199 Tested-by: Hudson CI --- .../ui/views/cpuusage/CpuUsageComposite.java | 31 +++++++++++++++++++ .../ui/views/cpuusage/CpuUsageView.java | 25 +++++++++++++-- .../ui/views/cpuusage/CpuUsageXYViewer.java | 23 +------------- .../viewers/tree/AbstractTmfTreeViewer.java | 28 +++++++++++++++++ 4 files changed, 82 insertions(+), 25 deletions(-) diff --git a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java index 1d4b09bd5d..8a5c5de5ae 100644 --- a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java +++ b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java @@ -13,11 +13,13 @@ 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 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; + } + } diff --git a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageView.java b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageView.java index fa13572d4a..d2d8a1ed23 100644 --- a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageView.java +++ b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageView.java @@ -12,9 +12,12 @@ 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()); diff --git a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageXYViewer.java b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageXYViewer.java index a3864e0353..e2167ef594 100644 --- a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageXYViewer.java +++ b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageXYViewer.java @@ -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 diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/tree/AbstractTmfTreeViewer.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/tree/AbstractTmfTreeViewer.java index 0261d791f3..b7ef9251b7 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/tree/AbstractTmfTreeViewer.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/tree/AbstractTmfTreeViewer.java @@ -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 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(); } -- 2.34.1