PDA

Просмотр полной версии : Редактируемый Tree


Роман Вадимович
22.04.2009, 15:48
Привет, Всем!
Горю желанием написать редактируемый элемент Tree. Больше всего хотелось бы сделать этот элемент управления также, как организована панель слоев в программе AdobePhotoshop.
Т.е. мне нужен элемент Tree у которого можно:
1) Создавать элементы
2) Создавать папки
3) Удалять папки и элементы
4) Перемещать элементы и папки в иерархии отображения
5) Переименовывать элементы и папки

Задача оказалась несколько сложнее чем я думал. Вот то что у меня получилось:


<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
<![CDATA[
import mx.collections.XMLListCollection;
import flash.utils.*;

[Bindable]
private var _collection:XMLListCollection = new XMLListCollection( new XMLList() );

private function newFolder():void {
var item:XML = <item isBranch="true"/>;
item.@label = "Папка " + Math.round(Math.random()*10);
_collection.addItem( item );
}

private function newItem():void {
var item:XML = <item/>;
item.@label = "Элемент " + Math.round(Math.random()*10);
_collection.addItem( item );
}

private function removeItem():void {
var selectedItem:XML = tree.selectedItem as XML;
if( !selectedItem ) return;

var parent:XML = selectedItem.parent() as XML;
if(parent) delete parent.*[selectedItem.childIndex()];
else _collection.removeItemAt( _collection.getItemIndex(selectedItem) );
}
]]>
</mx:Script>

<mx:Tree id="tree" labelField="@label" dragEnabled="true" dropEnabled="true" width="300" height="450" dataProvider="{_collection}"/>
<mx:HBox horizontalGap="4" width="300">
<mx:Button click="newItem()" label="newItem" width="33%" />
<mx:Button click="newFolder()" label="newFolder" width="33%"/>
<mx:Button click="removeItem()" label="deleteItem" width="33%" />
</mx:HBox>
</mx:WindowedApplication>


Вопрос же состоит в следующем. Подскажите верно ли я реализовал функцию removeItem()? Помоему я перемудрил, т.к. не нашел другого выхода. Удаление элемента оказалось более трудной задачей чем казалось.

Эту функцию я реализовал следующим образом:
1) Проверил есть ли у выбранного элемента "Папа". Если есть то из "Папы" удалил его.
2) Если "Папы" нет, значит этот элемент находится вверху иерарции XMLList и значит можно получить его Index и удалить из XMLListCollection непосредственно.

Скажите это верно или полный бред? Заранее благодарен!