Flash Builder -> Tree -> Drag & Drop 情報取得

Posted by muchag | ActionScript 3.0,Flash Builder 4 |
初回投稿:2010-07-31 (土) 2:19:59 | 最終更新:2010-08-01 (日) 17:13:30

D&D によって変更されたフォルダ構成を DB へ反映させるためには
ドラッグしたアイテムとドロップ先アイテムの情報を取得しなければならない。

幸い、よい参考サイトが見つかった。
FXUG:ドラッグ&ドロップ(treeからpanel)
Re: Treeのアイテム移動の制御

元データの取得

まずはドラッグしているアイテム(ノード)の情報について。

これはとても単純。
しかし、上記参考サイトにも載っているが、以下のようにするとエラーが出る。

Actionscript 3.0 on Flex 4

  1. var dragInitiatorData:Object = event.dragSource.dataForFormat('treeItems');
  2. Alert.show(dragInitiatorData.@label);
ReferenceError: Error #1081: Array にプロパティ @label が見つからず、デフォルト値もありません。

これは、変数 data が単純な Object 型 だと思っていたら Array 型 だったという罠。

そういうわけなので、下記のようにするのが正解。

Actionscript 3.0 on Flex 4

  1. var dragInitiatorData:Object = event.dragSource.dataForFormat('treeItems');
  2. Alert.show(dragInitiatorData[0].@label);

また、これも上記サイトに書いてあるが、複数行選択を許可した場合はまだ工夫が必要なようだ。
 

先データの取得

これも 前回 同様、上記参考サイトのコードをそのままいただいた。

Actionscript 3.0 on Flex 4

  1. var tree:Tree = event.currentTarget as Tree;
  2. var n:int = tree.calculateDropIndex(event);
  3. var dropTargetRenderer:IListItemRenderer = tree.indexToItemRenderer(n);
  4. if (dropTargetRenderer)
  5. {
  6.     // ドロップ先のXML情報
  7.     var targetXML:XML = dropTargetRenderer.data as XML;
  8.     // ドロップ先の親のXML情報
  9.     var parentXML:XML = targetXML.parent();
  10.     // ドロップ先の親の子供情報
  11.     var childrenXMLList:XMLList = parentXML.children();
  12. }


 

calculateDropIndex の曖昧さ

ところが、この方法だと、私がやりたいことの場合は曖昧であることがわかった。


このような Tree コンポーネントがあるとする。

Folder 3 を Folder 12 と Folder 2 の間に入れる場合は、以下の2パターン存在する。
傍線の長さに注目。

そして、それぞれの結果はこうなる。

この場合、上記の手法、即ち calculateDropIndex を利用する手法だと、
共に 3 を得ることになる。

calculateDropIndex とは、現時点で開いている、
つまり 見えている状態で上から何番目 という判断をするらしく
全体の中での 正確な情報ではない 上に、パターン1とパターン2の 区別がつかない

mx_internal::_dropData

そこで他を当たっていたら以下を見つけた。
FXUG:DataGridからTreeへのドラッグアンドドロップ時のドロップ先情報について

ここに載っている mx_internal::_dropData というのを用いると

Actionscript 3.0 on Flex 4

  1. var dropTargetData:Object = tree.mx_internal::_dropData;
  2. // ドロップ先の親のXML情報
  3. var parentXML:XML = dropTargetData.parent as XML;

パターン1では root を親とし
パターン2では Folder 2 を親としてくれた。

ホッとしながらも、mx_internal についてグーグル先生に聞いてみると
DROP.FACTORY:[@Flex]プロパティやメソッドの可視性

「mx_internal」は過去の遺物らしいです。
使用には十分注意しましょう、とゆーことか。

ということらしい。

確かに Adobe® Flex® 4.1 リファレンスガイド の索引には見当たらない・・・。

ん~、それでは正しい情報はどこからもらえるんだろう・・・。

また、こちらのサイトの他、あちこちのサイトに書いてある

Actionscript 3.0 on Flex 4

  1. import mx.core.mx_internal;
  2. use namespace mx_internal;

こちらの2行は、私の環境では書かなくても利用可能であった。

Posted by muchag | ActionScript 3.0,Flash Builder 4 |
初回投稿:2010-07-31 (土) 2:19:59 | 最終更新:2010-08-01 (日) 17:13:30

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment