/******************************************************************************* * Copyright (c) 2017 Rogue Wave Software Inc. 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 * * Contributors: * Rogue Wave Software Inc. - initial implementation *******************************************************************************/ package org.eclipse.php.profile.ui.actions; import org.eclipse.jface.action.*; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.php.profile.core.data.ProfilerFileData; import org.eclipse.php.profile.core.data.ProfilerFunctionData; import org.eclipse.php.profile.ui.PHPProfileUIMessages; import org.eclipse.php.profile.ui.ProfilerUIConstants; import org.eclipse.php.profile.ui.ProfilerUIImages; import org.eclipse.php.profile.ui.ProfilerUiPlugin; import org.eclipse.php.profile.ui.dialogs.FiltersDialog; import org.eclipse.php.profile.ui.filters.ExecutionStatisticsFilter; import org.eclipse.php.profile.ui.filters.ExecutionStatisticsFiltersRegistry; import org.eclipse.php.profile.ui.preferences.PreferenceKeys; import org.eclipse.php.profile.ui.views.ExecutionStatisticsView; import org.eclipse.php.profile.ui.views.TreeElement; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.actions.ActionGroup; /** * Execution statistics action group. */ public class ExecutionStatisticsActionGroup extends ActionGroup { private static final String GROUP_KEY = "ExecutionStatisticsActionGroup.group"; //$NON-NLS-1$ ExecutionStatisticsView fView; private IPreferenceStore fStore; private CollapseAllAction fCollapseAllAction; private ExpandAllAction fExpandAllAction; private ShowAsPersentageAction fShowAsPercentageAction; private GroupByFileAction fGroupByFileAction; private GroupByClassAction fGroupByClassAction; private GroupByFunctionAction fGroupByFunctionAction; private OpenFunctionInvocationStatisticsAction fOpenFunctionInvocationStatisticsAction; private FilterAction fFilterAction; public ExecutionStatisticsActionGroup(ExecutionStatisticsView view) { fView = view; fStore = ProfilerUiPlugin.getDefault().getPreferenceStore(); fExpandAllAction = new ExpandAllAction(); fCollapseAllAction = new CollapseAllAction(); fShowAsPercentageAction = new ShowAsPersentageAction(); fGroupByFileAction = new GroupByFileAction(); fGroupByClassAction = new GroupByClassAction(); fGroupByFunctionAction = new GroupByFunctionAction(); fOpenFunctionInvocationStatisticsAction = new OpenFunctionInvocationStatisticsAction(fView); fFilterAction = new FilterAction(); } public void fillActionBars(IActionBars actionBars) { super.fillActionBars(actionBars); IToolBarManager toolbarManager = actionBars.getToolBarManager(); toolbarManager.add(fFilterAction); toolbarManager.add(new Separator()); toolbarManager.add(fExpandAllAction); toolbarManager.add(fCollapseAllAction); toolbarManager.add(new Separator()); toolbarManager.add(fShowAsPercentageAction); toolbarManager.add(new Separator(GROUP_KEY)); toolbarManager.appendToGroup(GROUP_KEY, fGroupByFileAction); toolbarManager.appendToGroup(GROUP_KEY, fGroupByClassAction); toolbarManager.appendToGroup(GROUP_KEY, fGroupByFunctionAction); toolbarManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); updateGroups(); } /* * (non-Javadoc) * * @see * org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface. * action.IMenuManager) */ public void fillContextMenu(IMenuManager menu) { ISelection selection = fView.getViewer().getSelection(); if (selection != null && selection instanceof IStructuredSelection) { TreeElement element = (TreeElement) ((IStructuredSelection) selection).getFirstElement(); Object data = element.getData(); if (data instanceof ProfilerFunctionData) { menu.add(fOpenFunctionInvocationStatisticsAction); } else if (data instanceof ProfilerFileData && ((ProfilerFileData) data).getCodeCoverageData() != null) { // menu.add(fOpenCodeCoverageViewAction); } } menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } private void updateGroups() { int groupBy = fStore.getInt(PreferenceKeys.EXECUTION_VIEW_GROUP_BY); fGroupByFileAction.setChecked(groupBy == ProfilerUIConstants.GROUP_BY_FILE); fGroupByClassAction.setChecked(groupBy == ProfilerUIConstants.GROUP_BY_CLASS); fGroupByFunctionAction.setChecked(groupBy == ProfilerUIConstants.GROUP_BY_FUNCTION); } class ShowAsPersentageAction extends Action { public ShowAsPersentageAction() { super(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_0"), AS_CHECK_BOX); //$NON-NLS-1$ setDescription(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_0")); //$NON-NLS-1$ setToolTipText(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_0")); //$NON-NLS-1$ setImageDescriptor(ProfilerUIImages.getImageDescriptor(ProfilerUIImages.IMG_ELCL_PERCENTAGE)); setChecked(fStore.getBoolean(PreferenceKeys.EXECUTION_VIEW_SHOW_AS_PERCENTAGE)); } public void run() { final TreeViewer viewer = fView.getViewer(); final boolean on = isChecked(); fStore.setValue(PreferenceKeys.EXECUTION_VIEW_SHOW_AS_PERCENTAGE, on); BusyIndicator.showWhile(viewer.getControl().getDisplay(), new Runnable() { public void run() { viewer.getControl().setRedraw(false); viewer.refresh(); viewer.getControl().setRedraw(true); } }); } } class CollapseAllAction extends Action { public CollapseAllAction() { super(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_1")); //$NON-NLS-1$ setDescription(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_1")); //$NON-NLS-1$ setToolTipText(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_1")); //$NON-NLS-1$ setImageDescriptor(ProfilerUIImages.getImageDescriptor(ProfilerUIImages.IMG_ELCL_COLLAPSE_ALL)); } public void run() { BusyIndicator.showWhile(fView.getViewer().getControl().getDisplay(), new Runnable() { public void run() { fView.getViewer().getControl().setRedraw(false); fView.getViewer().collapseAll(); fView.getViewer().getControl().setRedraw(true); fView.storeExpandedElements(); } }); } } class ExpandAllAction extends Action { public ExpandAllAction() { super(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_2")); //$NON-NLS-1$ setDescription(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_2")); //$NON-NLS-1$ setToolTipText(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_2")); //$NON-NLS-1$ setImageDescriptor(ProfilerUIImages.getImageDescriptor(ProfilerUIImages.IMG_ELCL_EXPAND_ALL)); } public void run() { BusyIndicator.showWhile(fView.getViewer().getControl().getDisplay(), new Runnable() { public void run() { fView.getViewer().getControl().setRedraw(false); fView.getViewer().expandAll(); fView.getViewer().getControl().setRedraw(true); fView.storeExpandedElements(); } }); } } class GroupByFileAction extends Action { public GroupByFileAction() { super(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_3"), AS_CHECK_BOX); //$NON-NLS-1$ setDescription(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_3")); //$NON-NLS-1$ setToolTipText(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_3")); //$NON-NLS-1$ setImageDescriptor(ProfilerUIImages.getImageDescriptor(ProfilerUIImages.IMG_ELCL_GROUP_BY_FILE)); } public void run() { if (isChecked()) { fStore.setValue(PreferenceKeys.EXECUTION_VIEW_GROUP_BY, ProfilerUIConstants.GROUP_BY_FILE); BusyIndicator.showWhile(fView.getViewer().getControl().getDisplay(), new Runnable() { public void run() { fView.getViewer().getControl().setRedraw(false); fView.getViewer().refresh(); fView.getViewer().getControl().setRedraw(true); fView.restoreExpandedElements(); } }); } updateGroups(); } } class GroupByFunctionAction extends Action { public GroupByFunctionAction() { super(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_4"), AS_CHECK_BOX); //$NON-NLS-1$ setDescription(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_4")); //$NON-NLS-1$ setToolTipText(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_4")); //$NON-NLS-1$ setImageDescriptor(ProfilerUIImages.getImageDescriptor(ProfilerUIImages.IMG_ELCL_GROUP_BY_FUNCTION)); } public void run() { if (isChecked()) { fStore.setValue(PreferenceKeys.EXECUTION_VIEW_GROUP_BY, ProfilerUIConstants.GROUP_BY_FUNCTION); BusyIndicator.showWhile(fView.getViewer().getControl().getDisplay(), new Runnable() { public void run() { fView.getViewer().getControl().setRedraw(false); fView.getViewer().refresh(); fView.getViewer().getControl().setRedraw(true); fView.restoreExpandedElements(); } }); } updateGroups(); } } class GroupByClassAction extends Action { public GroupByClassAction() { super(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_5"), AS_CHECK_BOX); //$NON-NLS-1$ setDescription(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_5")); //$NON-NLS-1$ setToolTipText(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_5")); //$NON-NLS-1$ setImageDescriptor(ProfilerUIImages.getImageDescriptor(ProfilerUIImages.IMG_ELCL_GROUP_BY_CLASS)); } public void run() { if (isChecked()) { fStore.setValue(PreferenceKeys.EXECUTION_VIEW_GROUP_BY, ProfilerUIConstants.GROUP_BY_CLASS); BusyIndicator.showWhile(fView.getViewer().getControl().getDisplay(), new Runnable() { public void run() { fView.getViewer().getControl().setRedraw(false); fView.getViewer().refresh(); fView.getViewer().getControl().setRedraw(true); fView.restoreExpandedElements(); } }); } updateGroups(); } } class FilterAction extends Action implements IMenuCreator { private Menu fMenu; private ExecutionStatisticsFilter[] fFilters; private IPreferenceStore fPreferenceStore; private ExecutionStatisticsFilter fNoFilter; public FilterAction() { super(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_6"), AS_DROP_DOWN_MENU); //$NON-NLS-1$ setDescription(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_6")); //$NON-NLS-1$ setToolTipText(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup_6")); //$NON-NLS-1$ setImageDescriptor(ProfilerUIImages.getImageDescriptor(ProfilerUIImages.IMG_ELCL_FILTER)); setMenuCreator(this); fPreferenceStore = ProfilerUiPlugin.getDefault().getPreferenceStore(); fFilters = ExecutionStatisticsFiltersRegistry.getFilters(); fNoFilter = new ExecutionStatisticsFilter(); fNoFilter.setName(""); //$NON-NLS-1$ } /* * (non-Javadoc) * * @see org.eclipse.jface.action.Action#run() */ public void run() { editFilters(); } /* * (non-Javadoc) * * @see org.eclipse.jface.action.IMenuCreator#dispose() */ public void dispose() { if (fMenu != null) { fMenu.dispose(); } } private void removeOldFilters() { ViewerFilter[] filters = fView.getViewer().getFilters(); for (int i = 0; i < filters.length; ++i) { if (filters[i] instanceof ExecutionStatisticsFilter) { fView.getViewer().removeFilter(filters[i]); } } } private void editFilters() { FiltersDialog dialog = new FiltersDialog(fView.getSite().getShell()); if (dialog.open() == Window.OK) { fFilters = dialog.getFilters(); } } /* * (non-Javadoc) * * @see * org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets * .Control) */ public Menu getMenu(Control parent) { if (fMenu != null) { fMenu.dispose(); } fMenu = new Menu(parent); ActionContributionItem item; for (int i = 0; i < FilterAction.this.fFilters.length; ++i) { item = new ActionContributionItem(new ApplyFilterAction(FilterAction.this.fFilters[i])); item.fill(fMenu, -1); } item = new ActionContributionItem(new ApplyFilterAction(fNoFilter, PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup.7"))); //$NON-NLS-1$ item.fill(fMenu, -1); new Separator().fill(fMenu, -1); item = new ActionContributionItem(new EditFiltersAction()); item.fill(fMenu, -1); return fMenu; } /* * (non-Javadoc) * * @see * org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets * .Menu) */ public Menu getMenu(Menu parent) { // TODO Auto-generated method stub return null; } class EditFiltersAction extends Action { public EditFiltersAction() { super(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup.0")); //$NON-NLS-1$ setDescription(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup.1")); //$NON-NLS-1$ setToolTipText(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup.2")); //$NON-NLS-1$ setImageDescriptor(ProfilerUIImages.getImageDescriptor(ProfilerUIImages.IMG_ELCL_FILTER)); } /* * (non-Javadoc) * * @see org.eclipse.jface.action.Action#run() */ public void run() { FilterAction.this.editFilters(); } } class ApplyFilterAction extends Action { private ExecutionStatisticsFilter fFilter; public ApplyFilterAction(ExecutionStatisticsFilter filter) { this(filter, filter.getName()); } public ApplyFilterAction(ExecutionStatisticsFilter filter, String filterName) { super(" " + filterName, AS_RADIO_BUTTON); //$NON-NLS-1$ //$NON-NLS-2$ setDescription(PHPProfileUIMessages.getString("ExecutionStatisticsActionGroup.5")); //$NON-NLS-1$ setToolTipText(filterName); fFilter = filter; if (fFilter.getName().equals(FilterAction.this.fPreferenceStore .getString(PreferenceKeys.EXECUTION_STATISTICS_SELECTED_FILTER))) { setChecked(true); } } public void run() { FilterAction.this.removeOldFilters(); if (fFilter.getName().length() > 0) { fView.getViewer().addFilter(fFilter); } FilterAction.this.fPreferenceStore.setValue(PreferenceKeys.EXECUTION_STATISTICS_SELECTED_FILTER, fFilter.getName()); } } } }