● ToolBox API徒然草(2005/05/27)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 ドラッグ&ドロップの活用(その2) 〜


今回は、Finderでドラッグされたアイコンがターゲット領域(ブラウザコントロール)へドロップされた瞬間の処理について解説します。具体的には、InstallReceiveHandler()で登録されているmyReciveDrag()ルーチンから順次処理を追跡していきます。

以下が、InstallReceiveHandler()で先んじてインストールしておいたmyReciveDrag()ルーチンです。



myReciveDrag()には3つの引き数が渡されます。最初にSetPortWindowPort()でターゲットとなるウィンドウをカレントポートに設定し、HideDragHilite()でターゲット枠の強調表示を消します。アイコンのドロップ位置のグローバル座標はGetDragMouse()で得ることができるので、GlobalToLocal()でカタログウィンドウのローカル座標へと変換しておきます。また、CountDragItems()によりドロップされたオブジェクト数を得ることができます。こうした情報をまとめて次のreciveCatalogWindow()ルーチンに渡すことで、実際のRecive処理を実行します。

本サンプルアプリケーションでは、アイコンに添付されてくる'hfs 'というタイプのデータのみを受け取ります。このデータの実態は、HFSFlavorという構造体であり、その内容はGetFlavorData()で得ることが可能です。この構造体には、ドロップされたファイルやフォルダのFSSpec構造体やファイルタイプが含まれています。reciveCatalogWindow()では、ファイルタイプにより次の3つの処理を実行します(ソースコードに番号を添付)。

(1)アイコンがフォルダやボリュームの場合
(2)アイコンがドキュメントファイルの場合
(3)アイコンが表示可能な画像ファイルの場合



ファイルタイプの違いで処理を分岐する前に、得られたFSSpecをResolveAliasFile()に渡してドロップされたアイコンがエイリアスかどうかを調べます。もしエイリアスであれば(aliasがTRUE)、渡したFSSpecがオリジナルの物と差し替えられて戻ります。アイコンのオリジナルがフォルダであれば(folderがTRUE)、getFolderFSSpec()でフォルダ自身のFSSpecを求め、それをaddImageFolder()ルーチンに渡して内部にある画像ファイルをすべてブラウザに登録します。また、オリジナルがファイルであれば、FSpGetFInfo()でそのファイル情報を得て、正しいファイルタイプを設定し直しています。

ファイルタイプが'fold'や'fldr'であればフォルダアイコンが、'disk'や'srvr'であればボリュームアイコンがドロップされたことを示します。この場合の処理は、エイリアスがフォルダだった場合とまったく同じです。ファイルタイプが'MosD'であれば、これはサンプルアプリケーションのドキュメントですので、loadObjectFile()ルーチンでファイル読み込み処理を実行します。それ以外のファイルタイプであれば、画像ファイルである可能性が残されています。まず、navCheckImportExtention()ルーチンで拡張子を調べてから、navImportCheckTypeList()で登録可能(QuickTimeで表示できる)画像ファイルかどうかを見極め、addImageFile()ルーチンに渡してブラウザへと登録します。

本サンプルアプリケーションは、ウィンドウ全領域をドロップターゲットとはせず、ウィンドウに配置したID=100のブラウザコントロールの矩形枠内のみをターゲットとしています。ちなみに、上記ルーチンでは、PtInRect()を用いて矩形内かどうかを判断をしていますが、もしTrack処理側でも同じ処理を行っていれば、ここで再度行う必要はありません(Recive処理だけインストールした場合には必要です)。今回の例でも分かりますが、外からのデータを受け取る処理(Receive処理)のみを実装するだけなら、Drag Managerは割と簡単に利用できます。

次回は、Receive処理の話の続きです。reciveCatalogWindow()の中から呼ばれている自作ルーチン、addImageFolder()やaddImageFile()などについて詳しく解説したいと思います。


copyright 2005 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp