-  -  -  - - - ----->

JX

ドラッグ - アンド - ドロップ

Drag-And-Drop

--------------------

JX は、JXWidget の仮想関数セットにより ドラッグ・アンド・ドロップを提供します。

このスクリーンショットは、 JX ウィジェットがどのようにドロップを認識し反応するかを示します。マウスがテキスト・エディタの左側からテキスト・エディタの右側へドラッグされました。(運わるく xv は、マウスポインターをスクリーンキャプチャーに含みませんでしたが) 赤いボールド テキスト内で描画されたカレットは、マウスの位置、及び、どこにドロップされてデータが挿入されたかを示しています。

JX では、どのようなドラッグもエスケープ・キーによりキャンセルすることを標準とします。


ドラッグ・アンド・ドロップの実装

JX のドラッグ - アンド - ドロップ API の全機能を理解するには、 XDND プロトコル を読まれることを御勧めします。 サンプル をお手本にされるのもよいでしょう。ファイルをドラッグしてドロップ認識するためには、ファイル・ドラッグ・プロトコル を参考にされるのもよいでしょう。
 

ソース (Source)

ドラッグ・アンド・ドロップを準備するには、ウィジェットは XDNDManager :: GetDNDSelectionName()から選択名が戻されるため、少なくとも一度は、 AddSelectionTarget() を呼ばなくてはなりません。

ウィジェットからドラッグ・アンド・ドロップを開始するには、HandleMouseDown()か、HandleMouseDrag()から BeginDND()を呼び出します。もし kTrue を返せば、DND が始まります。ウィジェットは、これ以上、HandleMouseDrag() からもHandleMouseUp() からもメッセージを受けなくなります。代りに、ウィジェットが要求されるデータ等をイニシャライスするために、DNDInit()が呼び出されます。

ユーザーがマウスをドラッグしている間、GetDNDAction()が呼ばれます。これにより、ウィジェットは、ボタンやモディファイア・キーをターゲットへ送られるアクションとして解釈する事ができます。もしウィジェットが Ask アクション(JXDNDManager::GetDNDActionAskXAtom())を返すならば、GetDNDAskActions()も、また、ターゲットがドロップ発生時、ユーザに与えるべきアクション・リストとその詳細を得るために呼び出されます。.

ユーザーがターゲットの範囲を越えてマウスをドラッグしたときには、HandleDNDResponse()がターゲット側の応答に呼ばれます。したがってソース側は、ターゲット側で実際に起こっているアクションを延滞させ、カーソルを変えることができます。

ターゲット・ポインターはGetDNDAction() および HandleDNDResponse()の両方へ通達されます。これによりウィジェットは、ウィジェット自身へのドロップ、複合ドキュメントの一部分へのドロップ認識を許可します。ターゲット側が違うプログラムであれば、ポインターは NULL であります。.

Moveアクションをサポートするために、通常、ConvertSelection()内の JXSelectionManager :: GetDeleteSelectionXAtom() からの戻り型を捕らえ、現在選ばれているデータを削除し、そして、JXSelectionManager :: GetNULLXAtom() による戻り型からの空ポインターを返します。
 

ターゲット(Target)

ドラッグ-アンド-ドロップ中、マウスがウィジェットに入いる時、WillAcceptDrop()はウィジェットがドロップを受け付けたかどうかを問い合わすために呼ばれます。利用できるデータ型のリスト、およびリクエストされたアクションは、ウィジェットが受け入れることができる確かなデータ型のみに、確実なアクションを取ります。このアクションは、ポインターとして通達され、それは,修正することができます(例として、アンダーレイ・プロトコル に明確に述べてあり、コピーまたはプライベートの一方を変更する)。 実際のデータが、JXDNDManager :: GetDNDSelectionName()によって選択名が戻されるため、JXSelectionManager :: GetSelectionData() を呼び出す必要がある場合に、タイム・スタンプも提供されます。もしソース側が同じプログラムであれば、ウィジェットへのポインターが提供されます。したがって、ウィジェット自身、あるいは別の複合ドキュメントの一部分を見つけることができます。.

もし WillAcceptDrop() が、kTrue を返すならば、HandleDNDEnter() が呼び出されマウスが動くどのような時にも、HandleDNDHere() が続いて呼び出されます。もしマウスが、リリースされることなしにウィジェットから離れた場合、HandleDNDLeave() が呼び出されます。もしマウスが、ウィジェット内でリリースされたのであれば、HandleDNDDrop() が呼び出されます。

HandleDNDDrop() 内で、ウィジェットは、データを取り戻さなくてはならない(もしそれが、WillAcceptDrop() で行われないとしたら)。JXSelectionManager :: GetSelectionData() によって選択名が戻されるため、JXDNDManager :: GetDNDSelectionName() を呼び出し、もしアクションが Ask であれば、その時 JXDNDManager :: GetAskActions() を呼ぶべきです。(必要であれば)アクション・リストをフィルターし、その時 JXDNDManager :: ChooseDropAction() を呼び出します。 ウィジェットは、そのデータに対して働きかける用意ができています。(Move アクションを実行するためには、通常、ソース側のデータを抹消するために、JXSelectionManager :: SendDeleteSelectionRequest() を呼び出します。)
 

注意 (Notes)

ウィジェットに DND を実装する場合、忘れずに次の事柄を行なって下さい::

ドラッグ-アンド-ドロップの目的は、ユーザーが任意のアプリケーションから他のアプリケーションへデータをドラッグすることが出来るようにするものです。他のアプリケーション、ライブラリに対しても X プロトコル をベースに、ドラッグ-アンド-ドロップをサポートすることを推奨致します。


 匿名 ftp によリ JX を使うために必要とされる全ての情報を入手することができます。


 JX 特徴ページ ヘ戻る