ということで、前回つくったMyStaticTextを、Visual Web JSF(Visual Web Pack)のデザイナ上にポトペタ出来るようにしてみようと思う。
とりあえず、MyStaticText-Designtimeという名前で、前回作ったJSFComponentフォルダにプロジェクトを作る。
一応ライブラリフォルダには「..\lib」を選択しておいた。
次に、ライブラリにMyStaticText-Runtimeを追加しておく。
そして、NetBeansのインストールフォルダの下のvisualweb2/modules/extにあるdesigntime.jarとdesigntime-base.jarも追加する。
最後に、visualweb2/modulesにあるorg-netbeans-modules-visualweb-propertyeditors.jarも追加する。
最後に追加したjarは、プロパティエディタが色々入ってるのでとても便利です。
MyStaticText-Designtimeには、BeanInfoを追加する。
新規作成からBeanInfoをcom.wankuma.kazuki.statictext.MyStaticTextBeanInfoという名前で作成する。
そうすると、めっちゃ長いコードが生成される。後はここに色々な情報を入れていくだけになる。
まずは、getBeanDescriptorだ。
ここでは下記のような情報を入れていく。
- コンポーネントパレットの名前
- 管理ビーンに追加される変数名
- タグ名
- タグ名の接頭辞
- タグリブのURI
ということでさっくりと実装だ!
private static BeanDescriptor getBdescriptor() {
if (beanDescriptor == null) {
beanDescriptor = new BeanDescriptor(MyStaticText.class);
beanDescriptor.setDisplayName("自作静的テキスト");
beanDescriptor.setShortDescription("劣化StaticText");
beanDescriptor.setValue(Constants.BeanDescriptor.INSTANCE_NAME, "myStaticText");
beanDescriptor.setValue(Constants.BeanDescriptor.IS_CONTAINER, Boolean.FALSE);
beanDescriptor.setValue(Constants.BeanDescriptor.PROPERTY_CATEGORIES, CategoryDescriptors.getDefaultCategoryDescriptors());
beanDescriptor.setValue(Constants.BeanDescriptor.TAG_NAME, "MyStaticTextTag");
beanDescriptor.setValue(Constants.BeanDescriptor.TAGLIB_PREFIX, "kzk");
beanDescriptor.setValue(Constants.BeanDescriptor.TAGLIB_URI, "http://google.co.jp");
beanDescriptor.setValue(Constants.BeanDescriptor.TAGLIB_URI, "http://blog.wankuma.com/kazuki/components");
}
return beanDescriptor;
}
お次はプロパティですくりぷたぁ
getPropertyDescriptorsメソッドを書いていく。今回対象にするプロパティは、id, value, styleの3つにしておこうと思う。
これも、おまじないみたいに追加していく。
唯一気をつけるのが、valueプロパティはObject型なのでプロパティエディタを設定しないと悲しいことになる。
ここでは、StringPropertyEditorを設定してます。
private static PropertyDescriptor[] getPdescriptor() {
if (properties == null) {
try {
properties = new PropertyDescriptor[3];
properties[0] = new PropertyDescriptor("id", MyStaticText.class, "getId", "setId");
AttributeDescriptor attr = new AttributeDescriptor("id", false, null);
properties[0].setValue(Constants.PropertyDescriptor.ATTRIBUTE_DESCRIPTOR, attr);
properties[0].setValue(Constants.PropertyDescriptor.CATEGORY, CategoryDescriptors.GENERAL);
properties[1] = new PropertyDescriptor("value", MyStaticText.class, "getValue", "setValue");
attr = new AttributeDescriptor("value", false, null, true);
properties[1].setValue(Constants.PropertyDescriptor.ATTRIBUTE_DESCRIPTOR, attr);
properties[1].setValue(Constants.PropertyDescriptor.CATEGORY, CategoryDescriptors.DATA);
properties[1].setPropertyEditorClass(StringPropertyEditor.class);
properties[2] = new PropertyDescriptor("style", MyStaticText.class, "getStyle", "setStyle");
attr = new AttributeDescriptor("style", true, "", true);
properties[2].setValue(Constants.PropertyDescriptor.ATTRIBUTE_DESCRIPTOR, attr);
properties[2].setValue(Constants.PropertyDescriptor.CATEGORY, CategoryDescriptors.DATA);
} catch (IntrospectionException ex) {
Logger.getLogger(MyStaticTextBeanInfo.class.getName()).log(Level.SEVERE, null, ex);
}
}
return properties;
}
これで、BeanInfoの作成完了!!ビルドエラーがないことを確認しておく。
これで準備は整った。ついにVisualJSFのコンポーネントのファイルcomplibを作る。
complib用の設定ファイルのxmlと、マニフェストファイル。そして、実行時に必要なjarとデザイン時に使うjarをcomplibの中に含めることでOK。
まずは、NetBeansのお気に入りとかを使ってMyStaticText-ComplibをJSFComponentフォルダの中に作る。
その中にbuild.xmlというファイルを作って、とりあえず下のように必要最低限のantスクリプトを書く。
<?xml version="1.0"?>
<project name="MyStaticText-Complib" default="complib" basedir=".">
<target name="complib">
</target>
</project>
これが出来たら、NetBeansの既存のantスクリプトからプロジェクトを作る機能のJava自由形式プロジェクトでMyStaticText-Complibというプロジェクトを作成する。
build時に、complibを実行するように指定して作成!
confフォルダを作成して、ソースフォルダに追加しておく。

