2017-03-16 1 views
0

現在、Eclipseプラグインを作成中です。アクションを実行するには、アクティブなタブのキャレットリスナーを聞く必要があります。Eclipse Editor - SWT StyledText実際のファイルの行番号に対応しないCaretListenerオフセット

public void partOpened(IWorkbenchPartReference partRef) { 
    AbstractTextEditor e = (AbstractTextEditor) ((IEditorReference) partRef).getEditor(false); 
    StyledText sText = ((StyledText) e.getAdapter(Control.class)); 

    sText.addCaretListener(new CaretListener() { 

     @Override 
     public void caretMoved(CaretEvent event) { 
      IDocument d = e.getDocumentProvider().getDocument(e.getEditorInput()); 

      ... 

      int line = d.getLineOfOffset(event.caretOffset); 
      Point p = sText.getLocationAtOffset(event.caretOffset); 
     } 
    }); 
} 

このコードを使用して、最新の開いたタブにCaretListenerを追加します。

変数lineは、コードブロックが折りたたまれていない場合にのみ正しいです。 実際には、イベントによって返されたオフセットはStyledTextにリンクされていますが、ファイルの行番号を取得したいと思います。

This pictureは、折りたたまれたテキストの例を示しています。 StyledTextのキャレットオフセットは、6,7、および12の代わりに、6行目、7行目、8行目のようなものを与えます(Eclipseのように)。

StyledTextオフセットを「実ファイル」オフセットに「変換」する方法はありますか?私は、文字列として行を取得し、ファイル内で見つけることができますが、それは悪い考えのように聞こえる。

ありがとうございます!

答えて

0

折りたたみエディタの場合、エディタのソースビューアには、widgetOffset2ModelOffsetという調整方法を提供するITextViewerExtension5が実装されます。

は次のようなものを使用して、キャレット位置を取得します:

ISourceViewer sourceViewer = e.getSourceViewer(); 

int caret; 
if (sourceViewer instanceof ITextViewerExtension5) { 
    ITextViewerExtension5 extension = (ITextViewerExtension5)sourceViewer; 
    caret = extension.widgetOffset2ModelOffset(styledText.getCaretOffset()); 
} else { 
    int offset = sourceViewer.getVisibleRegion().getOffset(); 
    caret = offset + styledText.getCaretOffset(); 
} 
+0

ありがとうございます! getSourceViewerは "保護されている"ように見えるので、自分のコンテキストではアクセスできません。 提案がある場合、私はStackOverflowで検索します! – mduruisseau

+0

これについて考えると、実際には 'ITextViewer'だけが必要ですが、私は編集者がこれを簡単に利用できるとは思いません。それを必要とするものは、通常、エディタ内から作成され、ビューアをパラメータとして渡します。 –

+0

わかりましたが、私は答えを探しますが、私が今までに見つけたことは、あなたが言っていることと一致しています。もう一度ありがとう;) – mduruisseau

関連する問題