6

私のプラグインでは、CompilationUnitEditor で選択したコードにアクセスしようとしています。したがって、コンテキスト メニューにコントリビューションを追加し、次のコードを使用します。

public class ContextMenuHandler implements IEditorActionDelegate {

    private IEditorPart editorPart;

    @Override
    public void setActiveEditor(IAction action, IEditorPart editorPart) {
        this.editorPart = editorPart;
    }

    @Override
    public void run(IAction action) {
        JavaUI.getEditorInputJavaElement(editorPart.getEditorInput());
    }

    @Override
    public void selectionChanged(IAction action, ISelection selection) {
        if (selection instanceof TextSelection) {
            TextSelection text = (TextSelection) selection;
            System.out.println("Text: " + text.getText());
        } else {
            System.out.println(selection);
        }
    }

}

問題は、メソッド selectionChanged(...) が実際に何かを選択したときにのみ呼び出され、コピー/貼り付けできることです。しかし、このように強調表示されているコード要素にアクセスしたい (ここでは「IEditorPart」を取得したい)

ここに画像の説明を入力

残念ながら、何を探すべきかわかりません。

4

3 に答える 3

7

これを行う必要があります:

        ((CompilationUnitEditor) editorPart).getViewer().getSelectedRange();

このISourceViewerクラスには、ソースの場所とエディターに関する便利で興味深いメソッドが多数あります。も参照してくださいJavaSourceViewer


編集

私はあなたの質問に完全に答えていないようです。問題は、selectionChanged イベントが呼び出されるのは、選択範囲の長さが > 0 の場合のみであることです。なぜそうなるのかはわかりませんが、アクション デリゲートは常にこのように機能してきました。

キャレットが変更されるたびに通知を受け取りたい場合は、エディターのビューアーに選択変更リスナーを登録する必要があります。次のようにします。

((CompilationUnitEditor) editorPart).getViewer()
  .addSelectionChangedListener(mySelectionListener);

mySelectionListenerタイプorg.eclipse.jface.viewers.ISelectionChangedListenerです。この方法で登録すると、探しているすべてのイベントが表示されます。エディターを閉じたときに登録を解除するように注意してください。

于 2012-05-04T20:12:03.543 に答える
3

キャレットの現在位置を検出する方が簡単ではないでしょうか。位置を指定すると、カレットが単語上にあるかどうかを簡単に検出できます(たとえば、スペースで区切られたJava識別子、または正規表現を使用して、単語を好きなように定義します)。

ここではEclipseを実行できませんが、CaretListenerクラスを使用して、Caretの動きを検出し、その下の単語を抽出します。メソッドに指定されたCaretEventパラメータにcaretMovedは、オフセットが含まれます。

は、コンポーネントCaretListenerのにアタッチすることができます。これは、コンポーネントから取得できます(ここでは日食が実行されていないため、現時点ではこれ以上の情報はありません)。AdapterStyledTextEditorPart

それが役に立てば幸い。

編集:いくつかのコード。

final StyledText text = (StyledText)editorPart.getAdapter(Control.class);
text.addCaretListener(new CaretListener() {
        public void caretMoved(CaretEvent event) {
            int offset = event.caretOffset;
            String word = findWord(offset, text);
            if (word.length() > 0) {
                System.out.println("Word under caret: " + word);
            }
        }
});

private String findWord(int offset, StyledText text) {
    int lineIndex = text.getLineAtOffset(offset);
    int offsetInLine = offset - text.getOffsetAtLine(lineIndex);
    String line = text.getLine(lineIndex);
    StringBuilder word = new StringBuilder();
    if (offsetInLine > 0 && offsetInLine < line.length()) {
        for (int i = offsetInLine; i >= 0; --i) {
            if (!Character.isSpaceChar(line.charAt(i))) {
                word.append(line.charAt(i));
            } else {
                break;
            }
        }
        word = word.reverse();
    }
    if (offsetInLine < line.length()) {
        for (int i = offsetInLine; i < line.length(); ++i) {
            if (i == offsetInLine)
                continue; // duplicate
            if (!Character.isSpaceChar(line.charAt(i))) {
                word.append(line.charAt(i));
            } else {
                break;
            }
        }
    }
    return word.toString();
}

これは、周囲のスペース文字に基づいてカーソルの下に単語を取得するための簡単な実装です。有効なJava識別子などを検出するには、より堅牢な実装を使用する必要があります。たとえば、このためのライブラリを使用または使用しますCharacter.isJavaIdentifierStartCharacter.isJavaIdentifierPart

于 2012-05-04T19:31:18.043 に答える
1

他の回答からの入力を使用して、次の解決策になりました。

@Override
public void setActiveEditor(IAction action, IEditorPart editorPart) {
    ((CompilationUnitEditor) editorPart).getViewer().addTextListener(new ITextListener() {

        @Override
        public void textChanged(TextEvent event) {
            selectedText = event.getText();
        }
    });

}
于 2012-05-11T21:02:33.373 に答える