/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * 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 * * Contributors: * Elliott Baron <ebaron@redhat.com> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.valgrind.massif; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.linuxtools.valgrind.ui.CollapseAction; import org.eclipse.linuxtools.valgrind.ui.ExpandAction; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; public class MassifTreeViewer { private IDoubleClickListener doubleClickListener; private ITreeContentProvider contentProvider; private Action expandAction; private Action collapseAction; private TreeViewer viewer; public MassifTreeViewer(Composite parent) { viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL); contentProvider = new ITreeContentProvider() { @Override public Object[] getChildren(Object parentElement) { return ((MassifHeapTreeNode) parentElement).getChildren(); } @Override public Object getParent(Object element) { return ((MassifHeapTreeNode) element).getParent(); } @Override public boolean hasChildren(Object element) { MassifHeapTreeNode[] children = ((MassifHeapTreeNode) element).getChildren(); return children != null && children.length > 0; } @Override public Object[] getElements(Object inputElement) { return (Object[]) inputElement; } @Override public void dispose() {} @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {} }; viewer.setContentProvider(contentProvider); viewer.setLabelProvider(new MassifTreeLabelProvider()); doubleClickListener = event -> { MassifHeapTreeNode element = (MassifHeapTreeNode) ((TreeSelection) event.getSelection()).getFirstElement(); if (element.hasSourceFile()) { MassifPlugin.getDefault().openEditorForNode(element); } if (contentProvider.hasChildren(element)) { viewer.expandToLevel(element, 1); } }; viewer.addDoubleClickListener(doubleClickListener); expandAction = new ExpandAction(viewer); collapseAction = new CollapseAction(viewer); MenuManager manager = new MenuManager(); manager.addMenuListener(manager1 -> { ITreeSelection selection = (ITreeSelection) viewer.getSelection(); MassifHeapTreeNode element = (MassifHeapTreeNode) selection.getFirstElement(); if (contentProvider.hasChildren(element)) { manager1.add(expandAction); manager1.add(collapseAction); } }); manager.setRemoveAllWhenShown(true); Menu contextMenu = manager.createContextMenu(viewer.getTree()); viewer.getControl().setMenu(contextMenu); } public IDoubleClickListener getDoubleClickListener() { return doubleClickListener; } public TreeViewer getViewer() { return viewer; } }