タイトル鶴薗賢吾のCocoaはやっぱり!出張版》#6 - ツールバー(6)カテゴリーユーザインタフェース, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2001/12/17 22:59:37作成者新居雅行
 ̄ ̄ ̄ツールバーアイテム辞書の登録処理___

さて、先程説明をとばしたaddToolbarItemのところに戻ります。パラメータが沢山ありますので、まずはパラメータの説明から行います。addToolbarItem関数の先頭部分を見ていただきましょう。

◇Controller.m → addToolbarItem

static void addToolbarItem (
NSMutableDictionary *theDict, // 登録先のツールバーアイテム辞書
NSString *identifier, // 識別子
NSString *label, // ラベル
NSString *paletteLabel, // パレットラベル
NSString *toolTip, // ツールチップ
id target, // イメージアイテム用のターゲット
SEL settingSelector, // ツールバーにセットする時のメソッド名
id itemContent, // ツールバーにセットする画像かビュー
SEL action, // イメージアイテム用のアクション
NSMenu *menu // メニュー
) {

最初のtheDictが、ツールバーアイテムを登録する辞書のインスタンスで、それ以降は、登録するツールバーアイテムに関する情報になっています。

identifierからtoolTipまでは、今まで説明したツールバーアイテムの属性そのものですので、対応する文字列を渡します。targetは、イメージアイテムがクリックされた時のメッセージの送り先です。送るメッセージはactionで指定します。ビューアイテムの場合は、ビューアイテムの中の部品に予め設定されているため、このターゲットとアクションは無視されます。itemContentは、イメージアイテムなら画像のインスタンス、ビューアイテムならカスタムビューのインスタンスを渡します。これをツールバーアイテムへセットするわけですが、セットする際に使用するメソッドをsettingSelectorで指定します。イメージアイテムの場合は、setImage : を、ビューアイテムの場合は、setView : を指定します。menuは、Text Onlyモードの時やオーバーフローメニューで使用するメニューです。

呼び出し元のところを見てみます。addToolbarItemは、3回呼ばれていますが、それぞれはツールバーのアイテムの「 Font Style 」「 Font Size 」「 Blue Text 」の3つの登録の処理です。Font StyleとFont Sizeは、ビューアイテムでほぼ内容が同じなので、Font Styleのみ説明します。Blue Textは、イメージアイテムのなのでビューアイテムとはパラメータがちょっと異なります。

◇Controller.m → awakeFromNib

// Font StyleとFont Sizeを辞書に登録 ( ビューアイテム )
addToolbarItem( toolbarItems,
@"FontStyle", @"Font Style", @"Font Style",
@"Change your font style",
self, @selector(setView:), popUpView, NULL,
fontStyleMenu );

addToolbarItem( … 省略 … );

// Blue Textを辞書に追加 ( イメージアイテム )
addToolbarItem( toolbarItems,
@"BlueLetter", @"Blue Text", @"Blue Text",
@"This toggles blue text on/off",
self, @selector(setImage:),
[ NSImage imageNamed : @"blueLetter.tif" ],
@selector(blueText:), fontSizeMenu );

では、addToolbarItemの中を詳しく見ていきます。

◇Controller.m → addToolbarItem

static void addToolbarItem (
: 省略
) {

NSMenuItem *mItem;
NSToolbarItem *item = [ [ [ NSToolbarItem alloc ]
initWithItemIdentifier : identifier ]
autorelease ]; // ツールバーアイテム作成

[ item setLabel : label ]; // ラベルを設定
[ item setPaletteLabel : paletteLabel ]; // パレットラベルを設定
[ item setToolTip : toolTip ]; // ツールチップを設定
[ item setTarget : target ]; // ターゲットを設定

[ item performSelector : settingSelector
withObject : itemContent ]; // アイテムに画像かビューをセット
[ item setAction : action ]; // アクションを設定

if ( menu != NULL ) { // メニューを設定
mItem = [ [ [ NSMenuItem alloc ] init ] autorelease ];
[ mItem setSubmenu : menu ];
[ mItem setTitle : [ menu title ] ];
[ item setMenuFormRepresentation : mItem ];
}

[ theDict setObject : item
forKey : identifier ]; // アイテム辞書に登録
}

最初に空のツールバーアイテムをallocとinitWithItemIdentifier : で作りまして、後は、setXXX : メソッドで次々に属性をセットしていっています。performSelector : withObject : は、メッセージを指定のインスタンスに送るためのメソッドです。

[ item performSelector : settingSelector
withObject : itemContent ]; // アイテムに画像かビューをセット

itemインスタンスが持っているsettingSelectorメソッドをitemContentをパラメータとして実行するというものです。つまり、イメージアイテムの場合は、

[ item setImage : itemContent ];

が実行されますし、ビューアイテムの場合は、

[ item setView : itemContent ];

が実行されることになります。ツールバーアイテムは、setImage : を呼ぶことでイメージアイテムになり、setView : を呼ぶことでビューアイテムになります。

そして、setMenuFormRepresentation : でメニューをセットしています。このメソッドのパラメータは、NSMenuItemですが、Interface BuilderではNSMenuを作ることになりますので、ちょっと細工をしてNSMenuItemを作っています。最後に、辞書に登録しています。
(この項続く)
[鶴薗賢吾]
関連リンクCocoaはやっぱり!