Eclipse 编辑器 - SWT StyledText CaretListener 偏移量与实际文件行号不对应

Eclipse Editor - SWT StyledText CaretListener offset not corresponding to real file line number

我目前正在开发 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 相关联,但我想获取文件的行号。

This picture 显示折叠文本的示例。 StyledText 插入符偏移量会给我类似第 6、7 和 8 行的内容,而不是第 6、7 和 12 行(就像 Eclipse 那样)。

有没有办法将 StyledText 偏移 "transform" 偏移为 "real file" 偏移?我可以将该行作为字符串检索并在文件中找到它,但这听起来像个坏主意。

谢谢!

对于折叠编辑器,编辑器的源代码查看器将实现 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();
}