3

私の元の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は、グローバルハンドラーサービスです。特別なアクティベーションスコーピングやライフサイクルは提供されません。

4

1 に答える 1

1

申し訳ありませんが、質問する前にもう少し待つ必要がありました、私はそれを理解しました!

変更しました、

IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class); 

IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);

そしてそれはうまくいった。他の人の役に立つ場合に備えて、質問を残しておきます。

于 2012-12-04T17:21:49.460 に答える