2017-03-16 75 views
0

我目前正在使用Eclipse插件。爲了執行某個操作,我需要聽取活動選項卡的脫字符號偵聽器。Eclipse編輯器 - SWT StyledText CaretListener偏移量不對應於真實文件行號

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偏移量「轉換」爲「實際文件」偏移量?我可以將該行作爲字符串檢索並在文件中找到它,但這聽起來像個不好的主意。

謝謝!

回答

0

對於摺疊編輯器,編輯器的源查看器將執行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(); 
} 
+0

謝謝!看起來getSourceViewer是「受保護的」,所以我無法在我的上下文中訪問它。 如果有一些建議,我將在StackOverflow中搜索! – mduruisseau

+0

考慮到這一點,你實際上只需要'ITextViewer',但我不認爲編輯器可以很容易地使用它。所有需要它的東西通常都是在編輯器中創建的,並將查看器作爲參數傳遞。 –

+0

我明白了,我會尋找答案,但到目前爲止我發現的所有內容都與您所說的內容相符(即無法在編輯之外訪問)。 ) – mduruisseau