お世話になっております。
DataGridに表示している情報をTreeにドラッグアンドドロップで移動させたいです。
treeを開いた状態でDropする場合に
----------------------------
root
┣Folder1
┃ ┣item1
┃ ┗item2
┗Folder2
┗item3
 ̄ ̄ ̄
----------------------------
のように線が出る場合はFolder2の配下には<item>要素を追加し
----------------------------
root
┣Folder1
┃ ┣item1
┃ ┗item2
┗Folder2
┗item3
 ̄ ̄ ̄ ̄ ̄
----------------------------
の場合はrootの配下に<node>要素を追加したいと考えているのですが
calculateDropIndexを使用してtreeの選択状態を取得し
その時のselectedItemの値がどちらも「item3」になってしまっていて
rootとして追加する事が出来ません。
この場合、適切な取得方法があるのでしょうか?
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal"
creationComplete="creationCompleteHandler()">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.core.DragSource;
import mx.managers.DragManager;
import mx.core.UIComponent;
import mx.collections.ArrayCollection;
import mx.events.DragEvent;
[Bindable]
private var gridSource:ArrayCollection;
[Bindable]
private var treeDataSource:XML =
<root label="root">
<node label="Folder1" isBranch="true">
<item label="item1"/>
<item label="item2"/>
</node>
<node label="Folder2" isBranch="true">
<item label="item3"/>
</node>
</root>;
private function creationCompleteHandler():void {
gridSource = new ArrayCollection([
{id:1, value:"追加Item1"}, {id:2, value:"追加Item2"}
]);
}
private function treeDragEnterHandler(e:DragEvent):void {
if(UIComponent(e.dragInitiator).id == "datagrid1") {
DragManager.acceptDragDrop(UIComponent(e.target));
}
}
private function treeDragOverHandler(e:DragEvent):void {
tree.showDropFeedback(e);
}
private function treeDragDropHandler(e:DragEvent):void {
e.preventDefault();
var toComp:Tree = e.currentTarget as Tree;
var draggedFormat:String = e.dragSource.formats[0];
var draggedItems:Array = e.dragSource.dataForFormat(draggedFormat) as Array;
var dropIndex:int = toComp.calculateDropIndex(e);
toComp.selectedIndex = dropIndex;
var item:XML = <item></item>;
for each( var obj:Object in draggedItems ) {
if ((toComp.selectedItem as XML).name() == "root") {
item = <node></node>;
item.@isBranch = "true";
item.@label = obj.value;
(toComp.selectedItem as XML).appendChild(item);
} else {
item = <item></item>;
item.@label = obj.value;
if((toComp.selectedItem as XML).name() == "node") {
(toComp.selectedItem as XML).appendChild(item);
} else {
(toComp.selectedItem as XML).parent().appendChild(item);
}
}
}
toComp.selectedIndex = -1;
tree.hideDropFeedback(e);
datagrid1.hideDropFeedback(e);
}
private function treeDragExitHandler(e:DragEvent):void {
tree.hideDropFeedback(e);
}
private function dgDragCompleteHandler(e:DragEvent):void {
gridSource.removeItemAt(datagrid1.selectedIndex);
}
]]>
</mx:Script>
<mx:Tree id="tree" labelField="@label" showRoot="true" width="160"
dataProvider="{treeDataSource}"
dragEnter="treeDragEnterHandler(event)"
dragOver="treeDragOverHandler(event)"
dragDrop="treeDragDropHandler(event)"
dragExit="treeDragExitHandler(event)">
</mx:Tree>
<mx:DataGrid id="datagrid1" dataProvider="{gridSource}" dragEnabled="true" dragComplete="dgDragCompleteHandler(event)">
<mx:columns>
<mx:DataGridColumn dataField="id" />
<mx:DataGridColumn dataField="value" />
</mx:columns>
</mx:DataGrid>
</mx:Application>