/******************************************************************************* * Copyright (c) 2010-2012, Tamas Szabo, Istvan Rath and Daniel Varro * 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: * Tamas Szabo - initial API and implementation *******************************************************************************/ package hu.bme.mit.incquery.runtime.bpmn2; import java.util.ArrayList; import java.util.List; import org.eclipse.bpmn2.modeler.ui.editor.BPMN2MultiPageEditor; import org.eclipse.bpmn2.modeler.ui.editor.DesignEditor; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.EditPart; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.PictogramElement; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.ui.editor.DiagramEditor; import org.eclipse.incquery.runtime.api.IModelConnectorTypeEnum; import org.eclipse.incquery.tooling.ui.queryexplorer.adapters.EMFModelConnector; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.ui.IEditorPart; /** * Model connector implementation for the Graphiti model editors. */ public class BPMNModelConnector extends EMFModelConnector { public BPMNModelConnector(IEditorPart editorPart) { super(editorPart); } @Override public Notifier getNotifier(IModelConnectorTypeEnum modelConnectorTypeEnum) { Notifier result = null; if (editorPart instanceof BPMN2MultiPageEditor) { final DesignEditor editor = ((BPMN2MultiPageEditor) editorPart).getDesignEditor(); if (IModelConnectorTypeEnum.RESOURCESET.equals(modelConnectorTypeEnum)) { return editor.getResourceSet(); } else if (IModelConnectorTypeEnum.RESOURCE.equals(modelConnectorTypeEnum)) { PictogramElement[] selectedElements = editor.getSelectedPictogramElements(); if (selectedElements.length > 0) { PictogramElement element = selectedElements[0]; EObject businessObject = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement( element); if (businessObject != null) { return businessObject.eResource(); } } } } return result; } @Override public void showLocation(Object[] locationObjects) { // reflective set selection is not needed IStructuredSelection preparedSelection = prepareSelection(locationObjects); navigateToElements(getKey().getEditorPart(), preparedSelection); workbenchPage.bringToTop(getKey().getEditorPart()); // reflectiveSetSelection(key.getEditorPart(), preparedSelection); } @Override protected TreePath createTreePath(IEditorPart editor, EObject obj) { if (editor instanceof DiagramEditor) { Diagram diagram = ((DiagramEditor) editor).getDiagramTypeProvider().getDiagram(); List<PictogramElement> pictogramElements = Graphiti.getLinkService().getPictogramElements(diagram, obj); if (!pictogramElements.isEmpty()) { List<EditPart> parts = new ArrayList<EditPart>(); for (PictogramElement element : pictogramElements) { EditPart part = ((DiagramEditor) editor).getDiagramBehavior().getEditPartForPictogramElement(element); if (part != null) { parts.add(part); } } return new TreePath(parts.toArray()); } } return null; } @Override protected void navigateToElements(IEditorPart editorPart, IStructuredSelection selection) { if (editorPart instanceof DiagramEditor) { DiagramEditor providerEditor = (DiagramEditor) editorPart; providerEditor.getGraphicalViewer().setSelection(selection); } } }