在我自己的 eclipse 编辑器中折叠一些先前的行时获取当前行

Get current line when some previous lines was collapsed in my own eclipse editor

我正在尝试获取键盘光标的当前行。

StyledText styledText = (StyledText) getAdapter(Control.class);
styledText.addCaretListener(event -> {
    try {
        IDocument document = getDocumentProvider().getDocument(getEditorInput());
        // This is the current line
        int currentLine = document.getLineOfOffset(event.caretOffset);

    } catch (BadLocationException e) {
    }
});

但是当一些前面的行被折叠时,方法 getLineOfOffset 不起作用。如果文档折叠,则 event.caretOffset 会发生变化。

我尝试使用此代码:

ISelectionProvider selectionProvider = ((ITextEditor)editor).getSelectionProvider();
ISelection selection = selectionProvider.getSelection();
if (selection instanceof ITextSelection) {
    ITextSelection textSelection = (ITextSelection)selection;
    return textSelection.getStartLine();
}

但是最后一个代码 return 选择了旧行。我认为 addCaretListener 的事件在更改行之前执行(不确定)。

如何在 addCaretListener 事件中折叠文档时获取当前行?

如果您的编辑器使用 ProjectionViewer 作为源代码查看器,您可以 使用 ITextViewerExtension5 widgetOffset2ModelOffset 方法:

ISourceViewer sourceViewer = getSourceViewer(); // Get your SourceViewer

StyledText styledText = sourceViewer.getTextWidget();

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

IDocument document = sourceViewer.getDocument();

int currentLine = document.getLineOfOffset(docOffset);

(改编自 JDT JavaEditor)。