この章では、さらに複雑なテンプレートの作成方法と使い方を説明します。
第 2 章「テンプレート」で紹介した「Hello, World!」テンプレートを作成した後、必要に応じて、設定可能なプロキシのリストを動的にします。動的なリストがあると、GOPHER、 SOCKS、SSL など、その他のプロトコルを処理するプロキシをユーザーが追加できます。このタスクを行うには、「セット」を使用します。
プロキシページでのセットの使用は、例示のみを目的としています。実装には設定ツリーの元のレイアウトが必要になるため、StarSuite でも OpenOffice.org でもこの例を処理することはできません。
図 3–1 は、決まった数の編集フィールドを使用する代わりに、プロキシの動的なリストを表しています。
「新規作成...」ボタンをクリックすると、プロキシが追加されます。 プロキシで処理する新しいプロトコルの名前を求めるダイアログが表示されます。最初に FTP と指定してから、もう一度「New」をクリックし、2 番目のプロトコルの名前として HTTP と入力します。結果は図 3–1 のようになります。この 2 つのエントリはリンクです。リンクの 1 つをクリックすると、図 3–2 のような内容の「コンテンツ区画」が読み込まれます。
前の 2 つの図で説明した機能は、「Hello, world!」の例を次のように変更して実装します。HTTPProxy 、 HTTPPort、 FTPProxy、 FTPPort の 4 つのプロパティを削除します。次に、以下のコード例の注釈セクションに示したセット要素を追加します。
<?xml version="1.0" encoding="UTF-8"?> <DOCTYPE apt:template SYSTEM "policytemplate.dtd"> <apt:template> <category apt:name="StarSuite" apt:label="StarSuite"> <category apt:name="Internet" apt:label="インターネット"> <page apt:name="Proxy" apt:label="プロキシ"> <section apt:name="Settings" apt:label="設定"> <property apt:name="ProxyServer" apt:label="プロキシサーバー" apt:dataPath="org.openoffice.Inet/Settings/ooInetProxyType" oor:type="xs:int"> <visual apt:type="radioButtons"/> <constraints> <enumeration oor:value="0" apt:label="なし"/> <enumeration oor:value="2" apt:label="手動"/> </constraints> </property> <property apt:name="NoProxyFor" apt:label="プロキシなし" apt:dataPath="org.openoffice.Inet/Settings/ooInetNoProxy" oor:type="xs:string"/> </section> <!-- Beginning of set element to be added --> <set apt:name="ProxyList" apt:label="プロキシリスト" apt:dataPath="org.openoffice.Inet/Settings/ooInetProxyList"> <page apt:name="ProxyPage" apt:label="プロキシページ"> <section apt:name="Proxy" apt:label="プロキシ"> <property apt:name="HostName" apt:label="ホスト名" apt:dataPath="./$queriedId/HostName" oor:type="xs:string"/> <property apt:name="Port" apt:label="ポート" apt:dataPath="./$queriedId/Port" oor:type="xs:string"/> </section> </page> </set> <!-- End of added set element --> </page> </category> </category> </apt:template> |
set 要素の apt:dataPath 属性は、セットがバックエンドに保存されている場所を指しています。 set 要素には page 要素が含まれ、page 要素には section 要素、section 要素には property 要素が含まれています。この階層はカテゴリ要素の下の要素の階層と相関関係があります。同じようにページとして描画されますが、セットテーブルのリンクをクリックしてトリガする点が異なります。
カテゴリページと比較すると、セットページのプロパティ HostName と Port は apt:dataPath に特殊な表記法を使用しています。パスはドットで始まります。これは、要素の階層を上に検索して最初に見つかったパスの定義に相対するパスという意味です。apt:dataPath で最初の親要素はセット要素のため、Configuration Manager は相対パス、たとえば Port プロパティを org.openoffice.Inet/Settings/ooInetProxyList/$queriedId/Port に翻訳します。このパスのもう 1 つの特徴は $queriedId 変数です。設定リポジトリ内のデータはすべて他と識別できなければならないので、動的データ構造の各要素に一意の名前を付ける必要があります。$queriedId 変数は、「追加」ボタンがクリックされたときに、その名前のユーザーを問い合わせるよう Configuration Manager に指示します。その結果生成されるセット要素は、変数で判別される位置に、指定した名前で格納されます。したがって、セット要素 FTP の場合は、そのポートプロパティのパスは org.openoffice.Inet/Settings/ooInetProxyList/FTP/Port です。
別の例 : セットを使用して、NoProxyFor プロパティを表示することもできます。ホスト名の文字列が長くなると、このプロパティの編集フィールドの使用に問題が生じます。その場合、ユーザーはスクロールして編集フィールドの文字列全体を表示しなければなりません。セットで実装されるプロキシ名のリストによって、この余分のスクロール操作がなくなります。
NoProxyFor プロパティの文字列の代わりにセットを使用するには、NoProxyFor 要素をそのサブ要素すべてと一緒に削除します。そのあと、以下のコード例の注釈セクションに示したセット要素を追加します。
<?xml version="1.0" encoding="UTF-8"?> <DOCTYPE apt:template SYSTEM "policytemplate.dtd"> <apt:template> <category apt:name="StarSuite" apt:label="StarSuite"> <category apt:name="Internet" apt:label="インターネット"> <page apt:name="Proxy" apt:label="プロキシ"> <section apt:name="Settings" apt:label="設定"> <property apt:name="ProxyServer" apt:label="プロキシサーバー" apt:dataPath="org.openoffice.Inet/Settings/ooInetProxyType"" oor:type="xs:int"> <visual apt:type="radioButtons"/> <constraints> <enumeration oor:value="0" apt:label="なし"/> <enumeration oor:value="2" apt:label="手動"/> </constraints> </property> </section> <!-- Beginning of set element to be added --> <set apt:name="NoProxyFor" apt:label="プロキシなし" apt:dataPath="org.openoffice.Inet/Settings/ooInetNoProxySet"> <page apt:name="HostNamePage"> <section apt:name="HostNameSection"> <property apt:name="HostNameProp" apt:dataPath="./$queriedId/HostName" oor:type="xs:string" apt:storeDefault="true"> <visual apt:type="hidden"/> <value>$queriedId</value> </property> </section> </page> </set> <!-- End of set element to be added --> <set apt:name="ProxyList" apt:label="プロキシリスト" apt:dataPath="org.openoffice.Inet/Settings/ooInetProxyList"> <page apt:name="ProxyPage" apt:label="プロキシページ"> <section apt:name="Proxy" apt:label="プロキシ"> <property apt:name="HostName" apt:label="ホスト名" apt:dataPath="./$queriedId/HostName" oor:type="xs:string"/> <property apt:name="Port" apt:label="ポート" apt:dataPath="./$queriedId/Port" oor:type="xs:string"/> </section> </page> </set> </page> </category> </category> </apt:template> |
テーブルのエントリはリンクではなく、一価要素の単なるリストを表すようになります。これを行うには、apt:storeDefault 属性と visual 要素を value 要素と併せて使用します。value 要素は設定オプションのデフォルト値を定義できます。デフォルト値は、デフォルトでは設定リポジトリに保存されません。apt:storeDefault 属性は、そのデフォルトを上書きして、バックエンドにデフォルト値を自動的に保存するよう Configuration Manager に指示します。この場合、デフォルト値は新しいセット要素が追加されるときにユーザーがダイアログで入力する値です。visual 要素の apt:type 属性を「hidden (非表示)」と指定すると、そのページの唯一のセクションは空のままになります。セットのページが空の場合は、ページを表示する意味がないので、Configuration Manager はリンクを提供しません。
アクションハンドラは、イベントが発生するときにユーザー定義のアクションを実行するために使用されます。その時点で、使用可能なアクションハンドラは XML ハンドラ 1 つだけです。XML ハンドラはクライアント側のブラウザで JavaScript コードを生成します。
XML ハンドラを使用すると、まだテンプレートに含まれていない StarSuite/ OpenOffice.org 「プロキシ」 ダイアログの機能を実装することもできます。「プロキシサーバー」オプションに「なし」の値を選択すると、編集フィールドが無効になります。
次のテンプレートの注釈領域は、「プロキシサーバー」オプションが「手動」か「なし」に設定されている場合に、編集フィールドを有効または無効にするために、元の「Hello, world!」に加える必要のある変更を示しています。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE apt:template SYSTEM "policytemplate.dtd"> <apt:template> <category apt:name="StarSuite" apt:label="StarSuite" > <category apt:name="Internet" apt:label="インターネット"> <page apt:name="Proxy" apt:label="プロキシ"> <section apt:name="Settings" apt:label="設定"> <property apt:name="ProxyServer" apt:label="プロキシサーバー" apt:dataPath="org.openoffice.Inet/Settings/ooInetProxyType" oor:type="xs:int" <!-- The following line should be added to original "Hello, world!" template --> apt:xmlHandler="switchState"> <visual apt:type="radioButtons"/> <constraints> <enumeration oor:value="0" apt:label="なし"/> <enumeration oor:value="2" apt:label="手動"/> </constraints> </property> <property apt:name="HTTPProxy" apt:label="Http プロキシ" apt:dataPath="org.openoffice.Inet/Settings/ooInetHTTPProxyName" oor:type="xs:string"/> <property apt:name="HTTPPort" apt:label="Http ポート" apt:dataPath="org.openoffice.Inet/Settings/ooInetHTTPProxyPort" oor:type="xs:int"/> <property apt:name="FTPProxy" apt:label="Ftp プロキシ" apt:dataPath="org.openoffice.Inet/Settings/ooInetFTPProxyName" oor:type="xs:string"/> <property apt:name="FTPPort" apt:label="Ftp ポート" apt:dataPath="org.openoffice.Inet/Settings/ooInetFTPProxyPort" oor:type="xs:int"/> <property apt:name="NoProxyFor" apt:label="プロキシなし" apt:dataPath="org.openoffice.Inet/Settings/ooInetNoProxy" oor:type="xs:string"/> </section> <!-- Beginning of section to be added to original "Hello, world!" template --> <xmlHandler apt:name="switchState"> <event apt:type="onChange" /> <action> <choose> <when apt:test="ProxyServer.value=0"> <command>HTTPProxy.enabled=false</command> <command>HTTPPort.enabled=false</command> <command>FTPProxy.enabled=false</command> <command>FTPPort.enabled=false</command> <command>NoProxyFor.enabled=false</command> </when> <otherwise> <command>HTTPProxy.enabled=true</command> <command>HTTPPort.enabled=true</command> <command>FTPProxy.enabled=true</command> <command>FTPPort.enabled=true</command> <command>NoProxyFor.enabled=true</command> </otherwise> </choose> </action> </xmlHandler> <!-- End of section to be added --> </page> </category> </category> </apt:template> |
apt:xmlHandler 属性をプロパティ ProxyServer に追加すると、同じ名前 (ここでは「switchState」) の xmlHandler 要素が そのプロパティに関連付けられます。
アクションハンドラはイベントによってトリガされます。アクションハンドラの対象となるイベントは、イベント要素の apt:type 属性で定義します。この時点で使用できるイベントは、onChange イベントだけです。このイベントは、ユーザーがプロパティの新しいデータを入力したときに発行されます。前の例では、ProxyServer プロパティの値が変わったときに XML ハンドラをトリガするためにイベントが使用されています。
アクション要素には、イベント要素で指定されているイベントが発生したときに実行されるアクションが含まれています。前の例で、最初のアクションは ProxyServer プロパティの値をチェックし、それに応じてほかの編集フィールドの状態を変更することです。これには、choose、when、および otherwise 要素を使用します。ProxyServer プロパティを「なし」に設定した場合は、すべての編集フィールドが無効になります。ProxyServer プロパティを「手動」に設定した場合は、編集フィールドが有効になります。
ヘルプにはオンラインヘルプとインラインヘルプの 2 種類があります。
オンラインヘルプは、ユーザーがマストヘッドの 「ヘルプ」 リンクをクリックしたときに別のウィンドウに表示されるコンテキスト依存の詳しいヘルプです。前回の操作を「コンテンツ区画」で行った場合は、現在「コンテンツ区画」に表示されているテンプレートで定義されているオンラインヘルプのドキュメントが表示されます。前回の操作をそれ以外の場所で行った場合は、一般的なオンラインヘルプが表示されます。page 要素の apt:onlineHelp 属性は、HTML ヘルプファイルをテンプレートに結合するために使用されます。この場合、たとえば次のように、ファイルの完全修飾パスとそのベース名を指定する必要があります。
<page apt:name="Proxy"> apt:label="Proxy" <apt:onlineHelp="/StarSuite/Internet/proxy">
これは ./web/StarSuite/Internet/proxy.html を参照します。
HTML ファイルでは絶対パスと相対パスを使用できます。 HTML ファイルと一緒に images というディレクトリのイメージを配置する場合は、HTML ファイルで次のいずれかの注釈を使用できます。
<img src="/StarSuite/Internet/images/image.gif">
<img src="./images/image.gif">
インラインヘルプは、カテゴリ、ページ、プロパティの各ページに補足情報を提供する短いテキストです。インラインヘルプは category 要素では「コメント」列、page 要素ではページタイトルの下、 property 要素では設定オプションの下に表示されます。ヘルプテキストは、この category、 page、 property の 3 要素のいずれかの apt:inlineHelp 属性によって指定されます。たとえば、次のように入力します。
<property apt:name="HTTPProxy" apt:label="HTTP Proxy" apt:inlineHelp="Specify no proxy (None) or a manually defined proxy (manual)." apt:dataPath="org.openoffice.Inet/Settings/ooInetHTTPProxyName" oor:type="xs:string" </property>
ローカライズを円滑にするため、ラベルにリソースキーを与えておきます。