mozilla

Revision 96069 of Displaying Places information using views

  • リビジョンの URL スラグ: Displaying_Places_information_using_views
  • リビジョンのタイトル: Displaying Places information using views
  • リビジョンの ID: 96069
  • 作成日:
  • 作成者: Kohei
  • 現行リビジョン いいえ
  • コメント 新しいページ: '<breadcrumbs></breadcrumbs> {{firefox3}} ビューは、<code>nsINavHistoryResult</code> オブジェクトをユーザに表示する方法です。ビューは {{source|tool...'

このリビジョンの内容

{{template.Firefox3()}}

ビューは、nsINavHistoryResult オブジェクトをユーザに表示する方法です。ビューは {{template.Source("toolkit/components/places/public/nsINavHistoryService.idl", "nsINavHistoryService.idl")}} で定義されている nsINavHistoryResultViewer インタフェースを実装しています。

多くのアプリケーションでは、組み込みのビューで Places コントロールのいずれかを使うだけで十分な機能を得られるため、開発者が独自にビューを開発した場合の複雑さを回避できます。詳しくは Instantiating Views を参照してください。

ビューの登録

ビューを登録するには、nsINavHistoryResultviewer 属性を設定します。これにより、指定されたビューに対して結果が順次 result 属性を設定していきます。ビュー上に明示的に result 属性を設定してはいけません。 ビューをクリアするには、viewer 属性を null に設定します。これにより、ビューの result 属性も null に設定されます。

ここで参照サイクルに気を付ける必要があります。ビューと結果はそれぞれ互いに所有参照を保持しています。これらのオブジェクトを削除するには、result.viewernull を設定して、このサイクルをクリアする必要があります。組み込みのツリービュー (下記参照) ではこの処理が自動的に行われます。ツリーが破棄されるか、異なる nsITreeView がツリーに関連付けられると、ツリーは nsITreeView.tree = null を呼び出します。ビューアはこの状況を判別するとともに、それ自体を結果から切り離します。

組み込みのツリービュー

もっとも一般的なビューの種類はツリーコントロールですが、一方でこれは比較的実装が難しいものです。そのため Places では、開発者が結果をツリービューに表示したい場合に利用できる、組み込みのビューオブジェクトが提供されています。これは {{template.Source("browser/components/places/content/treeView.js")}} で実装されています。

このオブジェクトは nsINavHistoryResultViewer と {{template.Source("/layout/xul/base/src/tree/public/nsITreeView.idl", "nsITreeView")}} を実装しています。このため、このオブジェクトを利用することで、結果 (Places Query System 参照) とツリーの間の橋渡しをすることができます。

var result = historyService.executeQuery(...); // Places のクエリの結果
var tree = document.getElementById("mytree"); // ツリーコントロール

var showRootNodeInTree = true;
var treeviewer = new PlacesTreeView(showRootNodeInTree);

result.viewer = treeviewer;
tree.view = treeviewer.QueryInterface(Components.interfaces.nsITreeView);

組み込みのツリービューは、オブザーバがその実装である nsINavHistoryResultViewObserver ({{template.Source("toolkit/components/places/public/nsINavHistoryService.idl", "nsINavHistoryService.idl")}} で宣言されています) を追加できるようにしています。このオブザーバインタフェースを利用すると、外部のコンポーネントからどのような処理が行われているかを確認し、適切な処理が行うことができます。Places のツリーでは、コントローラを追加することで、例えば、何かがツリー上にドラッグ&ドロップされたときに通知を行っています。その際に適切な処理が実行されます。

ビューの実装

カスタマイズしたツリービューが必要な場合は、自作クラス内で nsINavHistoryResultTreeViewer をラップするのが最も簡単な方法です。例えば、「特別な」列を最初に加えたい場合は、自作オブジェクトでその最初の行のための nsITreeView レスポンスを実装し、他のすべてのメッセージを、インデックスをひとつずらして、組み込みのツリービューに渡します。

nsINavHistoryResultNode.viewIndex 属性は、ビューを利用するために明示的に提供されています。これらの値は、各ノードが作成される際 -1 に初期化されます。この値を使うと、表示されているノードを把握することができます。組み込みのツリービューアでは、ノードが含まれる列のインデックスを保持するためにこの属性が使われています。

nsINavHistoryResultViewer には、nsINavHistoryResultViewObserver が変更を監視できるようにするオブザーバインタフェースも含まれています。ただし、このオブザーバインタフェースはツリー専用です。これを nsINavHistoryResultTreeViewer オブジェクトに移す作業が {{template.Bug(337638)}} で行われました。nsINavHistoryResultViewer が独自のオブザーバを使う必要があるなら、追加の実装が必要となります。

{{ wiki.languages( { "en": "en/Places/Views" } ) }}

このリビジョンのソースコード

