Tree
このチュートリアルに似た JFace でプラグインを作成しました:チュートリアル
また、コマンドを含むメニュー エントリも定義しました。コマンドのハンドラーは、ツリーのモデルを変更して更新する必要があります。しかし、正しいツリー ビュー ( TreeViewer
/ ViewPart
) を取得する方法と、コマンド ハンドラーからモデルにアクセスする方法がわかりません。誰か助けてくれませんか?
Tree
このチュートリアルに似た JFace でプラグインを作成しました:チュートリアル
また、コマンドを含むメニュー エントリも定義しました。コマンドのハンドラーは、ツリーのモデルを変更して更新する必要があります。しかし、正しいツリー ビュー ( TreeViewer
/ ViewPart
) を取得する方法と、コマンド ハンドラーからモデルにアクセスする方法がわかりません。誰か助けてくれませんか?
解決策 1 - 独自の API を使用する
アクティブな MPart を Handler に挿入し、part.getObject() を使用してコントリビューション クラスを取得できます。その後、独自の API にアクセスしてモデルと TreeViewer を取得できます。
@Execute
public void executeHandler(@Named(IServiceConstants.ACTIVE_PART) MPart part) {
MyPart myPart = (MyPart)part.getObject();
MyModel myModel = myPart.getMyModel();
TreeViewer viewer = myPart.getMyTreeViewer();
}
解決策 2 - DI を使用する
TreeViewer を初期化するときは、Part の IEclipseContext に配置します。その後、TreeViewer を Handler に挿入できます。
public class MyPart {
@PostConstruct
void postConstruct(Composite parent, IEclipseContext context) {
TreeViewer viewer = new TreeViewer(parent);
context.set(TreeViewer.class, viewer);
}
}
public class MyHandler {
@Execute
public void executeHandler(TreeViewer viewer) {
}
}
もちろん、モデルでも同じことができます。モデルのインスタンスが 1 つしかない場合 (MyModel がシングルトンの場合)、パーツのコンテキストではなく、アプリケーションのコンテキストに配置できます。これを行うのに適した場所は、AddOn (または LifeCycleHandler) です。
または、MyModel クラスを @Creatable @Singleton に定義して、オンデマンドで DI によって作成されるようにすることもできます。これは、MyModel に必要なものがすべてコンテキスト内にある場合に便利です。
このような状況での私のお気に入りのソリューションは、ModelService を OSGi サービスとして作成することです。OSGi サービスは、IEclipseContext を介して常に利用できます。
DI の詳細については、Lars Vogel によるこのチュートリアル (18、31、32 章) を参照してください: http://www.vogella.com/articles/EclipseRCP/article.html#dependencyinjectione4 http://www.vogella.com/記事/EclipseRCP/article.html#extentcontext http://www.vogella.com/articles/EclipseRCP/article.html#ownobjects