Роман Вадимович
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 непосредственно.
Скажите это верно или полный бред? Заранее благодарен!
Горю желанием написать редактируемый элемент 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 непосредственно.
Скажите это верно или полный бред? Заранее благодарен!