カスタム コントロールを広範に配布する場合や、カスタム コントロールを大幅にカスタマイズしたい場合は、コントロールをプラグインとしてパッケージ化できます。この方法のメリットは以下のとおりです。
このトピックでは、コントロールをプラグインにパッケージ化する方法について説明します。この方法では Eclipse プラグインを作成するため、Eclipse プラグインおよびその作成方法についての基礎知識があるとより理解が深まります。
なお、この方法では、コントロール JAR をプラグインにラップします。社内での配布の場合は、わざわざプラグインを作成する必要はなく、単純にコントロール JAR ファイルを直接共有できます。
この方法の手順は次のとおりです。
「JAR へのコントロールのエクスポート」で説明されている手順に従います。
[次へ] をクリックします。

次の画面で、[プラグイン・プロバイダー] フィールドに入力して [終了] をクリックし、プロジェクトを作成します。

[はい] をクリックして [プラグイン開発] パースペクティブに変更します。
プラグイン プロジェクトのルートに (src フォルダの下ではなく)、lib フォルダを作成します。(前の手順で作成した) コントロール JAR を lib ディレクトリにコピーします。

マニフェストのエディタ ウィンドウが表示されていない場合は、MANIFEST.MF ファイルをダブルクリックしてウィンドウを開きます。エディタで、[依存関係] タブをクリックするか、[プラグイン・コンテンツ] セクションの [依存関係] リンクをクリックします。[必須プラグイン] セクションで [追加] ボタンをクリックして、次のプラグインを選択します。
[OK] をクリックして依存関係を追加します。[ファイル|すべて保管] をクリックして、依存関係を MANIFEST.MF ファイルに保存します。
[拡張] タブをクリックします。[追加] をクリックして、以下を選択します。

