タイトル鶴薗賢吾のCocoaはやっぱり!出張版》#6 - ツールバー(8)カテゴリーユーザインタフェース, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2001/12/17 23:0:41作成者新居雅行
―――――必須ではないデリゲートメソッド

ここでは、必須ではないデリゲートメソッドを紹介していきます。必須ではないので、実装しなくてもツールバーは動きますが、より細かい制御をしたい場合にはこれらのメソッドを実装するとよいでしょう。

 ̄ ̄ ̄ツールバーアイテムの登録通知___

Controller.mにはtoolbarWillAddItem : というメソッドもありますが、これは、ツールバーにアイテムが登録される直前に呼ばれます ( toolbar : itemForItemIdentifier : willBeInsertedToolbar : よりは後 )。主に、標準アイテムの属性を変更するのに使用します。ここでは、Printのツールチップとターゲットの変更を行っています。パラメータのNSNotificationのuserInfoのitemにNSToolbarItemが入っていますので、取り出して、setToolTip : とsetTarget : を実行しています。ちなみに、標準では、ツールチップは「 Print 」で、ターゲットはファーストレスポンダーになっています。

◇Controller.m → toolbarWillAddItem

- (void) toolbarWillAddItem : (NSNotification *) notif {

NSToolbarItem *addedItem = [ [ notif userInfo ] objectForKey : @"item" ];

if ( [ [ addedItem itemIdentifier ]
isEqual : NSToolbarPrintItemIdentifier ] ) { // Printの場合
[ addedItem setToolTip : @"Print your document" ]; // ツールチップ変更
[ addedItem setTarget : self ]; // ターゲット変更
}
}

 ★ NSToolbarNotifications : ツールバーアイテム登録通知
  [書式] - (void) toolbarWillAddItem : (NSNotification *) notification
  [入力] notification : 通知情報
 

 ̄ ̄ ̄ツールバーアイテムの削除通知___

登録通知の逆で、ツールバー上から取り除かれた後にも通知がきます。例えば、ツールバーアイテムの初期化時にメモリを確保しているようなものの場合は、ここで破棄を行います。

◇Controller.m → toolbarDidRemoveItem
- (void) toolbarDidRemoveItem : (NSNotification *) notif {

NSToolbarItem *removedItem = [ [ notif userInfo ] objectForKey : @"item" ];
: removedItemに対する終了処理
}

 ★ NSToolbarNotifications : ツールバーアイテム削除通知
  [書式] - (void) toolbarDidRemoveItem : (NSNotification *) notification
  [入力] notification : 通知情報

 ̄ ̄ ̄ツールバーのバリデーション___

状況によって一時的にツールバーアイテムを使用不可にしたいことがありますが、これを制御するにはバリデーションの機構 ( 有効かどうかを返す ) を使います。ツールバーアイテムのターゲットのインスタンスにvalidateToolbarItem : メソッドを書いておきますと、バリデーションが必要な時にツールバーアイテム単位でこのメソッドが呼ばれます。

◇Controller.m → validateToolbarItem :

- (BOOL) validateToolbarItem : (NSToolbarItem *) theItem {

// NSLog( @"validateToolbarItem : %@", [ theItem label ] ); // 追加

return YES; // or NO
}

パラメータにツールバーアイテムのインスタンスが渡ってきますので、判断をして有効ならばYESを無効ならばNOを返すようにします。上のようにNSLogを入れておきますと分かりますが、マウスが動いただけでこのメソッドは呼ばれることがあります。

 ★ NSToolbarItemValidation : ツールバーアイテムが有効かどうかを返す
  [書式] - (BOOL) validateToolbarItem : (NSToolbarItem *) theItem
  [入力] theItem: 対象のツールバーアイテム
  [出力] 返り値 : 有効 = YES、無効 = NO
  [備考] イメージアイテムにのみ有効

 ̄ ̄ ̄メニューのバリデーション___

ツールバーアイテムにメニューがついていて、Text Onlyモードやオーバーフローメニューになった場合は、validateMenuItem : が代わりに呼ばれるようになります。メニューがクリックされてプルダウンする直前に呼ばれますので、この中でメニューにチェックマークをつけるなどの処理も行うのが楽でいいでしょう。このサンプルでもこの中でチェックを付けています。

◇Controller.m → validateMenuItem :

- (BOOL) validateMenuItem : (NSMenuItem *) menuItem {

if ( [ menuItem action ] == @selector( changeFontStyle : ) ) {
if ( [ menuItem tag ] == fontStylePicked )
[ menuItem setState : NSOnState ]; // チェックをつける
}

return YES; // or NO
}

 ★ NSMenuValidation : メニューが有効かどうかを返す
  [書式] - (BOOL) validateMenuItem : (id ) menuItem
  [入力] menuItem : 対象のメニューアイテム
  [出力] 返り値 : 有効 = YES、無効 = NO

―――――メニューバーからの操作

 ̄ ̄ ̄ツールバーを隠す___

ツールバーは不要な場合は、ユーザーが隠すことが出来るようになっています。ウィンドウの右上にあるボタンで隠したり表示したり出来るので、特に何もしなくてもとりあえずは大丈夫ですが、一般的にはウィンドウメニューや表示メニューなどに「 Hide Toolbar ( ツールバーを隠す )」というメニューをつけることが多いです。このメニューは、ツールバーが隠されている場合は「 Show Toolbar ( ツールバーを表示 )」というタイトルに切り替わります。

このメニューを実現したい場合は、メニューを作って、ウィンドウのtoggleToolbarShown : というアクションにコネクトするだけで作業は完了です。メニューのタイトルもツールバーの状態によって自動的に変わりますので、タイトルを付けておく必要もありませんし、コーディングの必要はありません。さらに、設定パレットを表示している間は、自動的に使えなくなります。

◇Hide Toolbarメニューの挙動
 

このサンプルでは、toggleToolbarShown : のコネクトをウィンドウに対して行っていますが、複数のウィンドウを持つアプリケーションの場合は、ファーストレスポンダ ( First Responder ) にコネクトすることになります ( この方が一般的だと思います )。こうしておくと、ツールバーを持たないウィンドウがアクティブな時にはメニューが自動的に使えなくなってくれます。このサンプルでは、アバウトパネルをアクティブにしておくとメニューが使えなくなります。

 ̄ ̄ ̄設定パレットの表示___

設定パレットの表示も同様です。メニューを作って、ウィンドウの runToolbarCustomizationPalette : アクションにコネクトするだけです。このメニューも同様に、ファーストレスポンダにコネクトするのが一般的といえます。コネクトをするだけで、設定パネルが表示されて、閉じられるまでの操作も全てフレームワークが行ってくれます ( ツールバーからアイテムを取り除いた時の爆発のアニメーションも自動です )。
(この項続く)
[鶴薗賢吾]
関連リンクCocoaはやっぱり!