<p>
{{template.Firefox3()}}
</p><p>ビューは、<code>nsINavHistoryResult</code> オブジェクトをユーザに表示する方法です。ビューは {{template.Source("toolkit/components/places/public/nsINavHistoryService.idl", "nsINavHistoryService.idl")}} で定義されている <code>nsINavHistoryResultViewer</code> インタフェースを実装しています。
</p><p>多くのアプリケーションでは、組み込みのビューで Places コントロールのいずれかを使うだけで十分な機能を得られるため、開発者が独自にビューを開発した場合の複雑さを回避できます。詳しくは <a href="ja/Places/Instantiating_Views">Instantiating Views</a> を参照してください。
</p>
<h3 name=".E3.83.93.E3.83.A5.E3.83.BC.E3.81.AE.E7.99.BB.E9.8C.B2"> ビューの登録 </h3>
<p>ビューを登録するには、<code>nsINavHistoryResult</code> に <code>viewer</code> 属性を設定します。これにより、指定されたビューに対して結果が順次 <code>result</code> 属性を設定していきます。<i>ビュー上に明示的に <code>result</code> 属性を設定してはいけません。</i> ビューをクリアするには、<code>viewer</code> 属性を <code>null</code> に設定します。これにより、ビューの <code>result</code> 属性も <code>null</code> に設定されます。
</p><p>ここで参照サイクルに気を付ける必要があります。ビューと結果はそれぞれ互いに所有参照を保持しています。これらのオブジェクトを削除するには、<code>result.viewer</code> に <code>null</code> を設定して、このサイクルをクリアする必要があります。組み込みのツリービュー (下記参照) ではこの処理が自動的に行われます。ツリーが破棄されるか、異なる <code>nsITreeView</code> がツリーに関連付けられると、ツリーは <code>nsITreeView.tree = null</code> を呼び出します。ビューアはこの状況を判別するとともに、それ自体を結果から切り離します。
</p>
<h5 name=".E7.B5.84.E3.81.BF.E8.BE.BC.E3.81.BF.E3.81.AE.E3.83.84.E3.83.AA.E3.83.BC.E3.83.93.E3.83.A5.E3.83.BC"> 組み込みのツリービュー </h5>
<p>もっとも一般的なビューの種類はツリーコントロールですが、一方でこれは比較的実装が難しいものです。そのため Places では、開発者が結果をツリービューに表示したい場合に利用できる、組み込みのビューオブジェクトが提供されています。これは {{template.Source("browser/components/places/content/treeView.js")}} で実装されています。
</p><p>このオブジェクトは <code>nsINavHistoryResultViewer</code> と {{template.Source("/layout/xul/base/src/tree/public/nsITreeView.idl", "nsITreeView")}} を実装しています。このため、このオブジェクトを利用することで、結果 (<a href="ja/Places/Query_System">Places Query System</a> 参照) とツリーの間の橋渡しをすることができます。
</p>
<pre>var result = historyService.executeQuery(...); // Places のクエリの結果
var tree = document.getElementById("mytree"); // ツリーコントロール

var showRootNodeInTree = true;
var treeviewer = new PlacesTreeView(showRootNodeInTree);

result.viewer = treeviewer;
tree.view = treeviewer.QueryInterface(Components.interfaces.nsITreeView);
</pre>
<p>組み込みのツリービューは、オブザーバがその実装である <code>nsINavHistoryResultViewObserver</code> ({{template.Source("toolkit/components/places/public/nsINavHistoryService.idl", "nsINavHistoryService.idl")}} で宣言されています) を追加できるようにしています。このオブザーバインタフェースを利用すると、外部のコンポーネントからどのような処理が行われているかを確認し、適切な処理が行うことができます。Places のツリーでは、コントローラを追加することで、例えば、何かがツリー上にドラッグ&ドロップされたときに通知を行っています。その際に適切な処理が実行されます。
</p>
<h3 name=".E3.83.93.E3.83.A5.E3.83.BC.E3.81.AE.E5.AE.9F.E8.A3.85"> ビューの実装 </h3>
<p>カスタマイズしたツリービューが必要な場合は、自作クラス内で <code>nsINavHistoryResultTreeViewer</code> をラップするのが最も簡単な方法です。例えば、「特別な」列を最初に加えたい場合は、自作オブジェクトでその最初の行のための <code>nsITreeView</code> レスポンスを実装し、他のすべてのメッセージを、インデックスをひとつずらして、組み込みのツリービューに渡します。
</p><p><code>nsINavHistoryResultNode.viewIndex</code> 属性は、ビューを利用するために明示的に提供されています。これらの値は、各ノードが作成される際 <code>-1</code> に初期化されます。この値を使うと、表示されているノードを把握することができます。組み込みのツリービューアでは、ノードが含まれる列のインデックスを保持するためにこの属性が使われています。
</p><p><code>nsINavHistoryResultViewer</code> には、<code>nsINavHistoryResultViewObserver</code> が変更を監視できるようにするオブザーバインタフェースも含まれています。ただし、このオブザーバインタフェースはツリー専用です。これを <code>nsINavHistoryResultTreeViewer</code> オブジェクトに移す作業が {{template.Bug(337638)}} で行われました。<code>nsINavHistoryResultViewer</code> が独自のオブザーバを使う必要があるなら、追加の実装が必要となります。
</p>{{ wiki.languages( { "en": "en/Places/Views" } ) }}
このリビジョンへ戻す