Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

29sept/0914

DataFilterLib – Utilisation de filtres personnalisés

Dans les tutoriaux Flex DataFilterLib précédents, on a vu comment utiliser les filtres de la librairies, qu'ils soient simples ou combinés. La DataFilterLib fournit des filtres de base mais elle vous permet aussi d'ajouter des filtres personnalisés. Pour cela, il faut simplement créer une classe qui hérite (extends) de DataFilterBase comme ceci:

public class CustomSimpleFilter extends DataFilterBase {
 public function CustomSimpleFilter(parameters:DataFilterParameters = null) {
 super(parameters);
 }
}

Les filtres de la librairie sont codés de cette manière, vous pouvez jeter un oeil aux sources de la librairie Flex. Grâce à l'objet "parameters" de type DataFilterParameters, vous pourrez récupérer l'ensemble des paramètres passés dans le tag MXML (filterOperator, filterValues, filterKeys, …). Par exemple, pour récupérer les filterValues, il vous suffit d'appeler:

var values:Array = _parameters.filterValues;

Si vous voulez faire votre filtrage spécial, il faut surcharger la méthode apply(item:Object):Boolean comme ceci:

override public function apply(item:Object):Boolean {
// code
return true;
}

Dans l'exemple suivant, on remplit un ArrayCollection avec des objets custom, de type CustomSimpleObject. Au moment où l'objet passe dans la méthode apply, on peut donc faire un cast (conversion de type) du paramètre item. Voici donc la classe complète qui a servi pour l'exemple qui vient après:

28sept/0914

DataFilterLib – Utilisation de multiple filtres sur une même collection

Dans les exemples sur la DataFilterLib précédent, on a vu comment faire des filtrages simple, que ce soit par valeur ou par intervalle. Ces fonctionnalités étaient "assez" facilement reproduisibles avec des filterFunctions mais on va maintenant voir une des principales fonctionnalités de la DataFilterLib, le filtrage de données selon plusieurs filtres.

Le filtrage avec plusieurs DataFilterParameters est très simple puisqu'il suffit d'ajouter des DataFilterParameters au DataFilterSet principal. Les filtres seront ainsi combinés entre eux. N'importe quelle combinaison de filtres est possible, y compris un mélange de filtres type SingleValue et d'Interval.

Voici par exemple le DataFilterSet utilisé dans l'exemple suivant:

  <filter:DataFilterSet id="filterSet"
                        data="{productData}">
    <filter:dataFilterParameters>
      <filter:DataFilterParameters id="tstIntervalParameters"
                                   filterType="{DataFilterType.INTERVAL}"
                                   filterKeys="{'productPrice'}"
                                   filterOperator="{DataFilterIntervalOperator.INTERVAL_CLOSED}"
                                   filterValues="{hsProductPrice.values}"
                                   active="{activeIntervalCB.selected}"
                                   invert="{invertIntervalCB.selected}"/>
      <filter:DataFilterParameters id="tstMultiValueParameter"
                                   filterType="{DataFilterType.SINGLE_VALUE}"
                                   filterKeys="productType"
                                   filterOperator="{DataFilterSingleValueOperator.EQUALS_TO}"
                                   filterValues="{singleValuesList.selectedItems}"
                                   invert="{invertListCB.selected}"
                                   active="{activeListCB.selected}"/>
      <filter:DataFilterParameters id="tstSingleValueParameter"
                                   filterType="{DataFilterType.SINGLE_VALUE}"
                                   filterKeys="{textFieldCB.selectedItem}"
                                   filterOperator="{textOperatorCB.selectedItem}"
                                   filterValues="{stringFilter.text}"
                                   active="{activeTextCB.selected}"
                                   invert="{invertTextCB.selected}"/>
    </filter:dataFilterParameters>
  </filter:DataFilterSet>

On a ici 3 filtres, 2 de type Singlevalue et un de type Interval. Le nombre de filtre n'est pas limité au sein d'un DataFilterSet.

