1

Eclipse プラグイン (Indigo で開発) にハンドラーがあり、テキスト エディターで Java ファイルが保存される (または、理想的には開かれる) たびに実行したいと考えています。私が収集できる限り、これを達成するには2つの方法があります。

  1. CommandServiceAPIを介してプログラムで。
  2. での構成の使用plugin.xml

私はこれらの両方を試しました。このような方法1:

public class Activator extends AbstractUIPlugin {
    @Override
    public void start(final BundleContext context) throws Exception {
        super.start(context);
        ICommandService commandService = (ICommandService) PlatformUI
              .getWorkbench().getService(ICommandService.class);
        commandService.addExecutionListener(new MyListener());
        plugin = this;
    }
    ...
}

public class MyListener implements IExecutionListener {
    @Override
    public void postExecuteSuccess(final String commandId, final Object returnValue) {
        System.out.println("PostEventSuccess:" + commandId);
    }

    @Override
    public void preExecute(final String commandId, final ExecutionEvent event) {}

    @Override
    public void notHandled(String commandId, NotHandledException exception) {}

    @Override
    public void postExecuteFailure(String commandId, ExecutionException exception) {}
}

および方法2.次のように:

<extension point="org.eclipse.ui.handlers">
    <handler 
        commandId="org.eclipse.ui.file.save"
        class="mypackage.MyHandler">
        <activeWhen>
            <with variable="activeWorkbenchWindow">
                <instanceof value="org.eclipse.ui.IWorkbenchWindow"/>
            </with>
        </activeWhen>
    </handler>
</extension> 

方法 1. はリスナーをまったく実行しません。方法 2. は、ハンドラーが実行されるという点で機能しますが、私のハンドラーはデフォルトのハンドラーを置き換えているようです。ユーザーがファイルを保存しようとすると、ハンドラーが実行されますが、ファイルは保存されません。ハンドラー自体は問題ないようです (それを実行するメニュー項目を作成してテストしました)。

方法 1. は現在廃止されていますか、それともサービスを正しく実装していませんか? 方法 2. でファイルを保存するにはどうすればよいですか? 私のハンドラーからデフォルトのハンドラーを実行できますか?

4

1 に答える 1

2

これら 2 つの違いは、一方がプログラム的で他方が宣言的であるという点だけではありません。コマンドが実行されたことを通知されるだけでなく、コマンドの実行を処理するため、コマンドハンドラーの定義は間違っていると思います。最初のアプローチは問題ないように見えますが、プラグインがアクティブ化されるまでコードは実行されません。これは、バンドルの最初のクラスがロードされるときに遅延して発生します。org.eclipse.ui.startupEclipse には回避策があります。拡張ポイントに貢献してください。たとえば、Activatorクラスの実装IStartupを作成します。空の実装を使用できます。唯一のポイントは、フレームワークにバンドルから任意のクラスをロードさせることです。

于 2012-04-20T21:24:22.053 に答える