blob: 9c75b1a37feedc4612b0e0e8aa466dde756e8b58 [file] [log] [blame]
package org.eclipse.scout.sdk.ui.internal.extensions;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.scout.sdk.ui.action.IScoutHandler;
import org.eclipse.scout.sdk.ui.extensions.IContextMenuContributor;
import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
import org.eclipse.scout.sdk.ui.view.outline.pages.IPage;
public class ContextMenuContributorExtensionPoint {
private final static Object contextMenuExtensionsCacheLock = new Object();
private static List<IScoutHandler> contextMenuExtensions;
private final static Object contextMenuContributorExtensionsCacheLock = new Object();
private static MenuContributionInfo[] contextMenuContributorExtensions;
private static Map<IScoutHandler.Category, ArrayList<IScoutHandler>> contextMenuByCat;
private static class MenuContributionInfo {
private IContextMenuContributor contributor;
private Class<? extends IPage> pageClassFilter;
public MenuContributionInfo(IContextMenuContributor c, Class<? extends IPage> p) {
contributor = c;
pageClassFilter = p;
}
}
interface IExtensionVisitor {
boolean visit(IConfigurationElement element);
}
public static IContextMenuContributor[] getContextMenuContributors(IPage page) {
ArrayList<IContextMenuContributor> ret = new ArrayList<IContextMenuContributor>();
for (MenuContributionInfo i : getContributors()) {
if (page == null || i.pageClassFilter == null || i.pageClassFilter.isAssignableFrom(page.getClass())) {
ret.add(i.contributor);
}
}
return ret.toArray(new IContextMenuContributor[ret.size()]);
}
private static MenuContributionInfo[] getContributors() {
if (contextMenuContributorExtensions == null) {
synchronized (contextMenuContributorExtensionsCacheLock) {
if (contextMenuContributorExtensions == null) {
final ArrayList<MenuContributionInfo> list = new ArrayList<MenuContributionInfo>();
visitExtensions("contextMenuContributor", "contributor", new IExtensionVisitor() {
@SuppressWarnings("unchecked")
@Override
public boolean visit(IConfigurationElement element) {
try {
String pageClassName = element.getAttribute("page");
IContextMenuContributor ext = (IContextMenuContributor) element.createExecutableExtension("class");
Class<? extends IPage> clazz = null;
if (pageClassName != null) {
clazz = (Class<? extends IPage>) Class.forName(pageClassName.trim());
}
MenuContributionInfo info = new MenuContributionInfo(ext, clazz);
list.add(info);
}
catch (Throwable t) {
ScoutSdkUi.logError("create context menu contributor: " + element.getAttribute("class"), t);
}
return true;
}
});
contextMenuContributorExtensions = list.toArray(new MenuContributionInfo[list.size()]);
}
}
}
return contextMenuContributorExtensions;
}
public static void visitExtensions(String extensionPointName, String elementName, IExtensionVisitor v) {
IExtensionRegistry reg = Platform.getExtensionRegistry();
IExtensionPoint xp = reg.getExtensionPoint(ScoutSdkUi.PLUGIN_ID, extensionPointName);
IExtension[] extensions = xp.getExtensions();
for (IExtension extension : extensions) {
IConfigurationElement[] elements = extension.getConfigurationElements();
for (IConfigurationElement element : elements) {
if (elementName.equals(element.getName())) {
if (!v.visit(element)) {
return; // cancel when requested
}
}
}
}
}
public static IScoutHandler[] getAllRegisteredContextMenus() {
if (contextMenuExtensions == null) {
synchronized (contextMenuExtensionsCacheLock) {
if (contextMenuExtensions == null) {
final ArrayList<IScoutHandler> list = new ArrayList<IScoutHandler>();
visitExtensions("contextMenu", "contextMenu", new IExtensionVisitor() {
@Override
public boolean visit(IConfigurationElement element) {
try {
IScoutHandler ext = (IScoutHandler) element.createExecutableExtension("class");
list.add(ext);
}
catch (Throwable t) {
ScoutSdkUi.logError("create context menu: " + element.getAttribute("class"), t);
}
return true;
}
});
contextMenuExtensions = list;
}
}
}
return contextMenuExtensions.toArray(new IScoutHandler[contextMenuExtensions.size()]);
}
public static Map<IScoutHandler.Category, ArrayList<IScoutHandler>> getAllRegisteredContextMenusByCategory() {
if (contextMenuByCat == null) {
synchronized (contextMenuExtensionsCacheLock) {
if (contextMenuByCat == null) {
TreeMap<IScoutHandler.Category, ArrayList<IScoutHandler>> sorted =
new TreeMap<IScoutHandler.Category, ArrayList<IScoutHandler>>(new Comparator<IScoutHandler.Category>() {
@Override
public int compare(IScoutHandler.Category o1, IScoutHandler.Category o2) {
return Integer.valueOf(o1.getOrder()).compareTo(o2.getOrder());
}
});
// group and sort all actions by category
for (IScoutHandler a : getAllRegisteredContextMenus()) {
ArrayList<IScoutHandler> listOfCurCat = sorted.get(a.getCategory());
if (listOfCurCat == null) {
listOfCurCat = new ArrayList<IScoutHandler>();
sorted.put(a.getCategory(), listOfCurCat);
}
listOfCurCat.add(a);
}
contextMenuByCat = sorted;
}
}
}
return contextMenuByCat;
}
}