んじゃぁ、このconfの中にcomplib-config.xmlを書いていく。
ここには、実行時に必要なjarやデザイン時に必要なjarを指定する。そして、コンポーネントパレットにどんな風に表示されるのかも書いてある。
<?xml version="1.0" encoding="UTF-8"?>
<complibConfiguration version="1.0"
resourceBundleBaseName="complib-bundle">
<identifier>
<uri>http://blog.wankuma.com/kazuki</uri>
<version>1.0.0</version>
</identifier>
<titleKey>titleKey</titleKey>
<runtimePath>
<pathElement>dist/MyStaticText-Runtime.jar</pathElement>
</runtimePath>
<designTimePath
prependRuntimePath="true">
<pathElement>dist/MystaticText-Designtime.jar</pathElement>
</designTimePath>
<initialPalette>
<folder key="folder1Key">
<item className="com.wankuma.kazuki.statictext.MyStaticText"/>
</folder>
</initialPalette>
</complibConfiguration>
titleKeyやfolderKeyは、この後のpropertiesファイルで指定する。
同じconfフォルダに、complib-bundle.propertiesファイルを作成して、下記のような内容に編集する。
titleKey=初めてのコンポーネント
folder1Key=おりじなるコンポーネント
そして、build.xmlを以下のようにして必要なjarやマニフェストファイルとかをcomplibに固めるようにする。
<?xml version="1.0"?>
<project name="MyStaticText-Complib" default="complib" basedir=".">
<target name="complib">
<jar destfile="okazuki.complib">
<fileset dir="${basedir}/conf" includes="complib-config.xml, complib-bundle.properties"/>
<fileset dir="../MyStaticText-Designtime" includes="dist/**"/>
<fileset dir="../MyStaticText-Runtime" includes="dist/**"/>
<manifest>
<attribute name="X-Rave-API-Compatibility-Version" value="2.0"/>
<attribute name="X-Rave-Complib-Configuration" value="complib-config.xml"/>
<attribute name="Extension-Name" value="com.examples.imageslider"/>
</manifest>
</jar>
</target>
</project>
これを実行すると、下のような感じのcomplibが出来上がる。
さて、テストだ!
ツールのコンポーネントライブラリを選択する。インポートをして、okazuki.complibを作成する。
インポートすると、追加される。
んじゃ早速動きをみてみよう。
Visual JavaServer Facesを選択するのを忘れずに。
そして、プロジェクトのコンポーネントライブラリにさっき登録したcomplibを追加する。
そうすると、パレットにさっき作ったコンポーネントが表示される。
ページの上にぽとぺたっっとして、valueプロパティに値を指定したりできる。
当然実行も出来る!
いい感じだ。