Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Редактируемый Tree (http://www.flasher.ru/forum/showthread.php?t=124163)

Роман Вадимович 22.04.2009 15:48

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

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

Код AS3:

<?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 непосредственно.

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


Часовой пояс GMT +4, время: 01:02.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.