2012-04-20 13 views
1

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

  1. プログラムではCommandService API経由です。コンフィギュレーションを使用して

plugin.xmlに私はこれらの両方を試してみました。このような

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:このような方法1

<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.ファイルを保存するにはどうしたらよいですか?ハンドラからデフォルトハンドラを実行できますか?

+2

これらの2つはプログラム的であり、もう1つは宣言的である点で違いはありません。私は、コマンドハンドラを定義するのは間違っていると思います。コマンドが実行されたことを通知するのではなく、コマンドの実行を処理します。たぶん私は最初の方法で何かを掘り起こすでしょう。 –

+0

プラグインが有効になっていること、つまり 'start'のコードが実際に実行されたことは確実ですか? –

+0

良い質問です。私がいくつかの 'println'ステートメントをActivatorとListenerに置くと、そのコードが実行されていないかのように見えます。しかし、設定は正しい 'Activator'クラスを指しています。非常に奇妙な。 – snim2

答えて

2

これらの2つは、プログラム的であり、他の宣言的な点で違いはありません。私は、コマンドハンドラを定義することは間違っていると思います。これは、コマンドが実行されたことを通知するのではなく、コマンドの実行を処理するためです。あなたの最初のアプローチはうまくいくようですが、あなたのコードは、プラグインが起動されるまで実行されません。これは、バンドルの最初のクラスがロードされたときに遅延して発生します。 Eclipseには回避策があります:org.eclipse.ui.startup拡張ポイントに貢献してください。例: ActivatorクラスはIStartupを実装していますが、空の実装を使用できます。唯一のポイントは、クラスをバンドルからロードするフレームワークを取得することです。

+0

ありがとうございます。私はマニフェストからそれを削除しましたが、 'Activator'はまだリスナーをロードしていないか、' start() 'メソッドを実行しているようです。 – snim2

+1

答えを編集しました。この新しいアプローチが機能するには、ActivationPolicy行を削除する必要はありません。 –

+0

素晴らしい、ありがとう! – snim2

関連する問題