/** * <copyright> * </copyright> * * */ package org.dresdenocl.language.ocl.resource.ocl.ui; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.ui.viewer.IViewerProvider; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.FileEditorInput; /** * A hyperlink for the proxy elements in source code. */ public class OclHyperlink implements IHyperlink { private String text; private EObject linkTarget; private IRegion region; /** * <p> * Creates the hyperlink. * </p> * * @param region the region of the hyperlink to highlight * @param linkTarget the link target where this hyperlink should go to * @param targetText the text to specify the target position in the * <code>linkTarget</code> */ public OclHyperlink(IRegion region, EObject linkTarget, String targetText) { this.region = region; this.linkTarget = linkTarget; this.text = targetText; } public String getHyperlinkText() { return text; } /** * * @return the length of the hyperlink text */ public int length() { return text.length(); } public String getTypeLabel() { return null; } /** * Opens the resource in <code>linkTarget</code> with the generated editor, if it * supports the file extension of this resource, and tries to jump to the * definition. Otherwise it tries to open the target with the default editor. */ public void open() { if (linkTarget == null) { return; } IFile file = getIFileFromResource(); if (file != null) { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchPage page = workbench.getActiveWorkbenchWindow().getActivePage(); try { IEditorDescriptor desc = workbench.getEditorRegistry().getDefaultEditor(file.getName()); if (desc == null) { desc = workbench.getEditorRegistry().findEditor("org.eclipse.emf.ecore.presentation.ReflectiveEditorID"); } IEditorPart editorPart = page.openEditor(new FileEditorInput(file), desc.getId()); if (editorPart instanceof IEditingDomainProvider) { IEditingDomainProvider editingDomainProvider = (IEditingDomainProvider) editorPart; EditingDomain editingDomain = editingDomainProvider.getEditingDomain(); URI uri = EcoreUtil.getURI(linkTarget); EObject originalObject = editingDomain.getResourceSet().getEObject(uri, true); if (editingDomainProvider instanceof IViewerProvider) { IViewerProvider viewerProvider = (IViewerProvider) editingDomainProvider; Viewer viewer = viewerProvider.getViewer(); viewer.setSelection(new StructuredSelection(originalObject), true); } } } catch (PartInitException e) { org.dresdenocl.language.ocl.resource.ocl.mopp.OclPlugin.logError("Exception while opening hyperlink target.", e); } } } private IFile getIFileFromResource() { Resource linkTargetResource = linkTarget.eResource(); if (linkTargetResource == null) { return null; } URI resourceURI = linkTargetResource.getURI(); if (linkTargetResource.getResourceSet() != null && linkTargetResource.getResourceSet().getURIConverter() != null) { resourceURI = linkTargetResource.getResourceSet().getURIConverter().normalize(resourceURI); } if (resourceURI.isPlatformResource()) { String platformString = resourceURI.toPlatformString(true); if (platformString != null) { IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot root = workspace.getRoot(); return root.getFile(new Path(platformString)); } } return null; } public IRegion getHyperlinkRegion() { return region; } }