/** * Copyright (c) 2013 committers of YAKINDU 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.simulation.ui.model.presenter; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.debug.core.model.DebugElement; import org.eclipse.debug.ui.sourcelookup.ISourceDisplay; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.URIConverter; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.workspace.util.WorkspaceSynchronizer; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.FileEditorInput; import org.yakindu.base.gmf.runtime.highlighting.IHighlightingSupport; import org.yakindu.sct.simulation.core.engine.ISimulationEngine; import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil; /** * One SCTSourceDisplay is responsible for n {@link IDynamicNotationHandler}s. * Each {@link IDynamicNotationHandler} controls the * {@link IHighlightingSupport} of an {@link IEditorPart} * * @author andreas muelder - Initial contribution and API * */ public class SCTSourceDisplay implements ISourceDisplay { private Map<IEditorPart, IDynamicNotationHandler> handler = null; private ISimulationEngine container = null; private DebugElement debugElement; public SCTSourceDisplay(ISimulationEngine container) { this.container = container; handler = new HashMap<IEditorPart, IDynamicNotationHandler>(); } public void displaySource(Object element, IWorkbenchPage page, boolean forceSourceLookup) { debugElement = (DebugElement) element; IEditorPart editor = openEditor(debugElement, page); displaySource(editor); } public void displaySource(IEditorPart editor) { IDynamicNotationHandler notationHandler = handler.get(editor); IHighlightingSupport support = (IHighlightingSupport) editor.getAdapter(IHighlightingSupport.class); if (support == null) return; if (notationHandler == null) { notationHandler = new DefaultDynamicNotationHandler(); handler.put(editor, notationHandler); } else { notationHandler.setHighlightingSupport(new IHighlightingSupport.HighlightingSupportNullImpl()); } if (support.isLocked()) { support.releaseEditor(); } support.lockEditor(); notationHandler.setHighlightingSupport(support); notationHandler.display(container.getExecutionContext()); } public void terminate(boolean release) { container = null; debugElement = null; Collection<IDynamicNotationHandler> values = handler.values(); for (IDynamicNotationHandler notationHandler : values) { notationHandler.terminate(); if (release && notationHandler.getHighlightingSupport().isLocked()) notationHandler.getHighlightingSupport().releaseEditor(); } handler.clear(); } public IEditorPart openEditor(DebugElement debugElement, IWorkbenchPage page) { EObject semanticObject = (EObject) debugElement.getAdapter(EObject.class); IFile file = (IFile) debugElement.getAdapter(IFile.class); if (file == null) file = WorkspaceSynchronizer.getFile(semanticObject.eResource()); // check if an editor for the resource is already open, the return the // opened editor. // This is important for simulating subdiagrams IEditorPart activeEditor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() .getActiveEditor(); if (activeEditor != null) { IEditorInput editorInput = activeEditor.getEditorInput(); if (editorInput instanceof IFileEditorInput) { if (((IFileEditorInput) editorInput).getFile().equals(file)) return activeEditor; } } // check if a Diagram is available and open the editor for the // corresponding diagram Diagram diagram = DiagramPartitioningUtil.getDiagramContaining(semanticObject); if (diagram != null) { if (URIConverter.INSTANCE.exists(semanticObject.eResource().getURI(), null)) { Resource sharedDomainResource = DiagramPartitioningUtil.getSharedDomain().getResourceSet() .getResource(semanticObject.eResource().getURI(), true); Collection<Diagram> contents = EcoreUtil.getObjectsByType(sharedDomainResource.getContents(), NotationPackage.Literals.DIAGRAM); for (Diagram diag : contents) { if (EcoreUtil.getURI(diag.getElement()).equals(EcoreUtil.getURI(diagram.getElement()))) { return DiagramPartitioningUtil.openEditor((Diagram) diag); } } } // No diagram for the semantic element -> open the default editor // for the file } else { IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(file.getName()); try { return page.openEditor(new FileEditorInput(file), desc.getId()); } catch (PartInitException e) { e.printStackTrace(); } } // No editor found throw new RuntimeException("No editor found for semantic element " + semanticObject); } }