Flex3.2 TreeのDnD

FlexのTree、DnDによるノードの移動。子ノードが無いノード配下へのドロップができない。

以下、解決策、かな?
TreeコンポーネントのcalculateDropIndexファンクションを利用してカーソルの下にあるノードを取得します。この時、showDropFeedbackによるドロップインジケータはノードの上端。ドロップインジケータが下端に来るのはカーソルがノードの下方に外れたタイミングとなります。

このままインジケータの通りにドロップしてしまうと、ノードの上、もしくは下にしか移動することができません。

ここでひと工夫。インジケータの位置にはドロップさせないのだから、見た目でもわかるようにしたい。そこで、ノードの上から1/4〜ノードの高さの領域にカーソルがある場合にはhideDropFeedbackを利用してドロップインジケータが表示されないようにします。

この領域にカーソルがあることを判定するためにはDragEventのlocalYプロパティを使います。localYプロパティにはtreeコンポーネントの上端からの距離が設定されており、ノードのtreeコンポーネント内におけるY軸の位置を算出することによって、カーソルが領域上にあることがわかります。

領域の開始位置は下記のようにして求めることが出来ます。

ノードHeight*ノードRowIndex+(ノードHeight/4)

領域の終了位置は下記の通り。

ノードHeight*(ノードRowIndex+1)

よってlocalYの値がこの開始位置と終了位置の間にある時を判定すれば良いのだから、下記のようになります。

開始位置 < localY < 終了位置

これらの処理をDragOverハンドラで行います。また、DragDropハンドラでも同様の判定を行い、ドロップ位置を確定します。

実証コードは後日提示予定。