Démonstration en ligne (onglet "Multiple Filters")

L'exemple suivant montre comment mettre en place de multiples filtres sur un même ArrayCollection. On peut ainsi facilement trouver les produits de type Home et Electro entre 80 et 250 euros. Toutes les combinaisons sont possibles. Pour intégrer ce genre de filtres dans votre application Flex, il vous suffit de lier les filtres aux bon champs de votre donnée et le tour est joué

This movie requires Flash Player 11

14jan/0910

Flex PopUp – Créer une PopUp à partir d'un composant MXML ou ActionScript

Dans les précédents exemples sur les PopUp Flex, vous avez pu voir des cas d'utilisation simplistes, juste pour montrer le fonctionnement de la méthode createPopUp(). Mais la plupart du temps, vous voudrez utiliser des composants personnalisés, c'est-à-dire des composants que vous aurez codé en MXML ou en ActionScript (puisque si vous avez suivi, cela revient à peu près à la même chose).

Pour l'exemple, voici un composant MXML qui est une sous-classe de TitleWindow avec une TextArea et un handler pour fermer la fenêtre PopUp. Ici, je vais donc créer un nouveau composant MXML appelé TextAreaWindow.mxml dans mon répertoire de projet qui va contenir:

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" showCloseButton="true" close="closeHandler(event)">
	<mx:Script>
		<![CDATA[
			import mx.events.CloseEvent;
			import mx.managers.PopUpManager;
			private function closeHandler(event:CloseEvent):void{
				PopUpManager.removePopUp(this);
			}
		]]>
	</mx:Script>

	<mx:TextArea height="200" width="200" text="Texte dans une TextArea qui va être ajouté à une PopUp bla bla"/>

</mx:TitleWindow>
4nov/086

Flex Navigator – Le composant Accordion Flex

Le composant Accordion (accordéon) se compose de deux (ou plus) conteneurs qui ont la capacité de se réduire. Seulement un élément d'un Accordion peut être visible à la fois. Les autres éléments de l'accordéon sont réduits pour que l'on ne voit que leur titre. Les Accordion sont pertinents pour des processus par étapes où l'utilisateur peut revenir en arrière.
Par exemple, pour un formulaire contenant plusieurs sections. Plutôt que des présenter toutes les sections à la fois, un accordéon permet à l'utilisateur de voir une seule section à la fois.

La création d'Accordion, comme la plupart des composants Flex est assez simple. Les Accordion se comportent comme des conteneurs classiques dans lesquels vous pouvez mettre d'autres éléments (directement en MXML ou en utilisant la méthode addChild ActionScript). Dans le cas d'un Accordion, tous les éléments enfant devraient être des conteneurs eux-mêmes, et vous devrez ajouter une propriété label à tous les enfants direct de l'Accordion Flex. Les Accordions utilisent la propriété label des éléments enfant pour la barre de titre, et peuvent aussi afficher un icône quand la propriété icon est fixée.
Voici un exemple simple d'utilisation du composant Flex Accordion en MXML:

31oct/087

Flex UIComponent – Assigner un dataProvider à un Composant Flex en MXML et AS3

Vous pouvez utiliser n'importe quel type de collection (tant qu'il implémente ICollectionView) avec n'importe quel composant de type liste, ce qui permet d'avoir différentes structures de données. Tous ce que vous avez à faire, est de fixer la propriété dataProvider du composant à la collection.
Par exemple, le code suivant utilise un ArrayCollection pour peupler une liste (mx:List);

import mx.collections.ArrayCollection;
var collection:ArrayCollection = new ArrayCollection(["a", "b", "c", "d"]);
list.dataProvider = collection;

D'un autre côté, si la donnée est au format XML, vous pouvez facilement utiliser une XMLListCollection à la place:

import mx.collections.XMLListCollection;
public var xmlList:XMLList = XMLList("<item>a</item><item>b</item><item>c</item><item>d</item>");
public var collection:XMLListCollection = new XMLListCollection(xmlList);
list.dataProvider = collection;