Xtext超链接怎么样?

时间:2016-09-23 19:16:14

标签: xtext

我想在我的项目中创建超链接自定义处理,但找不到任何示例或教程。

我可以请你给我一些例子或教程的链接吗?

2 个答案:

答案 0 :(得分:0)

如果其他文件由EMF资源备份,那么您可以使用Xtext索引它们,特别是唯一标识资源的索引EMF对象,然后在语法中添加对它们的引用。

作为替代方案,您可以像Christian建议的那样自定义HyperlinkHelper。问题是您必须自定义所有UI组件,其中应存在此类引用的概念,例如找到参考。如果您如上所述明确建模您的参考文献,则没有此问题。

答案 1 :(得分:0)

我有ansver。 要做到这一点,我们需要覆盖方法

def Class<? extends DefaultHyperlinkDetector> bindDefaultHyperlinkDetector() 

的课程

AbstractMyDslUiModule

将以下列方式进行

/*
 * generated by Xtext 2.9.2
 */
package org.xtext.example.mydsl.ui

import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
import org.eclipse.xtext.ui.editor.hyperlinking.DefaultHyperlinkDetector

/**
 * Use this class to register components to be used within the Eclipse IDE.
 */
@FinalFieldsConstructor
class MyDslUiModule extends AbstractMyDslUiModule {
    def Class<? extends DefaultHyperlinkDetector> bindDefaultHyperlinkDetector() {
        return MyHyperlinkDetector;
    }
}

我需要覆盖类 DefaultHyperlinkDetector

package org.xtext.example.mydsl.ui;

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.Region;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.xtext.ui.editor.hyperlinking.DefaultHyperlinkDetector;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper;

public class MyHyperlinkDetector extends DefaultHyperlinkDetector{
    private static final String PREFERENCES = "Hello";

    @Override
    public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
        IDocument document = textViewer.getDocument();
          int offset = region.getOffset();

          // extract relevant characters
          IRegion lineRegion;
          String candidate;
          try {
           lineRegion = document.getLineInformationOfOffset(offset);
           candidate = document.get(lineRegion.getOffset(), lineRegion.getLength());
          } catch (BadLocationException ex) {
           return null;
          }

          // look for keyword
          int index = candidate.indexOf(PREFERENCES);
          if (index != -1) {

           // detect region containing keyword
           IRegion targetRegion = new Region(lineRegion.getOffset() + index, PREFERENCES.length());
           if ((targetRegion.getOffset() <= offset) && ((targetRegion.getOffset() + targetRegion.getLength()) > offset))
            // create link
            return new IHyperlink[] { new PreferencesHyperlink(targetRegion) };
          }

          return null;
    }

}

接下来我们需要实现IHyperlink接口 IHyperlink

package org.xtext.example.mydsl.ui;

import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.dialogs.PreferencesUtil;

public class PreferencesHyperlink implements IHyperlink {

    private final IRegion fUrlRegion;

    public PreferencesHyperlink(IRegion urlRegion) {
        fUrlRegion = urlRegion;
    }

    @Override
    public IRegion getHyperlinkRegion() {
        return fUrlRegion;
    }

    @Override
    public String getTypeLabel() {
        return null;
    }

    @Override
    public String getHyperlinkText() {
        return null;
    }

    @Override
    public void open() {
        PreferencesUtil.createPreferenceDialogOn(Display.getDefault().getActiveShell(), null, null, null).open();
    }
}

这样,当我们点击“hello”子字符串时,“首选项”页面将被打开