Solaris 共通デスクトップ環境 プログラマーズ・ガイド

ドロップ領域の使い方

この節では、ドロップ領域の使い方を説明します。

ドロップ領域の登録

一般に、ドロップ領域は、ドロップ領域になるウィジェットが作成された直後に登録します。モード付きドロップ領域にする場合は、ユーザがその上にドロップできるようにするにはウィジェットをドロップ領域として登録し、ユーザがその上にドロップできないようにするには登録を解除します。

Motif テキスト・ウィジェットは、作成されたときに、テキスト用のドロップ領域として自動的に登録されます。二重登録が可能です。テキスト・ウィジェットが、テキストだけでなく、ファイル名など他のデータのドロップも受け入れるようにする場合には、テキスト・ウィジェットをファイル用のドロップ領域としても登録できます。Motif によって提供されるテキスト・ドロップ機能は変わりません。ファイル名 (または他のデータ型) のドロップに対する機能は、その上に重ねられます。

ウィジェットをドロップ領域として登録するには、関数 DtDndDropRegister() を使用します。この関数は、必要に応じて二重登録を処理し、デスクトップに特有の準備を行い、XmDropSiteRegister() を呼び出します。DtDndDropRegister() 関数の形式とパラメータの使用法は、次のとおりです。

void
DtDndDropRegister(
   Widget  dropSite,
 	DtDndProtocol	protocols;
 	unsigned char	operations;
	   XtCallbackList	transferCallback;
 	ArgList	argList;
   Cardinal	argCount)


Widget dropSite

ドロップ領域として登録されるウィジェット


DtDndProtocol protocols

ドロップ領域が使用できるデータ転送プロトコルのリストを指定します。複数のプロトコルの使用を指定するには、or (|) とプロトコルの値を使用します。


unsigned char operations

ドロップ領域によってサポートされる操作。ドロップ領域は、目的の操作の組み合わせに対して or (|) を使用することによって、XmDROP_MOVEXmDROP_COPY、および XmDROP_LINK の任意の組み合わせをサポートできます。


XtCallbackList transferCallback

この関数は、ドロップ領域にドロップされたデータを受け入れます。転送コールバックについては、次の節で詳しく説明します。


ArgList argList

オプションの引き数リストを指定します。


Cardinal argCount

argList 内の引き数の数を指定します。

転送コールバックの使い方

転送コールバックは、ドロップが発生したときに、ドラッグ・ソースからデータを受け入れます。転送コールバックの最初のアクションは、callData の中の reason フィールドの確認です。reason が DtCR_DND_TRANSFER_DATA ではない場合には、直ちに戻さなければなりません。そうでない場合には、型と reason の中で指定された操作に基づいて、データ転送を続けます。たとえば、ファイルのコピーを処理している場合には、データ構造体からファイル名を検索し、ファイルを開き、その内容をコピーします。ドロップ領域が複数のデータ型をサポートしている場合には、各データ型の転送を適切にサポートする必要があります。

次に、テキストとファイル名のデータ型のコピーをサポートするドロップ領域を描画するための簡単な転送コールバックを示します。

void
	TransferCallback(
 	Widget widget,
 	XtPointer clientData,
 	XtPointer callData)
{
   DtDndTransferCallbackStruct *transferInfo =
				(DtDndTransferCallbackStruct*) callData;
   int ii;

   DtDndcontext * dropData = transferInfo->dropData;
 			return;
   switch dropData->protocol {
 	case DtDND_FILENAME_TRANSFER:
 		for (ii=0; ii < dropData->numItems; ii++) {
 			drawTheString(dropData->data, strings[ii]);
 		}
 		break;
 	case DtDND_TEXT_TRANSFER:
 		for (ii=0; ii<dropData->numItems; ii++){
      drawTheFile(dropData->data.files[ii]);
 		}
      break;
 	default:
			transferInfo->status = DtDND_FAILURE;
     }
}

データ型の使い方

バッファのドロップを受け入れるアプリケーションでは、ドロップされたデータをその型に基づいて異なる方法で処理したいことがあります。データ型を判断するには、データ型 API を使用します。重要なデータ型関数呼び出しは、DtDtsBufferToDataType()DtDtsBufferToAttributeValue() です。前者はデータのデータ属性名を返し、後者は指定されたデータ属性の値を返します。ドラッグ & ドロップに役立つ属性を、表 5-8 に示します。

表 5-8 データ型属性

属性 

説明 

ICON 

このデータに対して使用するアイコンのパス 

MEDIA 

このデータに対するメッセージ提携メディア名 

詳細は、第 9 章「データ型データベースのアクセス」を参照してください。