私の元のRCPは3.xで開始され、現在、互換性レイヤーを使用してJunoで実行しています。私はソフトマイグレーションを検討していたので、徐々に慣習を変え始めました。私がしていることの1つは、アクションをコマンドに変更することです。
現在、ビューのツールバーとポップアップメニューにアクションを追加するビュー(ディレクトリエクスプローラーのようなもの)があります。これらのアクションは、ビュー内の特定のメソッドを呼び出します。たとえば、1つのディレクトリを上に移動します。
Viewクラス自体でアクションを作成し、プログラムでツールバーに追加するだけなので、アクションでこれを行うのは簡単でした。
IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
mgr.add(upDirectory);
mgr.add(refresh);
mgr.add(changeRoot);
アクションの作成はから呼び出されますcreatePartControl()
upDirectory = new Action("Go up one directory") {
public void run() {
goUpOneDirectory();
}
};
goUpOneDirectory()
ビュー内のメソッドはどこですか
これをコマンドに変換したい場合は、ハンドラーでビューのこのメソッドにアクセスできるようにします。だから私は次のことを試みました、
private void createHandlers()
{
IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
IHandler upDirHandler = new AbstractHandler() {
public Object execute(ExecutionEvent event)
throws ExecutionException {
goUpOneDirectory();
return null;
}
};
handlerService.activateHandler("updir.id", upDirHandler);
}
そして、createHandlers
で呼び出されcreatePartControl
、コマンドはplugin.xmlを介してビューのツールバーに追加されます。問題は、ビューの焦点が合っていない瞬間に、これらのコマンドのツールバーのボタンが無効になることです。
常に有効にしてほしい。どうやってやるの?
私はisEnabled()
リターンが常に真であることを知っているので、なぜそれが起こるのかわかりません。activateHanlderは一度呼び出されるcreatePartControl
ので、常にアクティブである必要があると思います。
編集:わかりました、私はこれを見たばかりです、
ワークベンチパーツサイトのIHandlerServiceは、パーツハンドラサービスです。パーツハンドラサービスを介してアクティブ化されたハンドラは、そのパーツがアクティブな場合にのみアクティブになります。パーツハンドラサービスに追加されたリスナーは、パーツが廃棄されるときに削除され、アクティブなハンドラは非アクティブ化されます(ただし、廃棄されません)。
では、どうすればこれを入手できますか?
ワークベンチのIHandlerServiceは、グローバルハンドラーサービスです。特別なアクティベーションスコーピングやライフサイクルは提供されません。