blob: 93501c38a47e4acbb0c7c8442deb3b946849d971 [file] [log] [blame]
/*
* Copyright (c) 2014, 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.oomph.setup.presentation;
import org.eclipse.oomph.base.Annotation;
import org.eclipse.oomph.base.provider.BaseEditUtil.IconReflectiveItemProvider;
import org.eclipse.oomph.base.util.EAnnotations;
import org.eclipse.oomph.setup.CompoundTask;
import org.eclipse.oomph.setup.InstallationTask;
import org.eclipse.oomph.setup.Project;
import org.eclipse.oomph.setup.RedirectionTask;
import org.eclipse.oomph.setup.Scope;
import org.eclipse.oomph.setup.SetupPackage;
import org.eclipse.oomph.setup.SetupTask;
import org.eclipse.oomph.setup.VariableTask;
import org.eclipse.oomph.setup.WorkspaceTask;
import org.eclipse.oomph.setup.impl.DynamicSetupTaskImpl;
import org.eclipse.oomph.setup.internal.core.SetupTaskPerformer;
import org.eclipse.oomph.setup.ui.SetupEditorSupport;
import org.eclipse.oomph.ui.UIUtil;
import org.eclipse.oomph.workingsets.WorkingSet;
import org.eclipse.oomph.workingsets.WorkingSetsPackage;
import org.eclipse.oomph.workingsets.presentation.WorkingSetsActionBarContributor.PreviewDialog;
import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.provider.ReflectiveItemProvider;
import org.eclipse.emf.edit.ui.action.ControlAction;
import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
import org.eclipse.emf.edit.ui.action.LoadResourceAction;
import org.eclipse.emf.edit.ui.action.ValidateAction;
import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.SubContributionItem;
import org.eclipse.jface.bindings.Binding;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.keys.IBindingService;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* This is the action bar contributor for the Setup model editor.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public class SetupActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener
{
private static final String ENABLEMENT_ITEM_PREFIX = EnablementAction.class.getName() + "-";
private static final Comparator<? super IAction> ACTION_COMPARATOR = new Comparator<IAction>()
{
public int compare(IAction a1, IAction a2)
{
return a1.getText().compareTo(a2.getText());
}
};
/**
* This keeps track of the active editor.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected IEditorPart activeEditorPart;
/**
* This keeps track of the current selection provider.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected ISelectionProvider selectionProvider;
/**
* This action opens the Properties view.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected IAction showPropertiesViewAction = new Action(SetupEditorPlugin.INSTANCE.getString("_UI_ShowPropertiesView_menu_item"))
{
@Override
public void run()
{
try
{
getPage().showView("org.eclipse.ui.views.PropertySheet");
}
catch (PartInitException exception)
{
SetupEditorPlugin.INSTANCE.log(exception);
}
}
};
/**
* This action refreshes the viewer of the current editor if the editor
* implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected IAction refreshViewerAction = new Action(SetupEditorPlugin.INSTANCE.getString("_UI_RefreshViewer_menu_item"))
{
@Override
public boolean isEnabled()
{
return activeEditorPart instanceof IViewerProvider;
}
@Override
public void run()
{
if (activeEditorPart instanceof IViewerProvider)
{
Viewer viewer = ((IViewerProvider)activeEditorPart).getViewer();
if (viewer != null)
{
viewer.refresh();
}
}
}
};
/**
* This will contain one {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to each descriptor
* generated for the current selection by the item provider.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected Collection<IAction> createChildActions;
/**
* This is the menu manager into which menu contribution items should be added for CreateChild actions.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected IMenuManager createChildMenuManager;
/**
* This will contain one {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding to each descriptor
* generated for the current selection by the item provider.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected Collection<IAction> createSiblingActions;
/**
* This is the menu manager into which menu contribution items should be added for CreateSibling actions.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected IMenuManager createSiblingMenuManager;
private final ToggleViewerInputAction toggleViewerInputAction = new ToggleViewerInputAction();
private final PreferenceRecorderToolbarAction recordPreferencesAction = new PreferenceRecorderToolbarAction(true);
private final CommandTableAction commandTableAction = new CommandTableAction();
private final EditorTableAction editorTableAction = new EditorTableAction();
@SuppressWarnings("unused")
private final TestInstallAction testInstallAction = new TestInstallAction();
private final OpenInSetupEditorAction openInSetupEditorAction = new OpenInSetupEditorAction();
private final OpenInTextEditorAction openInTextEditorAction = new OpenInTextEditorAction();
private RevertAction revertAction;
private int lastSubMenuID;
/**
* This creates an instance of the contributor.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public SetupActionBarContributor()
{
super(ADDITIONS_LAST_STYLE);
loadResourceAction = new LoadResourceAction();
validateAction = new ValidateAction();
liveValidationAction = new DiagnosticDecorator.LiveValidator.LiveValidationAction(SetupEditorPlugin.getPlugin().getDialogSettings());
controlAction = new ControlAction();
}
public final ToggleViewerInputAction getToggleViewerInputAction()
{
return toggleViewerInputAction;
}
@Override
public void init(IActionBars actionBars)
{
super.init(actionBars);
revertAction = new RevertAction();
actionBars.setGlobalActionHandler(ActionFactory.REVERT.getId(), revertAction);
}
public void scheduleValidation()
{
liveValidationAction.run();
}
/**
* This adds Separators for editor additions to the tool bar.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public void contributeToToolBar(IToolBarManager toolBarManager)
{
toolBarManager.add(new Separator("setup-settings"));
toolBarManager.add(recordPreferencesAction);
toolBarManager.add(commandTableAction);
toolBarManager.add(editorTableAction);
// toolBarManager.add(testInstallAction);
toolBarManager.add(toggleViewerInputAction);
toolBarManager.add(new Separator("setup-additions"));
}
/**
* This adds to the menu bar a menu and some separators for editor additions,
* as well as the sub-menus for object creation items.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void contributeToMenu(IMenuManager menuManager)
{
super.contributeToMenu(menuManager);
IMenuManager submenuManager = new MenuManager(SetupEditorPlugin.INSTANCE.getString("_UI_SetupEditor_menu"), "org.eclipse.oomph.setupMenuID");
menuManager.insertAfter("additions", submenuManager);
submenuManager.add(new Separator("settings"));
submenuManager.add(new Separator("actions"));
submenuManager.add(new Separator("additions"));
submenuManager.add(new Separator("additions-end"));
// Prepare for CreateChild item addition or removal.
//
createChildMenuManager = new MenuManager(SetupEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
submenuManager.insertBefore("additions", createChildMenuManager);
// Prepare for CreateSibling item addition or removal.
//
createSiblingMenuManager = new MenuManager(SetupEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
submenuManager.insertBefore("additions", createSiblingMenuManager);
// Force an update because Eclipse hides empty menus now.
//
submenuManager.addMenuListener(new IMenuListener()
{
public void menuAboutToShow(IMenuManager menuManager)
{
menuManager.updateAll(true);
}
});
addGlobalActions(submenuManager);
}
/**
* When the active editor changes, this remembers the change and registers with it as a selection provider.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public void setActiveEditor(IEditorPart part)
{
super.setActiveEditor(part);
activeEditorPart = part;
toggleViewerInputAction.setActiveWorkbenchPart(part);
commandTableAction.setActivePart(part);
editorTableAction.setActivePart(part);
revertAction.setActiveWorkbenchPart(part);
openInSetupEditorAction.setActiveWorkbenchPart(part);
openInTextEditorAction.setActiveWorkbenchPart(part);
// Switch to the new selection provider.
//
if (selectionProvider != null)
{
selectionProvider.removeSelectionChangedListener(this);
}
if (part == null)
{
selectionProvider = null;
}
else
{
selectionProvider = part.getSite().getSelectionProvider();
selectionProvider.addSelectionChangedListener(this);
// Fake a selection changed event to update the menus.
//
if (selectionProvider.getSelection() != null)
{
selectionChanged(new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection()));
}
}
}
/**
* This implements {@link org.eclipse.jface.viewers.ISelectionChangedListener},
* handling {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for the children and siblings
* that can be added to the selected object and updating the menus accordingly.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void selectionChangedGen(SelectionChangedEvent event)
{
// Remove any menu items for old selection.
//
if (createChildMenuManager != null)
{
depopulateManager(createChildMenuManager, createChildActions);
}
if (createSiblingMenuManager != null)
{
depopulateManager(createSiblingMenuManager, createSiblingActions);
}
// Query the new selection for appropriate new child/sibling descriptors
//
Collection<?> newChildDescriptors = null;
Collection<?> newSiblingDescriptors = null;
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection && ((IStructuredSelection)selection).size() == 1)
{
Object object = ((IStructuredSelection)selection).getFirstElement();
EditingDomain domain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain();
newChildDescriptors = domain.getNewChildDescriptors(object, null);
newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
}
// Generate actions for selection; populate and redraw the menus.
//
createChildActions = generateCreateChildActions(newChildDescriptors, selection);
createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);
if (createChildMenuManager != null)
{
populateManager(createChildMenuManager, createChildActions, null);
createChildMenuManager.update(true);
}
if (createSiblingMenuManager != null)
{
populateManager(createSiblingMenuManager, createSiblingActions, null);
createSiblingMenuManager.update(true);
}
}
public void selectionChanged(SelectionChangedEvent event)
{
selectionChangedGen(event);
// recordPreferencesAction.selectionChanged(event);
openInSetupEditorAction.selectionChanged(event);
openInTextEditorAction.selectionChanged(event);
// testInstallAction.selectionChanged(event);
}
/**
* This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} for each object in <code>descriptors</code>,
* and returns the collection of these actions.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected Collection<IAction> generateCreateChildActionsGen(Collection<?> descriptors, ISelection selection)
{
Collection<IAction> actions = new ArrayList<IAction>();
if (descriptors != null)
{
for (Object descriptor : descriptors)
{
actions.add(new CreateChildAction(activeEditorPart, selection, descriptor));
}
}
return actions;
}
protected Collection<IAction> generateCreateChildActions(Collection<?> descriptors, ISelection selection)
{
Collection<IAction> actions = generateCreateChildActionsGen(descriptors, selection);
return addEnablementActions(descriptors, selection, false, actions);
}
/**
* This generates a {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each object in <code>descriptors</code>,
* and returns the collection of these actions.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected Collection<IAction> generateCreateSiblingActionsGen(Collection<?> descriptors, ISelection selection)
{
Collection<IAction> actions = new ArrayList<IAction>();
if (descriptors != null)
{
for (Object descriptor : descriptors)
{
actions.add(new CreateSiblingAction(activeEditorPart, selection, descriptor));
}
}
return actions;
}
protected Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection)
{
Collection<IAction> actions = generateCreateSiblingActionsGen(descriptors, selection);
return addEnablementActions(descriptors, selection, true, actions);
}
private Collection<IAction> addEnablementActions(Collection<?> descriptors, ISelection selection, boolean sibling, Collection<IAction> actions)
{
if (selection instanceof IStructuredSelection && ((IStructuredSelection)selection).size() == 1)
{
Object object = ((IStructuredSelection)selection).getFirstElement();
if (object instanceof EObject)
{
actions = new ArrayList<IAction>(actions);
addEnablementActions(descriptors, object, sibling, actions);
}
}
return actions;
}
private void addEnablementActions(Collection<?> descriptors, Object object, boolean sibling, Collection<IAction> actions)
{
EditingDomain domain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain();
ResourceSet resourceSet = domain.getResourceSet();
Object siblingObject = null;
if (sibling)
{
siblingObject = object;
object = domain.getParent(object);
if (!(object instanceof EObject))
{
return;
}
}
ReflectiveItemProvider itemProvider = new ReflectiveItemProvider(null)
{
@Override
protected void gatherAllMetaData(EObject eObject)
{
Resource mainResource = eObject.eResource();
if (mainResource != null)
{
ResourceSet resourceSet = mainResource.getResourceSet();
if (resourceSet == null)
{
gatherAllMetaData(mainResource);
}
else
{
// Allow for the resource set to grow as a result of proxy resolution.
EList<Resource> resources = resourceSet.getResources();
for (int i = 0; i < resources.size(); ++i)
{
gatherAllMetaData(resources.get(i));
}
}
}
}
protected void gatherAllMetaData(Resource resource)
{
for (EObject root : resource.getContents())
{
if (root instanceof EPackage)
{
gatherMetaData((EPackage)root);
}
}
}
};
IconReflectiveItemProvider iconItemProvider = ((SetupEditor)activeEditor).getReflectiveItemProvider();
Shell shell = activeEditorPart.getSite().getShell();
Collection<?> newChildDescriptors = itemProvider.getNewChildDescriptors(object, domain, siblingObject);
for (Iterator<?> it = newChildDescriptors.iterator(); it.hasNext();)
{
Object descriptor = it.next();
if (descriptor instanceof CommandParameter)
{
Object value = ((CommandParameter)descriptor).getValue();
if (value instanceof EObject)
{
EObject eObject = (EObject)value;
if (eObject instanceof DynamicSetupTaskImpl)
{
EClass eClass = eObject.eClass();
Resource eResource = eClass.eResource();
if (eResource != null && eResource.getResourceSet() == resourceSet)
{
EList<SetupTask> enablementTasks = SetupTaskPerformer.createEnablementTasks(eClass, true);
if (enablementTasks != null)
{
String typeText = EAnnotations.getText(eClass);
if (typeText == null)
{
typeText = iconItemProvider.getTypeText(eObject);
}
EnablementAction action = new EnablementAction(shell, eClass, typeText, enablementTasks);
actions.add(action);
}
}
}
}
}
}
}
/**
* This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.ActionContributionItem}s
* based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection,
* by inserting them before the specified contribution item <code>contributionID</code>.
* If <code>contributionID</code> is <code>null</code>, they are simply added.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected void populateManagerGen(IContributionManager manager, Collection<? extends IAction> actions, String contributionID)
{
if (actions != null)
{
for (IAction action : actions)
{
if (contributionID != null)
{
manager.insertBefore(contributionID, action);
}
else
{
manager.add(action);
}
}
}
}
protected void populateManager(IContributionManager manager, Collection<? extends IAction> actions, String contributionID)
{
manager.add(new Separator("elements"));
manager.add(new Separator("elements-end"));
manager.add(new Separator("scopes"));
manager.add(new Separator("scopes-end"));
manager.add(new Separator("defaults"));
manager.add(new Separator("defaults-end"));
manager.add(new Separator("installations"));
manager.add(new Separator("installations-end"));
manager.add(new Separator("tasks"));
manager.add(new Separator("tasks-end"));
manager.add(new Separator("annotations"));
manager.add(new Separator("annotations-end"));
manager.add(new Separator("additions"));
manager.add(new Separator("additions-end"));
List<IAction> elements = new ArrayList<IAction>();
List<IAction> scopes = new ArrayList<IAction>();
List<IAction> defaults = new ArrayList<IAction>();
List<IAction> installations = new ArrayList<IAction>();
List<IAction> tasks = new ArrayList<IAction>();
List<IAction> annotations = new ArrayList<IAction>();
List<IAction> additions = new ArrayList<IAction>();
List<EnablementAction> additionalTasks = new ArrayList<EnablementAction>();
List<EnablementAction> additionalElements = new ArrayList<EnablementAction>();
Set<String> installedClasses = new HashSet<String>();
for (IAction action : actions)
{
if (action instanceof EnablementAction)
{
EnablementAction additionalTaskAction = (EnablementAction)action;
EClass eClass = additionalTaskAction.getEClass();
if (SetupPackage.Literals.SETUP_TASK.isSuperTypeOf(eClass))
{
additionalTasks.add(additionalTaskAction);
}
else
{
additionalElements.add(additionalTaskAction);
}
continue;
}
Object descriptor;
if (action instanceof CreateChildAction)
{
descriptor = ((CreateChildAction)action).getDescriptor();
}
else if (action instanceof CreateSiblingAction)
{
descriptor = ((CreateSiblingAction)action).getDescriptor();
}
else
{
additions.add(action);
continue;
}
if (descriptor instanceof CommandParameter)
{
CommandParameter parameter = (CommandParameter)descriptor;
Object value = parameter.getValue();
if (value instanceof Scope)
{
scopes.add(action);
}
else if (value instanceof CompoundTask || value instanceof VariableTask || value instanceof RedirectionTask)
{
defaults.add(action);
}
else if (value instanceof InstallationTask || value instanceof WorkspaceTask)
{
installations.add(action);
}
else if (value instanceof SetupTask)
{
tasks.add(action);
}
else if (value instanceof Annotation)
{
annotations.add(action);
}
else
{
elements.add(action);
}
if (value instanceof EObject)
{
EClass eClass = ((EObject)value).eClass();
String installedClass = getInstalledClass(eClass);
installedClasses.add(installedClass);
}
}
else
{
additions.add(action);
}
}
removeInstalledClasses(installedClasses, additionalElements);
Collections.sort(elements, ACTION_COMPARATOR);
removeInstalledClasses(installedClasses, additionalTasks);
Collections.sort(tasks, ACTION_COMPARATOR);
populateManagerGen(manager, elements, "elements-end");
if (!additionalElements.isEmpty())
{
populateManagerEnablements(manager, SetupEditorPlugin.INSTANCE.getString("_UI_AdditionalElements_menu_item"), "elements-end", additionalElements);
}
populateManagerGen(manager, scopes, "scopes-end");
populateManagerGen(manager, defaults, "defaults-end");
populateManagerGen(manager, installations, "installations-end");
populateManagerGen(manager, tasks, "tasks-end");
if (!additionalTasks.isEmpty())
{
populateManagerEnablements(manager, SetupEditorPlugin.INSTANCE.getString("_UI_AdditionalTasks_menu_item"), "tasks-end", additionalTasks);
}
populateManagerGen(manager, annotations, "annotations-end");
populateManagerGen(manager, additions, "additions-end");
}
private String getInstalledClass(EClass eClass)
{
return eClass.getEPackage().getNsURI() + "#" + eClass.getName();
}
private void removeInstalledClasses(Set<String> installedClasses, List<EnablementAction> actions)
{
for (Iterator<EnablementAction> it = actions.iterator(); it.hasNext();)
{
EnablementAction action = it.next();
EClass eClass = action.getEClass();
String installedClass = getInstalledClass(eClass);
if (installedClasses.contains(installedClass))
{
it.remove();
}
}
}
private void populateManagerEnablements(IContributionManager manager, String subMenuText, String insertBeforeID, final List<EnablementAction> additionalTasks)
{
int id = ++lastSubMenuID;
String subMenuID = ENABLEMENT_ITEM_PREFIX + id;
final MenuManager submenuManager = new MenuManager(subMenuText, subMenuID);
submenuManager.addMenuListener(new IMenuListener()
{
public void menuAboutToShow(IMenuManager manager)
{
// Execute later in event loop to make sure the menu is visible when the first image is loaded.
UIUtil.asyncExec(new Runnable()
{
public void run()
{
final Queue<EnablementAction> queue = new ConcurrentLinkedQueue<EnablementAction>(additionalTasks);
for (int i = 0; i < 10; i++)
{
Job iconLoader = new Job("IconLoader-" + i)
{
@Override
protected IStatus run(IProgressMonitor monitor)
{
EnablementAction action;
while ((action = queue.poll()) != null && submenuManager.isVisible() && !monitor.isCanceled())
{
action.loadImage();
}
return Status.OK_STATUS;
}
};
iconLoader.setSystem(true);
iconLoader.schedule();
}
}
});
}
});
Collections.sort(additionalTasks, ACTION_COMPARATOR);
populateManagerGen(submenuManager, additionalTasks, null);
manager.insertBefore(insertBeforeID, submenuManager);
}
/**
* This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.ActionContributionItem}s
* based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*/
protected void depopulateManagerGen(IContributionManager manager, Collection<? extends IAction> actions)
{
if (actions != null)
{
IContributionItem[] items = manager.getItems();
for (int i = 0; i < items.length; i++)
{
// Look into SubContributionItems
//
IContributionItem contributionItem = items[i];
while (contributionItem instanceof SubContributionItem)
{
contributionItem = ((SubContributionItem)contributionItem).getInnerItem();
}
// Delete the ActionContributionItems with matching action.
//
if (contributionItem instanceof ActionContributionItem)
{
IAction action = ((ActionContributionItem)contributionItem).getAction();
if (actions.contains(action))
{
manager.remove(contributionItem);
}
}
}
}
}
protected void depopulateManager(IContributionManager manager, Collection<? extends IAction> actions)
{
IContributionItem[] items = manager.getItems();
if (items != null)
{
for (int i = 0; i < items.length; i++)
{
IContributionItem item = items[i];
String id = item.getId();
if (id != null && id.startsWith(ENABLEMENT_ITEM_PREFIX))
{
manager.remove(item);
}
}
}
depopulateManagerGen(manager, actions);
}
/**
* This populates the pop-up menu before it appears.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void menuAboutToShowGen(IMenuManager menuManager)
{
super.menuAboutToShow(menuManager);
MenuManager submenuManager = null;
submenuManager = new MenuManager(SetupEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
populateManager(submenuManager, createChildActions, null);
menuManager.insertBefore("edit", submenuManager);
submenuManager = new MenuManager(SetupEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
populateManager(submenuManager, createSiblingActions, null);
menuManager.insertBefore("edit", submenuManager);
}
@Override
public void menuAboutToShow(IMenuManager menuManager)
{
menuAboutToShowGen(menuManager);
menuManager.insertBefore("ui-actions", new Action()
{
@Override
public String getText()
{
return "Working Sets Preview...";
}
@Override
public void run()
{
Dialog dialog = new PreviewDialog(activeEditorPart.getSite().getShell(), activeEditorPart)
{
private List<WorkingSet> workingSets = new ArrayList<WorkingSet>();
@Override
protected void selectionChanged(IWorkbenchPart part, ISelection selection)
{
if (part == activeEditorPart)
{
List<WorkingSet> oldWorkingSets = workingSets;
workingSets = getWorkingSets();
if (workingSets != oldWorkingSets)
{
reconcile();
tree.setInput(input);
tree.expandAll();
}
}
super.selectionChanged(part, selection);
}
@Override
protected List<WorkingSet> getWorkingSets()
{
IStructuredSelection selection = (IStructuredSelection)((ISelectionProvider)activeEditorPart).getSelection();
LOOP: for (Object object : selection.toArray())
{
if (object instanceof EObject)
{
for (EObject eObject = (EObject)object; eObject != null; eObject = eObject.eContainer())
{
List<WorkingSet> workingSets = getWorkingSets(eObject);
if (workingSets != null)
{
this.workingSets = workingSets;
break LOOP;
}
}
}
}
return workingSets;
}
private List<WorkingSet> getWorkingSets(EObject eObject)
{
for (EReference eReference : eObject.eClass().getEAllReferences())
{
if (eReference.isMany() && eReference.getEType() == WorkingSetsPackage.Literals.WORKING_SET)
{
@SuppressWarnings("unchecked")
EList<WorkingSet> value = (EList<WorkingSet>)eObject.eGet(eReference);
return value;
}
}
return null;
}
};
dialog.open();
}
});
menuManager.insertBefore("ui-actions", openInSetupEditorAction);
menuManager.insertBefore("ui-actions", openInTextEditorAction);
}
/**
* This inserts global actions before the "additions-end" separator.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected void addGlobalActions(IMenuManager menuManager)
{
menuManager.insertAfter("additions-end", new Separator("ui-actions"));
menuManager.insertAfter("ui-actions", showPropertiesViewAction);
refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
menuManager.insertAfter("ui-actions", refreshViewerAction);
super.addGlobalActions(menuManager);
}
/**
* This ensures that a delete action will clean up all references to deleted objects.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected boolean removeAllReferencesOnDelete()
{
return true;
}
/**
* @author Eike Stepper
*/
private static final class CreateChildAction extends org.eclipse.emf.edit.ui.action.CreateChildAction
{
public CreateChildAction(EditingDomain editingDomain, ISelection selection, Object descriptor)
{
super(editingDomain, selection, descriptor);
}
public CreateChildAction(IEditorPart editorPart, ISelection selection, Object descriptor)
{
super(editorPart, selection, descriptor);
}
public CreateChildAction(IWorkbenchPart workbenchPart, ISelection selection, Object descriptor)
{
super(workbenchPart, selection, descriptor);
}
public Object getDescriptor()
{
return descriptor;
}
}
/**
* @author Eike Stepper
*/
private static final class CreateSiblingAction extends org.eclipse.emf.edit.ui.action.CreateSiblingAction
{
public CreateSiblingAction(EditingDomain editingDomain, ISelection selection, Object descriptor)
{
super(editingDomain, selection, descriptor);
}
public CreateSiblingAction(IEditorPart editorPart, ISelection selection, Object descriptor)
{
super(editorPart, selection, descriptor);
}
public CreateSiblingAction(IWorkbenchPart workbenchPart, ISelection selection, Object descriptor)
{
super(workbenchPart, selection, descriptor);
}
public Object getDescriptor()
{
return descriptor;
}
}
/**
* @author Eike Stepper
*/
private class PreferenceRecorderToolbarAction extends Action
{
public PreferenceRecorderToolbarAction(boolean withDialog)
{
super("Record", SetupEditorPlugin.INSTANCE.getImageDescriptor("recorder"));
}
@Override
public void run()
{
MessageDialog.openInformation(activeEditorPart.getSite().getShell(), "Heads Up!",
"The workflow for the recording of preference tasks has been simplified:\n\n" + "You don't need to open the editor for the user tasks anymore.\n"
+ "Just open the Preferences dialog and your user tasks will be updated automatically.");
}
}
// /**
// * @author Eike Stepper
// */
// private static class PreferenceRecorderToolbarAction extends PreferenceRecorderAction
// {
// public PreferenceRecorderToolbarAction(boolean withDialog)
// {
// super(withDialog);
// setImageDescriptor(SetupEditorPlugin.INSTANCE.getImageDescriptor("recorder"));
// }
// }
/**
* @author Eike Stepper
*/
@Deprecated
private class TestInstallAction extends Action
{
private Project project;
public TestInstallAction()
{
super("Test Install", AS_PUSH_BUTTON);
setImageDescriptor(SetupEditorPlugin.INSTANCE.getImageDescriptor("run"));
setToolTipText("Launch the installer with the current project");
}
@SuppressWarnings("unused")
public void selectionChanged(SelectionChangedEvent event)
{
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection)
{
IStructuredSelection structuredSelection = (IStructuredSelection)selection;
if (structuredSelection.size() == 1)
{
Object element = structuredSelection.getFirstElement();
if (element instanceof EObject)
{
project = getProject((EObject)element);
if (project != null)
{
setEnabled(true);
return;
}
}
}
}
project = null;
setEnabled(false);
}
@Override
public void run()
{
// Shell shell = activeEditorPart.getSite().getShell();
// new org.eclipse.oomph.internal.setup.ui.InstallerDialog(shell, project).open();
}
private Project getProject(EObject object)
{
while (object != null && !(object instanceof Project))
{
object = object.eContainer();
}
return (Project)object;
}
}
/**
* @author Eike Stepper
*/
private static final class CommandTableAction extends AbstractTableAction
{
public CommandTableAction()
{
super("Command Table");
setImageDescriptor(SetupEditorPlugin.INSTANCE.getImageDescriptor("commands"));
setToolTipText("Show a table of all available commands");
}
@SuppressWarnings("unchecked")
@Override
protected String renderHTML()
{
IBindingService bindingService = PlatformUI.getWorkbench().getService(IBindingService.class);
Binding[] bindings = bindingService.getBindings();
Map<String, List<Command>> map = new HashMap<String, List<Command>>();
ICommandService commandService = PlatformUI.getWorkbench().getService(ICommandService.class);
for (Command command : commandService.getDefinedCommands())
{
try
{
String category = command.getCategory().getName();
if (category == null || category.length() == 0)
{
category = command.getCategory().getId();
}
List<Command> commands = map.get(category);
if (commands == null)
{
commands = new ArrayList<Command>();
map.put(category, commands);
}
commands.add(command);
}
catch (NotDefinedException ex)
{
SetupEditorPlugin.getPlugin().log(ex);
}
}
List<String> categories = new ArrayList<String>(map.keySet());
Collections.sort(categories);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream out = new PrintStream(baos);
out.println("<table border=\"1\">");
for (String category : categories)
{
out.println("<tr><td colspan=\"3\" bgcolor=\"eae6ff\"><br><h2>" + category + "</h2></td></tr>");
List<Command> commands = map.get(category);
Collections.sort(commands);
for (Command command : commands)
{
StringBuilder keys = new StringBuilder();
for (Binding binding : bindings)
{
ParameterizedCommand parameterizedCommand = binding.getParameterizedCommand();
if (parameterizedCommand != null)
{
if (parameterizedCommand.getId().equals(command.getId()))
{
if (keys.length() != 0)
{
keys.append("<br>");
}
keys.append(binding.getTriggerSequence());
}
}
}
if (keys.length() == 0)
{
keys.append("&nbsp;");
}
String name;
try
{
name = command.getName();
}
catch (NotDefinedException ex)
{
name = command.getId();
}
out.println("<tr><td valign=\"top\" width=\"200\">" + name + "</td><td valign=\"top\" width=\"400\">" + command.getId()
+ "</td><td valign=\"top\" width=\"100\">" + keys + "</td></tr>");
}
}
out.println("</table>");
try
{
out.flush();
return baos.toString("UTF-8");
}
catch (UnsupportedEncodingException ex)
{
return "UTF-8 is unsupported";
}
}
}
/**
* @author Eike Stepper
*/
private static final class EditorTableAction extends AbstractTableAction
{
public EditorTableAction()
{
super("Editor Table");
setImageDescriptor(SetupEditorPlugin.INSTANCE.getImageDescriptor("FileEditor"));
setToolTipText("Show a table of all available editors");
}
@SuppressWarnings("restriction")
@Override
protected String renderHTML()
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream out = new PrintStream(baos);
out.println("<table border=\"1\">");
out.println("<tr><td bgcolor=\"eae6ff\">ID</td><td bgcolor=\"eae6ff\">Label</td></tr>");
org.eclipse.ui.internal.registry.EditorRegistry registry = (org.eclipse.ui.internal.registry.EditorRegistry)PlatformUI.getWorkbench().getEditorRegistry();
IEditorDescriptor[] editors = registry.getSortedEditorsFromPlugins();
for (IEditorDescriptor editor : editors)
{
out.println("<tr><td>" + editor.getId() + "</td><td>" + editor.getLabel() + "</td></tr>");
}
out.println("</table>");
try
{
out.flush();
return baos.toString("UTF-8");
}
catch (UnsupportedEncodingException ex)
{
return "UTF-8 is unsupported";
}
}
}
protected static final class ToggleViewerInputAction extends Action
{
private SetupEditor setupEditor;
public ToggleViewerInputAction()
{
super("Show Resources", IAction.AS_CHECK_BOX);
setImageDescriptor(SetupEditorPlugin.INSTANCE.getImageDescriptor("ToggleInput"));
setToolTipText("Show all resources");
}
@Override
public void run()
{
setupEditor.toggleInput();
}
public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart)
{
if (workbenchPart instanceof SetupEditor)
{
setupEditor = (SetupEditor)workbenchPart;
setEnabled(true);
setChecked(setupEditor.selectionViewer.getInput() instanceof ResourceSet);
}
else
{
setEnabled(false);
setupEditor = null;
}
}
}
private static final class RevertAction extends Action
{
private SetupEditor setupEditor;
@Override
public void run()
{
setupEditor.doRevert();
}
public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart)
{
if (workbenchPart instanceof SetupEditor)
{
setupEditor = (SetupEditor)workbenchPart;
setEnabled(true);
setChecked(setupEditor.selectionViewer.getInput() instanceof ResourceSet);
}
else
{
setEnabled(false);
setupEditor = null;
}
}
}
/**
* @author Ed Merks
*/
private static final class OpenInSetupEditorAction extends Action
{
private URI uri;
private SetupEditor setupEditor;
public OpenInSetupEditorAction()
{
setText("Open in Setup Editor");
}
@Override
public void run()
{
SetupEditorSupport.getEditor(setupEditor.getSite().getWorkbenchWindow().getActivePage(), uri, true);
}
public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart)
{
if (workbenchPart instanceof SetupEditor)
{
setupEditor = (SetupEditor)workbenchPart;
setEnabled(true);
}
else
{
setEnabled(false);
setupEditor = null;
}
}
public final void selectionChanged(SelectionChangedEvent event)
{
uri = null;
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
if (selection.size() == 1)
{
Object object = selection.getFirstElement();
object = AdapterFactoryEditingDomain.unwrap(object);
if (object instanceof EObject)
{
EObject eObject = (EObject)object;
Resource resource = eObject.eResource();
if (resource != null)
{
ResourceSet resourceSet = resource.getResourceSet();
if (resourceSet == null || resourceSet.getResources().indexOf(resource) != 0)
{
uri = EcoreUtil.getURI(eObject);
}
}
}
else if (object instanceof Resource)
{
Resource resource = (Resource)object;
uri = resource.getURI();
}
}
setEnabled(uri != null);
}
}
/**
* @author Ed Merks
*/
private static final class OpenInTextEditorAction extends Action
{
private URI uri;
private SetupEditor setupEditor;
public OpenInTextEditorAction()
{
setText("Open in Text Editor");
}
@Override
public void run()
{
SetupEditorSupport.getTextEditor(setupEditor.getSite().getWorkbenchWindow().getActivePage(), uri);
}
public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart)
{
if (workbenchPart instanceof SetupEditor)
{
setupEditor = (SetupEditor)workbenchPart;
setEnabled(true);
}
else
{
setEnabled(false);
setupEditor = null;
}
}
public final void selectionChanged(SelectionChangedEvent event)
{
uri = null;
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
if (selection.size() == 1)
{
Object object = selection.getFirstElement();
object = AdapterFactoryEditingDomain.unwrap(object);
if (object instanceof EObject)
{
EObject eObject = (EObject)object;
Resource resource = eObject.eResource();
if (resource != null)
{
uri = resource.getURI();
}
}
else if (object instanceof Resource)
{
Resource resource = (Resource)object;
uri = resource.getURI();
}
}
setEnabled(uri != null);
}
}
}