Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.04.2009, 14:52
Роман Вадимович вне форума Посмотреть профиль Отправить личное сообщение для Роман Вадимович Найти все сообщения от Роман Вадимович
  № 1  
Ответить с цитированием
Роман Вадимович

Регистрация: May 2007
Сообщений: 232
Question Неполное отображение данных в 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, который содержит только нужные мне данные (без внутренней структуры меню). Но в результате не сохраняются ссылки.

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

Старый 04.04.2009, 15:18
Tavy вне форума Посмотреть профиль Отправить личное сообщение для Tavy Найти все сообщения от Tavy
  № 2  
Ответить с цитированием
Tavy

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

Старый 04.04.2009, 16:41
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Можно попробовать сделать через 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
	{
		
	}
}
__________________
Hell is the possibility of sanity

Старый 04.04.2009, 17:28
Роман Вадимович вне форума Посмотреть профиль Отправить личное сообщение для Роман Вадимович Найти все сообщения от Роман Вадимович
  № 4  
Ответить с цитированием
Роман Вадимович

Регистрация: May 2007
Сообщений: 232
Да, конечно пригодится, спасибо большое!

Старый 04.04.2009, 18:44
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
А, хотя вот, собственно, сделал, но это не полная имплементация (курсор, сортировку и т.п. нужно доделать, но как подтверждение концепции - работает
Код:
<?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
		//
		//--------------------------------------------------------------------------
	}
}
__________________
Hell is the possibility of sanity

Старый 05.04.2009, 00:25
Роман Вадимович вне форума Посмотреть профиль Отправить личное сообщение для Роман Вадимович Найти все сообщения от Роман Вадимович
  № 6  
Ответить с цитированием
Роман Вадимович

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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