在我自己的 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)。
我正在尝试获取键盘光标的当前行。
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)。