/*
* Copyright 2013 The Sculptor Project Team, including the original
* author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sculptor.dsl.ui;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.jface.text.Region;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
import org.eclipse.xtext.scoping.impl.ImportUriResolver;
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.sculptor.dsl.sculptordsl.DslImport;
import org.sculptor.dsl.services.SculptordslGrammarAccess;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* This extension of Xtexts default {@link HyperlinkHelper} adds support for
* additional language features, e.g. import URIs.
*
* @since 3.0.1
*/
public class SculptordslHyperlinkHelper extends HyperlinkHelper {
@Inject
SculptordslGrammarAccess grammarAccess;
@Inject
protected Provider<XtextHyperlink> hyperlinkProvider;
@Inject
protected ImportUriResolver uriResolver;
@Inject
ImportUriGlobalScopeProvider scopeProvider;
@Override
public void createHyperlinksByOffset(XtextResource resource, int offset, IHyperlinkAcceptor acceptor) {
INode node = NodeModelUtils.findLeafNodeAtOffset(resource.getParseResult().getRootNode(), offset);
if (node != null && node.getGrammarElement() instanceof RuleCall
&& node.getSemanticElement() instanceof DslImport) {
if (grammarAccess.getSTRINGRule().equals(((RuleCall) node.getGrammarElement()).getRule())) {
DslImport iimport = (DslImport) node.getSemanticElement();
String uriString = iimport.getImportURI();
URI uri = URI.createURI(uriString);
final URIConverter uriConverter = resource.getResourceSet().getURIConverter();
final URI normalized = uri.isPlatformResource() ? uri : uriConverter.normalize(uri);
final URI targetURI = scopeProvider.getResourceDescriptions(resource, Lists.newArrayList(normalized))
.getResourceDescription(normalized).getURI();
XtextHyperlink result = hyperlinkProvider.get();
result.setURI(targetURI);
Region region = new Region(node.getOffset(), node.getLength());
result.setHyperlinkRegion(region);
result.setHyperlinkText(uriString);
acceptor.accept(result);
}
}
super.createHyperlinksByOffset(resource, offset, acceptor);
}
}