blob: cd6d781d9b46fb3cb87e09626530a2612fb0848c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2019 IBM Corporation and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - Jeff Briggs, Henry Hughes, Ryan Morse
*******************************************************************************/
package org.eclipse.linuxtools.internal.systemtap.ui.ide.views;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.Localization;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.actions.BrowserViewAction;
import org.eclipse.linuxtools.systemtap.structures.TreeNode;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.handlers.CollapseAllHandler;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.part.ViewPart;
/**
* The parent class of the Kernel Source browser, and grandparent of the Tapset browsers.
* Contains code common to all three of those classes.
* @author Ryan Morse
* @see org.eclipse.linuxtools.internal.systemtap.ui.ide.views.KernelBrowserView
* @see org.eclipse.linuxtools.internal.systemtap.ui.ide.views.FunctionBrowserView
* @see org.eclipse.linuxtools.internal.systemtap.ui.ide.views.ProbeAliasBrowserView
*/
public abstract class BrowserView extends ViewPart {
protected TreeViewer viewer;
protected BrowserViewAction doubleClickAction;
private CollapseAllHandler collapseHandler;
private RefreshHandler refreshHandler;
/**
* Provides an interface for the TreeViewer to interact with the internal TreeNode data structure.
* @author Ryan Morse
*
*/
static class ViewContentProvider implements ITreeContentProvider {
@Override
public void inputChanged(Viewer v, Object oldInput, Object newInput) {}
@Override
public void dispose() {}
@Override
public Object[] getElements(Object parent) {
return getChildren(parent);
}
@Override
public Object getParent(Object child) {
return null;
}
@Override
public Object[] getChildren(Object par) {
TreeNode parent = ((TreeNode)par);
Object[] children = new Object[parent.getChildCount()];
for(int i=0; i<children.length; i++) {
children[i] = parent.getChildAt(i);
}
return children;
}
@Override
public boolean hasChildren(Object parent) {
return ((TreeNode)parent).getChildCount() > 0;
}
}
protected abstract Image getEntryImage(TreeNode treeObj);
/**
* Provides the icon and text for each entry in the tapset tree.
* @author Ryan Morse
*/
protected class ViewLabelProvider extends LabelProvider {
@Override
public String getText(Object obj) {
return obj.toString();
}
@Override
public Image getImage(Object obj) {
TreeNode treeObj = (TreeNode) obj;
if (treeObj.toString().equals(Localization.getString("BrowserView.Loading")) //$NON-NLS-1$
|| treeObj.toString().equals(Localization.getString("BrowserView.TryRefresh"))) { //$NON-NLS-1$
return null;
}
return getEntryImage(treeObj);
}
}
@Override
public void createPartControl(Composite parent) {
PatternFilter filter = new PatternFilter();
FilteredTree filteredTree = new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, filter, true,
true);
viewer = filteredTree.getViewer();
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
IHandlerService handlerService = getSite().getService(IHandlerService.class);
collapseHandler = new CollapseAllHandler(getViewer());
handlerService.activateHandler(CollapseAllHandler.COMMAND_ID, collapseHandler);
refreshHandler = new RefreshHandler();
handlerService.activateHandler(RefreshHandler.COMMAND_ID, refreshHandler);
}
/**
* Wires up all of the actions for this browser, such as double and right click handlers.
*/
abstract void makeActions();
protected void registerContextMenu(String menuName) {
Control control = this.viewer.getControl();
MenuManager manager = new MenuManager(menuName);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
Menu menu = manager.createContextMenu(control);
viewer.getControl().setMenu(menu);
IWorkbenchPartSite partSite = getSite();
partSite.registerContextMenu(manager, viewer);
partSite.setSelectionProvider(viewer);
}
public TreeViewer getViewer() {
return viewer;
}
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
@Override
public void dispose() {
super.dispose();
if (collapseHandler != null) {
collapseHandler.dispose();
collapseHandler = null;
}
if (refreshHandler != null) {
refreshHandler.dispose();
refreshHandler = null;
}
if (viewer != null) {
if (doubleClickAction != null) {
viewer.removeDoubleClickListener(doubleClickAction);
}
viewer = null;
}
if (doubleClickAction != null) {
doubleClickAction.dispose();
doubleClickAction = null;
}
}
abstract void refresh();
protected void displayLoadingMessage() {
displayMessage(Localization.getString("BrowserView.Loading")); //$NON-NLS-1$
}
protected void displayMessage(String message) {
TreeNode tree = new TreeNode(null, false);
tree.add(new TreeNode(message, false));
setViewerInput(tree);
}
protected void setViewerInput(final Object input) {
if (viewer != null) {
viewer.getControl().getDisplay().asyncExec(() -> viewer.setInput(input));
}
}
protected void setRefreshable(boolean state) {
if (refreshHandler != null) {
refreshHandler.setActive(state);
}
}
}