[編集: 次の代替案を追加しました - 元の答えはファーザー ダウンです]
まず、Package Explorer で何かを選択した場合、選択された項目はすべて Java モデル オブジェクトです。あるレベルでそれらを処理する必要があります。これを処理するには、次の 2 つの方法があります。
- ICompilationUnit を直接使用する (下を参照)
- 変換を自動化するための 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 ファイルに変換するように依頼できます。のぞいて、存在するかどうかを確認します。