mirror of
https://github.com/Minres/RDL-Editor.git
synced 2025-07-01 13:33:27 +02:00
Added hyperlinking and bumped version numbers
This commit is contained in:
@ -0,0 +1,17 @@
|
||||
package com.minres.rdl.ui;
|
||||
|
||||
import org.eclipse.xtext.ui.XtextProjectHelper;
|
||||
|
||||
import com.minres.rdl.ui.wizard.RDLProjectCreator;
|
||||
|
||||
|
||||
public class JDTFreeStructuralProjectCreator extends RDLProjectCreator {
|
||||
@Override
|
||||
protected String[] getProjectNatures() {
|
||||
return new String[] {XtextProjectHelper.NATURE_ID};
|
||||
}
|
||||
@Override
|
||||
protected String[] getBuilders() {
|
||||
return new String[] {XtextProjectHelper.BUILDER_ID};
|
||||
}
|
||||
}
|
@ -6,6 +6,13 @@ package com.minres.rdl.ui
|
||||
import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
|
||||
import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider
|
||||
import org.eclipse.xtext.documentation.IEObjectDocumentationProvider
|
||||
import org.eclipse.xtext.ui.wizard.IProjectCreator
|
||||
import org.eclipse.xtext.ui.resource.IResourceSetProvider
|
||||
import org.eclipse.xtext.ui.resource.SimpleResourceSetProvider
|
||||
import org.eclipse.xtext.ui.editor.hyperlinking.HyperlinkHelper
|
||||
import com.minres.structural.ui.hyperlink.MyHyperlinkHelper
|
||||
import org.eclipse.xtext.ui.editor.hyperlinking.XtextHyperlink
|
||||
import com.minres.structural.ui.hyperlink.MyXtextHyperlink
|
||||
|
||||
/**
|
||||
* Use this class to register components to be used within the Eclipse IDE.
|
||||
@ -21,4 +28,20 @@ class RDLUiModule extends AbstractRDLUiModule {
|
||||
typeof(RDLEObjectDocumentationProvider);
|
||||
}
|
||||
|
||||
override Class<? extends IProjectCreator> bindIProjectCreator() {
|
||||
return JDTFreeStructuralProjectCreator;
|
||||
}
|
||||
|
||||
override Class<? extends IResourceSetProvider> bindIResourceSetProvider() {
|
||||
return SimpleResourceSetProvider
|
||||
}
|
||||
|
||||
def Class<? extends HyperlinkHelper> bindHyperlinkHelper() {
|
||||
return MyHyperlinkHelper
|
||||
}
|
||||
|
||||
def Class<? extends XtextHyperlink> bindHyperlink() {
|
||||
return MyXtextHyperlink
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,52 @@
|
||||
package com.minres.structural.ui.hyperlink
|
||||
|
||||
import com.google.inject.Inject
|
||||
import org.eclipse.emf.common.util.URI
|
||||
import org.eclipse.emf.ecore.util.EcoreUtil
|
||||
import org.eclipse.jface.text.Region
|
||||
import org.eclipse.xtext.EcoreUtil2
|
||||
import org.eclipse.xtext.nodemodel.util.NodeModelUtils
|
||||
import org.eclipse.xtext.resource.XtextResource
|
||||
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.util.TextRegion
|
||||
|
||||
class MyHyperlinkHelper extends HyperlinkHelper {
|
||||
|
||||
@Inject ImportUriResolver resolver;
|
||||
|
||||
override createHyperlinksByOffset(XtextResource resource, int offset, IHyperlinkAcceptor acceptor) {
|
||||
val region = new TextRegion(offset, 0)
|
||||
val crossRefNode = getEObjectAtOffsetHelper().getCrossReferenceNode(resource, region);
|
||||
if (crossRefNode === null){
|
||||
val parseResult = resource.getParseResult();
|
||||
if (parseResult !== null) {
|
||||
val leaf = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), region.getOffset());
|
||||
//val rule = EcoreUtil2.getContainerOfType(leaf.grammarElement, AbstractRule);
|
||||
val semObj = NodeModelUtils.findActualSemanticObjectFor(leaf);
|
||||
val importURI = resolver.resolve(semObj);
|
||||
if (importURI !== null && EcoreUtil2.isValidUri(semObj, URI.createURI(importURI))) {
|
||||
val referencedResource = EcoreUtil2.getResource(resource, importURI)
|
||||
if(referencedResource !== null && referencedResource.contents.size>0){
|
||||
val top = referencedResource.contents.get(0)
|
||||
val textRegion = leaf.getTextRegion();
|
||||
val uri = EcoreUtil.getURI(top);
|
||||
val result = hyperlinkProvider.get();
|
||||
result.setHyperlinkRegion(new Region(textRegion.getOffset(), textRegion.getLength()));
|
||||
result.setURI(if(uri.isPlatformResource()) uri else resource.getResourceSet().getURIConverter().normalize(uri));
|
||||
result.setHyperlinkText(labelProvider.getText(top));
|
||||
if(result instanceof MyXtextHyperlink) result.selectTarget=false
|
||||
acceptor.accept(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
val crossLinkedEObject = getEObjectAtOffsetHelper().getCrossReferencedElement(crossRefNode);
|
||||
if (crossLinkedEObject !== null && !crossLinkedEObject.eIsProxy()) {
|
||||
createHyperlinksTo(resource, crossRefNode, crossLinkedEObject, acceptor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package com.minres.structural.ui.hyperlink
|
||||
|
||||
import com.google.inject.Inject
|
||||
import org.eclipse.xtext.ui.editor.IURIEditorOpener
|
||||
import org.eclipse.xtext.ui.editor.hyperlinking.XtextHyperlink
|
||||
|
||||
class MyXtextHyperlink extends XtextHyperlink {
|
||||
|
||||
var boolean select = true
|
||||
|
||||
@Inject var IURIEditorOpener uriEditorOpener;
|
||||
|
||||
override void open() {
|
||||
uriEditorOpener.open(getURI(), select);
|
||||
}
|
||||
|
||||
def boolean getSelectTarget(){
|
||||
return select
|
||||
}
|
||||
|
||||
def void setSelectTarget(boolean select){
|
||||
this.select=select
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user