package de.sebastianbenz.task.ui.editor; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.text.hyperlink.URLHyperlink; import org.eclipse.xtext.resource.EObjectAtOffsetHelper; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.editor.hyperlinking.HyperlinkHelper; import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkAcceptor; import com.google.inject.Inject; import de.sebastianbenz.task.Content; import de.sebastianbenz.task.Link; import de.sebastianbenz.task.Tag; import de.sebastianbenz.task.TextSegment; import de.sebastianbenz.task.util.Contents; public class TaskHyperLinkHelper extends HyperlinkHelper { @Inject private EObjectAtOffsetHelper eObjectAtOffsetHelper; @Override public void createHyperlinksByOffset(XtextResource resource, int offset, IHyperlinkAcceptor acceptor) { super.createHyperlinksByOffset(resource, offset, acceptor); EObject current = eObjectAtOffsetHelper.resolveElementAt(resource, offset); if(current == null){ return; } if (current instanceof Content){ findLinksIn((Content) current, offset, acceptor); } } private void findLinksIn(Content content, int offset, IHyperlinkAcceptor acceptor) { int contentOffset = Contents.offset(content); for (Link link : content.getLinks()) { int linkOffset = contentOffset + link.getOffset(); if(isInRegion(offset, contentOffset, link)){ acceptor.accept(create(linkOffset, link)); return; } } for (Tag tag : content.getTags()) { int tagOffset = contentOffset + tag.getOffset(); if(isInRegion(offset, contentOffset, tag)){ acceptor.accept(create(tagOffset, tag)); } } } private boolean isInRegion(int offset, int contentOffset, TextSegment segment) { int tagOffset = contentOffset + segment.getOffset(); return offset >= tagOffset && offset < tagOffset + segment.getLength(); } private IHyperlink create(int offset, Tag tag) { IRegion region = new Region(offset, tag.getLength()); return new TagHyperLink(region, tag); } private IHyperlink create(int offset, Link link) { String url = link.getUrl(); IRegion region = new Region(offset, link.getLength()); if(!url.startsWith("http")){ url = "http://" + url; } return new URLHyperlink(region , url); } }