0

我目前正在开发一个 Eclipse 插件。为了执行操作,我需要收听活动选项卡的插入符号侦听器。

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的,但我想获取文件的行号。

这张图片显示了一个折叠文本的例子。StyledText 插入符号偏移量会给我类似于第 6、7 和 8 行的内容,而不是 6、7 和 12(就像 Eclipse 一样)。

有没有办法将 StyledText 偏移“转换”为“真实文件”偏移?我可以将该行作为字符串检索并在文件中找到它,但这听起来是个坏主意。

谢谢 !

4

1 回答 1

2

对于折叠编辑器,编辑器的源代码查看器将实现ITextViewerExtension5,它提供了widgetOffset2ModelOffset一种进行此调整的方法。

使用以下方法获取插入符号位置:

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();
}
于 2017-03-16T08:00:27.060 回答