解決
ユーザーがメタ キーを使用せずにエントリをドラッグできるようにする場合は、ドラッグ エンドとドロップ エンドの両方で常にシステム デフォルトのドラッグ操作を許可する必要があります。Windowsでは、これはたまたまDND.DRAG_MOVE
操作です(他のプラットフォームでも同じことが当てはまると思います)。
source.addDragSupport(DND.DROP_MOVE, new Transfer[] { DragSelectionListener.getTransfer() }, new DragSelectionListener(viewer));
target.addDropSupport(DND.DROP_MOVE, new Transfer[]{ DropListListener.getTransfer() }, new DropListListener(viewer));
説明
3 つの操作セットが交差する必要があります。
- ソースをドラッグできる操作 (StructuredViewer.addDragSupport() で設定)
- ターゲット サポートをドラッグする操作 (StructuredViewer.addDropSupport() で設定されます)
- ユーザーが選択した操作 (ドロップ時に押されたメタ キーによって異なります)
その場合にのみ、ドロップ ターゲットは受信したドロップを検証し、ドラッグ ソースにデータが要求されます。
調査
メタキーの処理はorg.eclipse.swt.dnd.DropTarget.setEventData()
行で行われます
operations[0] = osToOp(operations[0]) & style;
if (operations[0] == DND.DROP_NONE) return false;
droptarget のスタイルと、システム ドロップ操作から取得した値を交差させます。これは、dragsource に基づいていますが、DND.DRAG_DEFAULT
. この 2 つが交差しない場合、操作は中止されます。
さらに、このセットは、押されたメタ キーから計算されたものと比較されます。操作が再度中止される可能性があります。
if ((operation & operations[0]) == 0) operation = DND.DROP_NONE;
この動作は に渡しDND.DROP_DEFAULT
て制御できますaddDropSupport()
が、ユーザーが選択した操作が と比較されるため、さらに悪いことになりDND.DROP_MOVE
ますaddDropSupport()
。
DND.DROP_DEFAULT
扱いが壊れていて頼りにならないと思います。最初の条件によって効果的に防止された場合に使用します。