2008年6月13日金曜日

ドラッグ&ドロップのイベントを拾う

SequenceGrabberから脱線してMac版 vixy converter の改造中。今、ローカルのFLVをトランスコードできるようにしています。ローカルにあるFLVのパスを取得する方法として、ベタですけどウインドウにドラッグ&ドロップ(以下、D&D)で取得するのが分かりやすいんじゃないかなーと実装中。とりあえず、分かったことをまとめてみる。

----
NSTextFieldは元々D&Dが可能なんだね。。。でもやりたいのはウインドウのどこでもD&Dだから。

----
D&DをNSViewやNSWindowに実装するにはNSDraggingDestinationプロトコルのメソッドを実装する必要がある。Cocoaアプリケーションプロジェクトで作成されるNSWindowにこのプロトコルを実装するためには、
(1) WindowDDHandlerというクラス名(例だよ)で、NSWindowを継承したクラスを作成。
(2) InterfaceBuilder(以下IB)を開きWindowDDHandler.hをD&Dするとカスタムクラスで選択できるようになるので、デフォルトウインドウのカスタムクラスに割り当てる。
(3) WindowDDHandlerのawakeFromNib:でD&Dを受け付けるタイプの指定registerForDraggedTypes:を行う。FinderからファイルのD&Dを受け付けたい場合はNSFilenamesPboardTypeを指定。ちなみにinitでregisterForDraggedTypes:を読んでもダメ。
(4) NSDraggingDestinationプロトコルのメソッドをオーバーライドする。 動作確認ならNSLog()だけでできるよね。

----
NSDraggingDestinationプロトコルで必要なメソッドは、draggingEntered:とperformDragOperation:。これだけでパスの取得は可能だった。draggingEntered:はウインドウにアイテムがドラッグされるとコールされ、performDragOperation:はドロップしたときコールされる。performDragOperation:の引数からNSPasteboardクラスが取得でき、そこにはNSFilenamesPboardTypeで指定した場合、ドラッグされたファイル名をNSArrayで取得することができる。

----
重要なのは:registerForDraggedTypesをコールして、D&Dを許可するファイルのタイプを指定しておくこと。というかD&Dを受け付けるということを伝えておくこと。

0 件のコメント: