■
id:makotan さんからコンポーネントの再利用について要望をいただいたので、まずは通常の再利用について考えてみます。
再利用可能なコントロールを作る
たとえば、OK ボタンと Cancel ボタンを並べたようなコンポーネントを定義しておき、どこからでも利用できるようにしておきたいシチュエーションで考えてみましょう。
以下のように、template 要素直下で controlDef 要素を使って、再利用したいXMLを記述します。
<template> <controlDef name="okCancelButton"> <!-- パラメータの定義 --> <param name="okLabel">OK</param> <param name="cancelLabel">Cancel</param> <!-- 本体の定義 --> <composite type="box" layout="fill" layoutParam="type=HORIZONTAL; spacing=5"> <layoutData name="horizontalAlignment" value="FILL" /> <control type="button" id="okButton"> <property name="text" value="#{okLabel}" /> </control> <control type="button" id="cancelButton"> <property name="text" value="#{cancelLabel}" /> </control> </composite> </controlDef> </tamplate>
ボタンのラベルを変えたいなどといった場合は、こんな感じでパラメータを定義しておき・・・("OK"はデフォルト値)
<param name="okLabel">OK</param>
#{パラメータ名} という形式で参照できるようにしておきます。
<control type="button" id="okButton"> <property name="text" value="#{okLabel}" /> </control>
利用する側の記述方法はいたってシンプルで、以下のように通常のコントロールと同様に記述できます。
<control type="okCancelButton"> <property name="okLabel" value="実行" /> <property name="cancelLabel" value="キャンセル" /> </control>
再利用可能なコンポジットを作る
もうひとつ、子要素を持つようなコンポジットを再利用する方法を考えます。
たとえば、すべての子要素に FILL レイアウトを指定して、パラメータで指定したalignment を適用するようなコンポジットを考えてみます。
<template> <compositeDef name="alignBox"> <!-- パラメータの定義 --> <param name="alignment">FILL</param> <!-- 本体の定義 --> <composite type="box" layout="fill" layoutParam="type=HORIZONTAL; spacing=5"> <layoutData name="horizontalAlignment" value="#{alignment}" /> #{elements} </composite> </compositeDef> </tamplate>
先ほどと同じように template 要素直下で定義します。今度は compositeDef 要素を使って定義しますが、それ以外は先ほどと同じです。
ポイントは、子要素を埋め込みたい部分に #{elements} を指定することです。
使い方はこんな感じになります。
<composite type="alignBox"> <property name="alignment" value="CENTER" /> <control type="button" id="okButton"> <property name="text" value="OK" /> </control> <control type="button" id="cancelButton"> <property name="text" value="キャンセル" /> </control> </composite>
すると、実際には以下のようなXMLへ展開されるわけです。
<composite type="box" layout="fill" layoutParam="type=HORIZONTAL; spacing=5"> <layoutData name="horizontalAlignment" value="CENTER" /> <control type="button" id="okButton"> <property name="text" value="OK" /> </control> <control type="button" id="cancelButton"> <property name="text" value="キャンセル" /> </control> </composite>
ほとんどマクロ定義の世界ですが、現実的にはけっこう必要な機能です。
ディレクトリとの関係はまだ整理できていないのですが、まずはこんな感じでどうでしょうか? > id:makotan さん