SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Eclipse RCPを好きなスクリプト言語で拡張する

JavaScript、AppleScript、Rubyなどを使ったEclipseの拡張

JavaScriptを使った計算機のサンプル

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

図5 JavaScript計算機
図5 JavaScript計算機

 リフレッシュボタンを押すとスクリプトが再度読み込まれ、変更が即座にUIに反映されます。

 スクリプト言語は、他にも多数のシナリオでEclipse内でインターフェイスを描画するのに役立ちます。たとえば、Groovyを使用してSWTインターフェイスを作成したり、このRubyライブラリを使用してRubyでSWTインターフェイスを作成することで、ビルダパラダイムを利用できます。

リスト2 ScriptingStartupから呼び出される^^getContribution()^^メソッド
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("\" ");
}
リスト3 JavaScript計算機
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 MonkeyEclipseShellなどのプロジェクトが、Eclipseプラットフォームに対してスクリプトサポートを提供しています。これを書いている時点では、この記事の一番の目的であるJSR-223をサポートしていなかったため触れていませんが、両方とも興味深い内容なので、その一部をサンプルコードで使用しました(Monkey Domなど。Eclipse拡張を使ってカスタムオブジェクトをスクリプトに提供しています)。少し時間を割いて見てみてもいいでしょう。

補足説明1 EclipseのRich Client Platform
 EclipseのRich Client Platform(RCP)は、アプリケーション開発のための完全に整備された基盤を提供するという目的で選び出されたEclipseプラットフォームのコアコンポーネントの集まりです。RCPを使用すると、設定管理、更新管理、GUIエレメントなど、すべてのアプリケーションに共通の機能を手動でプログラムする必要がなくなり、アプリケーション固有のロジックに集中できます。
補足説明2 Eclipseプラグインのしくみ
 Eclipseプラットフォームのプラグインは、このプラットフォームに機能を追加するためのもので、プロプライエタリなプラグインとユーザー提供のプラグインの両方があり、メニュー、ツールバー、ビュー、エディタ、ウィザード、基幹サービスなど、あらゆる形式のプラグインが使われています。プラグインは、他のプラグインに対して拡張を宣言することで、そのプラグインに依存できます。また、他のプラグインに対して拡張ポイントを公開することもできます。この観点から見ると、Eclipseというプラットフォームは、それ全体が一連の相互接続された通信プラグインにすぎません。具体的に説明すれば、プラグインは、「plugin.xml」記述子ファイルを使用して依存と拡張ポイントを宣言しているただのjarファイルです。プラグインには、ゼロ以上のフラグメントを含めることができます。プラグインフラグメントは、そのターゲットプラグインに対して追加機能を提供します。実行時には、これらのフラグメントがターゲットプラグインにマージされます。フラグメントを使用すると、プラグインの一部をオプションにすることができ、プラグインを部分的にインストールしたり、アンインストールしたり、更新したりすることが可能になります。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Riccardo Govoni(Riccardo Govoni)

2003年からJ2EE開発者としてイタリアの金融サービス会社に勤務。ソフトウェアアーキテクトとして従来の銀行システムのWebフロントエンドの設計に従事。物理学修士。SCJP(Sun Certified Java Programmer)資格を持つ。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1443 2007/07/03 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー