この記事は Firefox 3 の新機能について述べています
ビューは、nsINavHistoryResult
オブジェクトをユーザに表示する方法です。ビューは nsINavHistoryResultViewer
インタフェースを実装しています。
拡張機能やアプリケーションの中でブックマークや履歴の内容を表示したい場合、組み込みの Places ビューを使うことができます。これは、汎用的なもので、基本的な機能を実装する時間を大幅に節約できるため、開発者は拡張機能やアプリケーションの開発作業に集中できます。
<!-- XBL バインディングを得るため、Places のスタイルシートをインクルードします -->
<?xml-stylesheet href="chrome://browser/content/places/places.css"?>
<!-- また、以下のスタイルシートをインクルードすることで、ツリーに
既定のスタイル (アイコンなど) を適用することができます -->
<?xml-stylesheet href="chrome://browser/skin/places/places.css"?>
<!-- Places オーバーレイを読み込んで、必要な JavaScript ファイルや
既定のコマンド、コンテキストメニューをインクルードします -->
<?xul-overlay href="chrome://browser/content/places/placesOverlay.xul"?>
<!-- ツリービュー -->
<tree id="myTree"
type="places"
place="place:...">
<treecols>
<treecol id="name" flex="1" primary="true"/>
</treecols>
<treechildren flex="1"/>
</tree>
<!-- メニュービュー -->
<menu id="myMenu" label="My Menu">
<menupopup type="places" place="place:..."/>
</menu>
<!-- ツールバービュー -->
<toolbaritem id="myToolbaritem"
type="places"
place="place:..."/>
var view = document.getElementById("your_view");
view.init(null);
view.appendController(PlacesController);
null を使ってビューを初期化します (これにより既定のビューの設定が使用されます - オプションについては Places:View Configurations を参照してください。ここには ViewConfig オブジェクトを使ってビューの機能に変更を加える詳しい方法が載っています)。それから、コントローラを加えます。これでビューは使用可能になりました。
より高い柔軟性を求める場合や、Places 情報の表示に独自形式を使用したい場合は、独自にビューを作成することで実現できます。
ビューを登録するには、nsINavHistoryResult に viewer 属性を設定します。これにより、指定されたビューに対して結果が順次 result 属性を設定していきます。ビュー上に明示的に result 属性を設定してはいけません。 ビューをクリアするには、viewer 属性を null に設定します。これにより、ビューの result 属性も null に設定されます。
ここで参照サイクルに気を付ける必要があります。ビューと結果はそれぞれ互いに所有参照を保持しています。これらのオブジェクトを削除するには、result.viewer に null を設定して、このサイクルをクリアする必要があります。組み込みのツリービュー (下記参照) ではこの処理が自動的に行われます。ツリーが破棄されるか、異なる nsITreeView がツリーに関連付けられると、ツリーは nsITreeView.tree = null を呼び出します。ビューアはこの状況を判別するとともに、それ自体を結果から切り離します。
もっとも一般的なビューの種類はツリーコントロールですが、一方でこれは比較的実装が難しいものです。そのため Places では、開発者が結果をツリービューに表示したい場合に利用できる、組み込みのビューオブジェクトが提供されています。これは browser/components/places/content/treeView.js
で実装されています。
このオブジェクトは nsINavHistoryResultViewer と nsITreeView
を実装しています。このため、このオブジェクトを利用することで、結果 (Querying Places 参照) とツリーの間の橋渡しをすることができます。
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 (nsINavHistoryService.idl
で宣言されています) を追加できるようにしています。このオブザーバインタフェースを利用すると、外部のコンポーネントからどのような処理が行われているかを確認し、適切な処理が行うことができます。Places のツリーでは、コントローラを追加することで、例えば、何かがツリー上にドラッグ&ドロップされたときに通知を行っています。その際に適切な処理が実行されます。
カスタマイズしたツリービューが必要な場合は、自作クラス内で nsINavHistoryResultTreeViewer をラップするのが最も簡単な方法です。例えば、「特別な」列を最初に加えたい場合は、自作オブジェクトでその最初の行のための nsITreeView レスポンスを実装し、他のすべてのメッセージを、インデックスをひとつずらして、組み込みのツリービューに渡します。
nsINavHistoryResultNode.viewIndex 属性は、ビューを利用するために明示的に提供されています。これらの値は、各ノードが作成される際 -1 に初期化されます。この値を使うと、表示されているノードを把握することができます。組み込みのツリービューアでは、ノードが含まれる列のインデックスを保持するためにこの属性が使われています。
nsINavHistoryResultViewer には、nsINavHistoryResultViewObserver が変更を監視できるようにするオブザーバインタフェースも含まれています。ただし、このオブザーバインタフェースはツリー専用です。これを nsINavHistoryResultTreeViewer オブジェクトに移す作業が
bug 337638
で行われました。nsINavHistoryResultViewer が独自のオブザーバを使う必要があるなら、追加の実装が必要となります。
このページは2008年 5月 14日, 02:18に更新されました by Kohei
