Просмотр полной версии : Неполное отображение данных в Tree
Роман Вадимович
03.04.2009, 14:52
Пользуюсь 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, который содержит только нужные мне данные (без внутренней структуры меню). Но в результате не сохраняются ссылки.
Подскажите как можно поступить в данной ситуации?
Сформировать новый XML, который содержит только нужные данные.
Когда пользователь выбирает узел, искать соответствующий узел в исходном XML (например ввести доп. атрибут - айдишник и по нему находить)
Можно попробовать сделать через 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
Да, конечно пригодится, спасибо большое!
А, хотя вот, собственно, сделал, но это не полная имплементация (курсор, сортировку и т.п. нужно доделать, но как подтверждение концепции - работает :)
<?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
Просто супер! Ещё раз огромное спасибо, в который раз я Ваш должник.
Если смогу чем-то пригодиться с радостью помогу :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.