このセクションでは、XPCOM の使用例をその他のインターフェースとともに提供します。
インターフェース nsIWindowMediator によって、開いている別のすべての Mozilla ウィンドウにアクセスできます。これはフォーカスを別のウィンドウに切り替えるのに使えます。開いているウィンドウのリストは、RDF データソースとして使うことができます。これによって、アプリケーション内で現在開いているウィンドウのリストからなるウィンドウメニューを作ることができます。このためのデータソースは rdf:window-mediator です。以下の例のようにこれを使うことができます。
例 8.2.1
<toolbox>
<menubar id="windowlist-menubar">
<menu label="Window">
<menupopup id="window-menu" datasources="rdf:window-mediator" ref="NC:WindowMediatorRoot">
<template>
<rule>
<menuitem uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#Name"/>
</rule>
</template>
</menupopup>
</menu>
</menubar>
</toolbox>
|
開いているウィンドウすべてのリストからなるウィンドウメニューが作られます。ブラウザーウィンドウを幾つか開いてこの例を試してみて下さい。それらすべてがメニューにリストされるのが分かるはずです。開いているウィンドウのリストを表示する上ではこれで十分ですが、メニューをクリックするとそのウィンドウに切り替わるように拡張したいと思います。これは、nsIWindowMediator インターフェースを使えば可能です。このインターフェースを使うと、開いているウィンドウのリストにアクセスできます。指定のウィンドウを取得するのにこれを使い、フォーカスをそれに切り替えることができます。以下のコードは、それを実装するコンポーネントを取得する方法を示しています。
var wmdata = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService(); var wmediator = wmdata.QueryInterface(Components.interfaces.nsIWindowMediator); |
このコードは、window mediator コンポーネントを検索します。コンポーネントの名前に注意して下さい。組み込みのデータソースのどれを取得する場合にも似たシンタックスが使えます。使用しているコンポーネントは、window-mediator RDF データソースを処理するのと同じものです。多くの関数が、nsIWindowMediator によって利用できます。
| getEnumerator(type) | 開いているウィンドウセットで繰り返し処理を行なうのに使える nsISimpleEnumerator を実装するオブジェクトを取得する。 |
| getMostRecentWindow(type) | 最も最近使われたウィンドウを返す。ある型のウィンドウを取得するため、型の指定ができる。 |
| getWindowForResource(url) | 与えられた RDF リソースに対して、それが記述するウィンドウを返す。これは、window-mediator RDF データソースからウィンドウを取得するのに使える。 |
| convertISupportsToDOMWindow(win) | 通常はウィンドウ列挙型を通じて返される XPCOM ウィンドウ参照に対して、JavaScript ウィンドウオブジェクトを返す。 |
type パラメータは、null でも構いません。これは、すべての型のウィンドウということです (これは実質上すべてのウィンドウを意味します)。型を指定すると、興味のないウィンドウをフィルターすることができます。ウィンドウの型は、window 要素に windowtype 属性を追加することによって指定できます。例えば
<window id="findfile-window" title="Find Files" windowtype="find-files" xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> |
しかし、関数 getWindowForResource が使いたいかもしれません。データソースからリソースが取得できるからです。前の例では、ウィンドウのリストを作成して、それをテンプレートを使ってメニューに追加しました。テンプレートは、個々の menuitem 要素に id 属性を作り出します。この属性の値はリソースとして使えます。このことは、ウィンドウフォーカスを切り替えるのに、次のようにする必要があるということです。
下の例は、これをどのように行なうのかを示しています。
<menu label="Window" oncommand="switchFocus(event.target);">
function switchFocus(elem)
{
var wmdata = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService();
var wmediator = wmdata.QueryInterface(Components.interfaces.nsIWindowMediator);
var resource = elem.getAttribute('id');
switchwindow = wmediator.getWindowForResource(resource);
if (switchwindow){
switchwindow.focus();
}
}
|
コマンドハンドラーを、メニューから選択された要素のパラメータを使ってこの関数を呼び出すメニュー要素に追加しました。関数 switchFocus は、まず、window mediator インターフェースを実装するコンポーネントへの参照を取得します。次に、要素の id 属性の値を取得します。id 属性の値はリソースとして使えます。関数 getWindowForResource はリソースを受け取り、それにマッチするウィンドウを返します。switchwindow 変数に保存されたこのウィンドウは、JavaScript ウィンドウオブジェクトと同様に定義されます。これは、それが提供する関数のどれでも呼び出せるということです。その一つが focus です。
(進む) 次は、RDF を操作するのに使われる XPCOM インターフェースを見ることにしましょう。
例: 8.2.1