package org.erlide.ui.editors.erl.hyperlink;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.erlide.engine.services.parsing.ErlToken;
import org.erlide.ui.actions.OpenAction;
import org.erlide.ui.editors.erl.AbstractErlangEditor;
import org.erlide.ui.editors.erl.IErlangEditorActionDefinitionIds;
public class ErlangHyperlinkDetector extends AbstractHyperlinkDetector {
public ErlangHyperlinkDetector() {
}
@Override
public IHyperlink[] detectHyperlinks(final ITextViewer textViewer,
final IRegion region, final boolean canShowMultipleHyperlinks) {
if (region == null) {
return null;
}
final IDocument document = textViewer.getDocument();
if (document == null) {
return null;
}
return detectHyperlinks(document, region.getOffset());
}
private IHyperlink[] detectHyperlinks(final IDocument doc, final int offset) {
final AbstractErlangEditor editor = (AbstractErlangEditor) getAdapter(AbstractErlangEditor.class);
if (editor == null) {
return null;
}
final ErlToken token = editor.getScanner().getTokenAt(offset);
if (token == null) {
return null;
}
final int tokenKind = token.getKind();
if (tokenKind != ErlToken.KIND_ATOM && tokenKind != ErlToken.KIND_STRING
&& tokenKind != ErlToken.KIND_MACRO && tokenKind != ErlToken.KIND_VAR) {
return null;
}
try {
final ITypedRegion partition = doc.getPartition(offset);
final ErlRegion region = new ErlRegion(token.getOffset(), token.getLength(),
partition.getType());
if (!IDocument.DEFAULT_CONTENT_TYPE.equals(region.getType())) {
return null;
}
return new IHyperlink[] { new ErlangHyperlink(editor, region) };
} catch (final BadLocationException e) {
return null;
}
}
static class ErlRegion extends Region {
String type;
public ErlRegion(final int offset, final int length, final String type) {
super(offset, length);
this.type = type;
}
public String getType() {
return type;
}
public void setType(final String string) {
type = string;
}
}
private static class ErlangHyperlink implements IHyperlink {
private final AbstractErlangEditor editor;
private final ErlRegion region;
public ErlangHyperlink(final AbstractErlangEditor editor, final ErlRegion partion) {
this.editor = editor;
region = partion;
}
@Override
public String getTypeLabel() {
return null;
}
@Override
public String getHyperlinkText() {
return null;
}
@Override
public void open() {
final OpenAction action = (OpenAction) editor
.getAction(IErlangEditorActionDefinitionIds.OPEN);
if (action != null) {
action.run();
}
}
@Override
public IRegion getHyperlinkRegion() {
return region;
}
}
}