Форум 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=123494)

Роман Вадимович 03.04.2009 14:52

Неполное отображение данных в Tree
 
Пользуюсь Flex SDK.
У меня есть XML следующего вида:

Код:

<xml>
  <folder label="Основное">
    <menu label="Верхнее меню">
      <button name="Кнопка1"/>
      <button name="Кнопка2"/>
      <button name="Кнопка3"/>
    </menu>
    <menu label="Нижнее меню"/>
      <button name="Кнопка1"/>
      <button name="Кнопка2"/>
      <button name="Кнопка3"/>
    </menu>
    <menu label="Среднее меню"/>
      <button name="Кнопка1"/>
      <button name="Кнопка2"/>
      <button name="Кнопка3"/>
    </menu>
  </folder>
  <folder label="Дополнительно">
    <menu label="Ещё одно меню"/>
      <button name="Кнопка1"/>
      <button name="Кнопка2"/>
    </menu>
  </folder>
</xml>

У меня следующая задача. Нужно поместить эти данные в элемент Tree.
Этот xml содержит элементы меню, помещенные в папки. Но каждый элемент меню имеет свою структуру, которую отображать не нужно.
Т.е. в элемент Tree необходимо поместить следующие данные:
Код:

Основное
|--Верхнее меню
|--Нижнее меню
|--Среднее меню меню
Дополнительно
|--Еще одно меню

Я бы мог сформировать новый XML, который содержит только нужные мне данные (без внутренней структуры меню). Но в результате не сохраняются ссылки.

Подскажите как можно поступить в данной ситуации?

Tavy 04.04.2009 15:18

Сформировать новый XML, который содержит только нужные данные.
Когда пользователь выбирает узел, искать соответствующий узел в исходном XML (например ввести доп. атрибут - айдишник и по нему находить)

wvxvw 04.04.2009 16:41

Можно попробовать сделать через ITreeDataDescriptor... но это столько мороки и на столько неудобно сделано, что вряд ли захочется возится... просто сдублировать XML будет гораздо проще...

Хотел попробовать сдлать пример три-дата-дескрипора, если пригодится, вот:
Код:

package 
{
        import mx.collections.ICollectionView;
        import mx.controls.treeClasses.ITreeDataDescriptor;
       
        /**
        * CustomTreeDataDescriptor class.
        * @author wvxvw
        * @langVersion 3.0
        * @playerVersion 10.0.12.36
        */
        public class CustomTreeDataDescriptor implements ITreeDataDescriptor
        {
                //--------------------------------------------------------------------------
                //
                //  Public properties
                //
                //--------------------------------------------------------------------------
               
                //--------------------------------------------------------------------------
                //
                //  Protected properties
                //
                //--------------------------------------------------------------------------
               
                //--------------------------------------------------------------------------
                //
                //  Private properties
                //
                //--------------------------------------------------------------------------
               
                //--------------------------------------------------------------------------
                //
                //  Cunstructor
                //
                //--------------------------------------------------------------------------
                public function CustomTreeDataDescriptor()
                {
                        super();
                       
                }
               
                /* INTERFACE mx.controls.treeClasses.ITreeDataDescriptor */
               
                public function getChildren(node:Object, model:Object = null):ICollectionView
                {
                        trace("getChildren", arguments);
                        // Should be HierarchicalCollectionView
                        return new CustomCollectionView(node);
                }
               
                public function hasChildren(node:Object, model:Object = null):Boolean
                {
                        if ((node as XML).*.length()) return true;
                        return false;
                }
               
                public function isBranch(node:Object, model:Object = null):Boolean
                {
                        if (validateNode(node) && (node as XML).*.length()) return true;
                        return false;
                }
               
                public function getData(node:Object, model:Object = null):Object
                {
                        trace("getData", arguments);
                        return node;
                }
               
                public function addChildAt(parent:Object, newChild:Object, index:int,
                                                                                                model:Object = null):Boolean
                {
                        trace("addChildAt", arguments);
                        return false;
                }
               
                public function removeChildAt(parent:Object, child:Object, index:int,
                                                                                                model:Object = null):Boolean
                {
                        trace("removeChildAt", arguments);
                        return false;
                }
                //--------------------------------------------------------------------------
                //
                //  Public methods
                //
                //--------------------------------------------------------------------------
               
                //--------------------------------------------------------------------------
                //
                //  Protected methods
                //
                //--------------------------------------------------------------------------
               
                protected function validateNode(node:Object):Boolean
                {
                        if (node.hasOwnProperty("@label")) return true;
                        return false;
                }
               
                //--------------------------------------------------------------------------
                //
                //  Private methods
                //
                //--------------------------------------------------------------------------
        }
}
import flash.events.EventDispatcher;
import mx.collections.ICollectionView;
import mx.collections.IViewCursor;
import mx.collections.Sort;

internal final class CustomCollectionView extends EventDispatcher implements ICollectionView
{
        public function CustomCollectionView(data:Object)
        {
                super();
        }
       
        /* INTERFACE mx.collections.ICollectionView */
       
        public function get length():int
        {
               
        }
       
        public function get filterFunction():Function
        {
               
        }
       
        public function set filterFunction(value:Function):void
        {
               
        }
       
        public function get sort():Sort
        {
               
        }
       
        public function set sort(value:Sort):void
        {
               
        }
       
        public function createCursor():IViewCursor
        {
               
        }
       
        public function contains(item:Object):Boolean
        {
               
        }
       
        public function disableAutoUpdate():void
        {
               
        }
       
        public function enableAutoUpdate():void
        {
               
        }
       
        public function itemUpdated(item:Object, property:Object = null,
                                        oldValue:Object = null, newValue:Object = null):void
        {
               
        }
       
