1

アプリケーションがあり、既存のコマンドにフックしたいと考えています。ただし、既存のハンドラーを置き換えたくはありません。機能を追加したい(できれば、既定のハンドラーの実行が終了した後)。

これは可能ですか?または、これを行う別の方法を見つける必要がありますか?

シナリオは次のとおりです。誰かがEclipseで何かをコピーしたときに登録したいと思います。次に、ユーザーがコピーしたものを処理したいと思います。既存のコピー機能は優れているので、それを変更したくありません。しかし、誰かがいつコピー コマンドを実行したかを知りたいのです。

注: これは Eclipse 内でのみ機能する必要があります。;) Eclipse の外でクリップボードを監視する必要はありません。

4

1 に答える 1

2

これを行う方法を見つけたと思います!多くの調査を行った後、このインターフェイスを見つけました: IExecutionListener。javadoc は次のように述べています。

コマンドの実行に対するリスナー。コマンドが実行されようとしている場合、およびその実行が完了すると、このリスナーに通知されます。リスナーが実行を防止することはできず、何らかの方法で応答することしかできません。

これはまさに私が望んでいることです: 既存のコマンドに干渉せず、実行時に通知を受けます。

したがって、実行リスナーをデフォルトのコピー コマンドに追加するコードは次のとおりです。

public void addListenerToCopyCommand() {
    ICommandService commandService = (ICommandService) PlatformUI
      .getWorkbench().getAdapter(ICommandService.class);
    Command defaultCopyCommand = commandService
      .getCommand(org.eclipse.ui.IWorkbenchCommandConstants.EDIT_COPY);
    defaultCopyCommand.addExecutionListener(new MyCopyListener());
}

public class MyCopyListener implements IExecutionListener {
        @Override
        public void preExecute(String commandId, ExecutionEvent event) {
            // do nothing
        }

        @Override
        public void postExecuteSuccess(String commandId, Object returnValue) {

            // !!! Do stuff with the copied things here !!!!

            System.out.println("copy command has executed");

        }

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

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

あとは、プラグインの起動時に実行されるプラグインのアクティベーターを追加するだけです。ユーザーが何かをコピーするたびに、プラグインに通知されます。

于 2013-07-18T13:19:49.510 に答える