2017-03-16 7 views
0

현재 이클립스 플러그인을 작성 중입니다. 액션을 수행하려면 활성 탭의 캐럿 리스너를 청취해야합니다.Eclipse Editor - 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, 12 대신에 6, 7, 8 행을 제공합니다 (Eclipse처럼).

StyledText 오프셋을 "실제 파일"오프셋으로 "변환"할 수 있습니까? 내가 줄로 문자열을 검색하고 파일에서 찾을 수 있지만 나쁜 생각처럼 들리 네요.

감사합니다.

답변

0

접이식 편집기의 경우 편집기의 소스 뷰어는 widgetOffset2ModelOffset 방법을 제공하는 ITextViewerExtension5을 구현합니다.

는 같은 것을 사용하여 캐럿 위치를 가져옵니다 :

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