2016-09-23 54 views
0

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

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

+0

问题,要求我们推荐或“首选项”找到一本书,工具,软件库,教程或其他非现场资源是堆栈溢出的话题,因为它们倾向于吸引自以为是的答案和垃圾邮件。相反,请描述问题以及到目前为止解决问题所做的工作。 –

+0

你可以更具体地说明你想应用什么样的超链接自定义。 HyperlinkHelper的代码不是那么复杂的自定义。但没有任何要求,很难指向方向 –

+0

我会像下面这样做:我的语法是一组其他文件上的链接。我想添加按Ctrl +点击功能。即当我按Ctrl +单击(或按f3)链接编辑器将打开链接的文件。 问候,弗拉基米尔 –

回答

0

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

作为替代方案,您可以按照基督徒的建议自定义HyperlinkHelper。问题是你必须定制所有的UI组件,这些参考的概念应该存在,例如找到参考。正如我上面提到的,如果您明确地建模引用,则不存在此问题。

+0

我知道HyperlinkHelper自定义,但想要得到它的例子。或者,也许是教程 –

0

我有答案。 要做到这一点,我们只需要重写方法

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(); 
    } 
} 

这样,当我们点击“你好”字符串,页面会被打开