TreeCheck com E4X

O E4X torna mais simples o trabalho com XML e em muitos casos isto significa menos loops e "ifs" no seu código. Como o componente TreeCheck trabalha com XML resolvemos refatorá-lo a fim de obter uma implementação mais interessante.

O resultado você pode conferir no novo TreeCheck. Para efeito de comparação incluímos no pacote "br.com.dclick.renderers" as duas implementações:

CheckIntederminateTreeItemRenderer: Implementação nova que tira proveito do E4X.
CheckIntederminateTreeItemRendererOld: Implementação antiga que foi refatorada.

Para que você compreenda mais facilmente o código é preciso dizer que para uma variável do tipo XML a notação de ponto tem um sentido peculiar. Assim, "myXML.item" corresponde a uma instrução que retornará todos os filhos de "myXML". De maneira semelhante é possível acessar todos os ancestrais, bastando para isto usar a seguinte sintaxe: "myXML..item". Enfim, não confunda o "." em um objeto XML com o "." nos outros objetos .

No código (botão direito -> View Source), destaque para os métodos "allDescendantsSelected" e "allDescendantsUnselected".



No XML, um atributo "selected" define se o item estará ou não selecionado.

1
2
3
4
5
6
7
8
9
10
11
12
<node label="Clients" selected="false">
    <node label="Client01" selected="false">
         <node label="Project01" selected="false"/>
         <node label="Project02" selected="false"/>
    </node>
    <node label="Client02" selected="false">
         <node label="Project01" selected="false"/>
         <node label="Project02" selected="false"/>
         <node label="Project03" selected="false"/>
         <node label="Project04" selected="false"/>
    </node>
</node>

Então o método "allDescendantsSelected" retorna true se todos os filhos do XML estiverem selecionados.

1
2
3
4
5
private function allDescendantsSelected(item:XML):Boolean
{
     var numSelected:int = item..node.(@selected == "true").length();
     return numSelected == item..node.length();
}

A semântica da implementação é a seguinte: se o número de itens do XML cujo atributo "selected" é igual a "true" (primeira linha) for igual ao número de itens do XML (segunda linha), então, o retorno da chamada da função será "true", caso contrário será "false".

O funcionamento do método "allDescendantsUnselected" é semelhante e você pode conferir no código fonte.


2 comentários

  1. emurhfkq em 21.jun.07 às 7:16 pm

    people are stranger

  2. Marcos Chi em 15.out.10 às 2:03 pm

    Fera…

    Estou utilizando o componente Tree CheckBox desenvolvido por vcs da DClick e estou com um problema…

    Em alguns componentes como DataGrid, ComboBox e outros, eu alimento os Provider com um ArrayCollection ou Array ou XML…

    Nesse caso, vcs usaram XML para alimentar o provider do componente…
    Como estou retornando do java um objeto, tentei implementar, mas não tive sucesso ao marcar o checkBox…
    Qndo clico no checkBox, a opção é marcada… porem ao tirar o mouse de cima do checkBox, a marcação some…

    Abri o arquivo CheckIndeterminateTreeItemRenderer.as para analisar e percebi que em alguns métodos, é implementado variaveis do tipo XML…
    aonde percorre os nós fazendo o controle de checagem…

    Alguma sugestão??

    Atenciosamente!!!

Deixe Seu Comentário