/**
* Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below.
* 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:
* Cloudsmith
*
*/
package org.cloudsmith.geppetto.pp.dsl.ui.editor.hyperlinking;
import java.util.List;
import org.cloudsmith.geppetto.pp.dsl.linking.PPObjectAtOffsetHelper;
import org.cloudsmith.geppetto.pp.dsl.ui.labeling.PPDescriptionLabelProvider;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.jface.text.Region;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.hyperlinking.HyperlinkHelper;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkAcceptor;
import org.eclipse.xtext.ui.editor.hyperlinking.XtextHyperlink;
import org.eclipse.xtext.util.TextRegion;
import com.google.inject.Inject;
/**
* A PP specific hyperlink helper, that can find references using CrossReferenceAdapter instead of / in addition to
* eReferences.
*
*/
public class PPHyperlinkHelper extends HyperlinkHelper {
@Inject
PPObjectAtOffsetHelper ppObjectAtOffsetHelper;
@Inject
private PPDescriptionLabelProvider labelProvider;
/*
* (non-Javadoc)
*
* @see org.eclipse.xtext.ui.editor.hyperlinking.HyperlinkHelper#createHyperlinksByOffset(org.eclipse.xtext.resource.XtextResource, int,
* org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkAcceptor)
*/
@Override
public void createHyperlinksByOffset(XtextResource resource, int offset, IHyperlinkAcceptor acceptor) {
super.createHyperlinksByOffset(resource, offset, acceptor);
INode crossRefNode = ppObjectAtOffsetHelper.getCrossReferenceNode(resource, new TextRegion(offset, 0));
if(crossRefNode == null)
return;
List<IEObjectDescription> crossLinkedObjects = ppObjectAtOffsetHelper.getCrossReferencedElement(crossRefNode);
Region region = new Region(crossRefNode.getOffset(), crossRefNode.getLength());
if(crossLinkedObjects != null)
for(IEObjectDescription iod : crossLinkedObjects)
createHyperlinksTo(resource, region, iod, acceptor);
}
public void createHyperlinksTo(XtextResource from, Region region, IEObjectDescription to,
IHyperlinkAcceptor acceptor) {
if(!isAcceptableTarget(to))
return;
final URIConverter uriConverter = from.getResourceSet().getURIConverter();
final String hyperlinkText = labelProvider.getText(to);
final URI uri = to.getEObjectURI();
final URI normalized = uriConverter.normalize(uri);
XtextHyperlink result = getHyperlinkProvider().get();
result.setHyperlinkRegion(region);
result.setURI(normalized);
result.setHyperlinkText(hyperlinkText);
acceptor.accept(result);
}
public boolean isAcceptableTarget(IEObjectDescription to) {
String path = to.getEObjectURI().path();
if(path == null)
return false;
// not meaningful to open a .pptp file (XML)
if(path.endsWith(".pptp"))
return false;
return true;
}
}