2016-09-23 11 views
0

私のプロジェクトでハイパーリンクのカスタム処理を作成したいのですが、サンプルやチュートリアルは見つかりませんでした。Xtextのハイパーリンク方法?

は、私はあなたが私にいくつかの例、またはチュートリアルのリンクを与えることを聞いても?

+0

質問を開いたりします「こんにちは」のサブストリング、「環境設定」をクリックすると、このように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(); } } 

を実装する必要がありますStack Overflowの本、ツール、ソフトウェアライブラリ、チュートリアル、その他のオフサイトリソースは、オピニオンレスポンスやスパムを引き付ける傾向があるため、トピックではありません。代わりに、問題を説明し、それを解決するためにこれまでに何が行われているかを記述します。 –

+0

あなたは、適用したいハイパーリンクのカスタマイズの種類をより具体的にすることができます。 HyperlinkHelperのコードは複雑ではありません。しかし、どんな要件もなく、指示を指すのは難しいです。 –

+0

私は次のようにします。私の文法は、別のファイルのリンクのセットです。 Ctrl +クリック機能を追加したいと思います。私。リンクエディタでctrl +クリック(またはf3キーを押す)すると、リンクされたファイルが開きます。 よろしく、ウラジミール –

答えて

0

他のファイルがEMFリソースによってバックアップされている場合、あなたはそれからのXtextでインデックスして、一意のリソースを識別し、特にインデックスEMFオブジェクト、そしてあなたの文法でそれらへの参照を追加することができます。クリスチャンが示唆したように、あなたがHyperlinkHelperをカスタマイズすることができます別の方法として

。問題は、そのような参照の概念が存在するはずのすべてのUIコンポーネントをカスタマイズする必要があることです。参照を見つける。上記のように明示的に参照をモデル化すると、この問題は発生しません。

+0

私はHyperlinkHelperのカスタマイズについて知っていますが、その例を得るのが欲しいです。または、チュートリアルかもしれない –

0

私はアンサーを持っています。私達はちょうどメソッドクラスの

def Class<? extends DefaultHyperlinkDetector> bindDefaultHyperlinkDetector() 

AbstractMyDslUiModule 

は、私はクラスDefaultHyperlinkDetector

を上書きする必要以上に次のよう

/* 
* 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; 
    } 
} 

でそれを行います上書き必要がある。これを行うために

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

} 

そして次は、私たちは、ページがお勧めする私たちを求めて