2016-09-23 53 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(); 
    } 
} 

這樣,當我們點擊「你好」字符串,頁面會被打開