2013-04-23 2 views
0

Eclipse 텍스트 편집기의 캐럿 위치를 선택한 블록의 반대쪽으로 이동시키는 약간의 플러그인을 작성 중입니다. 문제는 선택이 왼쪽에서 오른쪽인지 또는 오른쪽에서 왼쪽인지를 알아내는 좋은 방법을 찾지 못한다는 것입니다.Eclipse 텍스트 편집기의 캐럿 위치

  • 어떤 방법으로 CarretListener를 사용

    나는 이러한 대안이 있습니다 이해합니다. 불필요한 것처럼 보이고 싶지 않습니다.

  • 밑받침을 잡고 StyledText을 선택하고 캐럿 위치와 비교합니다. 에디터의 구현 방법을 알아야하기 때문에 추상화를 깨뜨리는 것 같습니다. 또 다른 단점은 텍스트 뷰어에서 widgetOffset2ModelOffset 메서드를 사용하여 위치를 조정해야한다는 것입니다.

ITextEditor 또는 ISelectionProvider 또는 무엇인가에서 캐럿 포지션을 얻을 수 없습니까?

public class SwapCursorSelectionHandler extends AbstractHandler { 
    public Object execute(ExecutionEvent event) 
    { 
     ITextEditor editor; 
     try { 
      editor = (ITextEditor) HandlerUtil.getActivePartChecked(event); 
     } catch (ExecutionException exc) { 
      throw new RuntimeException(exc); 
     } 

     ITextSelection sel = (ITextSelection) editor.getSelectionProvider().getSelection(); 

     // How to find out if sel is left-to-right or right-to-left?! 

     editor.selectAndReveal(...); 

     return null; 
    } 
} 

업데이트 :

여기 내 코드입니다 StyledText를 사용하지 않고이 작업을 수행 할 수있는 방법이있을 것 같지 않습니다. 이상하게 생각하고 선택 방향 정보가 ITextSelection에 추가되어야한다고 제안하는 버그 보고서를 삽입하는 것을 고려합니다. 제가 이것을하기 전에이 제안에 관해서 여기에있는 사람들에 대한 의견을 얻는 것이 흥미로울 것입니다.

답변

1

매우 우아하지 않은 코드 조각을이 표준을 달성하는 가장 표준적인 방법으로 생각했습니다. 그것은 ITextEditor.getAdapter(ITextOperationTarget.class)JFaceTextUtil을 사용합니다. 이는 특정 편집기 구현에 따라 달라 지지만 최소한 직접 수정하거나 widget2model 메서드로 처리 할 필요가 없다는 것을 의미합니다.

public Object execute(ExecutionEvent event) { 
    try { 
     ITextViewer viewer = (ITextViewer) 
      ((ITextEditor) HandlerUtil.getActivePartChecked(event)) 
       .getAdapter(ITextOperationTarget.class); 
     int caretOffset = JFaceTextUtil.getOffsetForCursorLocation(viewer); 
    } catch (ExecutionException exc) { 
     throw new RuntimeException(exc); 
    } 
    return null; 
}