Eclipse 4 (e4) Tutorial Part 3 - Extending the Application Model

Eclipse 4 (e4) Tutorial Part 3 - Extending the Application Model
http://eclipsesource.com/blogs/2012/06/26/eclipse-4-e4-tutorial-part-3-extending-the-application-model/

Written by Jonas Helming. 

----

      
<h1 class="title">Eclipse 4 (e4) Tutorial Part 3 – Extending the Application Model</h1>
<p>本チュートリアルの前パートでは、アプリケーションモデルを生成し、それらを実装にリンクする方法を
説明しました。

これまでは、単一のアプリケーションモデルを扱うのみでしたが、Eclipseアプリケーションは、
通常、モジュール化設計されます。

このパートでは、既存のアプリケーションモデルを新しい要素で拡張する方法、例えば、メニューに
新しい項目を追加する方法を説明します。

この連載はPDFでダウンロードできます。</p>
<h2>たった１つのモデル？</h2>
<p>Eclipse RCP開発の主な利点の１つに、アプリケーションのモジュール化設計があります。OSGiに基くプラグインの概念は、機能の開発と配置を、必要に応じて独立化することができます。そのようなモジュール化されたアプリケーションのとても良い例として、Eclipse IDEを挙げることが
できます。その中では、多数の追加プラグインがインストールされます。これらの拡張の多くは、アプリケーションのワークベンチ設計に影響を与える、つまり、
追加のボタン、メニュー項目、ビューを追加します。e4におけるアプリケーションモデルは、ワークベンチを設計する上での
中心的な一貫したアプローチですが、新しいプラグインによって、アプリケーションモデルを拡張する方法が必要です。

Eclipse 3.xは、拡張ポイントを使うのに対して、Eclipse4では、アプリケーションモデルを拡張するためのフラグメントとプロセッサを用意しています。フラグメントは、それ自身小さなアプリケーションモデルであり、ルートとなるアプリケーションモデル
に追加されるべき要素を定義します。フラグメントは、アプリケーションモデルの一部と成りえる任意の要素を、モデルに加えることができます。
例えば、ハンドラやメニュー項目、ウインドウなどです。<br />
次に示す図表は、そのような拡張の例です。"org.eclipse.example.e4“プラグイン のアプリケーションモデルは、

"org.eclipse.example.e4.extension“プラグインに含まれるフラグメントにより拡張されます。</p>
<p><a href="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/fragmentextension.png"><img class="aligncenter size-medium wp-image-8473" title="fragmentextension" alt="fragmentextension 300x162 Eclipse 4 (e4) Tutorial Part 3 Extending the Application Model" src="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/fragmentextension-300x162.png" width="300" height="162" /></a></p>
<p style="text-align:center">アプリケーションモデルは、フラグメントを用いて拡張される</p>
<p style="text-align:left">プロセッサは、アプリケーションモデルをプログラム的に拡張する仕組みを提供します。これによって、アプリケーションはモデルの現在の状態に反応することができるようになります。例えば、他のプラグインがインストールされている場合のみに対応したり、既存の要素を取り除ける場合のみに
新たなボタンを追加するなどです。このチュートリアルでは、アプリケーションモデルをフラグメント、プロセッサ双方によって拡張する方法を
説明します。どちらの場合でも、アプリケーションモデルの要素は、以前の章で述べたものと同様の方法で、実装にリンクされます。通常、実装は先の例である"org.eclipse.example.e4.extension“のようなプラグインの一部
として提供されます。</p>
<h2>準備運動</h2>
<p>最初のステップとして、メインプラグインおよび拡張可能なアプリケーションモデルを作成します。本チュートリアルの以前のパートのように、ウィザードを使って生成されるe4テンプレートを
使おうと思います。重要なことは、拡張されるアプリケーションモデルの要素は、固有のIDを持つということです。このIDは、拡張フラグメントが要素を参照する際に使われます。テンプレートアプリケーションの中では、アプリケーションとツールバーは既にIDを持っています。新しいパーツを既存のパートスタックに加えたいので、そのパートスタックにもIDを持たせる
必要があります。そのため、アプリケーションモデル(Application.e4xmi )のパートスタックに対して、"id"フィールドを設定しなければなりません。</p>
<p><a href="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/partstack.png"><img class="aligncenter size-full wp-image-8474" title="partstack" alt="partstack Eclipse 4 (e4) Tutorial Part 3 Extending the Application Model" src="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/partstack.png" width="297" height="221" /></a></p>
<p style="text-align:center">既存のパートスタックには、固有のIDが必要</p>
<p style="text-align:center"><a href="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/idforpartstack.png"><img class="aligncenter size-medium wp-image-8475" title="idforpartstack" alt="idforpartstack 300x60 Eclipse 4 (e4) Tutorial Part 3 Extending the Application Model" src="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/idforpartstack-300x60.png" width="300" height="60" /></a></p>
<p style="text-align:center">IDによって、拡張フラグメントは既存要素を参照することができます。</p>
<p>さらに、最初のプラグインを拡張する２つ目のプラグインが必要です。この２つ目のプラグインは、以下のプラグインへの依存が必要です。<br />

