Flash Builder -> Tree -> ノードの開閉

Posted by muchag | ActionScript 3.0,Flash Builder 4 |
初回投稿:2010-07-31 (土) 21:59:23 | 最終更新:2010-07-31 (土) 22:17:38

Tree コンポーネントの各ノードの開閉を制御したい。

expandItem() メソッドを用いることで実現できる。

開く場合は、第2引数を true に、閉じる場合は、第2引数を false に。

 
[as3onfx4]public function expandItem(
item:Object,
open:Boolean,
animate:Boolean = false,
dispatchEvent:Boolean = false,
cause:Event = null
):void[/as3onfx4]

Adobe® Flex® 4.1 リファレンスガイド:Tree expandItem() メソッド
 

item

今のところ、XMLListCollection の方法しかわからない。

しかも、場所を自由に選ぶ方法がわからない。

詳細は、以下の 特定のノードの開閉 を参照。
 

特定のノードの開閉

今のところ、起動時に固定フォルダを開く方法しか試していない。
 

XML オブジェクトを辿る手法
[as3onfx4]var myXML:XML = new XML(event.result);
myTree.dataProvider = new XMLListCollection( new XMLList(myXML) );

myTree.validateNow();
treeFavorit.expandItem(myXML.children()[0], true, true);[/as3onfx4]

これはルートを表示しない方式の Tree で、1番目のフォルダをデフォルトで開いた状態にしている。

4行目に関しては

dataProvider を設定し、その直後に expandItem() を呼び出した場合は、不適切な動作が起こる可能性があります。
コンポーネントが検証されるまで待つか、validateNow() を呼び出します。

リファレンスのこの指示に従ったまでである。
 

XML オブジェクトをインデックスで拾う手法

Tree コンポーネントには、indexToItemRenderer() メソッドというものがあり
インデックスから当該アイテムレンダラを取得できる。

ただこのインデックスは曲者で、現在の状態で上から何番目 というものらしく
ノードの開閉状態によって コロコロ変化する ようだ。

さりながら、メインフォルダであればルートを表示していれば 1 。
ルートを表示してなければ 0 になる。

これを利用して以下のようにすることで、メインフォルダに関してだけは成功した。
[as3onfx4]var myXML:XML = new XML(event.result);
myTree.dataProvider = new XMLListCollection( new XMLList(myXML) );

myTree.validateNow();
var renderer:IListItemRenderer = myTree.indexToItemRenderer(0);
if (renderer)
{
var myXML:XML = renderer.data as XML;
myTree.expandItem(myXML, true);
}[/as3onfx4]

Posted by muchag | ActionScript 3.0,Flash Builder 4 |
初回投稿:2010-07-31 (土) 21:59:23 | 最終更新:2010-07-31 (土) 22:17:38

Flash Builder -> XML 系の比較

Posted by muchag | ActionScript 3.0,Flash Builder 4 |
初回投稿:2010-07-31 (土) 18:34:04 | 最終更新:2010-08-02 (月) 22:14:30

Flash Builder 4 -> コレクションオブジェクト
ここでも触れたが、FB4 には XML 系オブジェクトとして3種類存在する。
XML オブジェクト、XMLList オブジェクト、XMLListCollection オブジェクト

それぞれの意義自体もまだよく分かってないが
それに纏わるプロパティ、メソッドとなると尚更だ。

そこで、気が付く毎に何となく列挙していくことにした。

length 系
XML
length プロパティ

length プロパティは存在する。
[as3onfx4]XML.length[/as3onfx4] これは、当然の如く必ず 1 が戻り値。
なぜって? XML オブジェクトとは、ルートが1つのものだから。
 

length() メソッド

子供の数を知りたければ
[as3onfx4]XML.children().length()[/as3onfx4] このように children()length() メソッド を用いる。

特定の子供の数を知りたければ
[as3onfx4]XML.child(“hoge”).length()[/as3onfx4] このように child() メソッドlength() メソッド を用いる。

また、child() メソッドにはワイルドカードが使えるようで
[as3onfx4]XML.child(“*”).length()[/as3onfx4] これで全ての子の数が拾えるようだ。
 

XMLList
length プロパティ

XMLList オブジェクトには、length プロパティは 存在しない ようだ。
 

length() メソッド
[as3onfx4]XMLList.length()[/as3onfx4] これは、XMLList のプロパティの数が戻り値。
 

XMLListCollection
length プロパティ
[読み取り専用] このビュー内のアイテムの数です。

意味不明・・・。
 

length() メソッド

XMLListCollection オブジェクトには、length() メソッドは 存在しない ようだ。
 
 
実際に動かしてみないとよくわからないね。
暇を見てチャレンジしてみることにしよう。
 
Adobe® Flex® 4.1 リファレンスガイド
XMLXMLListXMLListCollection

Flash 用 ActionScript 3.0 のプログラミング:XML の操作

Posted by muchag | ActionScript 3.0,Flash Builder 4 |
初回投稿:2010-07-31 (土) 18:34:04 | 最終更新:2010-08-02 (月) 22:14:30

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のアイテム移動の制御

元データの取得

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

これはとても単純。
しかし、上記参考サイトにも載っているが、以下のようにするとエラーが出る。
[as3onfx4]var dragInitiatorData:Object = event.dragSource.dataForFormat(‘treeItems’);
Alert.show(dragInitiatorData.@label);[/as3onfx4]

ReferenceError: Error #1081: Array にプロパティ @label が見つからず、デフォルト値もありません。

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

そういうわけなので、下記のようにするのが正解。
[as3onfx4]var dragInitiatorData:Object = event.dragSource.dataForFormat(‘treeItems’);
Alert.show(dragInitiatorData[0].@label);[/as3onfx4]

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

先データの取得

これも 前回 同様、上記参考サイトのコードをそのままいただいた。
[as3onfx4]var tree:Tree = event.currentTarget as Tree;
var n:int = tree.calculateDropIndex(event);
var dropTargetRenderer:IListItemRenderer = tree.indexToItemRenderer(n);
if (dropTargetRenderer)
{
// ドロップ先のXML情報
var targetXML:XML = dropTargetRenderer.data as XML;
// ドロップ先の親のXML情報
var parentXML:XML = targetXML.parent();
// ドロップ先の親の子供情報
var childrenXMLList:XMLList = parentXML.children();
}[/as3onfx4]


 

calculateDropIndex の曖昧さ

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


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

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

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

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

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

mx_internal::_dropData

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

ここに載っている mx_internal::_dropData というのを用いると
[as3onfx4]var dropTargetData:Object = tree.mx_internal::_dropData;
// ドロップ先の親のXML情報
var parentXML:XML = dropTargetData.parent as XML;[/as3onfx4] パターン1では root を親とし
パターン2では Folder 2 を親としてくれた。

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

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

ということらしい。

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

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

また、こちらのサイトの他、あちこちのサイトに書いてある
[as3onfx4]import mx.core.mx_internal;
use namespace mx_internal;[/as3onfx4] こちらの2行は、私の環境では書かなくても利用可能であった。

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

XML 文字列をオブジェクト化

Posted by muchag | PHP |
初回投稿:2010-07-29 (木) 18:46:50 | 最終更新:2010-07-29 (木) 20:09:40