Cocoa Programming Tips 1001
Application Kit
NSDragging
Application Kit - NSDragging
ドラッグを受け付ける
Keywords: registerForDraggedTypes, draggingEntered, draggingUpdated, draggingExited
ある View を、他からのドラッグを受け付けることができるようにするには、まず NSView の registerForDraggedTypes: を使うんだ。
Application Kit/NSView.h
- (void)registerForDraggedTypes:(NSArray*)pboardType;
引き数に、ドラッグで受け付けたいタイプを指定する。たとえば、Finder からファイルのドラッグをもらいたいときは、NSFilenamesPboardType を指定するんだ。タイプは NSPasteboard で解説している。
で、指定されたタイプがドラッグされると、メッセージが投げられる。これを受け取るには、NSDraggingDestination で指定されるメソッドをオーバーライドするんだ。
Application Kit/NSDragging.h
- (unsinged int)draggingEntered:(id <NSDraggingInfo>)sender;
- (unsinged int)draggingUpdated:(id <NSDraggingInfo>)sender;
- (void)draggingExited:(id <NSDraggingIno>)sender;
ドラッグが入ると、draggingEntered:、入ってるいる間は draggingUpdated: が呼び出される。draggingUpdated: は、一度だけじゃなくて、入っている間くり返し呼び出されるようだ。で、出たら draggingExited: が呼ばれる、と。
(sample)
- (id)initWithFrame:(NSRect)rect
{
self = [super initWithFrame:rect];
if(self) {
NSArray* array =
[NSArray arrayWithObject:NSFilenamesPboardType];
[self registerForDraggedTypes:array];
}
return self;
}
- (unsigned int)draggingEntered:(id <NSDraggingInfo>)sender
{
printf("Drag entered¥n");
}
- (unsigned int)draggingUpdateed:(id <NSDraggingInfo>)sender
{
printf("Drag updated¥n");
}
- (void)draggingExited:(id <NSDraggingInfo>)sender
{
printf("Drag exited¥n");
}
上のサンプルでは、受け付けるドラッグのタイプとして、NSFilenamePboardType を指定しているんだ。これだと、たとえば Finder からのファイルドラッグを受け付けることができる。initWithFrame: の中で、registerForDraggedTypes: を呼ぶことで、指定してみた。
Application Kit - NSDragging
ドラッグされた View をハイライト表示する
Keywords: registerForDraggedTypes, draggingEntered, draggingUpdated, draggingExited
ある View に、Finder からファイルとかをドラッグしてきたとき、View の周りをハイライト表示させてみよう。
(sample)
- (id)initWithFrame:(NSRect)rect
{
self = [super initWithFrame:rect];
if(self) {
NSArray* array =
[NSArray arrayWithObject:NSFilenamesPboardType];
[self registerForDraggedTypes:array];
}
return self;
}
- (unsigned int)draggingEntered:(id <NSDraggingInfo>)sender
{
[[NSColor selectedControlColor] set];
NSFrameRectWidthWidth([self visibleRect], 2.0);
[self displayIfNeeded];
return NSDragOperationNone;
}
- (void)draggingExited:(id <NSDraggingInfo>)sender
{
NSEraseRect([self visibleRect]);
[self displayIfNeeded];
}
dragginEntered: と、draggingExited: を使ってる。
まず、draggingEntered: では、selectedControlColor を使って、強調色の設定をして、枠を描く。そのあと displayIfNeeded を呼んで、再描画しているんだ。
draggingExited では、NSEraseRect を使って、消している。ほんとは、枠だけ消せばいいんだけどね。