草案
このページは完成していません。
コントローラはPlaces model-view-controller 設計におけるコンポーネントの1つです。コントローラは有効化、無効化を受け取り、Places viewの状態を元にコマンドを実行します。
Placesは組み込み済みのコントローラを提供していますが、異なった目的のコントローラはアプリケーション中で使われており、Placesに特有のものではありません。一般的なコントローラの情報については、XULチュートリアル内のCommandsおよびUpdating Commandsのページを参照してください。
The built-in controller
PlacesではPlacesController
という組み込みコントローラが提供されており、browser/components/places/content/controller.js
にてプロトタイプが定義されています。組み込みPlacesビューではPlacesController
自動的にが使われるので、組み込みビューを使用する場合、コントローラを新たに書き起こす必要はありません。しかしながら、XUL文書内にPlacesController
のソースを含める必要があります。ソースを含めるのには、browser/components/places/content/placesOverlay.xul
をオーバーレイするのが推奨されます。このファイルは、組み込みPlacesコンテクストメニューとXUL commandset
を含みます。詳しくは、Displaying Places information using viewsを参照してください。
PlacesController
でサポートされている全てのコマンドをあなたのカスタムビューがサポートしており、また、PlacesController
のコマンドしかサポートしていないのであれば、PlacesController
をそのまま使うこともできます。もしあなたのビューが、これらのコマンドのサブセットだけをサポートしているのならば、PlacesController
の長所のみを使用できるかもしれません。後述のCreating custom controllersを参照してください。
Places commands
PlacesController
がサポートしているコマンド及びその詳細が下記に一覧されています。
コマンドの多くが、コントローラのビューにおいて現在選択されているノードを操作します。ただし注記しておきます。ビューのnsIPlacesView
インターフェイスのselectedNode
プロパティを読み取ることによって選択されたノードは発見されます。selectedNode
プロパティではビューはひとつのノードしか選択しないと仮定されているので、selectedNode
プロパティに依存するコマンドもまた、ビューがひとつのノードしか選択していないと仮定しており、ビューが複数のノードを選択している場合にはコマンドは動作しません。
いくつかのコマンドはコントローラのビューの結果に新規ノードを追加します。結果としてノードが挿入される位置は、ビューのnsIPlacesView
インターフェイスのnsIPlacesView
プロパティで定義された位置となります。
- placesCmd_deleteDataHost
-
nsIPrivateBrowsingService.removeDataFromDomain()
.を呼び出すことによって、選択されたノードのドメインについての全てのデータを削除します。 - placesCmd_moveBookmarks
-
選択されたノードを別のフォルダに移動させるのに使われるUIが表示されます。先述の1つのノードの選択に関する注記は適用されません。このコマンドはビューの
nsIPlacesView.getSelectionNodes()を呼び出します。
- placesCmd_new:bookmark
-
PlacesUIUtils.showAddBookmarkUI()を呼び出すことによって、新規ブックマークを追加する際に使われるUIを表示します。
新規ブックマークはビューの挿入位置に挿入されます。もし挿入位置が存在しない場合は、NS_ERROR_NOT_AVAILABLEが投げられます。
- placesCmd_new:folder
-
PlacesUIUtils.showAddFolderUI()
を呼び出すことによって、新規フォルダを追加する際に使われるUIを表示します。
新規フォルダはビューの挿入位置に挿入されます。もし挿入位置が存在しない場合は、NS_ERROR_NOT_AVAILABLEが投げられます。
- placesCmd_new:livemark
-
PlacesUIUtils.showAddLivemarkUI()
.を呼び出すことによって、新規ライブブックマークを追加する際に使われるUIを表示します。
新規ライブブックマーク
はビューの挿入位置に挿入されま す。もし挿入位置が存在しない場合は、NS_ERROR_NOT_AVAILABLEが投げられます。
- placesCmd_new:separator
-
ビューの現在の挿入位置に新規セパレータが追加されます。もし挿入位置が存在しない場合は、
NS_ERROR_NOT_AVAILABLEが投げられます。
- placesCmd_open
- PlacesUIUtils.openNodeIn()を呼び出し、現在のタブに、ビューで選択しているノードを開きます。
- placesCmd_open:tab
- PlacesUIUtils.openNodeIn()を呼び出し、新規タブに、ビューで選択しているノードを開きます。
- placesCmd_open:window
- PlacesUIUtils.openNodeIn()を呼び出し、新規ウィンドウに、ビューで選択しているノードを開きます。
- placesCmd_reload
-
nsILivemarkService.reloadLivemarkFolder()
を呼び出し、ビューで選択されているノードがライブブックマークであれば、再読み込みをします。 - placesCmd_reloadMicrosummary
-
nsIMicrosummaryService.refreshMicrosummary()
を呼び出し、ビューで選択されているノードがmicrosummaryであれば、再読み込みをします。 - placesCmd_show:info
-
PlacesUIUtils.showItemProperties()を呼び出し、ビューで選択されているノードの
プロパティ編集UIを表示します。
- placesCmd_sortBy:name
-
nsIPlacesTransactionsService.sortFolderByName()
を呼び出し、選択されているノードがフォルダであれば、フォルダ内のソートを行います。
PlacesController
はまた、標準の編集コマンドをサポートしています。
- cmd_copy
-
ビューで選択されているノードをクリップボードにコピーします。先述の1つのノードの選択に関する注記は適用されません。このコマンドはビューの
nsIPlacesView.getSelectionNodes()
を 呼び出します。
- cmd_cut
- ビューで選択されているノードをクリップボードにコピーし、ノードを削除します。このコマンドの実装は、コピーに続けて削除を行う単純なものです。
- cmd_delete
-
ビューで選択されているノードを削除します。 このコマンドはビューの
nsIPlacesView.getRemovableSelectionNodes()
を呼び出します。
- cmd_paste
-
ビューの結果の現在の挿入位置にクリップボードのノードを追加します。もし挿入位置が存在しない場合は、
NS_ERROR_NOT_AVAILABLEが投げられます。
- cmd_redo
-
PlacesUIUtils
で保持されたnsIPlacesTransactionsService
インスタンスのnsITransactionManager.redoTransaction()
を呼び出して、最後のPlacesトランザクションをredoします。 - cmd_selectAll
-
ビューの
nsIPlacesView.selectAll()
を呼び出し、ビュー中の全てのノードを選択します。 - cmd_undo
-
PlacesUIUtils
で保持されたnsIPlacesTransactionsService
インスタンスのnsITransactionManager.undoTransaction()
を呼び出して、最後のPlacesトランザクションをundoします。
Creating custom controllers
PlacesController
がサポートしていないコマンドを使いたい場合、またはPlacesController
ではない方法でコマンドを制御したい場合、あなた自身によりコントローラを記述する必要があります。さもなくば、カスタムビューも記述している場合は、カスタムビューを使用しているとしても、PlacesController
をそのまま使用することとなります。コントローラに慣れていない場合は、XULチュートリアル内の Commands 及び Updating Commandsを参照してください。
組み込みビューのためのコントローラを自ら記述しているのならば、ビューが自動的にPlacesControllerのインスタンスである標準のコントローラを接続するという事実の利点を使うことができます。あなたのカスタムビューは、PlacesControllerがサポートしていようがしていまいが、オーバーライドを望む方法でコマンドをサポートする必要があります。他のすべてのコマンドは、ビュー標準のコントローラによって制御されます。あなたのコントローラが標準のものを上書きするのを保証するため、ビュー内のコントローラの一覧において、標準コントローラを前に持ってくるべきです。(なぜこうするべきか納得できない場合は、前段にリンクがあるチュートリアルを参照してください)
ビューは単純に標準コントローラを最後に配置します。そのため、nsIControllers.insertControllerAt()
を呼び出して、indexの値を0として設定してください。
下記の例では、ビューの標準コントローラによってコマンドの制御をオーバーライドされる placesCmd_open
と、カスタムコマンドであるaCommandOfMyOwn
の、2つのコマンドを制御するコントローラを作成しています。他のすべてのコマンドは、ビューの標準コントローラによって制御されます。
var controller = { doCommand: function (aCmd) { switch (aCmd) { case "placesCmd_open": alert("No."); break; case "aCommandOfMyOwn": alert("Shrimp and white wine."); break; } }, isCommandEnabled: function (aCmd) { return true; }, onEvent: function (aEventName) {}, supportsCommand: function (aCmd) { return ["placesCmd_open", "aCommandOfMyOwn"].indexOf(aCmd) >= 0; } }; var treeView = document.getElementById("myTreeView"); treeView.controllers.insertControllerAt(0, controller);
あなたのカスタムコントローラがカスタムビュー向けである場合、PlacesControllerによってサポートされるいくつかのコマンドの制御も含まれます。また、幸運なことにPlacesControllerがこれらのコマンドを制御する方法は、PlacesControllerに頼ることであなたの作業量を減らします。2つ方策があります。前段で述べたように、一方はPlacesControllerのインスタンス、もう一方はカスタムコントローラ、の二つを付随させることができます。または、あなたの使い方にあわせて修正されたPlacesControllerのインスタンスか、またはPlacesControllerインスタンスを加太代わりするための完全なカスタムコントローラのどちらか一方のみをコントローラとして使うことです。
下記の例では、PlacesController
オブジェクトを作成することで、 placesCmd_open
コマンドの制御をオーバーライドし、そして他の全てのコマンドは標準の挙動に頼っています。このケースでは、仮定したビューのコントローラは私たちがここで作成したカスタムコントローラだけであるので、それが優先されるのはあまり重要ではありません。それ故、insertControllerAt()の代わりに
nsIControllers.appendController()
を呼び出すことでコントローラを追加しています。
var treeView = document.getElementById("myCustomTreeView"); var controller = new PlacesController(treeView); controller._doCommand = controller.doCommand; controller.doCommand = function (aCmd) { if (aCmd === "placesCmd_open") alert("No."); else this._doCommand(aCmd); }; treeView.controllers.appendController(controller);