package org.activiti.designer.features.contextmenu;
import java.util.Set;
import org.activiti.bpmn.model.CallActivity;
import org.activiti.designer.eclipse.common.ActivitiPlugin;
import org.activiti.designer.util.ActivitiConstants;
import org.activiti.designer.util.workspace.ActivitiWorkspaceUtil;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICustomContext;
import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
public class OpenCalledElementForCallActivity extends AbstractCustomFeature {
public OpenCalledElementForCallActivity(final IFeatureProvider fp) {
super(fp);
}
@Override
public String getDescription() {
return "Opens a specified call element for a call activity.";
}
@Override
public boolean canExecute(ICustomContext context) {
final CallActivity ca = getCallActivity(context);
if (ca == null) {
return super.canExecute(context);
} else {
return true;
}
}
@Override
public String getName() {
return "Open Called Element";
}
@Override
public void execute(ICustomContext context) {
final CallActivity ca = getCallActivity(context);
final String calledElement = ca.getCalledElement();
if (calledElement != null && StringUtils.isNotBlank(calledElement)) {
final Set<IFile> dataFiles = ActivitiWorkspaceUtil.getDiagramDataFilesByProcessId(calledElement);
if (dataFiles.size() == 1) {
// we only handle this if it is not ambiguous
final IFile dataFile = dataFiles.iterator().next();
openDiagramForBpmnFile(dataFile);
}
}
}
/**
* Opens the given diagram specified by the given data file in a new editor. In case an error
* occurs while doing so, opens an error dialog.
*
* @param dataFile the data file to use for the new editor to open
*
* TODO: this is a copy from PropertyCallActivitySection. Figure out how to make sure we do not double this
*/
private void openDiagramForBpmnFile(IFile dataFile) {
if (dataFile.exists())
{
final IWorkbenchPage activePage
= PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
try {
IDE.openEditor(activePage, dataFile, ActivitiConstants.DIAGRAM_EDITOR_ID, true);
} catch (PartInitException exception) {
final IStatus status = new Status(IStatus.ERROR, ActivitiPlugin.getID()
, "Error while opening new editor.", exception);
ErrorDialog.openError(Display.getCurrent().getActiveShell()
, "Error Opening Activiti Diagram", null, status);
}
}
}
private CallActivity getCallActivity(final ICustomContext context) {
final PictogramElement[] pes = context.getPictogramElements();
if (pes != null) {
for (final PictogramElement pe : pes) {
final Object bo = getBusinessObjectForPictogramElement(pe);
if (bo instanceof CallActivity) {
return (CallActivity) bo;
}
}
}
return null;
}
}