/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.workflow.view; import java.util.List; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.InvalidRegistryObjectException; import org.eclipse.core.runtime.Platform; import org.eclipse.gef.ContextMenuProvider; import org.eclipse.gef.GraphicalViewer; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import de.rcenvironment.core.component.execution.api.ComponentExecutionInformation; import de.rcenvironment.core.component.workflow.execution.api.WorkflowExecutionInformation; import de.rcenvironment.core.component.workflow.model.api.WorkflowNode; import de.rcenvironment.core.gui.workflow.parts.WorkflowRunNodePart; import de.rcenvironment.core.gui.workflow.parts.WorkflowExecutionInformationPart; import de.rcenvironment.core.gui.workflow.parts.WorkflowPart; import de.rcenvironment.core.toolkitbridge.transitional.ConcurrencyUtils; import de.rcenvironment.toolkit.modules.concurrency.api.TaskDescription; /** * {@link ContextMenuProvider} for the {@link WorkflowRunEditor}. * * @author Doreen Seider */ public class WorkflowRunEditorContextMenuProvider extends ContextMenuProvider { private final GraphicalViewer viewer; public WorkflowRunEditorContextMenuProvider(GraphicalViewer viewer) { super(viewer); this.viewer = viewer; } @Override public void buildContextMenu(IMenuManager menu) { @SuppressWarnings("rawtypes") List selection = viewer.getSelectedEditParts(); if (selection.size() == 0) { // fixes IndexOutOfBoundsException occurring if no element is currently selected return; } WorkflowRunNodePart part = null; if (selection.get(0) instanceof WorkflowRunNodePart) { part = (WorkflowRunNodePart) selection.get(0); } if (part != null) { WorkflowExecutionInformation wfExeInfo = (WorkflowExecutionInformation) ((WorkflowExecutionInformationPart) ((WorkflowPart) part.getParent()).getParent()).getModel(); final WorkflowNode wfNode = (WorkflowNode) part.getModel(); final ComponentExecutionInformation compExeInfo = wfExeInfo.getComponentExecutionInformation(wfNode.getIdentifier()); // Find registered views IExtensionRegistry extReg = Platform.getExtensionRegistry(); IConfigurationElement[] confElements = extReg.getConfigurationElementsFor("de.rcenvironment.core.gui.workflow.monitoring"); //$NON-NLS-1$ IConfigurationElement[] viewConfElements = extReg.getConfigurationElementsFor("org.eclipse.ui.views"); //$NON-NLS-1$ for (final IConfigurationElement confElement : confElements) { if (compExeInfo.getComponentIdentifier().startsWith(confElement.getAttribute("component"))) { //$NON-NLS-1$ for (final IConfigurationElement viewConfElement : viewConfElements) { if (viewConfElement.getAttribute("id").equals(confElement.getAttribute("view"))) { menu.add(new Action() { @Override public String getText() { return viewConfElement.getAttribute("name"); } @Override public void run() { final IViewPart view; try { view = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(). showView(viewConfElement.getAttribute("class"), compExeInfo.getExecutionIdentifier(), IWorkbenchPage.VIEW_VISIBLE); //$NON-NLS-1$ ConcurrencyUtils.getAsyncTaskService().execute(new Runnable() { @Override @TaskDescription("Initialize component runtime view data") public void run() { ((ComponentRuntimeView) view).initializeData(compExeInfo); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { ((ComponentRuntimeView) view).initializeView(); } }); } }); view.setFocus(); } catch (PartInitException e) { throw new RuntimeException(e); } catch (InvalidRegistryObjectException e) { throw new RuntimeException(e); } } @Override public boolean isEnabled() { @SuppressWarnings("rawtypes") List selection = viewer.getSelectedEditParts(); return selection.size() == 1 && selection.get(0).getClass() == WorkflowRunNodePart.class; } }); break; } } } } } } }