TreeViewer
ユーザーがアイテムをドラッグしているときに、 のアイテムがどのように強調表示されるかを理解するのに問題があります。
何が起こるか: 内の一番下のアイテムをドラッグし始めるTreeviewer
と、それに応じてその隣のアイテムが強調表示されます。問題は、DragOver
イベントから強調表示されたアイテムを取得できないことです。しかし、この位置からアイテムをドロップすると、Drop
メソッドのイベントには、強調表示されたアイテムを保持する「アイテム」フィールドがあります。ハイライトが発生しても、ツリーの選択は変更されません
やりたいこと:ハイライトされた項目に合わせてポインタのイメージを変えたい。問題は、どれが強調表示されているかを理解する方法がわからないことです。私にとってもう 1 つの問題は、Drop メソッドでは、強調表示された項目がドロップのターゲットになることです (この場合、上から 2 番目のフィールド)。使いたくないSWT.FULL_SELECTION
画像は次のとおりです。
ソース スニペット (私が欲しいのはDragOver
、アイテムに直接カーソルを合わせていない場合の機能です)
final DropTarget valuesTarget = new DropTarget(tree, DND.DROP_MOVE);
valuesTarget.addDropListener(new DropTargetAdapter()
@Override
public void dragOver(DropTargetEvent event)
{
if (transfer.isSupportedType(event.currentDataType))
{
final DropTarget target = (DropTarget)event.widget;
final Tree tree = (Tree)target.getControl();
final Point relativeDropPoint = getRelativeDropPoint(event);
final TreeItem targetItem = tree.getItem(relativeDropPoint);
if (targetItem != null)
{
event.feedback =
DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
if (event.item.getData() instanceof NotAcceptableClass)
{
event.detail = DND.DROP_NONE;
}
}
}
}
private Point getRelativeDropPoint(DropTargetEvent event)
{
final Tree tree = (Tree)((DropTarget)event.widget).getControl();
final Point tableLocation = tree.toDisplay(0, 0);
return new Point(event.x - tableLocation.x, event.y
- tableLocation.y);
}