Estoy intentando hacer un arbol que permita mostrar un checkbox y mas de un icono (todos los que se quieran).
Para ello he implementado una clase CheckBoxImage, la cual es un HBox que contiene el checkBox, un HBox images y una label. En el HBox images voy anidando todas las imágenes que recibe mi componente en el atributo Bindable listImages.
Este es mi compo, el cual funciona ok cuando no está dentro de un TreeItemRenderer:
package milcomponents
{
import flash.events.Event;
import flash.events.MouseEvent;
import mx.collections.ArrayCollection;
import mx.containers.HBox;
import mx.controls.CheckBox;
import mx.controls.Label;
import mx.events.FlexEvent;
public class CheckBoxImages extends HBox
{
public var cb:CheckBox;
public var images:HBox;
public var etiqueta:Label;
[Bindable]
public var listaImagenes:ArrayCollection = new ArrayCollection();
[Bindable]
public var labelcb:String;
public function CheckBoxImages()
{
super();
this.setStyle("horizontalGap", 10);
this.addEventListener(FlexEvent.INITIALIZE, cargar);
cb = new CheckBox;
cb.x = 0;
cb.y = 0;
addChild(cb);
images = new HBox;
images.setStyle("borderStyle","none");
images.setStyle("horizontalGap",5);
images.addEventListener(MouseEvent.CLICK, dispararClickCB);
addChild(images);
etiqueta = new Label;
etiqueta.addEventListener(MouseEvent.CLICK, dispararClickCB);
addChild(etiqueta);
}
private var _selected:Boolean;
public function get selected():Boolean{
return cb.selected;
}
public function set selected(estado:Boolean):void{
cb.selected = estado;
}
/*Agregar todos los iconos que le pasemos por el array listaImagenes*/
private function cargar(e:Event):void{
for(var ind:int = 0; ind < listaImagenes.length; ind++){
images.addChild(listaImagenes[ind]);
}
etiqueta.text = labelcb;
}
public function eliminarIcono(numIcono:int):void{
listaImagenes.removeItemAt(numIcono);
images.removeChildAt(numIcono);
}
private function dispararClickCB(e:Event):void{
cb.selected = !(cb.selected);
}
}
Este lo uso dentro de un TreeItemRender:
package milcomponents
{
import mx.controls.treeClasses.TreeItemRenderer;
import mx.controls.Tree;
import mx.controls.treeClasses.TreeListData;
import flash.events.MouseEvent;
import mx.collections.ICollectionView;
import mx.controls.treeClasses.ITreeDataDescriptor;
import mx.collections.IViewCursor;
public class CheckBoxImaTreeRenderer extends TreeItemRenderer
{
private var entrada:CheckBoxImages;
Instancio mi objeto en la funcion createChildren y lo anido:
override protected function createChildren():void
{
super.createChildren();
entrada = new CheckBoxImages();
entrada.setStyle( "verticalAlign", "middle" );
entrada.addEventListener( MouseEvent.CLICK, checkBoxImaToggleHandler );
addChild(entrada);
}
sobrecargo tb el metod para pintar mi objeto checkBoxImages:
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth, unscaledHeight);
if(super.data)
{
if (super.icon != null)
{
super.icon.visible = false;
entrada.labelcb = super.label.text;
entrada.x = super.icon.x;
entrada.y = 10;
entrada.visible = true;
super.label.visible = false;
}
else
{
super.label.visible = false;
entrada.labelcb = super.label.text;
entrada.x = super.label.x;
entrada.y = 10;
entrada.visible = true;
super.label.x = entrada.x + entrada.width + 5;
}
}
}
}
La configuracion de mi tree:
<mx:Tree id="treeClasificacion" x="10" y="189" width="285" height="94"
itemRenderer="milcomponents.CheckBoxImaTreeRenderer" dataProvider="{dataProviderClasificacion}"> </mx:Tree>
Cuando no uso este itemRenderer me funciona sin problemas, pero con este solo se ve el pico que indica si esta la carpeta abierta o no. Es normal que el icono y la label por defecto no slagan pues yo los vuelvo invisible, ya que mi componente ya los tiene, pero no se ve ni el checkbox, ni las images y etiqueta de mi CheckBoxImages.
A ver si me podeis hechar una mano, porque no consigo saber porque no los muestra.
Muchas gracias
