7

ナビゲーター ツリー ビューで Eclipse ユーザーの構造化された選択の詳細を取得しようとしています。現在、org.eclipse.ui.popMenus 拡張ポイントに基づいた以下のものがあります。

public void run(IAction action) {

Shell shell = new Shell();

ISelection selection = workbenchPart.getSite().getSelectionProvider().getSelection();

if (structuredSelection instanceof org.eclipse.jface.viewers.TreeSelection) {

   org.eclipse.jface.viewers.TreeSelection treeSelection = (org.eclipse.jface.viewers.TreeSelection) structuredSelection;
   IAdaptable firstElement = (IAdaptable) treeSelection.getFirstElement();

   // Relies on an internal API, bad juju
   if (firstElement instanceof org.eclipse.jdt.internal.core.CompilationUnit) {
    org.eclipse.jdt.internal.core.CompilationUnit compilationUnit = (org.eclipse.jdt.internal.core.CompilationUnit) firstElement;                                   
    String editorSelection = new String(compilationUnit.getContents());
   }            
}

これに関する問題は、現在 JDT コンパイル ユニット API に結合されていることです。これは内部的なものであり、私が望むものにはあまりにも具体的です。

理想的には、依存することなく、基になるファイル名、タイプ、およびコンテンツを取得できるようにしたいと考えています。

  1. 内部 API
  2. JDT コンパイル ユニット コード。

これにより、ユーザーがナビゲーター ビューでファイルを右クリックしたときに、汎用ファイルのプロパティを取得できるようになります。

誰かが私がこれを行う方法についての指針を教えてもらえますか?

4

4 に答える 4

9

[編集: 次の代替案を追加しました - 元の答えはファーザー ダウンです]

まず、Package Explorer で何かを選択した場合、選択された項目はすべて Java モデル オブジェクトです。あるレベルでそれらを処理する必要があります。これを処理するには、次の 2 つの方法があります。

  1. ICompilationUnit を直接使用する (下を参照)
  2. 変換を自動化するための Eclipe アダプター ファクトリを作成する

アダプタ ファクトリ アプローチ

Eclipse が ICompilationUnit から IFile に自動的に変換するために使用できるアダプター ファクトリ (メイン プラグインまたは別のプラグインに存在する可能性があります) を作成できます。

注: 別のプラグインでアダプタ ファクトリを作成する場合は、アダプタ ファクトリをロードするために早期起動を設定する必要があります。それ以外の場合は、アダプターを提供するプラグインに応じて、選択で動作するプラグインを用意する必要があります。

http://www.eclipse.org/resources/resource.php?id=407にアダプターに関する詳細がいくつかありますが、ここではこの問題の実装について説明します。

依存関係

アダプターをホストするプラグインには、次の依存関係が必要です

  • org.eclispe.core.resources
  • org.eclipse.jdt.core

アダプタ ファクトリ クラス

新しいプラグインで次のクラスを定義します

package com.javadude.foo;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.jdt.core.ICompilationUnit;

public class CompilationUnitToFileAdapter implements IAdapterFactory {
    @Override
    public Object getAdapter(Object adaptableObject, Class adapterType) {
        if (adaptableObject instanceof ICompilationUnit)
            // note: "adapting" it here just means returning the ref'd IFile
            return (IFile) ((ICompilationUnit)adaptableObject).getResource();
        return null;
    }
    @Override
    public Class[] getAdapterList() {
        return new Class[] {IFile.class};
    }
}

拡張子

アダプター ファクトリをホストするプラグインで、次を plugin.xml に追加します。

<extension point="org.eclipse.core.runtime.adapters">
    <factory
        adaptableType="org.eclipse.jdt.core.ICompilationUnit"
        class="com.javadude.foo.AdapterFactory1">
        <adapter type="org.eclipse.core.resources.IFile" />
    </factory>
</extension>

アダプターの使用

上記が整ったら、次のように書くことができます。

Object firstElement = ((ITreeSelection) selection).getFirstElement();
IFile file = (IFile) Platform.getAdapterManager().
                         getAdapter(firstElement, IFile.class);
if (file == null)
    // adapter not present; cannot use as IFile
else
    // adapter present - you can use it as an IFile

このアプローチを使用すると、追加のアダプターを追加して他の型を IFile に変換でき、選択コードは気にしません。


ダイレクト ICompilationUnit アプローチ

[編集: 回答を変更しましたが、参照情報として以下を残します。b/c パッケージ エクスプローラーで選択されたコンパイル ユニットのコンテンツを探索する標準的な方法です]

これは、実際には、パッケージ エクスプローラーでファイルの内容を取得するための推奨される方法です...

CompilationUnit を使用する代わりに、ICompilationUnit を使用する必要があります。ほとんどの Eclipse API は、公開用にインターフェースを使用し、内部の詳細にはクラスを使用します。

コードを次のように変更すると

if (firstElement instanceof ICompilationUnit) {
    ICompilationUnit unit = (ICompilationUnit firstElement;
    String contents = new String(unit.getContents());
}

あなたは良い形になります。

Java モデルとソース コードの調査/変更の詳細を確認するには:

(In Eclipse)
Help->
  Help Contents->
    JDT Plug-in Developer's Guide->
      Programmer's Guide->
        JDT Core

これは、Java モデルを適切に操作する方法を示しています

Java モデルを参照する場所を分離するために、Java モデル オブジェクトをファイルに変換する (Eclipse) アダプターを作成できます。そのようなアダプターが存在すると仮定すると、AdapterManager にそれを Java ファイルに変換するように依頼できます。のぞいて、存在するかどうかを確認します。

于 2009-04-22T14:09:19.207 に答える
4

それ (JDT からリソースを切り離すこと) は、E4 (Eclipse 4)の目標の 1 つです。
REsourcesのプラグイン リストでは、JDT について言及されていません (これも Eclipse 4.x のみ)。

  • org.eclipse.core.filesystem- ローカル ファイル システム用のこの API の実装を含む、抽象的な汎用ファイル システム API。これは、リソース プラグインが基盤となるファイル システムにアクセスするための API です。
  • org.eclipse.core.resources- API とリソース モデルの実装が含まれています
  • org.eclipse.core.resources.compatibility- Eclipse 3.1 以降で古いワークスペースを開くユーザーに移行サポートを提供するプラグイン

e4photoのようなデモ プロジェクトでは、 IContainer の選択から IResource にアクセスするための JDT は必要ありません。

void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION)
        IResource selection) {
...
IResource[] members = input.members();
...
IResource resource = members[i];
if (resource.getType() == IResource.FILE) {
  InputStream contents = ((IFile) resource).getContents();
于 2014-01-26T17:25:36.497 に答える
3

何を達成しようとしていますか?ファイルの内容を取得しますか?次に、試すことができます:

IAdaptable firstElement = (IAdaptable) treeSelection.getFirstElement();

IFile file = (IFile) firstElement.getAdapter(IFile.class);
if (file != null && file.isAccessible()) {
    // Use getContents API
    ....
}
于 2009-04-22T07:30:45.997 に答える
3

JDT は、IAdapterFactoryコンパイル ユニット ( ) を含むすべての Java 要素に対して既に を定義しているようorg.eclipse.jdt.internal.ui.JavaElementAdapterFactoryです。アダプターは、IResourceではなくのIFileために定義されているため、次のことができるはずです。

Object firstElement = treeSelection.getFirstElement();

IResource resource = (IResource)Platform.getAdapterManager().getAdapter(firstElement, IResource.class);
于 2014-01-28T21:43:57.517 に答える