Flash Builder -> Tree -> Drag & Drop 個々に設定
Tree コンポーネントを触っていて
Windows エクスプローラ ライクに D&D をしたくなる。
Tree コンポーネントの場合、D&D だけなら簡単だ。
dragMoveEnabled プロパティに関しては、Tree コンポーネントの場合はデフォルトで true なので、
設定の必要はない。
ところが、1つの Tree コンポーネントの中で、
ドラッグ禁止やらドロップ禁止を個々に設けたい場合がある。
その際は、Tree コンポーネントのイベントを利用する。
Flash Builder -> Tree with Spring Loaded Folders
で、よいサンプルを見つけたものの、Flex 2 用で上手く動かなかったので
これを見つつ、以下を大いに参考にして、カーソル変更も付加した結果がこれだ。
FXUG:Re: Treeのアイテム移動の制御
[mxml]
上記のように、目的別にイベントを設定し、
そのイベント内容を関数にすることで、目的の処理をする。
[as3onfx4]import mx.controls.listClasses.IListItemRenderer;
import mx.events.DragEvent;
import net.lifebird.ui.cursor.*;
import net.lifebird.ui.cursor.plugins.*;
// D&D 処理が完全に終了した時点
private function myTree_dragCompleteHandler(event:DragEvent):void
{
Cursors.cursor(CursorType.DEFAULT);
}
// ドロップした時点
private function myTree_dragDropHandler(event:DragEvent):void
{
Cursors.cursor(CursorType.DEFAULT);
if (!isDropEnabled(event))
event.preventDefault();
}
// Tree コンポーネントより外へマウスが出た時点
private function myTree_dragExitHandler(event:DragEvent):void
{
Cursors.cursor(CursorType.REJECT);
}
// Tree コンポーネント内でドラッグされている間
private function myTree_dragOverHandler(event:DragEvent):void
{
if (!isDropEnabled(event)) {
var tree:Tree = event.currentTarget as Tree;
tree.hideDropFeedback(event);
event.preventDefault();
Cursors.cursor(CursorType.REJECT);
}
else {
Cursors.cursor(CursorType.DEFAULT);
}
}
// ドラッグ開始時点
private function myTree_dragStartHandler(event:DragEvent):void
{
if (!isDragEnabled(event))
event.preventDefault();
Cursors.cursor(CursorType.DEFAULT);
}
// マウスカーソルが乗ったアイテムのドラッグ可否関数
private function isDragEnabled(event:DragEvent):Boolean
{
var tree:Tree = event.currentTarget as Tree;
var n:int = tree.calculateDropIndex(event);
var renderer:IListItemRenderer = tree.indexToItemRenderer(n);
if (renderer)
{
var xml:XML = renderer.data as XML;
if (xml.@acceptDrag == “false”)
return false;
}
return true;
}
// マウスカーソルが乗ったアイテムのドロップ可否関数
private function isDropEnabled(event:DragEvent):Boolean
{
var tree:Tree = event.currentTarget as Tree;
var n:int = tree.calculateDropIndex(event);
var renderer:IListItemRenderer = tree.indexToItemRenderer(n);
if (renderer)
{
var xml:XML = renderer.data as XML;
if (xml.@acceptDrop == “false”)
return false;
}
return true;
}[/as3onfx4]
カーソルの変更については以下を参照。
Flash Builder 4 -> net.lifebird.ui.cursor