/**
* <copyright>
* </copyright>
*
*
*/
package org.feature.multi.perspective.mapping.viewmapping.resource.mtext.ui;
/**
* A hyperlink for the proxy elements in source code.
*/
public class MtextHyperlink implements org.eclipse.jface.text.hyperlink.IHyperlink {
private String text;
private org.eclipse.emf.ecore.EObject linkTarget;
private org.eclipse.jface.text.IRegion region;
/**
* Creates the hyperlink.
*
* @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 MtextHyperlink(org.eclipse.jface.text.IRegion region, org.eclipse.emf.ecore.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;
}
org.eclipse.core.resources.IFile file = getIFileFromResource();
if (file != null) {
org.eclipse.ui.IWorkbench workbench = org.eclipse.ui.PlatformUI.getWorkbench();
org.eclipse.ui.IWorkbenchPage page = workbench.getActiveWorkbenchWindow().getActivePage();
try {
org.eclipse.ui.IEditorDescriptor desc = workbench.getEditorRegistry().getDefaultEditor(file.getName());
if (desc == null) {
desc = workbench.getEditorRegistry().findEditor("org.eclipse.emf.ecore.presentation.ReflectiveEditorID");
}
org.eclipse.ui.IEditorPart editorPart = page.openEditor(new org.eclipse.ui.part.FileEditorInput(file), desc.getId());
if (editorPart instanceof org.eclipse.emf.edit.domain.IEditingDomainProvider) {
org.eclipse.emf.edit.domain.IEditingDomainProvider editingDomainProvider = (org.eclipse.emf.edit.domain.IEditingDomainProvider) editorPart;
org.eclipse.emf.edit.domain.EditingDomain editingDomain = editingDomainProvider.getEditingDomain();
org.eclipse.emf.common.util.URI uri = org.eclipse.emf.ecore.util.EcoreUtil.getURI(linkTarget);
org.eclipse.emf.ecore.EObject originalObject = editingDomain.getResourceSet().getEObject(uri, true);
if (editingDomainProvider instanceof org.eclipse.emf.common.ui.viewer.IViewerProvider) {
org.eclipse.emf.common.ui.viewer.IViewerProvider viewerProvider = (org.eclipse.emf.common.ui.viewer.IViewerProvider) editingDomainProvider;
org.eclipse.jface.viewers.Viewer viewer = viewerProvider.getViewer();
viewer.setSelection(new org.eclipse.jface.viewers.StructuredSelection(originalObject), true);
}
}
} catch (org.eclipse.ui.PartInitException e) {
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.mopp.MtextPlugin.logError("Exception while opening hyperlink target.", e);
}
}
}
private org.eclipse.core.resources.IFile getIFileFromResource() {
org.eclipse.emf.ecore.resource.Resource linkTargetResource = linkTarget.eResource();
if (linkTargetResource == null) {
return null;
}
org.eclipse.emf.common.util.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) {
org.eclipse.core.resources.IWorkspace workspace = org.eclipse.core.resources.ResourcesPlugin.getWorkspace();
org.eclipse.core.resources.IWorkspaceRoot root = workspace.getRoot();
return root.getFile(new org.eclipse.core.runtime.Path(platformString));
}
}
return null;
}
public org.eclipse.jface.text.IRegion getHyperlinkRegion() {
return region;
}
}