/******************************************************************************* * Copyright (c) 2008, 2009 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: * Kent Sebastian <ksebasti@redhat.com> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.oprofile.ui.view; import java.lang.reflect.InvocationTargetException; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.linuxtools.internal.oprofile.core.model.OpModelRoot; import org.eclipse.linuxtools.internal.oprofile.ui.OprofileUiMessages; import org.eclipse.linuxtools.internal.oprofile.ui.OprofileUiPlugin; import org.eclipse.linuxtools.oprofile.ui.model.UiModelRoot; import org.eclipse.linuxtools.oprofile.ui.model.UiModelSession; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; /** * The view for the OProfile plugin. Shows the elements gathered by the data model * in a tree viewer, parsed by the ui model (in the model package). The hierarchy * (as it is displayed) looks like: * * UiModelRoot (not shown in the view) * \_ UiModelEvent * \_ ... * \_ UiModelEvent * \_ UiModelSession * \_ ... * \_ UiModelSession * \_ UiModelImage * | \_ UiModelSymbol * | \_ ... * | \_ UiModelSymbol * | \_ UiModelSample * | \_ ... * | \_ UiModelSample * \_ UiModelDependent * \_ UiModelImage * | \_ ... (see above) * \_ ... * * The refreshView() function takes care of launching the data model parsing and * ui model parsing in a separate thread. */ public class OprofileView extends ViewPart implements ISelectionChangedListener { private TreeViewer viewer; private IAction deleteSessionAction; private IAction saveDefaultSessionAction; @Override public void createPartControl(Composite parent) { createTreeViewer(parent); createActionMenu(); OprofileUiPlugin.getDefault().setOprofileView(this); } private void createTreeViewer(Composite parent) { viewer = new TreeViewer(parent, SWT.SINGLE); viewer.setContentProvider(new OprofileViewContentProvider()); viewer.setLabelProvider(new OprofileViewLabelProvider()); viewer.addDoubleClickListener(new OprofileViewDoubleClickListener()); viewer.addSelectionChangedListener(this); } private void createActionMenu() { IMenuManager manager = getViewSite().getActionBars().getMenuManager(); manager.add(new OprofileViewLogReaderAction()); manager.add(new OprofileViewRefreshAction()); saveDefaultSessionAction = new OprofileViewSaveDefaultSessionAction(); manager.add(saveDefaultSessionAction); deleteSessionAction = new OprofileViewDeleteSessionAction(getTreeViewer()); manager.add(deleteSessionAction); MenuManager sortMenu = new MenuManager( OprofileUiMessages.getString("view.menu.sortby.label")); //$NON-NLS-1$ for (UiModelRoot.SortType s : UiModelRoot.SortType.values()) { sortMenu.add(new OprofileViewSortAction(s, OprofileViewSortAction.sortTypeMap.get(s))); } manager.add(sortMenu); } private TreeViewer getTreeViewer() { return viewer; } /** * Extremely convoluted way of getting the running and parsing to happen in * a separate thread, with a progress monitor. In most cases and on fast * machines this will probably only be a blip. */ public void refreshView() { try { PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(OprofileUiPlugin.ID_OPROFILE_VIEW); } catch (PartInitException e) { e.printStackTrace(); } IRunnableWithProgress refreshRunner = monitor -> { monitor.beginTask(OprofileUiMessages.getString("view.dialog.parsing.text"), 2); //$NON-NLS-1$ OpModelRoot dataModelRoot = OpModelRoot.getDefault(); dataModelRoot.refreshModel(); monitor.worked(1); final UiModelRoot UiRoot = UiModelRoot.getDefault(); UiRoot.refreshModel(); Display.getDefault().asyncExec(() -> OprofileUiPlugin.getDefault().getOprofileView().getTreeViewer().setInput(UiRoot)); monitor.worked(1); monitor.done(); }; ProgressMonitorDialog dialog = new ProgressMonitorDialog(null); try { dialog.run(true, false, refreshRunner); } catch (InvocationTargetException|InterruptedException e) { e.printStackTrace(); } } @Override public void selectionChanged(SelectionChangedEvent event) { TreeSelection tsl = (TreeSelection) viewer.getSelection(); if (tsl.getFirstElement() instanceof UiModelSession) { if (!deleteSessionAction.isEnabled()) { deleteSessionAction.setEnabled(true); } if (((UiModelSession) tsl.getFirstElement()).isDefaultSession()) { if (!saveDefaultSessionAction.isEnabled()) { saveDefaultSessionAction.setEnabled(true); } } } else { deleteSessionAction.setEnabled(false); saveDefaultSessionAction.setEnabled(false); } } @Override public void setFocus() { // TODO Auto-generated method stub } @Override public void dispose() { super.dispose(); viewer.removeSelectionChangedListener(this); } }