タイトル鶴薗賢吾のCocoaはやっぱり!出張版》#6 - ツールバー(2)カテゴリーユーザインタフェース, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2001/12/17 22:57:17作成者新居雅行
 ̄ ̄ ̄ツールバーのカスタマイズ___

ツールバー上のアイテムは、ユーザーが自由に順番を入れ替えたり、用意されているアイテムの中から取捨選択ができるようになっています。「 Window → Customize Toolbar... 」メニューを選択してみてください。

◇Customize Toolbarメニュー
 

ちょっと補足:設定パレットを表示する方法は、ツールバーから表示されるコンテキストメニューから実行する方法や、ウィンドウの右上に表示されているボタンを、オプションキーとコマンドキーを同時に押したままクリックする方法もあります。

すると、以下のようなシートが表示されます。これを「 設定パレット ( Customize Palette ) 」と呼びます。

◇設定パレット
 

ツールバー上のテキストを「 ラベル 」といい、設定パレット上のテキストを「 パレットラベル 」といいます。ラベルは常に表示されるため短めが好まれますし、パレットラベルは多少長くても分かりやすい名前が好まれますので、別の名称が指定できます。ただし、このサンプルでは同じになっています。さらに詳細な説明を付けたい場合は、ツールチップを設定することもできます。マウスを重ねたまましばらく動かさないと下のようなツールチップが表示されます。

◇ツールチップ
 

設定パレットには、アプリケーションで使用できるツールバーアイテムの全てが表示されていますし、かつ、よく使われると思われるツールバーのセットがデフォルトセットとして表示されています。設定パレットを表示するのは、ツールバー ( NSToolbarクラス ) の役目ですので、この「 全ツールバーアイテムのリスト 」と「 デフォルトセットのリスト 」を教えてあげる必要があります。そのために、この2つのリストの情報を返すメソッドを作っておいて、これらのメソッドを持っているインスタンスをツールバーのデリゲート ( delegate ) として登録します。ツールバーは、これらのリスト情報が必要になったら、デリゲートのメソッドを呼び出します。

ちょっと補足:デリゲートというのは、アプリケーション固有の処理のようにフレームワーク側ではできないことを、外部に用意してあるインスタンスに任せるための仕組みです。また、その外部のインスタンスもデリゲートと呼びます。デリゲートにどういったメソッドを実装していないといけないかは、デリゲートを呼び出す側のクラスの仕様によりますので、リファレンスを参照して必要なメソッドを知っておく必要があります。ちなみに、デリゲートとは「 委任 」という意味です。Cocoaのフレームワークでは、このデリゲートの仕組みはよく使われます。

ここで、これまでの内容を図にしてみましょう。ツールバーを作成した時には、ツールバーの下請け的に働いて色んな情報を返したりするデリゲートと各ツールバーアイテムの処理を実行するためのターゲットのインスタンスが必要になります。ツールバーを使うためには、このデリゲートとターゲットを作るのが主な作業となります。今回のサンプルでは、Controllerというクラスにデリゲートやターゲットなどの全ての処理が書かれています。

◇ツールバーが動くために必要なインスタンスと送られるメッセージ
 

 ̄ ̄ ̄アイテムリスト取得のための2つのデリゲートメソッド___

ツールバーにはデリゲートがあって、デリゲートには、ツールバーアイテムの全リストとデフォルトセットの2つのアイテムリストを返すメソッドが必要だということが分かりました。ここでは、この2つのメソッドについて掘り下げていきます。

全てのツールバーアイテムには、重複しないような名前 ( 文字列 ) が付けられていまして、この名前でツールバーを識別したり、ツールバーを指定したりします。この名前のことを「 識別子 ( Identifier ) 」と呼びます。この2つのメソッドは、識別子の配列を返すメソッドになっています。具体的にどうなっているかを、Controller.mを開いて見てみましょう。まずは、全ツールバーアイテムを返す toolbarAllowedItemIdentifiers : からです。

◇Controller.m → toolbarAllowedItemIdentifiers

- (NSArray *) toolbarAllowedItemIdentifiers : (NSToolbar*) toolbar {

return [ NSArray arrayWithObjects :
@"FontStyle",
@"FontSize",
NSToolbarSeparatorItemIdentifier,
@"BlueLetter",
NSToolbarSpaceItemIdentifier,
NSToolbarFlexibleSpaceItemIdentifier,
NSToolbarPrintItemIdentifier,
nil ];

}

このように、識別子の配列を1つ作ってそれを返しているだけです。NSToolbar...ItemIdentifierとなっているのは、先程出てきた標準アイテムの識別子です。このように使うわけです。それ以外は、カスタムアイテムの識別子です。この配列の順番と設定パレット上の順番が同じになっているところにも注目です。続いて、デフォルトセットを返すtoolbarDefaultItemIdentifiers : も見てみます。

◇Controller.m → toolbarDefaultItemIdentifiers

- (NSArray *) toolbarDefaultItemIdentifiers : (NSToolbar *) toolbar {

return [ NSArray arrayWithObjects :
@"FontStyle",
@"FontSize",
NSToolbarSeparatorItemIdentifier,
@"BlueLetter",
NSToolbarPrintItemIdentifier,
nil ];

}

これも同様に識別子の配列を返しているだけです。こちらも、配列の順番と設定パレット上の順番が同じになっています。メソッドの詳細は以下のとおりです。


 ★ NSToolbarDelegate : 全ツールバーアイテムの取得
  [書式] - (NSArray *) toolbarAllowedItemIdentifiers : (NSToolbar*) toolbar
  [入力] toolbar : 親のツールバーのインスタンス
  [出力] 返り値 : 全ツールバーアイテムの識別子(文字列)の配列。
          配列の順番に設定パレットに表示される。
  [備考] このメソッドは、NSToolbarのデリゲートに必須のメソッド。
      主に設定パレットを表示する直前で呼ばれる。
      (フレームワークのバージョンで変わる可能性がある)

 ★ NSToolbarDelegate : ツールバーアイテムのデフォルトセットの取得
  [書式] - (NSArray *) toolbarDefaultItemIdentifiers : (NSToolbar*) toolbar
  [入力] toolbar : 親のツールバーのインスタンス
  [出力] 返り値 : デフォルトセットの識別子(文字列)の配列。
          配列の順番に設定パレットに表示される。
  [備考] このメソッドは、NSToolbarのデリゲートに必須のメソッド。
      このメソッドは、主に以下のケースで呼ばれる。
      (フレームワークのバージョンで変わる可能性がある)
        ・設定パレットを表示する直前
        ・ツールバーがデフォルトセットに戻された時
        ・環境設定ファイルが無い状態で空のツールバーが
         ウィンドウにセットされた時

ちょっと補足:どちらのメソッドもパラメータに親のツールバーのインスタンスが渡ってきます。今回のサンプルでは無視していますが、例えば、Mac OS XにバンドルされているMailアプリケーションのように、受信メールのウィンドウとメール作成のウィンドウで別のツールバーを表示する場合もあります。そのため、見分ける必要がある場合にはこのパラメータを使います。もちろん、ツールバー毎にデリゲートを別にする方法もあります。
[鶴薗賢吾]
関連リンクCocoaはやっぱり!