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

Eclipse编辑器-SWT StyledText CaretListener偏移量与实际文件行号不对应,eclipse,caret,styledtext,Eclipse,Caret,Styledtext,我目前正在开发一个Eclipse插件。为了执行某个操作,我需要监听活动选项卡的插入符号侦听器 public void partOpened(IWorkbenchPartReference partRef) { AbstractTextEditor e = (AbstractTextEditor) ((IEditorReference) partRef).getEditor(false); StyledText sText = ((StyledText) e.getAdapter(

我目前正在开发一个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

只有在没有折叠代码块时,变量
才是正确的。 事实上,事件返回的偏移量链接到StyledText,但我想获取文件的行号

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

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


谢谢

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

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

isoourceviewer sourceViewer=e.getSourceViewer();
插入符号;
if(ITextViewerExtension5的sourceViewer实例){
ITextViewerExtension5扩展=(ITextViewerExtension5)sourceViewer;
插入符号=扩展名.widgetOffset2ModelOffset(styledText.getCaretOffset());
}否则{
int offset=sourceViewer.getVisibleRegion().getOffset();
插入符号=offset+styledText.getCareTofset();
}

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

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

isoourceviewer sourceViewer=e.getSourceViewer();
插入符号;
if(ITextViewerExtension5的sourceViewer实例){
ITextViewerExtension5扩展=(ITextViewerExtension5)sourceViewer;
插入符号=扩展名.widgetOffset2ModelOffset(styledText.getCaretOffset());
}否则{
int offset=sourceViewer.getVisibleRegion().getOffset();
插入符号=offset+styledText.getCareTofset();
}

谢谢!getSourceViewer似乎是“受保护的”,因此我无法在我的上下文中访问它。如果有什么建议,我会在StackOverflow中搜索!考虑到这一点,您实际上只需要
ITextViewer
,但我认为编辑器并不能轻松提供这一功能。需要它的所有内容通常都是在编辑器中创建的,并作为参数传递给查看器。明白了,我会查找答案,但我找到的所有内容都与您所说的内容相匹配(即,在编辑器之外无法访问)。再次感谢;)我使用ITextViewer:ITextViewer=(ITextViewer)editor.getAdapter(ITextOperationTarget.class)获得了实际的行然后将您的代码与
widgetOffset2ModelOffset
方法一起使用!非常感谢。getSourceViewer似乎是“受保护的”,因此我无法在我的上下文中访问它。如果有什么建议,我会在StackOverflow中搜索!考虑到这一点,您实际上只需要
ITextViewer
,但我认为编辑器并不能轻松提供这一功能。需要它的所有内容通常都是在编辑器中创建的,并作为参数传递给查看器。明白了,我会查找答案,但我找到的所有内容都与您所说的内容相匹配(即,在编辑器之外无法访问)。再次感谢;)我使用ITextViewer:ITextViewer=(ITextViewer)editor.getAdapter(ITextOperationTarget.class)获得了实际的行然后将您的代码与
widgetOffset2ModelOffset
方法一起使用!