blob: 5290c73ff2cd23d58d178f6773c6b078e1c53c82 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2017 Ericsson, École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Patrick Tasse - Initial API and implementation
* Geneviève Bastien - Moved SelectTraceTypeContributionItem to this class
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.ui.project.handlers;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
/**
* ContributionItem for the element type selection.
*
* @author Patrick Tassé
*/
public class SelectElementTypeContributionItem extends CompoundContributionItem {
private final static class ItemComparator implements Comparator<IContributionItem> {
@Override
public int compare(IContributionItem o1, IContributionItem o2) {
if (o1 instanceof MenuManager) {
if (o2 instanceof MenuManager) {
MenuManager m1 = (MenuManager) o1;
MenuManager m2 = (MenuManager) o2;
return m1.getMenuText().compareTo(m2.getMenuText());
}
return -1;
}
if (o2 instanceof MenuManager) {
return 1;
}
CommandContributionItem c1 = (CommandContributionItem) o1;
CommandContributionItem c2 = (CommandContributionItem) o2;
return c1.getData().label.compareTo(c2.getData().label);
}
}
private static final Comparator<IContributionItem> ITEM_COMPARATOR = new ItemComparator();
private static final ImageDescriptor SELECTED_ICON = Activator.getDefault().getImageDescripterFromPath("icons/elcl16/bullet.gif"); //$NON-NLS-1$
private static final String TYPE_PARAMETER = "org.eclipse.linuxtools.tmf.ui.commandparameter.select_trace_type.type"; //$NON-NLS-1$
private static final String SELECT_TRACE_TYPE_COMMAND_ID = "org.eclipse.linuxtools.tmf.ui.command.select_trace_type"; //$NON-NLS-1$
@Override
protected IContributionItem[] getContributionItems() {
/*
* Fill the selected trace types and verify if selection applies only to
* either traces or experiments
*/
Set<String> selectedTraceTypes = new HashSet<>();
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
ISelection selection = page.getSelection();
boolean forTraces = false, forExperiments = false;
if (selection instanceof StructuredSelection) {
for (Object element : ((StructuredSelection) selection).toList()) {
if (element instanceof TmfTraceElement) {
TmfTraceElement trace = (TmfTraceElement) element;
selectedTraceTypes.add(trace.getTraceType());
forTraces = true;
} else if (element instanceof TmfExperimentElement) {
TmfExperimentElement exp = (TmfExperimentElement) element;
selectedTraceTypes.add(exp.getTraceType());
forExperiments = true;
}
}
}
if (forTraces && forExperiments) {
/* This should never happen anyways */
throw new RuntimeException("You must select only experiments or only traces to set the element type"); //$NON-NLS-1$
}
return getContributionItems(selectedTraceTypes, forExperiments);
}
/**
* Get the contribution items for traces
*
* @param selectedTraceTypes
* The set of selected trace types
* @param forExperiments
* <code>true</code> if the contribution items are requested for
* experiments, <code>false</code> for traces
*
* @return The list of contribution items
*/
protected IContributionItem[] getContributionItems(Set<String> selectedTraceTypes, boolean forExperiments) {
List<IContributionItem> list = new LinkedList<>();
Map<String, MenuManager> categoriesMap = new HashMap<>();
TmfTraceType.getTraceTypeHelpers().forEach(traceTypeHelper -> {
String traceTypeId = traceTypeHelper.getTraceTypeId();
boolean selected = selectedTraceTypes.contains(traceTypeId);
if (traceTypeHelper.isEnabled() || selected) {
if (forExperiments == traceTypeHelper.isExperimentType()) {
String categoryName = traceTypeHelper.getCategoryName().replaceAll("&", "&&"); //$NON-NLS-1$ //$NON-NLS-2$
MenuManager subMenu = null;
if (!categoryName.isEmpty()) {
subMenu = categoriesMap.get(categoryName);
if (subMenu == null) {
subMenu = new MenuManager(categoryName);
categoriesMap.put(categoryName, subMenu);
list.add(subMenu);
}
}
String label = traceTypeHelper.getName().replaceAll("&", "&&"); //$NON-NLS-1$ //$NON-NLS-2$
if (selected && subMenu != null) {
subMenu.setImageDescriptor(SELECTED_ICON);
}
addContributionItem(list, traceTypeId, label, selected, subMenu);
}
}
});
Collections.sort(list, ITEM_COMPARATOR);
return list.toArray(new IContributionItem[list.size()]);
}
/**
* Returns the command id to use for contribution items
*
* @return the command id
*/
protected String getContributionItemCommandId() {
return SELECT_TRACE_TYPE_COMMAND_ID;
}
private void addContributionItem(List<IContributionItem> list,
String traceTypeId, String label, boolean selected, MenuManager subMenu) {
Map<String, String> params = new HashMap<>();
params.put(TYPE_PARAMETER, traceTypeId);
ImageDescriptor icon = null;
if (selected) {
icon = SELECTED_ICON;
}
CommandContributionItemParameter param = new CommandContributionItemParameter(
PlatformUI.getWorkbench().getActiveWorkbenchWindow(), // serviceLocator
"my.parameterid", // id //$NON-NLS-1$
getContributionItemCommandId(), // commandId
CommandContributionItem.STYLE_PUSH // style
);
param.parameters = params;
param.icon = icon;
param.disabledIcon = icon;
param.hoverIcon = icon;
param.label = label;
param.visibleEnabled = true;
if (subMenu != null) {
CommandContributionItem item = new CommandContributionItem(param);
int i = Collections.binarySearch(Arrays.asList(subMenu.getItems()), item, ITEM_COMPARATOR);
i = (i >= 0) ? i : -i - 1;
subMenu.insert(i, item);
} else {
list.add(new CommandContributionItem(param));
}
}
}