このセクションでは、テンプレートからツリーを生成する方法について説明します。
ツリーにデータソースを設定する
ツリーを利用する場合、多量の階層データを取り扱うために、しばしばテンプレートを使用してコンテントをビルドすることになると思います。
テンプレートをツリーに対して使用するときも、構文についてはそれ以外の要素の場合とほとんど同じです。
つまり、データソースを指定する
属性と、
表示するルートノードを指定する datasources
属性を、
ref
要素に設定する必要があります。
また、種類の異なるデータに対して異なったコンテントを生成する必要があるときには、複数のルールを設定することも可能です。
tree
以下に、ツリーのために履歴データソースを使用する例を示します。
<tree datasources="rdf:history" ref="NC:HistoryByDate" flags="dont-build-content">
前のセクションで説明したように、ツリーをテンプレートから生成するためには、おおむね通常のコンテントビルダーではなく、ツリービルダーの方が利用されます。
言い換えれば、ツリーの行ごとに要素を生成するのではなく、もっと効率のよい方法が利用されているということです。
上記の例のように、
属性に flags
dont-build-content
を値として設定することでツリービルダーの使用を指示します。
この属性を削除した場合は、コンテントビルダーが使用されることになります。
なお、Mozilla の DOM インスペクタを使用して、フラグの有るツリーと無いツリーを比較することによって、相違点を確認することが可能です。
また、コンテントビルダーの方を利用する場合は、通常、コンテントは実際に必要になるまでビルドされないことに注意してください。 つまり、階層ツリーのときは、利用者が親項目を開くまで子項目は生成されません。
テンプレートでは、ツリーの各列に対し treecell 要素が存在することになります。 各セルに対しラベルを設定するために、セルは label 属性を持つ必要があります。 これには通常、ラベルをデータソースから取得するために、 RDF プロパティを設定することになるでしょう。
テンプレートから生成したツリーの例
以下の例は、テンプレートから生成したツリーを示しています。 表示データとしては、ファイルシステムを利用します。
var el = env.locale; 例 1 : ソース
<tree id="my-tree" flex="1" datasources="rdf:files" ref="file:///" flags="dont-build-content"> <treecols> <treecol id="Name" label="Name" primary="true" flex="1"/> <splitter/> <treecol id="Date" label="Date" flex="1"/> </treecols> <template> <rule> <treechildren> <treeitem uri="rdf:*"> <treerow> <treecell label="rdf:https://home.netscape.com/NC-rdf#Name"/> <treecell label="rdf:https://home.netscape.com/WEB-rdf#LastModifiedDate"/> </treerow> </treeitem> </treechildren> </rule> </template> </tree>
これにより、ファイル名と更新日の 2 列からなるツリーが生成されます。
このツリーには、ルートディレクトリにあるファイルの一覧が表示されているはずです。
今回、ルールは 1 つしか使用していませんが、必要であれば追加しても構いません。
また、要素の uri
属性は、他のテンプレートの場合と同様に、コンテント生成の起点を示しています。
行の中に置かれる 2 つのセルは、データソースから名前と日付を受け取り、その値をセルのラベルに設定します。
また、この例からは、テンプレートで uri
属性により生成の起点を指定することの使い勝手の良さも確認することができます。
まず、この例では、uri
属性が
要素に設定されていますが、
この要素は treeitem
rule
要素の直接の子要素ではないことに注目してください。
uri
属性は、各リソースごとに繰り返し生成させたい要素に対してのみ設定する必要があるので、
複数生成する必要のない
要素には設定せず、
treechildren
要素に設定しています。
つまり、treeitem
属性が設定された要素の外側 (あるいは上位) の要素は複製されず、
uri
属性が設定された要素とその内側の要素が各リソースごとに複製されることになります。
uri
なお、コンテントビルダーではなくツリービルダーを利用する場合、
テンプレート中の要素は、上記の例で示したような、
要素をルールの中に置く構造でなければなりません。
ツリービルダーは、テンプレート中の要素を実際にはビルドしませんが、生成するべき内容を正しく認識させるために、テンプレートの中をこの構造にしておく必要があります。
treechildren
画像から、トップレベルの要素の下に、自動的に入れ子の要素が付加されていることが確認できます。 XUL には、テンプレートやルールにツリー関連の要素やメニュー関連の要素が含まれているときに、自動的に入れ子の要素を追加する機能が実装されています。 このため、ツリー関連の要素は、RDF データが入れ子の構造を持ってさえいれば、 それに基づいて必要なだけ入れ子で生成されます。
このときの RDF データソースの興味深い挙動のひとつとして、 リソースの値は「必要になったときに必要な範囲だけが確定される」ということがあります。 つまり、リソース階層の深い位置にある値は、利用者が下位の階層を表示させるツリー操作を行い、実際にそのノードを表示させるまで値は確定されません。 これは、特にデータが動的に変化する種類のデータソースで有効に作用します。
列のソート
先述の例を実際に動作させたとき、ファイルがソートされていないことが気になるかもしれません。 ツリーをデータソースから生成する場合は、オプションでデータをソートさせることが可能です。 このとき、ツリーの任意の列をキーにして、昇順にも降順にもソートできます。 また、利用者が列の見出しをクリックすることで、ソートする列を選択したり、ソートの方向 (昇順 / 降順) の切り替えを行うことも可能です。 このソート機能は、静的コンテントから生成されたツリーにはありません。 (静的コンテントの場合もデータをソートするスクリプトを作成することは可能です)。
ソート処理は、列 (treecol
) に設定する必要がある 3 つの属性によって指定します。
最初の sort
属性には、ソートキーとして利用するための RDF プロパティを設定する必要があります。
通常、ここには、その列のセルのラベルに設定するものと同じ値を設定します。
この属性を列に設定することで、その列のデータはソートされ、
利用者が列の見出しをクリックしてソート方向を切り替えられる様になります。
sort
属性の指定を取り除いた場合には、その列でデータをソートすることはできなくなります。
次の sortDirection
属性 (大文字が混ざっていることに注意) は、列のデフォルトのソート方向を指定するために使用します。
ここには、以下の 3 つの値が指定可能です。
- ascending
- データは昇順で表示されます。
- descending
- データは降順で表示されます。
- natural
- データはそのままの順で表示されます。つまり、 RDF データソースに格納されている順番で表示されます。
最後の sortActive
属性は、デフォルトでソートする列に対して、true
を値にして設定します。
ソート処理は上記の属性のみで正しく機能しますが、加えて、ソート可能な列には、スタイルクラス (class
属性) に sortDirectionIndicator
を設定することも可能です。
これによって、列の見出しにソート方向を示す小さな三角形が表示されるようになります。
これを設定しない場合も、利用者が列をソートすることは可能ですが、どの列でソートされているかの表示がされなくなってしまいます。
以下に、前例の列の部分に上記の追加設定を加えたものを示します。
<treecols> <treecol id="Name" label="Name" flex="1" primary="true" class="sortDirectionIndicator" sortActive="true" sortDirection="ascending" sort="rdf:https://home.netscape.com/NC-rdf#Name"/> <splitter/> <treecol id="Date" label="Date" flex="1" class="sortDirectionIndicator" sort="rdf:https://home.netscape.com/WEB-rdf#LastModifiedDate"/> </treecols>
列の状態を保存する
現在どの列でソートされているかをセッション間で保存して、設定内容が持続するようにしたい場合があると思います。
このためには、
属性を、各 persist
要素に対して設定します。
設定を持続させるためには、treecol
treecol
要素が持つ、
「列の幅 (width)」「列の並び順 (ordinal)」「列が可視であるか (hidden)」「現在ソートのために使用されている列 (sortActive)」「列のソート方向 (sortDirection)」
の 5 つの属性を保存する必要があります。
以下に、列に対してこれらを設定した例を示します。
<treecol id="Date" label="Date" flex="1" class="sortDirectionIndicator" persist="width ordinal hidden sortActive sortDirection" sort="rdf:https://home.netscape.com/WEB-rdf#LastModifiedDate"/>
なお、
属性についての詳細は、後のセクションで説明する予定です。
persist
ツリーのためのルール属性
また、rule
要素に対して、ツリー固有の特殊な条件にマッチさせるために使用可能な 2 つの属性があります。
- iscontainer
- この属性を値
true
で設定した場合、ルールは子を持つことができるすべてのリソースにマッチします。例えば、このルールをブックマークフォルダにマッチさせるために使用することが可能です。これにより、 RDF データソース側にコンテナであることを示すための専用の属性を含めておく必要が無くなります。 - isempty
- この属性を値
true
で設定した場合、ルールは子を持たないすべてのリソースにマッチすることになります。
リソースは、コンテナである場合にも空であることもあります。 この場合、リソースが空であることは、コンテナではないことを意味しません。 例えば、ブックマークフォルダはコンテナですが、子を持つことも持たないこともあります。 といっても、単一のブックマークやセパレータがコンテナになることはありません。
これらの属性を他の属性と組み合わせることで、より細かい条件にマッチするルールを作成することが可能です。
次のセクションでは、Mozilla が提供するデータソースについて、いくつかを見ていきます。