2012-05-04 13 views
6

私のプラグインでは、CompilationUnitEditorで選択したコードにアクセスしようとしています。したがって、私は次のコードコンテキストメニューや利用への貢献を追加しました:Eclipseで選択したコードを取得するにはどうすればよいですか?

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メソッドのみが呼び出されることです。しかし、私は残念ながら

enter image description here

(ここで私は「IEditorPart」を取得したいと思います)、このように強調表示されているコードの要素にアクセスしたい、私は私がどうあるべきか見当がつかない。

答えて

1

:私は考えて働くだろう

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

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

} 
3

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

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

CaretListenerあなたは(私はここで実行されている日食を持っていないとして、現時点ではこれ以上の情報を持っていない)あなたのEditorPartから得ることができることを、あなたのStyledTextコンポーネントのAdapterに取り付けることができます。

希望します。

編集:コードです。

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(); 
} 

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

+0

は、しかし、私は強く、より良い選択肢がなければならないことを前提としています。 – RoflcoptrException

+0

これはうまくいくかもしれませんが、非常に低レベルのAPIにアクセスしているので、このソリューションに対してはお勧めします。ソースビューアなどのJFace APIを使用してエディタと対話する必要があります。 –

+0

編集してコードを追加しました。 – Alex

7

あなたはこれを行う必要があります。

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

ISourceViewerクラスは、元の場所とエディタに関するかなりの数の便利で興味深い方法があります。 JavaSourceViewerもご覧ください。


EDIT

私はかなりあなたの質問に答えていないように見えます。問題はselectionChangedイベントは、選択範囲の長さが0より大きい場合にのみ呼び出されるということです。なぜこれが当てはまるのかわかりませんが、それはアクション代理人が常に働いた方法です。

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

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

mySelectionListenerはタイプorg.eclipse.jface.viewers.ISelectionChangedListenerである。このような何かを行います。このように登録すると、探しているすべてのイベントが表示されます。エディタが終了したら、登録解除に注意してください。他の回答からの入力を使用して、私は、次の解決策になってしまった

+0

それから私はポイントを返す。私はそれをどうしたらいいですか? – RoflcoptrException

+0

JavaDocを読むと、現在の選択範囲をこのビューアのドキュメントの座標で返します 戻り値: a xがオフセットであり、yが現在の選択の長さであるポイント " –

+0

実際にあなたの質問を読んで、私はもはやあなたが何を探しているのかは分かりません。選択した範囲が必要ですか?選択したテキストを含むJava要素が必要ですか?または、宣言を決定するために現在選択されているものを解決したいですか? –

関連する問題