Eclipse文本编辑器的插入位置

时间:2013-04-23 21:25:47

标签: eclipse eclipse-plugin

我正在编写一个小插件,将Eclipse文本编辑器的插入位置移动到所选块的另一侧。问题是我找不到一个很好的方法来发现选择是从左到右还是从右到左。

我知道有这些替代品:

  • 以某种方式使用CarretListener。这似乎是不必要的,我不想。
  • 抓住底层StyledText并将选择与插入位置进行比较。似乎打破了抽象,因为我必须知道编辑器是如何实现的。另一个缺点是你必须在文本查看器上使用widgetOffset2ModelOffset方法来调整位置。

我无法从ITextEditorISelectionProvider或其他内容获得插入位置?

这是我的代码:

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。在我这样做之前,有兴趣在这里就这个提议征求人们的意见。

2 个答案:

答案 0 :(得分:2)

编辑:这个解决方案结果证明是错误的!感谢willkil指出它。


这段不是很优雅的代码是我能找到的最经典的方法。它使用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;
}

答案 1 :(得分:1)

获取当前光标位置的最佳方法是通过ITextViewer.getTextWidget().getCaretOffset()。这是一个示例,它在我正在研究的IContentAssistProcessor实现中打印各种文本位置:

public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
    int widgetCaretOffset = viewer.getTextWidget().getCaretOffset();
    if (viewer instanceof ITextViewerExtension5) {
        ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
        System.out.println(extension.widgetOffset2ModelOffset(widgetCaretOffset));
    }
    System.out.println(JFaceTextUtil.getOffsetForCursorLocation(viewer));
    System.out.println(offset);
    System.out.println(widgetCaretOffset);
    System.out.println(viewer.getSelectedRange());
}

我将插入号放置在文档中的任意位置,然后将鼠标移到第一行的开头附近,然后通过各种选择触发了内容助手。在我的情况下,textViewer没有实现ITextViewerExtension5,所以我只打印四行。上面的代码输出如下:

未选择任何内容:

6
794
794
Point {794, 0}

通过右移创建从左到右的选择(插入符号在选择的右侧闪烁):

6
794
799
Point {794, 5}

请注意,插入符号位置为799,等于794 + 5。

通过左移创建从左到右的选择(插入符号在选择的左侧闪烁):

6
794
794
Point {794, 5}

请注意,插入标记的位置等于选择偏移量。

还请注意,尽管与该问题无关,但offset中的IContentAssistProcessor. computeCompletionProposals()参数始终是所选内容的偏移量,而不是插入符号。

如果您使用的是ITextEditor而不是ITextViewer,则可以通过从another answer到该问题以及从an answera different question

ITextViewer