今回は、アプリケーションからFinderなどにファイル情報をドラッグ&ドロップする時、どのようにドラッグアイテムを作成したら良いのかを調べてみます。具体的には、ドラッグアイテムとして渡すことになる、HFSFlavor構造体と、PromiseHFSFlavor構造体の使い分けの解説です。
まず最初に紹介するのが、Finderや他のアプリケーション(ワープロや画像編集ソフトなど)にファイル情報を渡す時に用いられるHFSFlavor構造体です。ここで注目すべきは、ファイルデータ(ファイルの中身)自体を渡すのではなく、ファイルタイプ、クリエータ、Finderフラグ、FSSpec構造体といったファイル情報を渡すという点です。例えば、ワープロがドラッグ&ドロップによりファイル情報を受け取ると、そのタイプからテキストなのか?画像なのか?画像であればどんな種類なのか?を判断してから、FSSpec構造体を参照してデータを読み込み、作業用ウィンドウのドロップされた位置にそれを張り込むことになります。

以下のcreateDataMyDrag()ルーチンは、HFSFlavor構造体をAddDragItemFlavor()でドラッグアイテムとして登録しています。登録すべきファイルのFSSpec構造体は、自作ルーチンのgetMyTargetFSSpec()で得ていますが、この部分を適切な処理に差し替えれば、そのまま汎用ルーチンとして利用することが出来ます。ターゲットファイルのファイルタイプ、クリエータ、Finderフラグについては、FSpGetFInfo()を使えば得ることが出来ます。

Finderは、上記のドラッグアイテムを受け取ると、いったいどんな処理を実行するのでしょうか?それを試すのには、Adobe PhotoshopなどでJPEG画像をオープンし、ウィンドウタイトルに表示されるプロキシアイコンをデスクトップ上にドラッグ&ドロップしてみてください。対象となるJPEGファイルのアイコンは、ドロップされたデスクトップ位置へと移動させられます。また、オプションキーを押しながら実行すると、そのファイルは複製され、オプション+コマンドキーを押しながらだと、Aliasファイルが作成されることが分かります。つまり、Finder上でアイコンをマウス操作するのとまったく同じ処理を実行しているわけです。
それでは、ドラッグ&ドロップでファイル情報を渡すのではなく、ファイルデータ(ファイルの中身)そのものを、別アプリケーションに渡したい時にはどうしたら良いのでしょうか?普通に考えれば、データそのものをドラッグアイテムに追加してしまえば良いわけですが、ファイル容量が膨大(数100Mとか)であると、そのドラッグアイテムを作成するのに相当な時間がかかることになります。すると、ユーザが対象物をマウスドラッグしようとしても、それがマウス移動に追随できない状況が発生し、ドラッグ&ドロップの操作感を大きく損ねてしまいます。また、作業用メモリが不足し、処理を継続できない可能性も出てきます。
そこで、Drag Managerには、実際のデータの受け渡しを、ドラッグ開始時ではなくドロップ時に行う仕組みが備わっています。つまり、ドロップ時であれば、少々時間がかかる処理であっても、ユーザの操作感は損なわれないわけです。この仕組みを用いると、ドラッグ開始時に大量データをドラッグアイテムに追加する処理を省略することができます。この時にドラッグアイテムとして利用するのが、以下のPromiseHFSFlavor構造体です。
今回は、Finder上のドロップした位置に、ドラッグしてきたファイルの複製を作成してみます。また、複製されたファイルは、こちらで指定した文字列により名称変更がなされるとします。以下のcreateDataMyDrag()ルーチンで、PromiseHFSFlavor構造体をドラッグアイテムとして登録しています。加えて、オリジナルファイルのFSSpec構造体、名称変更用のパスカル文字列も追加します。そして最後に、アイテムタイプがkDragPromisedFlavorで、データが何も含まれていないドラッグアイテムをひとつ追加します。

次回は、今回のファイル複製処理の続きです。以前解説したstartMyDrag()の中で登録しておいたsendDataMyDrag()ルーチンについて詳しく解説します。ドラッグアイテムに追加されたPromiseHFSFlavor構造体やその他の情報は、このルーチンの中で解析されてファイル複製に利用されることになります。
copyright 2005 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp