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

ドラッグ・ソースの使い方

この節では、ドラッグ・ソースの使い方を説明します。

ドラッグの開始

ドラッグは、2 つの方法のどちらかで開始されます。1 つは、ユーザは、Btransfer (中央マウス・ボタン) を押すことで、ドラッグを開始できます。ボタンが押されるとすぐに、ドラッグが開始されます。もう 1 つは、ユーザは Bselect (左マウス・ボタン)を押しながらカーソルを動かすことによって、ドラッグを開始できます。ユーザがマウスを特定の距離だけ動かすと、ドラッグが開始されます。この距離をドラッグしきい値といい、ピクセル単位で示されます。Bselect のデフォルトのドラッグしきい値は、10 ピクセルです。Btransfer のドラッグしきい値は 0 です。ドラッグしきい値がないので、ポインタを動かすとすぐに、ドラッグが開始されます。Motif スクロール・テキスト・リストおよびテキスト・ウィジェットは、BtransferBselect によってテキスト・ドラッグするためのドラッグ・ソースとして自動的に登録されます。

リストまたはアイコンからのドラッグ

ドラッグ・ソースとして使用できる 2 つの一般的なインタフェース・オブジェクトがあります。すなわち、リストとアイコンです。Motif リスト・ウィジェットは、自動的にテキスト・ドラッグの転送元を示します。他の種類のドラッグが必要な場合には、デフォルトのウィジェット変換を新しい Btn1Btn2 変換で無効にすることによって行われます。Motif にはアイコン・ウィジェットはありませんが、通常は描画領域をアイコンのコンテナとして使用します。この場合、ドラッグを開始するために、Btn1Motion のイベント・ハンドラが使用されます。コーディング例の詳細は、/usr/dt/examples/dtdnd のサンプル・コードを参照してください。

ドラッグしきい値

Bselect を使用してドラッグを開始するときには、ウィジェット・イベント・ハンドラまたは変換手順は、ドラッグを開始する前に、10 ピクセルのドラッグしきい値を適用しなければなりません。Btransfer にしきい値はないので、直ちにドラッグが開始されます。

Btransfer または Badjust

スタイル・マネージャの [マウス] カテゴリには、Btn2 (中央マウス・ボタン) が Btransfer として機能するか、それとも Badjust として機能するかを制御する設定があります。この設定は、リソース名 enableBtn1Transfer として格納されます。1 の設定は、Btn2Badjust であり、選択を調節することを示します。他の値の設定は、Btn2Btransfer であり、ドラッグを開始することを意味します。Btn1 (左マウス・ボタン) は、常にドラッグを開始します。

次の例は、Btn2BtransferBadjust であるかを決める方法を示します。

Display* display;

int
adjust;
  XtVaGetValues ((Widget)XmGetXmDisplay(display,
	"enableBtn1Transfer", &adjust, 	NULL);

  if (adjust == 1)
 	  /* Btn2 is adjust */
 else
      /* Btn2 is transfer */

ドラッグの開始

共通デスクトップ環境 1.0 アプリケーションは、DtDndDragStart() を呼び出すことによってドラッグを開始します。この関数は、ドラッグを開始するためにデスクトップに特有の準備を行い、XmDragStart() を呼び出します。DtDndDragStart() 関数の形式とパラメータの使用法は、次のとおりです。

Widget DtDndDragStart(
 	Widget				dragSource,
 	XEvent 				*event,
  	DtDndProtocol				protocol,
 	Cardinal				numItems,
 	unsigned char				operations,
 	XtCallbackList 	convertCallback,
 	XtCallbackList dragFinishCallback 	ArgList				argList,
		Cardinal				argCount)


Widget dragSource

ドラッグを始めたイベントを受け取るウィジェット


XEvent *event

ドラッグを始めたボタンが押された、またはボタン・モーション・イベント


DtDndProtocol protocol

データ転送のために使用するプロトコル。プロトコルは、次のいずれか 1 つを使用できます。

DtDND_TEXT_TRANSFER

DtDND_FILENAME_TRANSFER

DtDND_BUFFER_TRANSFER


Cardinal numItems

ドラッグする項目数を指定します。


unsigned char operations

dragSource によってサポートされるオプションを指定します。オプションは、XmDROP_MOVEXmDROP_COPY、および XmDROP_LINK です。ドラッグ・ソースは、これらの操作の任意の組み合わせをサポートできます。操作の組み合わせを指定するには、or (|) を使用します。たとえば、移動とコピー操作をサポートするには、XmDROP_MOVE | XmDROP_COPY と指定します。


XtCallbackList convertCallback

このコールバックは、ドロップが開始され、ドロップ領域がドラッグ・ソースからデータを要求したときに呼び出されます。convertCallback については、次の節で詳しく説明します。


XtCallbackList dragFinishCallback

このコールバックは、ドラッグ & ドロップ・トランザクションが完了したときに呼び出されます。dragFinishCallback は、dragMotionHandler() をリセットして、ドラッグ & ドロップ・トランザクション時にドラッグ・ソースによって割り当てられたメモリを解放します。

変換コールバックの使い方

変換コールバックは、ドロップが発生すると、ドロップ領域にデータを提供します。変換コールバックの最初のアクションは、callData の中の reason フィールドの確認です。reason が DtCR_CONVERT_DATA または DtCR_CONVERT_DELETE でない場合には、直ちに戻さなければなりません。そうでない場合には、データの変換を続けます。たとえば、ファイル名の変換を処理する場合には、内部のデータ構造体から該当するファイル名を検索して、ファイル・データ・オブジェクトにコピーします。ドラッグ・ソースが移動操作をサポートしている場合には、DELETE ターゲットの変換をサポートする必要があります。すなわち、reason が DtCR_CONVERT_DELETEconvertCallback が呼ばれた場合は、移動されたデータに対して適切な削除アクションを実行します。ファイル転送の場合には、ファイルを削除します。次に、ファイル名の変換と削除を処理する簡単な convertCallback を示します。

void
convertFileCallback(
 	Widget dragContext,
 	XtPointer clientData,
 	XtPointer callData) 
{
 	DtDndConvertCallbackStruct *convertInfo =	(DtDndConvertCallbackStruct*)
  allData;
 	char	 *fileName = (char *) clientData;
  	if (convertInfo->reason == DtCR_DND_CONVERT_DATA) 
   {
		convertInfo->dragData->data.files[0]=
 				XtNewString(fileName); 	
   }

else if (convertInfo->reason == DtCR_DND_CONVERT_DELETE)
   {
		deleteFile(fileName);
 	} else {
 	convertInfo->status = DtDND_FAILURE;
 	}

}