Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   drag&drop в mx:Tree (http://www.flasher.ru/forum/showthread.php?t=108748)

SSergeyS 28.02.2008 13:17

drag&drop в mx:Tree
 
Приветствую!
Вынужден еще раз вернутся к вопросу drag&drop
Я пытаюсь реализовать mx:Tree с возможностью перетаскивать элементы дерева в пределах одного уровня вложенности но разных веток. Тобиш таскаемая ветка ни при каких условиях не должна менять уровень вложенности.
Tree:
Код:

<mx:Tree
labelField="@label" showRoot="false"
dragEnabled="true" dropEnabled="true"
dragDrop="dragDropHandler(event);"
dataProvider="{MyXML}">
</mx:Tree>

MyXML:
Код:

<root>
<node isBranch='true' l=”0” label=”1”>
        <node l=”1” label=”a”></node>
<node l=”1” label=”b”></node>
</node>
<node isBranch='true' l=”0” label=”2”>
</node>
<node isBranch='true' l=”0” label=”3”>
        <node l=”1” label=”c”></node>
</node>
</root>

dragDropHandler:
Код:

private function dragDropHandler(event:DragEvent):void
{                       
var node_t:Array = event.dragSource.dataForFormat("treeItems") as Array;
Alert.show(String(node_t[0].@l));

дальше проверка вложенности и соответственно перемещение нода.
}

Я застрял на последней функции.
Посмотрел доку про DragEvent и DragManager. Но не могу разобраться как получить оба нода:в который перетаскивается и тот который мы непосредственно тянем. Чтобы сделать нормальную проверку и, например, записывать в историю, что куда перетягивали.

В event.currentTarget лежит Все дерево с dataProvider но как понять в какой именно нод MyXML мы перетянули объект?

FlexOkeks 28.02.2008 14:47

Цитата:

Сообщение от SSergeyS
как получить оба нода:в который перетаскивается и тот который мы непосредственно тянем. Чтобы сделать нормальную проверку и, например, записывать в историю, что куда перетягивали.

Тот который мы непосредственно тянем я брал из selectedItems. А чтобы определить нод в который перетаскивается, я сделал так:
Код:

        protected var _dropTargetItem:Оbject;
        protected override function dragOverHandler(evt:DragEvent):void {
                var renderer:Object = indexToItemRenderer(calculateDropIndex(evt));
                if(renderer) {
                        _dropTargetItem = renderer.data;
                }else {
                        _dropTargetItem = null;
                }
                super.dragOverHandler(evt);
        }

Обработчик ловит индекс видимого объекта над которым мы тащим курсор и получает ссылку на ноду, если она есть. Это не обязательно ловить на dragOverHandler можно ловить и на dragDropHandler.

SSergeyS 28.02.2008 16:52

Код:

var node_t:Array = event.dragSource.dataForFormat("treeItems") as Array
Alert.show(String(node_t[0]));

Интересно что в node_t[0] тоже будет нод на который мы отпустили объект?!?!?!

А ни у кого нет под рукой примера с подробным разбором, в какой переменной, что лежит в событии DragEvent

В каком событии можно после некой проверки запрещать или разрешать "drop"?

SSergeyS 05.03.2008 10:20

Вся проблема в том что «drag&drop» происходит в пределах одного компонента "Tree"?
У меня не получается нормально отследить все этапы перетаскивания элементов и при необходимости отменить или запретить перетаскивание текущего элемента.


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

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