ページ

2008年10月24日金曜日

範囲選択履歴(その5)ポップアップメニューのハンドリング

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

検証ができたので、組み込みに入る。アーキテクチャは下図のようにする。


三角を押す、メニューを選ぶ、と2つのイベントを処理する必要がある為に少し複雑になっている。
イベントのやりとりは Viewが中心になることから、イベントの直接的な処理を Viewにまかせ、Controller は表示するメニューの提供や、Viewからのイベント伝達を待つような役割分担とする。実際にはこの後、履歴を管理するモデルもこの中に登場することになる。

(1)から(4)までの処理を行っている Viewのコードはこんな感じ。

- (void)displayMenuWithTag:(UInt)tag event:(NSEvent*)theEvent
{
NSArray* list = [_delegate performSelector:@selector(menuWithTag:)
withObject:[NSNumber numberWithInt:tag]];
NSMenu* menu = [[[NSMenu alloc] initWithTitle:@""] autorelease];
NSInteger idx = 0;
for (NSString* title in list) {
[menu insertItemWithTitle:title
action:@selector(selectMenu:)
keyEquivalent:@""
atIndex:idx++];
}
[NSMenu popUpContextMenu:menu withEvent:theEvent forView:self];
}

_delegateに対して投げている menuWithTag: はこんな感じ。現在は動作確認用に固定の文字配列を返す。
-(NSArray*)menuWithTag:(NSNumber*)tag
{
NSLog(@"tag=%@", tag);
NSMutableArray* array = [NSMutableArray array];
switch ([tag intValue]) {
case TAG_SELECTION_HISTORY:
[array addObject:@"100x100"];
[array addObject:@"200x200"];
[array addObject:@"300x300"];
break;

default:
break;
}
return array;
}


これでポップアップメニューが出る。


今回はメニューが押された時に呼出されるメソッドも用意したので、全メニューが有効(Enable)になって選択できるようになっている。