mozilla

Revision 121122 of View Controller

  • リビジョンの URL スラグ: Places/View_Controller
  • リビジョンのタイトル: View Controller
  • リビジョンの ID: 121122
  • 作成日:
  • 作成者: saneyuki
  • 現行リビジョン いいえ
  • コメント 英語版(06:30, 3 May 2009)に対応作業開始; page created, 753 words added

このリビジョンの内容

{{ 翻訳中() }}

{{ draft() }}

{{ Firefox3() }}

コントローラはPlaces model-view-controller 設計におけるコンポーネントの1つです。コントローラは有効化、無効化を受け取り、Places viewの状態を元にコマンドを実行します。

Placesは組み込み済みのコントローラを提供していますが、異なった目的のコントローラはアプリケーション中で使われており、Placesに特有のものではありません。一般的なコントローラの情報については、XULチュートリアル内のCommandsおよびUpdating Commandsのページを参照してください。

The built-in controller

PlacesではPlacesControllerという組み込みコントローラが提供されており、{{ Source("browser/components/places/content/controller.js") }}にてプロトタイプが定義されています。組み込みPlacesビューではPlacesController自動的にが使われるので、組み込みビューを使用する場合、コントローラを新たに書き起こす必要はありません。しかしながら、XUL文書内にPlacesControllerのソースを含める必要があります。ソースを含めるのには、{{ source("browser/components/places/content/placesOverlay.xul") }}をオーバーレイするのが推奨されます。このファイルは、組み込みPlacesコンテクストメニューとXUL commandsetを含みます。詳しくは、Displaying Places information using viewsを参照してください。

PlacesControllerでサポートされている全てのコマンドをあなたのカスタムビューがサポートしており、また、PlacesControllerのコマンドしかサポートしていないのであれば、PlacesControllerをそのまま使うこともできます。もしあなたのビューが、これらのコマンドのサブセットだけをサポートしているのならば、PlacesControllerの長所のみを使用できるかもしれません。後述のCreating custom controllersを参照してください。

Places commands

PlacesController がサポートしているコマンド及びその詳細が下記に一覧されています。

コマンドの多くが、コントローラのビューにおいて現在選択されているノードを操作します。ただし注記しておきます。ビューの{{ Interface("nsIPlacesView") }}インターフェイスのselectedNode プロパティを読み取ることによって選択されたノードは発見されます。selectedNode プロパティではビューはひとつのノードしか選択しないと仮定されているので、selectedNode プロパティに依存するコマンドもまた、ビューがひとつのノードしか選択していないと仮定しており、ビューが複数のノードを選択している場合にはコマンドは動作しません。

いくつかのコマンドはコントローラのビューの結果に新規ノードを追加します。結果としてノードが挿入される位置は、ビューの{{ Interface("nsIPlacesView") }}インターフェイスの{{ Interface("nsIPlacesView") }}プロパティで定義された位置となります。

