/*******************************************************************************
* Copyright (c) 2012-2015 INRIA.
* 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:
* Generoso Pagano - initial API and implementation
******************************************************************************/
/**
*
*/
package fr.inria.soctrace.framesoc.ui.perspective;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import fr.inria.soctrace.framesoc.ui.perspective.FramesocPartContributionManager.PartContributionDescriptor;
/**
* Dynamically creates the Traces view context menu items related to the Framesoc part contribution
* extension point.
*
* <p>
* For each contribution, a menu entry is created. Menu entries are sorted by position and, within
* each position, by priority. Position and priority corresponds to the fields of the Framesoc part
* extension point.
*
* @author "Generoso Pagano <generoso.pagano@inria.fr>"
*/
public class FramesocPartContributionItem extends CompoundContributionItem {
@Override
protected IContributionItem[] getContributionItems() {
List<PartContributionDescriptor> parts = FramesocPartContributionManager.getInstance()
.getPartContributionDescriptors();
// position -> list of descriptor
Map<String, List<PartContributionDescriptor>> sortedIds = new HashMap<String, List<PartContributionDescriptor>>();
for (PartContributionDescriptor des : parts) {
if (!sortedIds.containsKey(des.position)) {
sortedIds.put(des.position, new ArrayList<PartContributionDescriptor>());
}
sortedIds.get(des.position).add(des);
}
int i = 0;
IContributionItem[] list = new IContributionItem[parts.size()];
if (sortedIds.containsKey(FramesocPerspective.TOP_RIGHT)) {
sortDescriptors(sortedIds.get(FramesocPerspective.TOP_RIGHT));
for (PartContributionDescriptor des : sortedIds.get(FramesocPerspective.TOP_RIGHT)) {
CommandContributionItemParameter param = new CommandContributionItemParameter(
PlatformUI.getWorkbench(), null, des.commandId,
CommandContributionItem.STYLE_PUSH);
param.icon = des.icon;
list[i++] = new CommandContributionItem(param);
}
}
if (sortedIds.containsKey(FramesocPerspective.BOTTOM_RIGHT)) {
sortDescriptors(sortedIds.get(FramesocPerspective.BOTTOM_RIGHT));
for (PartContributionDescriptor des : sortedIds.get(FramesocPerspective.BOTTOM_RIGHT)) {
CommandContributionItemParameter param = new CommandContributionItemParameter(
PlatformUI.getWorkbench(), null, des.commandId,
CommandContributionItem.STYLE_PUSH);
param.icon = des.icon;
list[i++] = new CommandContributionItem(param);
}
}
return list;
}
private void sortDescriptors(List<PartContributionDescriptor> list) {
Collections.sort(list, new Comparator<PartContributionDescriptor>() {
@Override
public int compare(PartContributionDescriptor arg0, PartContributionDescriptor arg1) {
return Integer.compare(arg0.priority, arg1.priority);
}
});
}
}