Flash Builder -> Tree -> Drag & Drop 個々に設定
Tree コンポーネントを触っていて
Windows エクスプローラ ライクに D&D をしたくなる。
Tree コンポーネントの場合、D&D だけなら簡単だ。
D&D の実装
[mxml]dragMoveEnabled プロパティに関しては、Tree コンポーネントの場合はデフォルトで true なので、
設定の必要はない。
個々に設定
ところが、1つの Tree コンポーネントの中で、
ドラッグ禁止やらドロップ禁止を個々に設けたい場合がある。
その際は、Tree コンポーネントのイベントを利用する。
Flash Builder -> Tree with Spring Loaded Folders
で、よいサンプルを見つけたものの、Flex 2 用で上手く動かなかったので
これを見つつ、以下を大いに参考にして、カーソル変更も付加した結果がこれだ。
FXUG:Re: Treeのアイテム移動の制御
[mxml]
上記のように、目的別にイベントを設定し、
そのイベント内容を関数にすることで、目的の処理をする。
- 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;
- }
This movie requires Flash Player 9.0.0
カーソルの変更については以下を参照。
Flash Builder 4 -> net.lifebird.ui.cursor