placesCmd_deleteDataHost {{ fx_minversion_inline("3") }}
{{ Interface-method("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
{{ Interface-method("nsILivemarkService", "reloadLivemarkFolder") }}を呼び出し、ビューで選択されているノードがライブブックマークであれば、再読み込みをします。
placesCmd_reloadMicrosummary
{{ Interface-method("nsIMicrosummaryService", "refreshMicrosummary") }}を呼び出し、ビューで選択されているノードがmicrosummaryであれば、再読み込みをします。
placesCmd_show:info
PlacesUIUtils.showItemProperties()を呼び出し、ビューで選択されているノードのプロパティ編集UIを表示します。
placesCmd_sortBy:name
{{ Interface-method("nsIPlacesTransactionsService", "sortFolderByName") }}を呼び出し、選択されているノードがフォルダであれば、フォルダ内のソートを行います。

PlacesController はまた、標準の編集コマンドをサポートしています。

cmd_copy
ビューで選択されているノードをクリップボードにコピーします。先述の1つのノードの選択に関する注記は適用されません。このコマンドはビューの{{ Interface-method("nsIPlacesView", "getSelectionNodes") }}を 呼び出します。
cmd_cut
ビューで選択されているノードをクリップボードにコピーし、ノードを削除します。このコマンドの実装は、コピーに続けて削除を行う単純なものです。
cmd_delete
ビューで選択されているノードを削除します。 このコマンドはビューの{{ Interface-method("nsIPlacesView", "getRemovableSelectionNodes") }}を呼び出します。
cmd_paste
ビューの結果の現在の挿入位置にクリップボードのノードを追加します。もし挿入位置が存在しない場合は、NS_ERROR_NOT_AVAILABLEが投げられます。
cmd_redo
PlacesUIUtilsで保持された{{ Interface("nsIPlacesTransactionsService") }}インスタンスの{{ Interface-method("nsITransactionManager", "redoTransaction") }}を呼び出して、最後のPlacesトランザクションをredoします。
cmd_selectAll
ビューの{{ Interface-method("nsIPlacesView", "selectAll") }}を呼び出し、ビュー中の全てのノードを選択します。
cmd_undo
PlacesUIUtilsで保持された{{ Interface("nsIPlacesTransactionsService") }}インスタンスの{{ Interface-method("nsITransactionManager", "undoTransaction") }}を呼び出して、最後のPlacesトランザクションをundoします。

Creating custom controllers

PlacesController がサポートしていないコマンドを使いたい場合、またはPlacesController ではない方法でコマンドを制御したい場合、あなた自身によりコントローラを記述する必要があります。さもなくば、カスタムビューも記述している場合は、カスタムビューを使用しているとしても、PlacesControllerをそのまま使用することとなります。コントローラに慣れていない場合は、XULチュートリアル内の Commands 及び Updating Commandsを参照してください。

If you are writing a controller for a built-in view, you can take advantage of the fact that the view automatically hooks itself up to its own default controller, an instance of PlacesController.  Your custom view need only support the commands that PlacesController either does not support or supports in ways you wish to override.  All other commands will be passed to the view's default controller.  To ensure that your controller overrides the default, it must precede the default in the view's list of controllers.  (If you are not sure why, see the tutorial links given in the previous paragraph.)  The view simply appends its default controller to the end of the list, so you should insert yours by calling the {{ Interface-method("nsIControllers", "insertControllerAt") }} method with index 0.

The following example creates a controller that supports two commands: placesCmd_open, which will override the handling of that command by the view's default controller, and aCommandOfMyOwn, a custom command.  All other commands will be handled by the view's default controller:

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);

If your custom controller is for a custom view, your set of commands includes some of those supported by PlacesController, and you are happy with the way PlacesController handles those commands, then you can still rely on PlacesController to save yourself some work.  There are a couple of strategies.  You can attach two controllers, one a PlacesController instance and one a custom, in the way described in the previous paragraphs.  Or you can attach a single controller, either an instance of PlacesController modified to suit your needs or a completely custom controller that delegates to a PlacesController instance.

The following example creates a PlacesController object, overrides its handling of the placesCmd_open command, and falls back on the default actions for all other commands.  In this case, because the our hypothetical view's only controller is the custom one we're creating here, it is not important that it precede anything; we therefore add the controller by calling {{ Interface-method("nsIControllers", "appendController") }} instead of insertControllerAt():

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);

{{ languages( { "en": "en/View_Controller"} ) }}

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

<p>{{ 翻訳中() }}</p>
<p>{{ draft() }}</p>
<p>{{ Firefox3() }}</p>
<p>コントローラはPlaces <a class="external" href="http://ja.wikipedia.org/wiki/Model_View_Controller" rel="external nofollow" target="_blank" title="http://ja.wikipedia.org/wiki/Model_View_Controller">model-view-controller</a> 設計におけるコンポーネントの1つです。コントローラは有効化、無効化を受け取り、<a href="/ja/Displaying_Places_information_using_views" title="ja/Displaying_Places_information_using_views">Places view</a>の状態を元にコマンドを実行します。</p>
<p>Placesは組み込み済みのコントローラを提供していますが、異なった目的のコントローラはアプリケーション中で使われており、Placesに特有のものではありません。一般的なコントローラの情報については、XULチュートリアル内の<a class="internal" href="/XUL_Tutorial/Commands" rel="internal">Commands</a>および<a href="/ja/XUL_Tutorial/Updating_Commands" rel="internal">Updating Commands</a>のページを参照してください。</p>
<h2>The built-in controller</h2>
<p>Placesでは<code>PlacesController</code>という組み込みコントローラが提供されており、{{ Source("browser/components/places/content/controller.js") }}にてプロトタイプが定義されています。<a class="internal" href="/ja/Displaying_Places_information_using_views" title="ja/Displaying Places information using views">組み込みPlacesビュー</a>では<code>PlacesController</code>自動的にが使われるので、組み込みビューを使用する場合、コントローラを新たに書き起こす必要はありません。しかしながら、XUL文書内に<code>PlacesController</code>のソースを含める必要があります。ソースを含めるのには、{{ source("browser/components/places/content/placesOverlay.xul") }}をオーバーレイするのが推奨されます。このファイルは、組み込みPlacesコンテクストメニューとXUL <code>commandset</code>を含みます。詳しくは、<a class="internal" href="/ja/Displaying_Places_information_using_views#Instantiating" title="ja/Displaying Places information using views#Instantiating">Displaying Places information using views</a>を参照してください。</p>
<p><code>PlacesController</code>でサポートされている全てのコマンドをあなたのカスタムビューがサポートしており、また、<code>PlacesController</code>のコマンドしかサポートしていないのであれば、<code>PlacesController</code>をそのまま使うこともできます。もしあなたのビューが、これらのコマンドのサブセットだけをサポートしているのならば、<code>PlacesController</code>の長所のみを使用できるかもしれません。後述の<a href="#Creating_custom_controllers">Creating custom controllers</a>を参照してください。</p>
<h2>Places commands</h2>
<p><code>PlacesController</code> がサポートしているコマンド及びその詳細が下記に一覧されています。</p>
<p>コマンドの多くが、コントローラのビューにおいて現在選択されているノードを操作します。ただし注記しておきます。ビューの{{ Interface("nsIPlacesView") }}インターフェイスの<code>selectedNode</code> プロパティを読み取ることによって選択されたノードは発見されます。<code>selectedNode</code> プロパティではビューはひとつのノードしか選択しないと仮定されているので、<code>selectedNode</code> プロパティに依存するコマンドもまた、ビューがひとつのノードしか選択していないと仮定しており、ビューが複数のノードを選択している場合にはコマンドは動作しません。</p>
<p>いくつかのコマンドはコントローラのビューの結果に新規ノードを追加します。結果としてノードが挿入される位置は、ビューの{{ Interface("nsIPlacesView") }}インターフェイスの{{ Interface("nsIPlacesView") }}プロパティで定義された位置となります。</p>
<dl> <dt>placesCmd_deleteDataHost {{ fx_minversion_inline("3") }}</dt> <dd>{{ Interface-method("nsIPrivateBrowsingService", "removeDataFromDomain") }}.を呼び出すことによって、選択されたノードのドメインについての全てのデータを削除します。</dd> <dt>placesCmd_moveBookmarks</dt> <dd>選択されたノードを別のフォルダに移動させるのに使われるUIが表示されます。先述の1つのノードの選択に関する注記は適用されません。このコマンドはビューの<span class="lang lang-en"><code><a href="/ja/nsIPlacesView#getSelectionNodes%28%29" rel="internal">nsIPlacesView.getSelectionNodes()</a>を呼び出します。</code></span></dd> <dt>placesCmd_new:bookmark</dt> <dd><code><a class="internal" href="/ja/Places_utilities_for_JavaScript#showAddBookmarkUI.28.29" title="ja/Places utilities for JavaScript#showAddBookmarkUI.28.29">PlacesUIUtils.showAddBookmarkUI()</a>を呼び出すことによって、新規ブックマークを追加する際に使われるUIを表示します。</code>新規ブックマークはビューの挿入位置に挿入されます。もし挿入位置が存在しない場合は、<code>NS_ERROR_NOT_AVAILABLEが投げられます。</code></dd> <dt>placesCmd_new:folder</dt> <dd><code><a class="internal" href="/ja/Places_utilities_for_JavaScript#showAddFolderUI()" title="ja/Places utilities for JavaScript#showAddFolderUI()">PlacesUIUtils.showAddFolderUI()</a></code><code>を呼び出すことによって、新規フォルダを追加する際に使われるUIを表示します。</code>新規フォルダはビューの挿入位置に挿入されます。もし挿入位置が存在しない場合は、<code>NS_ERROR_NOT_AVAILABLEが投げられます。</code></dd> <dt>placesCmd_new:livemark</dt> <dd><code><a class="internal" href="/ja/Places_utilities_for_JavaScript#showAddLivemarkUI()" title="ja/Places utilities for JavaScript#showAddLivemarkUI()">PlacesUIUtils.showAddLivemarkUI()</a></code>.<code>を呼び出すことによって、新規ライブブックマークを追加する際に使われるUIを表示します。</code>新規<code>ライブブックマーク</code>はビューの挿入位置に挿入されま す。もし挿入位置が存在しない場合は、<code>NS_ERROR_NOT_AVAILABLEが投げられます。</code></dd> <dt>placesCmd_new:separator</dt> <dd>ビューの現在の挿入位置に新規セパレータが追加されます。もし挿入位置が存在しない場合は、<code>NS_ERROR_NOT_AVAILABLEが投げられます。</code></dd> <dt>placesCmd_open</dt> <dd><a class="internal" href="/ja/Places_utilities_for_JavaScript#openNodeIn()" title="ja/Places utilities for JavaScript#openNodeIn()">PlacesUIUtils.openNodeIn()</a>を呼び出し、現在のタブに、ビューで選択しているノードを開きます。</dd> <dt>placesCmd_open:tab</dt> <dd><a class="internal" href="/ja/Places_utilities_for_JavaScript#openNodeIn()" title="ja/Places utilities for JavaScript#openNodeIn()">PlacesUIUtils.openNodeIn()</a>を呼び出し、新規タブに、ビューで選択しているノードを開きます。</dd> <dt>placesCmd_open:window</dt> <dd><a class="internal" href="/ja/Places_utilities_for_JavaScript#openNodeIn()" title="ja/Places utilities for JavaScript#openNodeIn()">PlacesUIUtils.openNodeIn()</a>を呼び出し、新規ウィンドウに、ビューで選択しているノードを開きます。</dd> <dt>placesCmd_reload</dt> <dd>{{ Interface-method("nsILivemarkService", "reloadLivemarkFolder") }}を呼び出し、ビューで選択されているノードがライブブックマークであれば、再読み込みをします。</dd> <dt>placesCmd_reloadMicrosummary</dt> <dd>{{ Interface-method("nsIMicrosummaryService", "refreshMicrosummary") }}を呼び出し、ビューで選択されているノードがmicrosummaryであれば、再読み込みをします。</dd> <dt>placesCmd_show:info</dt> <dd><code><a class="internal" href="/ja/Places_utilities_for_JavaScript#showItemProperties()" title="ja/Places utilities for JavaScript#showItemProperties()">PlacesUIUtils.showItemProperties()</a>を呼び出し、ビューで選択されているノードの</code><code>プロパティ編集UIを表示します。</code></dd> <dt>placesCmd_sortBy:name</dt> <dd>{{ Interface-method("nsIPlacesTransactionsService", "sortFolderByName") }}を呼び出し、選択されているノードがフォルダであれば、フォルダ内のソートを行います。</dd>
</dl>
<p><code>PlacesController</code> はまた、標準の編集コマンドをサポートしています。</p>
<dl> <dt>cmd_copy</dt> <dd>ビューで選択されているノードをクリップボードにコピーします。先述の1つのノードの選択に関する注記は適用されません。このコマンドはビューの{{ Interface-method("nsIPlacesView", "getSelectionNodes") }}<span class="lang lang-en"><code>を 呼び出します。</code></span></dd> <dt>cmd_cut</dt> <dd>ビューで選択されているノードをクリップボードにコピーし、ノードを削除します。このコマンドの実装は、コピーに続けて削除を行う単純なものです。</dd> <dt>cmd_delete</dt> <dd>ビューで選択されているノードを削除します。 このコマンドはビューの{{ Interface-method("nsIPlacesView", "getRemovableSelectionNodes") }}<span class="lang lang-en"><code>を呼び出します。</code></span></dd> <dt>cmd_paste</dt> <dd>ビューの結果の現在の挿入位置にクリップボードのノードを追加します。もし挿入位置が存在しない場合は、<code>NS_ERROR_NOT_AVAILABLEが投げられます。</code></dd> <dt>cmd_redo</dt> <dd><code><a class="internal" href="/ja/Places_utilities_for_JavaScript" title="ja/Places utilities for JavaScript">PlacesUIUtils</a></code>で保持された{{ Interface("nsIPlacesTransactionsService") }}インスタンスの{{ Interface-method("nsITransactionManager", "redoTransaction") }}を呼び出して、最後のPlacesトランザクションをredoします。</dd> <dt>cmd_selectAll</dt> <dd>ビューの{{ Interface-method("nsIPlacesView", "selectAll") }}を呼び出し、ビュー中の全てのノードを選択します。</dd> <dt>cmd_undo</dt> <dd><code><a class="internal" href="/ja/Places_utilities_for_JavaScript" title="ja/Places utilities for JavaScript">PlacesUIUtils</a></code>で保持された{{ Interface("nsIPlacesTransactionsService") }}インスタンスの{{ Interface-method("nsITransactionManager", "undoTransaction") }}を呼び出して、最後のPlacesトランザクションをundoします。</dd>
</dl>
<h2>Creating custom controllers</h2>
<p><code>PlacesController</code> がサポートしていないコマンドを使いたい場合、または<code>PlacesController</code> ではない方法でコマンドを制御したい場合、あなた自身によりコントローラを記述する必要があります。さもなくば、カスタムビューも記述している場合は、カスタムビューを使用しているとしても、<code>PlacesController</code>をそのまま使用することとなります。コントローラに慣れていない場合は、XULチュートリアル内の <a class="internal" href="/ja/XUL_Tutorial/Commands" title="ja/XUL Tutorial/Commands">Commands</a> 及び <a href="/ja/XUL_Tutorial/Updating_Commands" title="ja/XUL_Tutorial/Updating_Commands">Updating Commands</a>を参照してください。</p>
<p>If you are writing a controller for a built-in view, you can take advantage of the fact that the view automatically hooks itself up to its own default controller, an instance of <code>PlacesController</code>.  Your custom view need only support the commands that <code>PlacesController</code> either does not support or supports in ways you wish to override.  All other commands will be passed to the view's default controller.  To ensure that your controller overrides the default, it must precede the default in the view's list of controllers.  (If you are not sure why, see the tutorial links given in the previous paragraph.)  The view simply appends its default controller to the end of the list, so you should insert yours by calling the {{ Interface-method("nsIControllers", "insertControllerAt") }} method with index 0.</p>
<p>The following example creates a controller that supports two commands: <code>placesCmd_open</code>, which will override the handling of that command by the view's default controller, and <code>aCommandOfMyOwn</code>, a custom command.  All other commands will be handled by the view's default controller:</p>
<pre class="brush: js">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) &gt;= 0;
  }
};
var treeView = document.getElementById("myTreeView");
treeView.controllers.insertControllerAt(0, controller);
</pre>
<p>If your custom controller is for a custom view, your set of commands includes some of those supported by <code>PlacesController</code>, and you are happy with the way <code>PlacesController</code> handles those commands, then you can still rely on <code>PlacesController</code> to save yourself some work.  There are a couple of strategies.  You can attach two controllers, one a <code>PlacesController</code> instance and one a custom, in the way described in the previous paragraphs.  Or you can attach a single controller, either an instance of <code>PlacesController</code> modified to suit your needs or a completely custom controller that delegates to a <code>PlacesController</code> instance.</p>
<p>The following example creates a <code>PlacesController</code> object, overrides its handling of the <code>placesCmd_open</code> command, and falls back on the default actions for all other commands.  In this case, because the our hypothetical view's only controller is the custom one we're creating here, it is not important that it precede anything; we therefore add the controller by calling {{ Interface-method("nsIControllers", "appendController") }} instead of <code>insertControllerAt()</code>:</p>
<pre class="brush: js">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);
</pre>
<p>{{ languages( { "en": "en/View_Controller"} ) }}</p>
このリビジョンへ戻す