JavaScriptを使った計算機のサンプル
これで、スクリプト言語のメリットを利用して、従来のJavaコードでは実現に手間がかかっていた機能も実現できるようになります。たとえば、単純な計算機なども実現可能です。JavaScriptとそのeval()関数を使用すれば、ユーザーからサブミットされた数式を評価するためのコードを書かずにすみます。図5に、実際の表示例を示します。リスト3はそれを作成するJavaScriptコードです。

リフレッシュボタンを押すとスクリプトが再度読み込まれ、変更が即座にUIに反映されます。
スクリプト言語は、他にも多数のシナリオでEclipse内でインターフェイスを描画するのに役立ちます。たとえば、Groovyを使用してSWTインターフェイスを作成したり、このRubyライブラリを使用してRubyでSWTインターフェイスを作成することで、ビルダパラダイムを利用できます。
public String getContribution(IConfigurationElement el) { StringBuilder sb = new StringBuilder(); sb.append("<plugin>"); sb.append("<extension point=\"org.eclipse.ui.views\">"); sb.append("<view "); appendAttribute(sb, el, "allowMultiple"); appendAttribute(sb, el, "category"); appendAttribute(sb, el, "name"); appendAttribute(sb, el, "icon"); appendAttribute(sb, el, "fastViewWidthRatio"); // Id attribute sb.append(" id=\""). append(getContributionId(el)).append("\" "); // Class attribute sb.append(" class=\"" sb.appnend("com.devx.scripting.view.ScriptProxyView\""); sb.append("/>"); sb.append("</extension>"); sb.append("</plugin>"); return sb.toString(); } public String getContributionId(IConfigurationElement el) { return el.getAttribute("id") + ".autoView"; } private void appendAttribute( StringBuilder sb, IConfigurationElement el, String attribute) { if (el.getAttribute(attribute) != null) sb.append(" "). append(attribute). append("=\""). append(el.getAttribute(attribute)). append("\" "); }
importPackage(org.eclipse.ui); importPackage(org.eclipse.swt); importPackage(org.eclipse.swt.widgets); importPackage(org.eclipse.swt.events); importPackage(org.eclipse.swt.layout); c = new Composite(parent,SWT.NONE); c.setLayout(new GridLayout(1,true)); t = new Text(c,SWT.BORDER); t.layoutData = new GridData(GridData.FILL_HORIZONTAL); t.editable = false; buttonArea = new Composite(c,SWT.NONE); buttonArea.setLayout(new GridLayout(4,true)); buttonArea.setLayoutData(new GridData(GridData.FILL_BOTH)); var labels = new Array( "Clr","Bck","(",")", "7","8","9","/", "4","5","6","*", "1","2","3","-", "0",".","=","+"); keylistener = { widgetSelected: function(event) { t.text += event.widget.text } , widgetDefaultSelected: function(event) { } } evallistener = { widgetSelected: function(event) { t.text = eval("res = " + t.text) } , widgetDefaultSelected: function(event) { } } clearlistener = { widgetSelected: function(event) { t.text = "" } , widgetDefaultSelected: function(event) { } } backlistener = { widgetSelected: function(event) { s = "" + t.text; // conversion to javascript string t.text = s.substring(0,s.length-1); }, widgetDefaultSelected: function(event) { } } for (i = 0; i < labels.length; i++ ) { b = new Button(buttonArea, SWT.BORDER); b.layoutData = new GridData(GridData.FILL_BOTH); b.text = labels[i]; switch(labels[i]) { case "Clr" : b.addSelectionListener( new SelectionListener(this.clearlistener)); break; case "Bck" : b.addSelectionListener( new SelectionListener(this.backlistener)); break; case "=" : b.addSelectionListener( new SelectionListener(this.evallistener)); break; default: b.addSelectionListener( new SelectionListener(this.keylistener)); } }
Eclipseとスクリプト言語との完全統合に向けて
以上の説明で、Javaプラットフォームが提供する新しいスクリプト機能とEclipseとの統合がいかに簡単であるかという点についてはおわかりいただけたのではないでしょうか。これで、スクリプトエンジンをEclipseプラグインアーキテクチャに組み込んで、Eclipse環境からスクリプトを実行できます。また、Eclipseプラットフォームのまさに核となる部分でスクリプト言語を使用して、ビューやアクションセットなど、標準の拡張ポイントへの拡張を提供する方法も説明しました。
ここで説明した以外にも、Eclipse MonkeyやEclipseShellなどのプロジェクトが、Eclipseプラットフォームに対してスクリプトサポートを提供しています。これを書いている時点では、この記事の一番の目的であるJSR-223をサポートしていなかったため触れていませんが、両方とも興味深い内容なので、その一部をサンプルコードで使用しました(Monkey Domなど。Eclipse拡張を使ってカスタムオブジェクトをスクリプトに提供しています)。少し時間を割いて見てみてもいいでしょう。
参考資料
- Eclipse RCP Meets Spring: A Perfect Thick-Client Match
- Build a Java App Server Foundation for Thick-Client Deployment
- Leverage JNLP and SOAP for Java Thick-client Development
- Java SE 6 First Impressions: A Desktop Winner
- Take Charge of Desktop Integration with Java SE 6
- Java SE 6's New Scripting and Compiling Goodies
- Mustang Must-Haves: What's Cool in Java SE 6
- Java Zone
- DevX: Java Zone
- Eclipse