[終了] をクリックして拡張を追加します。[ファイル|すべて保管] をクリックして変更内容を保存します。
新しいファイル plugin.xml がプロジェクトに追加されています。このファイルには、以下の拡張情報が記述されています。
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
<extension
point="com.bea.workshop.controls.core.controls">
</extension> </plugin>
com.bea.workshop.controls.core.controls 拡張ポイントには、少なくとも id、class、isControlExtension、および isExtensible 属性を指定したネストされた <control> タグが含まれている必要があります。例を示します。
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin> <extension point="com.bea.workshop.controls.Controls"> <control id="com.mycompany.example.MyExampleControlId" class="com.mycompany.example.control.MyExampleControl" isControlExtension="false" isExtensible="false" /> </extension> </plugin>
<control> タグの属性は、以下のとおりです。
|
||||||||||||||||||||||||||||||||||||||||||||||||||
次に、多くの属性を使用した <control> タグの例を示します。
<extension point="com.bea.workshop.controls.core.controls">
<control
class="com.mycompany.controls.MyControl"
id="MyControl12"
groupName="My Company"
groupPriority="10"
includeInPalette="true"
insertionDelegateClass="com.mycompany.workshop.MyInsertionDelegate"
isControlExtension="false"
isExtensible="false"
label="Sample Control"
palettePriority="10"
priority="10" />
</extension>
<control> タグの insertionDelegateClass 属性は、挿入の委託を示し、コントロールがファイルに挿入されるときに委託をトリガします。この属性はさまざまな用途に使用できますが、(たとえばファセットやライブラリ モジュールとして) まだプロジェクトに含まれていない場合は、後述のようにコントロール JAR をユーザのプロジェクトにコピーするために使用するのが一般的です。
コントロールをプラグインに含める場合、JAR ファイルはプラグインに配置されますが、コントロールのユーザのプロジェクトには配置されません。JAR をプラグインからコントロールを使用するプロジェクトにコピーするには、以下のようなコードを挿入の委託に挿入する必要があります。このコードでは、挿入の委託が呼び出されると、コントロール JAR がユーザのプロジェクトにコピーされます。
挿入の委託を作成するには、src フォルダ内にパッケージを作成し、挿入の委託のクラス用のファイルを作成します。
挿入の委託のサンプル コードを以下に示します。当然、パッケージ名とクラス名は更新する必要があります。
package org.example.controls.workshop;
import java.io.File;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.swt.widgets.Display;
import com.bea.workshop.controls.core.model.IControlInsertionDelegateContext;
import com.bea.workshop.controls.ui.actions.DefaultControlInsertionDelegate;
public class SampleInsertionDelegate extends DefaultControlInsertionDelegate {
@Override
public IJavaElement insertControl(IControlInsertionDelegateContext ctxt) {
try {
File file = getFileFromPlugin(Activator.getDefault(), "/lib/TestControl.jar");
copyJarIfNecessary(ctxt, file, file.getName());
return super.insertControl(ctxt);
} catch (Exception e) {
String message = "Error inserting control";
error(message,e);
}
return null;
}
private void error(String message, Exception e) {
ErrorDialog.openError(Display.getCurrent().getActiveShell(),
"Control Insert Error",
message + " - " + e.getMessage(),
new Status(IStatus.ERROR,Activator.PLUGIN_ID,1,"Control Insert Error",e));
}
}
上のサンプル コードは、「コントロールをプロジェクトに挿入する」例です。パラメータを収集して追加のアノテーションを挿入するカスタム ウィザードを使用する場合は、コードを次のように更新できます。
public IJavaElement insertControl(IControlInsertionDelegateContext ctxt) {
try {
// ここでウィザードを起動して処理を完了させる。必要に応じてパラメータを
// 収集してから、ファイルをコピーしてパラメータをアノテーション値
// として使用する。
File file = getFileFromPlugin(Activator.getDefault(), "/lib/TestControl.jar");
copyJarIfNecessary(ctxt, file, file.getName());
HashMap<String, String> attrs = new HashMap<String, String>();
attrs.put("attr", "aValue");
return super.insertControl(ctxt,"org.example.controls.SampleControl.SamplePropertySet",attrs);
} catch (Exception e) {
String message = "Error inserting control";
error(message,e);
}
return null;
}
前の例は、1 つのアノテーションを追加する場合に便利な API です。追加するアノテーションが複数ある場合は、次の例のように AnnotationInfo オブジェクトのリストを使用できます。
public IJavaElement insertControl(IControlInsertionDelegateContext ctxt) {
try {
// ここでウィザードを起動して処理を完了させる。必要に応じてパラメータを
// 収集してから、ファイルをコピーしてパラメータをアノテーション値
// として使用する。
File file = getFileFromPlugin(Activator.getDefault(), "/lib/TestControl.jar");
copyJarIfNecessary(ctxt, file, file.getName());
List infos = new ArrayList();
HashMap<String, String> attrs1 = new HashMap<String, String>();
attrs1.put("attr", "aValue");
AnnotationInfo info1 = new AnnotationInfo(
"org.example.controls.SampleControl.SamplePropertySet",attrs1);
infos.add(info1);
HashMap<String, String> attrs2 = new HashMap<String, String>();
attrs2.put("anotherAttribute", "aValue");
AnnotationInfo info2 = new AnnotationInfo(
"org.example.controls.SampleControl.SamplePropertySet",attrs2);
infos.add(info2);
return super.insertControl(ctxt,infos);
} catch (Exception e) {
String message = "Error inserting control";
Activator.getDefault().logError(message, e);
error(message,e);
}
return null;
}
DefaultControlInsertionDelegate によって提供される API の詳細については Javadoc を参照してください。
[ビルド] タブをクリックして、プラグインに lib ディレクトリが含まれていることを確認します。[バイナリー・ビルド] セクションの [lib] フォルダをクリックして、プラグインが正しくビルドされていることを確認します。
プラグインを実行するには、[実行|Eclipse アプリケーション] コマンドを使用して、プラグインが正しく動作するかどうかをテストします。
[概要] タブをクリックします。[エクスポート・ウィザード] をクリックして、コントロール JAR、挿入の委託、およびその他の必要なファイルを格納するプラグイン JAR を作成します。このビューが表示されない場合は、META-INF/MANIFEST.MF を右クリックして [開く] を選択すると、ビューが表示されます。

[エクスポート] ダイアログで、必ずプラグイン ファイルを作成するディレクトリを設定します。デフォルトでは、[ソース・コードを組み込む] オプションが無効になっているため、コントロールのソース コードをプラグイン ユーザが使用できません。プラグインの送り先ディレクトリを指定して [終了] をクリックすると、コントロール プラグイン ファイルが作成されます。

これで、作成したプラグインを、他の Eclipse プラグインと同じように他の開発者に配布できます。