        public function refresh():Boolean
        {
               
        }
}


Роман Вадимович 04.04.2009 17:28

Да, конечно пригодится, спасибо большое!

wvxvw 04.04.2009 18:44

А, хотя вот, собственно, сделал, но это не полная имплементация (курсор, сортировку и т.п. нужно доделать, но как подтверждение концепции - работает :)
Код:

<?xml version="1.0" encoding="utf-8"?>
<!-- Tree control example. -->
<mx:Application
        xmlns:mx="http://www.adobe.com/2006/mxml"
        applicationComplete="filterTreeProvider()">

    <mx:Script>
        <![CDATA[
                        import mx.collections.XMLListCollection;
                        import CustomTreeDataDescriptor;
                       
            [Bindable]
            public var selectedNode:XML;

            // Event handler for the Tree control change event.
            public function treeChanged(event:Event):void
                        {
                selectedNode=Tree(event.target).selectedItem as XML;
            }
                       
                        public function filterTreeProvider():void
                        {
                                trace(myTree.dataDescriptor);
                                (myTree.dataProvider as XMLListCollection).filterFunction = treeFilterFunction;
                                (myTree.dataProvider as XMLListCollection).refresh();
                        }
                       
                        private function treeFilterFunction(item:Object):Boolean
                        {
                                trace("treeFilterFunction", item is XML);
                                if(item.hasOwnProperty("@label")) return true;
                                return false;
                        }
                       
        ]]>
    </mx:Script>

    <mx:XMLList id="treeData">
        <node label="Mail Box">
            <node label="Inbox">
                <node label="Marketing"/>
                <node label="Product Management"/>
                <node label="Personal"/>
            </node>
            <node label="Outbox">
                <node label="Professional"/>
                <node label="Personal"/>
            </node>
            <node label="Spam"/>
            <node label="Sent"/>
<!-- этот узел не будет отображен т.как не пройдет валидацию у CustomTreeDataDescriptor -->
            <foo anotherAttribute="Sent"/>
        </node>   
    </mx:XMLList>

    <mx:Panel title="Tree Control Example" height="75%" width="75%"
        paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">

        <mx:Label width="100%" color="blue"
            text="Select a node in the Tree control."/>

        <mx:HDividedBox width="100%" height="100%">
            <mx:Tree id="myTree" width="50%" height="100%" labelField="@label"
                                dataDescriptor="{new CustomTreeDataDescriptor()}"
                showRoot="false" dataProvider="{treeData}" change="treeChanged(event)"/>
            <mx:TextArea height="100%" width="50%"
                text="Selected Item: {selectedNode.@label}"/>
        </mx:HDividedBox>
       
    </mx:Panel>
</mx:Application>

Код:

package 
{
        import mx.collections.ICollectionView;
        import mx.collections.ListCollectionView;
        import mx.collections.XMLListCollection;
        import mx.controls.treeClasses.ITreeDataDescriptor;
       
        /**
        * CustomTreeDataDescriptor class.
        * @author wvxvw
        * @langVersion 3.0
        * @playerVersion 10.0.12.36
        */
        public class CustomTreeDataDescriptor implements ITreeDataDescriptor
        {
                //--------------------------------------------------------------------------
                //
                //  Public properties
                //
                //--------------------------------------------------------------------------
               
                //--------------------------------------------------------------------------
                //
                //  Protected properties
                //
                //--------------------------------------------------------------------------
               
                //--------------------------------------------------------------------------
                //
                //  Private properties
                //
                //--------------------------------------------------------------------------
               
                //--------------------------------------------------------------------------
                //
                //  Cunstructor
                //
                //--------------------------------------------------------------------------
                public function CustomTreeDataDescriptor()
                {
                        super();
                       
                }
               
                /* INTERFACE mx.controls.treeClasses.ITreeDataDescriptor */
               
                public function getChildren(node:Object, model:Object = null):ICollectionView
                {
                        return new ListCollectionView(validateList(node));
                }
               
                public function hasChildren(node:Object, model:Object = null):Boolean
                {
                        if ((node as XML).*.length()) return true;
                        return false;
                }
               
                public function isBranch(node:Object, model:Object = null):Boolean
                {
                        if (validateNode(node) && (node as XML).*.length()) return true;
                        return false;
                }
               
                public function getData(node:Object, model:Object = null):Object
                {
                        //trace("getData", arguments);
                        return node;
                }
               
                public function addChildAt(parent:Object, newChild:Object, index:int,
                                                                                                model:Object = null):Boolean
                {
                        //trace("addChildAt", arguments);
                        return false;
                }
               
                public function removeChildAt(parent:Object, child:Object, index:int,
                                                                                                model:Object = null):Boolean
                {
                        //trace("removeChildAt", arguments);
                        return false;
                }
                //--------------------------------------------------------------------------
                //
                //  Public methods
                //
                //--------------------------------------------------------------------------
               
                //--------------------------------------------------------------------------
                //
                //  Protected methods
                //
                //--------------------------------------------------------------------------
               
                protected function validateNode(node:Object):Boolean
                {
                        if (node.hasOwnProperty("@label")) return true;
                        return false;
                }
               
                protected function validateList(node:Object):XMLListCollection
                {
                        var listCopy:XMLList = (node as XML).*.(validateNode(valueOf()));
                        return new XMLListCollection(listCopy);
                }
               
                //--------------------------------------------------------------------------
                //
                //  Private methods
                //
                //--------------------------------------------------------------------------
        }
}


Роман Вадимович 05.04.2009 00:25

Просто супер! Ещё раз огромное спасибо, в который раз я Ваш должник.
Если смогу чем-то пригодиться с радостью помогу :)


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

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