ページ

2008年5月28日水曜日

RubberBand(その33)ThinButtonにToolTip表示

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

ThinButton に ToolTipを表示させる。ToolTipとはマウスカーソルを置いてしばらくすると表示されるメッセージ。


ずいぶん昔に取り上げことがある。これを参考にして ThinButtonを改良してみる。
NSViewの特定の領域でToopTipを表示する - NSView

まず ThinButtonで ToolTipへ表示する文字列を保持できるよう各イニシャライザに引数を追加する。

ThinButton.h
- (id)initWithImage:(NSImage*)image1 alterImage:(NSImage*)image2 frame:(NSRect)frame tag:(UInt)tag tooltip:(NSString*)tooltip;

ThinButtonBar.h
- (void)addButtonWithImageResource:(NSString*)resource alterImageResource:(NSString*)resource2 tag:(UInt)tag tooltip:(NSString*)tooltip;

最後にそれぞれ tooltipを追加してある。


次に NSViewへTooltipを登録する。これは ThinButtonBar に新しいボタンが追加されるタイミングで行なう。
ThinButtonBar.m
- (void)addButtonWithImageResource:(NSString*)resource alterImageResource:(NSString*)resource2 tag:(UInt)tag tooltip:(NSString*)tooltip
{
:
//
// Add tooltip
//
[self addToolTipRect:frame owner:self userData:nil];

:
}


frame は追加する ThinButton のNSRectを表しており、ボタン毎に登録していく。

最後にボタンを登録するコードへ Tooltip文字列を追加する。ここではじかに英語の文字列を用意した。
RubberBand.m
- (id)initWithFrame:(NSRect)frame {
:
[_button_bar addButtonWithImageResource:@"icon_cancel"
alterImageResource:@"icon_cancel2"
tag:TAG_CANCEL
tooltip:@"Cancel capture"];
:


ここまででも ToolTip が表示されるようになる。


ただし指定した Tooltip文字列が表示されていない。デフォルトの動作では NSView#addToolTipRect:owner:userdata: の ownerの #description メソッドの戻り値が表示に使われる。任意の文字列を出すには NSToolTipOnwerプロトコル(非形式プロトコル)を ownerで実装してやれば良い。今回は ownerが ThinButtonBar なのでここで下記コードを実装した。

ThinButtonBar.m
- (NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(NSPoint)point userData:(void *)userData
{
for(ThinButton* button in _list) {
if (NSPointInRect(point, [button frame])) {
return [button tooltip];
}
}
return @"non";
}

マウスカーソル位置が渡されるのでどのボタンの上かをチェックし、そのToolTip文字列を返す。するとできあがり。


なお ThinButtonBar のframeを ToolTipのエリアとして登録する方法も考えられる。ただし試したところこれはうまくいかなかった。ToolTipが表示された後、マウスを動かして別のボタンの上へ動かしても最初に表示された ToolTipの文字列が表示されたままになった。恐らく領域が一つであるため、切り替わりのイベントが発生しない為だと思われる。

ソース:RubberBand-17.zip