プラットフォームでスクリプトコントリビューションを活用する
これで、次の段階に進む準備ができました。今度は、スクリプト言語を使用してEclipseプラットフォームを直接操作して変更する方法、そしてスクリプトを使ってプラットフォームにコントリビューションを追加する方法を見ていきましょう。まずは、スクリプトコントリビューションとプラットフォームとの間を結ぶバインディングレイヤーの定義が必要です。このレイヤーには、以下のものが含まれます。
- 標準のビューコントリビューションの代わりとなる、標準のEclipse拡張ポイントを模倣する拡張ポイント(scriptedViewなど)。スクリプトから返されるEclipseビューを提供するために必要。
- org.eclipse.ui.part.ViewPartなどの標準Eclipseインターフェイスを実装し、メソッド呼び出しを基幹スクリプトに委任するプロキシクラス。
- org.eclipse.ui.startup拡張ポイントへの拡張。スタートアップ時にスクリプトコントリビューションとプラットフォームとの間のすべてのプラミングとバインディングを行う。
JavaScript実装に支えられているEclipseビューの例を見てみます。図4は、この例のサイクル全体を表しています。これを見ると、構成/スタートアップ時に実行されるアクションと、実行時に実行されるアクションの違いがわかります(Eclipseアクションセットなど、他の種類のコントリビューションについては、サンプルコードを参照してください)。
まず、次のコードを使用して、スクリプトコントリビューションを定義します。
<plugin> <extension point="com.devx.scripting.scriptedContribution"> <scriptedView allowMultiple="false" id="com.devx.scripting.jsCalculator name="JavaScript Calculator"> <script extension="js" id="com.devx.scripting.jsCalculator.script" uri="scripts/jsCalculator.js"> </script> </scriptedView> </extension> </plugin>
この拡張は標準のorg.eclipse.ui.viewsと非常によく似ています。唯一異なるのは追加の<script>エレメントです。これは基幹スクリプトを定義します(uri属性は、プラグイン内のリソースまたは外部リソースを指定できます。プラグイン内のリソースの場合は関連URIを、外部リソースの場合はfile://スキームを使用します)。アプリケーションの起動時に、org.eclipse.ui.startup拡張ポイントとして登録されているcom.devx.scripting.ScriptingStartupクラスは、使用可能なスクリプトコントリビューションをスキャンし、これらのコントリビューションをIExtensionRegistry.addContribution()メソッドで動的にプラットフォームに追加します。なお、動的コントリビューションには特別な許可が必要です。この許可は、アプリケーション起動時に-Declipse.registry.nulltoken=trueコマンドラインを追加することで付与します。
ScriptingStartupクラスは、スクリプトコントリビューションと、スクリプトのプロキシとして動作するコントリビューションとの間で変換を行います。リスト2は、変換プロセスに関連するgetContribution()メソッドです。
おわかりのように、このコードはスクリプトコントリビューションをコピーして、それを標準のorg.eclipse.ui.viewsに変換するだけです。ビュー実装クラスであるcom.devx.scripting.view.ScriptProxyViewは、Eclipseプラットフォームによるビューへの呼び出しを基幹スクリプトに委任します。たとえば、次のコードは、スクリプトへのレンダリングプロセスの委任を示しており、これは、EclipseがcreatePartControl(Composite parent)を呼び出してビューを描画するときに実行されます。
scriptParent = new Composite(parent,SWT.NONE); scriptParent.setLayoutData(new GridData(GridData.FILL_BOTH)); scriptParent.setLayout(new FillLayout(SWT.HORIZONTAL)); // this call returns the script associated with this view IScript script = getScript(); Map<String,Object> params = new HashMap<String,Object>(); params.put("parent", scriptParent); new ScriptSupport().runScript(script, params);
これにより、スクリプトに対する変更がすぐに反映されるため(ビューを閉じて開くだけで確認できます)、開発者はユーザーインターフェイスのプロトタイプを短時間で作成できるようになります。

