/********************************************************************** * Copyright (c) 2016, 2017 École Polytechnique de Montréal and others * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html **********************************************************************/ package org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.kernelmemoryusage; import org.eclipse.jdt.annotation.NonNull; 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.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceContext; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer; import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer; import org.eclipse.tracecompass.tmf.ui.views.TmfChartView; import com.google.common.annotations.VisibleForTesting; /** * Memory usage view * * @author Samuel Gagnon * @author Mahdi Zolnouri * @author Wassim Nasrallah */ public class KernelMemoryUsageView extends TmfChartView { /** ID string */ public static final @NonNull String ID = "org.eclipse.tracecompass.analysis.os.linux.ui.kernelmemoryusageview"; //$NON-NLS-1$ /** ID of the Kernel Memory Usage view data in the data map of {@link TmfTraceContext} */ public static final @NonNull String KERNEL_MEMORY = ID + ".KERNEL_MEMORY"; //$NON-NLS-1$ /* * We need this reference to update the viewer when there is a new selection */ private KernelMemoryUsageTreeViewer fTreeViewerReference = null; /** * Constructor */ public KernelMemoryUsageView() { super(Messages.MemoryUsageView_title); } @Override protected TmfXYChartViewer createChartViewer(Composite parent) { return new KernelMemoryUsageViewer(parent); } private final class SelectionChangeListener implements ISelectionChangedListener { @Override public void selectionChanged(SelectionChangedEvent event) { KernelMemoryUsageTreeViewer treeViewer = fTreeViewerReference; KernelMemoryUsageViewer chartViewer = (KernelMemoryUsageViewer) getChartViewer(); if (treeViewer == null || chartViewer == null) { return; } ITmfTrace trace = treeViewer.getTrace(); if (trace == null) { return; } ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { Object structSelection = ((IStructuredSelection) selection).getFirstElement(); if (structSelection instanceof KernelMemoryUsageEntry) { KernelMemoryUsageEntry entry = (KernelMemoryUsageEntry) structSelection; String tid = entry.getTid(); if (tid == null) { return; } treeViewer.setSelectedThread(tid); chartViewer.setSelectedThread(tid); TmfTraceManager.getInstance().updateTraceContext(trace, builder -> builder.setData(KERNEL_MEMORY, tid)); } } } } @Override protected @NonNull TmfViewer createLeftChildViewer(Composite parent) { @NonNull KernelMemoryUsageTreeViewer fTreeViewer = new KernelMemoryUsageTreeViewer(parent); fTreeViewerReference = fTreeViewer; fTreeViewer.addSelectionChangeListener(new SelectionChangeListener()); /* Initialize the viewers with the currently selected trace */ ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace(); if (trace != null) { TmfTraceSelectedSignal signal = new TmfTraceSelectedSignal(this, trace); fTreeViewer.traceSelected(signal); fTreeViewerReference.traceSelected(signal); } fTreeViewer.getControl().addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e) { super.controlResized(e); } }); return fTreeViewer; } @VisibleForTesting @Override public TmfXYChartViewer getChartViewer() { // change visibility return super.getChartViewer(); } }