ダイアログボックスでユーザーが設定した結果は、ダイアログボックス上で編集されたXML文書フラグメントとして表されます。ここでは、ダイアログボックスで編集された住所エントリーを住所録の末尾に追加する処理を、AddEntryコマンドに実装します。
ダイアログボックスでの設定結果は、instruction:dialogインストラクションのreturn-to属性に記述した名前の変数に格納されます。ダイアログボックスを閉じるときに、ダイアログボックスに表示されたXML文書フラグメントの編集結果と、終了したときの状態を表す
instruction:dialog-result要素からなるXML文書フラグメントが変数に格納されます。設定結果を参照するときには、この変数を参照します。設定結果が格納された変数を利用できるスコープは、
instruction:variableインストラクションで定義された変数のスコープと同じです。
この住所録の例では、instruction:dialogインストラクションのreturn-to属性に設定された変数resultに、次のような内容のXML文書フラグメントが設定されます。
<ab:edit-dialog closed-by="ok">
<ab:entry>
<ab:person>Betty Jackson</ab:person>
<ab:address>Denver, Colorado USA</ab:address>
</ab:entry>
</ab:edit-dialog>
<instruction:dialog-result is-closed-with-command="true" />
instruction:dialog-result要素のis-closed-with-command属性は、ダイアログボックスを
command:dialog-closeコマンドで閉じた場合にtrueが設定されます。ダイアログボックスのクローズボックスやキー操作で強制的に終了された場合は、falseが設定されます。
では、住所エントリーを住所録の末尾に追加しましょう。住所エントリーを住所録の末尾に追加する処理は、「ダイアログボックスの表示」で作成したAddEntryコマンドのinstruction:dialogインストラクションの後ろに追加します。強調文字で表記した個所が、追加した個所です。
<xvcd:xvcd ...>
:
: ボキャブラリコンポーネントの定義は省略
:
<!-- 住所エントリーを追加するコマンド -->
<xvcd:command name="AddEntry">
<!-- ダイアログボックスを表示するインストラクション -->
<instruction:dialog return-to="result">
<!-- ダイアログボックスで表示・編集するXMLボキャブラリ -->
<ab:edit-dialog>
<ab:entry>
<ab:person />
<ab:address />
</ab:entry>
</ab:edit-dialog>
</instruction:dialog>
<!-- ダイアログボックスで編集された結果を反映します。 -->
<instruction:if test="'ok'=$result/ab:edit-dialog/@closed-by">
<!--
ダイアログボックスで編集された住所エントリーを元の文書の末尾に追加します。
xvcd:insertインストラクションの内容はVCによる変換が行われます。
-->
<xvcd:insert ref="/ab:addressbook" position="last-child">
<xvcd:copy-of select="$result//ab:entry" />
</xvcd:insert>
</instruction:if>
</xvcd:command>
:
: テンプレートは省略
:
</xvcd:xvcd>
この住所録の例では、ダイアログボックスの設定結果を表すXML文書フラグメントは、変数resultに格納されます。この変数resultに格納されたXML文書フラグメントを参照すると、ダイアログボックスでユーザーが設定した結果を利用できます。
ユーザーがダイアログボックスで設定した結果を利用するのは、ダイアログボックスで[OK]がクリックされたときだけです。従って、ダイアログボックスが閉じたあと、[OK]がクリックされたかそうでないかを調べる必要があります。「ダイアログボックス用のボキャブラリコンポーネント」で作成したダイアログボックス用のボキャブラリコンポーネントでは、[OK]がクリックされたかそうでないかを表す情報を、設定結果を表すXML文書フラグメントに設定します。この例の場合、[OK]がクリックされたときは、XML文書フラグメントの頂点要素であるab:edit-dialog要素のclosed-by属性の値に"ok"が設定されます。そのため、この属性の値を調べると、ダイアログボックスが[OK]で閉じられたかそうでないかを判断できます。
実際にダイアログボックスで[OK]がクリックされかそうでないかを判断しているのは、instruction:dialogインストラクションの次にある
instruction:ifインストラクションです。このインストラクションでは、変数resultに格納されたXML文書フラグメントを調べて、ab:edit-dialog要素のclosed-by属性の値に"ok"が設定されていれば、[OK]でダイアログボックスが閉じられたと判断しています。
[OK]がクリックされたときは、ダイアログボックスでユーザーが設定した結果を利用します。この住所録の例では、ユーザーが編集した住所エントリーを表すXML文書フラグメントを、住所録の末尾に追加します。住所エントリーを住所録に追加するには、
xvcd:insertインストラクションを使用します。xvcd:insertインストラクションの内容はボキャブラリコネクション(以下、VCと表記します)によって変換されます。今回は、VCによる変換を利用し、住所エントリーを
xvcd:copy-of要素でコピーしています。
以上で、住所録に住所エントリーを追加するコマンドAddEnteryの実装は完了です。
実際にxfy Clientで表示しましょう。AddressBook.xmlをxfy Clientで開いてください。 メインメニューに[Entry]が追加されています。
メニューが追加された
[Entry - Add]を実行しましょう。ダイアログボックスが表示されます。
ダイアログボックスが表示された
ダイアログボックスで[Name]に「Betty Jackson」、[Address]に「Denver, Colorado USA」を入力して[OK]をクリックしましょう。最終行に住所エントリーが1行追加され、「Betty Jackson」/「Denver, Colorado USA」と表示されます。
住所エントリーが追加された