読者です 読者をやめる 読者になる 読者になる

Commands Part 1: Actions vs Commands

Eclipse Tipsの翻訳です。Eclipse Platformの3.3で導入されたコマンドフレームワークについていいシリーズがまとまっていたので翻訳しました。Part1ではなぜコマンドフレームワークが必要なのか、語られています。
このシリーズは全部で6パートに分かれていますが、一通り翻訳するつもりです。画像に関しては元記事を参照してください。

(2009/03/17 22時追記)
訳がひどかったので、直しました。ごめんなさい><

原文

著者:Prakash G.R.
2009/01/02に記述

あなたはワークベンチに対して機能を追加する時、二つの異なる方法があることを既に知っていますよね。ActionとCommandです。Commandは新しく、進歩したものではありますが、普段は簡単なのでActionを使っています。私はActionを使うことに不自由を感じていません。私はコマンドフレームワークのいくつかのバグを修正し始めました。その詳細について、中を見なければならなかったのです。Commandについてより詳しく見ていくことで、私はCommandにより愛着を持ったのです。なので私はCommandについてのシリーズを書くことにし、この記事はシリーズの一番最初のものです。*1ここに上げられるたくさんの情報は、いくつかの古いバグや、Wiki、CVSのヒストリーなどを探す時に見つけたものです。もしなにか間違っていたり、下記漏れていることがあれば筆者まで教えてください。

それではActionから始めましょう。私達はメニューやツールバー、プルダウンなどをワークベンチにコントリビュートすることができます。また私たちはラベルやツールチップなどplugin.xmlにUIの詳細を記述することができたり、実行時にロードする、遅延ロードを実現しています。なのに何が間違っているのでしょう?

  • UIとハンドリングはいつも強固に結びつきます。あなたはUIとハンドリングを分離する方法がないのです。
  • アクションはワークベンチ(ポップアップメニューやツールバー)の違うパートにコントリビュートするために、いくつかの場所に重複してXMLに記述しなければなりません。すべての拡張ポイントが同じ設定とならないことが一番まずいポイントです。
  • 複数の場所に記述されたアクションをメンテナンスする事は悪夢のような事です。もしあなたがアクションのアイコンを変えたとしましょう。あなたは全ての場所に記述されたアイコンを修正する必要があるのです。
  • 他にもplugin.xmlにアクションを重複して登録する問題として、メモリ内に同じアクションのインスタンスが複数作成される事が上げられるでしょう。

それではコマンドフレームワークがこれらをどのように取り除くのか、見ていきましょう。

コマンドは"org.eclipse.ui.commands"という拡張ポイントによって定義されます。典型的なコマンドの定義は下記のようになります。:

<command
         id="com.eclipse-tips.commands.someCommand"
         name="Some Command">
</command>

そうです。これだけです。これだけでコマンドを定義できました。
もしこのコマンドをツールバーに置くとしましょう。"org.eclipse.ui.menus"拡張ポイントを使わなければなりません。

<menuContribution
      locationURI="toolbar:org.eclipse.ui.main.toolbar">
   <toolbar
         id="com.eclipse-tips.commands.toolbar1">
      <command
            commandId="com.eclipse-tips.commands.someCommand"
            id="com.eclipse-tips.commands.someCommandInToolBar">
      </command>
   </toolbar>
</menuContribution>

これでUIに配置することが出来ました。

それではどうやってコードを実行するのでしょうか?それには別の拡張ポイントである"org.eclipse.ui.handlers"を使って定義します。:

<handler
         class="com.eclipse_tips.commads.SomeCommandHandler"
         commandId="com.eclipse-tips.commands.someCommand">
</handler>

最後の1ピースはコマンドにアイコンを加えることです。
推測できると思いますが、これにも別の拡張ポイントである"org.eclipse.ui.commandImages"を使う必要があります。:

<image
         commandId="com.eclipse-tips.commands.someCommand"
         icon="icons/sample.gif">
</image>

これで全て設定できました。それではアクションの中のコマンドを見てみましょう。


画像については原文を参照してください

ご存知のとおり、アクションを定義するためには私たちは唯一つの拡張ポイントを使うだけで済ませることができました。対してコマンドを使った場合は4つの拡張ポイントを使わなければなりません。これは回り道をしているように聞こえるかもしれません。たぶん私たちはコマンドを使って複数のハンドラについて知ったり、コンテキストベースのつながり、ハンドラーの有効化など、私たちはこのフレームワークの素晴らしさを知らないためにそう思うのです。このシリーズでは今後下記について見ていきます。

  • Part 2: 選択によるHandlerの有効化
  • Part 3: コマンドのパラメータ
  • Part 4: 様々なアイテム
  • Part 5: ISourceProviderとコマンドを動的に更新する
  • Part 6: 'toggle'と'radio'スタイルのメニューへの追加

*1:このシリーズではコントリビュートと言う単語が何度も出てきます。コントリビュートとはEclipseのワークベンチに機能を追加することを指します。Eclipseはpluginを導入することで機能を追加する事ができますが、それをコントリビュートと呼んでいます。