1

Eclipse テキスト エディターのキャレット位置を選択したブロックの反対側に移動する小さなプラグインを作成しています。問題は、選択が左から右か右から左かを発見する良い方法が見つからないことです。

これらの代替手段があることを理解しています:

  • 何らかの方法で CarretListener を使用します。それは不必要に思えますし、したくありません。
  • 下敷きを手に取りStyledText、選択範囲をキャレットの位置と比較します。エディターがどのように実装されているかを知る必要があるため、抽象化が壊れているようです。もう 1 つの欠点はwidgetOffset2ModelOffset、テキスト ビューアのメソッドを使用して位置を調整する必要があることです。

ITextEditoror ISelectionProvideror somethingからキャレットの位置を取得できませんか?

これが私のコードです:

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ます。私がこれを行う前に、この提案について SO の人々の意見を聞くことは興味深いでしょう。

4

2 に答える 2

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;
}
于 2013-05-03T13:18:51.947 に答える