blob: e05600ac56e3829ae3069551dbb64c7726ab3fbf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Christian Pontesegger and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Christian Pontesegger - initial API and implementation
*******************************************************************************/
package org.eclipse.ease.ui.modules.ui;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.ease.modules.ModuleDefinition;
import org.eclipse.ease.service.IScriptService;
import org.eclipse.ease.ui.Activator;
import org.eclipse.ease.ui.preferences.IPreferenceConstants;
import org.eclipse.ease.ui.tools.AbstractPopupItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.menus.IWorkbenchContribution;
import org.eclipse.ui.services.IServiceLocator;
import org.osgi.service.prefs.Preferences;
public final class ModuleContributionFactory extends CompoundContributionItem implements IWorkbenchContribution {
private IServiceLocator fServiceLocator;
@Override
public void initialize(final IServiceLocator serviceLocator) {
fServiceLocator = serviceLocator;
}
@Override
protected IContributionItem[] getContributionItems() {
final List<IContributionItem> contributions = new ArrayList<>();
final IScriptService scriptService = PlatformUI.getWorkbench().getService(IScriptService.class);
final Collection<ModuleDefinition> modules = scriptService.getAvailableModules();
// read preferences for tree/list layout
final Preferences prefs = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID).node(IPreferenceConstants.NODE_SHELL);
final boolean flatMode = prefs.getBoolean(IPreferenceConstants.SHELL_MODULES_AS_LIST, IPreferenceConstants.DEFAULT_SHELL_MODULES_AS_LIST);
// create root menu (only used as a container while populating)
final HashMap<IPath, ModulePopupMenu> moduleTree = new HashMap<>();
ModulePopupMenu menu = new ModulePopupMenu("");
moduleTree.put(new Path("/"), menu);
for (final ModuleDefinition definition : modules) {
if (definition.isVisible()) {
if (!flatMode) {
// find correct menu for tree layout
final IPath path = definition.getPath();
if (!moduleTree.containsKey(path.removeLastSegments(1)))
createPath(moduleTree, path.removeLastSegments(1));
menu = moduleTree.get(path.removeLastSegments(1));
}
menu.addEntry(new ModulePopupItem(definition));
}
}
// sort all menus
for (final ModulePopupMenu popupMenu : moduleTree.values())
popupMenu.sortEntries();
// populate root contributions
final ModulePopupMenu root = moduleTree.get(new Path("/"));
for (final AbstractPopupItem item : root.getEntries())
contributions.add(item.getContribution(fServiceLocator));
return contributions.toArray(new IContributionItem[contributions.size()]);
}
@Override
public boolean isDirty() {
return true;
}
private static ModulePopupMenu createPath(final Map<IPath, ModulePopupMenu> moduleTree, final IPath path) {
if (!moduleTree.containsKey(path)) {
final ModulePopupMenu parentMenu = createPath(moduleTree, path.removeLastSegments(1));
final ModulePopupMenu menu = new ModulePopupMenu(path.lastSegment());
parentMenu.addEntry(menu);
moduleTree.put(path, menu);
return menu;
}
return moduleTree.get(path);
}
}