</p>
```
 • org.eclipse.e4.ui.model.workbench
 • org.eclipse.e4.core.di
 • javax.inject
 • 拡張されるプラグイン
```

<h2>モデルフラグメント</h2>
<p>フラグメントは、小規模なアプリケーションモデル以外の何物でもありません。フラグメントを含むファイルは、e4ツールが提供するウィザードを使って生成することができます。</p>
<p><a href="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/new_fragment_001.png"><img class="aligncenter size-full wp-image-8476" title="new_fragment_001" alt="new fragment 001 Eclipse 4 (e4) Tutorial Part 3 Extending the Application Model" src="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/new_fragment_001.png" width="196" height="58" /></a></p>
<p>拡張プラグインは、１つのコンテナとして置かれます。モデルフラグメントファイルは、アプリケーションモデルの変更に使用したエディタと
同様に動作するエディタで開きます。最初のステップは、フラグメントを加えることです。フラグメントは、メインのアプリケーションモデルが拡張される場所を定義する必要があります。これは、要素IDとフィーチャー名によって行われます。要素IDは、メインのアプリケーションモデルの拡張される要素(例えば、ツールバー)を定義します。
フィーチャー名は、追加先を指定するEMF参照を定義します。
フィーチャーは、ツールバーやメニュー、ウインドウ、アプリケーションさえも含む要素に対して、通常、子として定義されます。次の例では、新たな要素を既存のツールバーの子として追加します。</p>
<p><a href="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/select_toolbar.png"><img class="aligncenter size-medium wp-image-8477" title="select_toolbar" alt="select toolbar 300x62 Eclipse 4 (e4) Tutorial Part 3 Extending the Application Model" src="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/select_toolbar-300x62.png" width="300" height="62" /></a></p>
<p style="text-align:center">要素IDは、拡張対象の要素を定義します。</p>
<p style="text-align:center"><a href="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/select_children_of_toolbar.png"><img class="aligncenter size-full wp-image-8478" title="select_children_of_toolbar" alt="select children of toolbar Eclipse 4 (e4) Tutorial Part 3 Extending the Application Model" src="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/select_children_of_toolbar.png" width="296" height="146" /></a></p>
<p style="text-align:center">フィーチャー名は新たな要素が追加される場所を定義する</p>
<p>新たなフラグメント内に他の新規要素を生成することも可能です。簡単な例として、フラグメントの子として、DirectToolItemを追加してみましょう。それを可視化するためには、ラベルもしくはアイコンの設定が必要です。新たに作成したツール項目上のクリックで、アクションがトリガされるようにするには、ハンドラへリンク
する必要があります。この例では、“Hello Eclipse!”を出力するハンドラにリンクされています。</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace"><span style="color:#000000;font-weight:bold">public</span> <span style="color:#000000;font-weight:bold">class</span> MyHandler <span style="color:#009900">{</span>
   @Execute
   <span style="color:#000000;font-weight:bold">public</span> <span style="color:#000066;font-weight:bold">void</span> execute<span style="color:#009900">(</span>Shell parent<span style="color:#009900">)</span> <span style="color:#009900">{</span>
      MessageDialog.<span style="color:#006633">openInformation</span><span style="color:#009900">(</span>parent, <span style="color:#0000ff">""</span>, <span style="color:#0000ff">"Hello Eclipse!"</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#009900">}</span>
<span style="color:#009900">}</span></pre></td></tr></table></div>

<p>DirectToolItemをハンドラに接続するためには、DirectToolItemの“Class URI“を実装クラスに
設定します。このクラスは、拡張プラグインに置かれています。<br />
もちろん、フラグメントには２つ以上の要素を追加することもできます。例えば、お互いに結び付いたツール項目、ハンドラ、コマンドを加えることが可能です。<br />
とにかく、新たなモデルフラグメントは、拡張ポイントを通して登録されます。</p>
```
<extension id=”id” point=”org.eclipse.e4.workbench.model”>
    <fragment uri=”fragment.e4xmi”></fragment>
</extension>
```
<p>最後に、モデルフラグメントを加える新たなプラグインを、既存のプロダクト設定に加える必要があります。アプリケーションを再起動した後、パートスタックに新たなパーツを加えた場合と同様に、
ツール項目が見えるようになります。</p>
<p><a href="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/new_toolbaritem.png"><img class="aligncenter size-full wp-image-8479" title="new_toolbaritem" alt="new toolbaritem Eclipse 4 (e4) Tutorial Part 3 Extending the Application Model" src="http://eclipsesource.com/blogs/wp-content/uploads/2012/06/new_toolbaritem.png" width="173" height="90" /></a></p>
<h2>モデルプロセッサ</h2>
<p>フラグメントを使用することも可能ですが、プログラム的にアプリケーションモデルを拡張することも
できます。e4では、これをプロセッサを使用して実現します。プロセッサは、拡張が、既存のアプリケーションモデル内の状態に応じて対応する必要がある場合、
または既存のアプリケーションモデルが何らかの拡張により変更される予定である場合に、
特に有用です。アプリケーション例においては、既存ウインドウの隣に配置する新たなウインドウを加えます。この新たなウインドウは、既存のウインドウと同じ高さを持ち、左側に置かれます。新たなウインドウ用にスペースを空けるため、既存ウインドウを右にずらします。アプリケーションモデルを変更するには、EMFの経験が使えます。EMFのチュートリアルは、このリンクから見つけることができます。
次のコードは、変更されたアプリケーションモデル(MApplication)を注入する
プロセッサの実装を示したものです。</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace"><span style="color:#000000;font-weight:bold">public</span> <span style="color:#000000;font-weight:bold">class</span> Processor <span style="color:#009900">{</span>
 
   @Inject
   MApplication application<span style="color:#339933">;</span>
 
   @Execute
   <span style="color:#000000;font-weight:bold">public</span> <span style="color:#000066;font-weight:bold">void</span> execute<span style="color:#009900">(</span><span style="color:#009900">)</span><span style="color:#009900">{</span>
      MWindow existingWindow <span style="color:#339933">=</span> application.<span style="color:#006633">getChildren</span><span style="color:#009900">(</span><span style="color:#009900">)</span>.<span style="color:#006633">get</span><span style="color:#009900">(</span><span style="color:#cc66cc">0</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
      existingWindow.<span style="color:#006633">setX</span><span style="color:#009900">(</span><span style="color:#cc66cc">200</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
      MTrimmedWindow newWindow <span style="color:#339933">=</span>
      MBasicFactory.<span style="color:#006633">INSTANCE</span>.<span style="color:#006633">createTrimmedWindow</span><span style="color:#009900">(</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
      newWindow.<span style="color:#006633">setWidth</span><span style="color:#009900">(</span><span style="color:#cc66cc">200</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
      newWindow.<span style="color:#006633">setHeight</span><span style="color:#009900">(</span>existingWindow.<span style="color:#006633">getHeight</span><span style="color:#009900">(</span><span style="color:#009900">)</span><span style="color:#009900">)</span><span style="color:#339933">;</span>
      application.<span style="color:#006633">getChildren</span><span style="color:#009900">(</span><span style="color:#009900">)</span>.<span style="color:#006633">add</span><span style="color:#009900">(</span>newWindow<span style="color:#009900">)</span><span style="color:#339933">;</span>
   <span style="color:#009900">}</span>
<span style="color:#009900">}</span></pre></td></tr></table></div>

<p>最後に、モデルフラグメントに対して行ったのと同様に、プロセッサは、拡張ポイント経由で
登録される必要があります。アプリケーションを再起動後、２つめのウインドウが開かれるでしょう。</p>
```
<extension id=”id” point=”org.eclipse.e4.workbench.model”>
    <processor beforefragment=”true”
               class=”org.eclipse.example.e4.extension.Processor”>
    </processor>
</extension>
```
<h2>まとめ</h2>
<p>モデルフラグメントとプロセッサは、既存のアプリケーションモデルを拡張することができます。UI要素を含む新たな機能を既存アプリケーションに簡単に付け外しできることによって、
アプリケーションのモジュール化を支援します。モデルフラグメントの定義は、アプリケーションモデル自身の定義と同様に動作するため、追加の知識を
必要としません。プロセッサを使ったプログラム的な拡張機能は、堅牢なEMF APIを使用しており、高い自由度を持って
提供されています。<br />
次の章では、Eclipse4における依存性注入について説明しようと思います。異なるアノテーションが、注入されるパラメータに対してどのような影響を与えるかや、
インジェクションを手動でトリガする方法を説明します。</p>
<p> </p>