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

18déc/102

Flex 4 – Limiter le nombre d'éléments dans une List (rowCount en Flex 3)

Voila un petit billet pour couvrir une propriété qui était bien pratique en Flex 3: la propriété "rowCount" sur mx:List. Ce "rowCount" permettait de restreindre le nombre d'élément affiché par une liste. Si le nombre d'éléments de la liste était supérieur au rowCount, on avait un scroll.

Cela permettait aussi de pouvoir adapter la taille de la liste suivant la donnée, grâce à un Binding du plus bel effet:

Flex Tips – Adapter automatiquement la taille d'une List / DataGrid / ComboBox suivant la donnée

Avec le composant Spark List (Flex 4), cette propriété a disparu mais il est toujours possible de limiter le nombre d'objets affichés. Cela se passe maintenant dans le layout, avec la propriété "requestedRowCount" ou "requestedMinRowCount", suivant ce que vous souhaitez.

Comme vous avez devez mettre un layout type VerticalLayout pour cela, il vous faudra ajouter 2 arguments pour conserver le style de la liste de base:

<s:List id="list" width="100%">
 <s:layout>
  <s:VerticalLayout requestedRowCount="3" gap="0" horizontalAlign="contentJustify" />
 </s:layout>
</s:List>
1juin/104

DataFilterLib – Using the DataFilterLib with ActionScript code only

Someone raised an issue a while ago on my DataFilterLib project:

Creating DataSetFilter in Actionscript

If you are not familiar with the DataFilterLib capabilities, this article will explain everything you need to know about it, including examples:

DataFilterLib – Filtrez votre donnée de manière simple et dynamique

As the person who raised the issue doesn't seem to be a native French speaker, this will be my first post in english on this blog :) .

So this issue is actually more of a lack of documentation than a bug or anything. Every example is written in MXML, using Binding mechanisms and if you are not so familiar with ActionScript code, you might run into some issues.

Here was the MXML code to create the "Very Simple Example":

...
  <mx:Script source="../data/StateData.as"/>

  <filter:DataFilterSet id="filterSet" data="{statesData}">
    <filter:dataFilterParameters>
      <filter:DataFilterParameters id="simpleParam" filterType="{DataFilterType.SINGLE_VALUE}" filterKeys="state" filterOperator="{DataFilterSingleValueOperator.STARTS_WITH}"
                                   filterValues="{stateInput.text}"/>
    </filter:dataFilterParameters>
  </filter:DataFilterSet>

  <mx:Label text="Filter By State Name (Starts With)" fontSize="14" fontWeight="bold"/>
  <mx:TextInput id="stateInput"/>
...

The "StateData.as" file only contains an ArrayCollection filled with USA States and some more data, named "statesData". The data wont be dynamically changed, the Data Binding is only here to set the "data" property on the DataFilterSet once it's set. Also, the "filterType" and "filterOperator" properties use Data Binding on public static constants. The curly braces aren't used for Data Binding in that situation, just to set the properties to a non-String value (class constants). We could as well have set the String value corresponding to the constant but this way, we have compile-time type checking and auto-completion.

6mar/1011

Master Class Advanced Flex @ Bruxelles, Retour en images

La semaine dernière a eu lieu la Master Class Advanced Flex à Bruxelles, un séminaire donné par l'équipe de Farata Systems. Vous l'aviez peut-être deviné, j'étais présent pour ce séminaire. Autant être clair, si vous n'y étiez pas, vous avez raté une des conférences les plus intéressantes (en France et ses alentours en tout cas).

J'ai eu l'occasion de rencontrer quelques uns (6 je crois) des lecteurs de flex-tutorial.fr à cette occasion (certains que je connaissais seulement par GTalk), c'était vraiment intéressant d'échanger en direct :D . Un bonjour à eux

Le Hilton, c'est classe

Le séminaire s'est passé sur 2 jours, au Hilton de Bruxelles. Pour planter le décor, les 2 jours se sont passés au 27e étage du Hilton, dans une salle de réunion panoramique avec sûrement une des meilleures vue sur tout Bruxelles. Rien que pour cela, cela valait le coup. Étaient présentes, une trentaine de personne, ce qui a permis de pouvoir communiquer facilement et de poser des questions. Quelques photos sont disponibles à la fin de cet article.

Le premier soir, l'équipe de Farata Systems a invité tous les participants à prendre une tournée de binche au bar du Hilton, un geste très sympa. Rajoutez à cela le buffet à volonté le midi (et c'est pas celui du Flunch) avec de très bons vins compris dans le prix(400 euros), ce séminaire était une aubaine :) .

Assez parlé du contexte, parlons maintenant du contenu.

Les présentateurs de chez Farata Systems

Ils étaient 3 pour animer ce séminaire, chacun spécialiste dans sa "branche" (compilation et optimisation, développement et aspect humains, …): Victor Rasputnis, Yakov Fain et Anatole Tartakovsky. Trois américains d'origine d'Europe de l'Est avec un accent anglais plutôt sympa ^^.

Ils sont tous consultant/développeur, venant du monde Java avec des bonnes années d'expérience derrière eux. Ils ont notamment écrit plusieurs livres spécialisés, notamment:

On a eu affaire à de vrais pros, qui ont développé des projets de grande envergure depuis des années. Ils ont tourné et modifié Flex et l'ActionScript dans tous les sens et connaissent tout sur le bout de doigts.

Ce qu'on a pu voir en 2 jours

2 jours, cela peut paraître long sur Flex mais ce fut en fait trop court pour pouvoir tout aborder. Le programme de ce séminaire était très chargé et on a pas eu le temps de tout aborder. De nombreux points sont déjà abordés dans leur blog mais il est toujours plus intéressant de les voir expliqués en live.

Voir le blog Flex de Farata Systems

Voici les points abordés qui m'ont le plus intéressé:

21fév/105

Flex Tips – Adapter automatiquement la taille d'une List / DataGrid / ComboBox suivant la donnée

Voilà un petit "tip" que j'utilise très fréquemment pour créer des interfaces plus agréables à utiliser. Ce n'est pas grand chose mais c'est toujours un petit plus. Ce petit truc sert simplement à adapter la taille d'une composant de type "liste" (List / DataGrid / ComboBox) suivant le nombre de données qu'il doit afficher.

En effet, par défaut, ces composants affichent un certain nombre d'éléments de votre dataProvider:

  • 5 pour la ComboBox (le DropDown)
  • 6 pour la DataGrid
  • 7 pour la List

Prenons maintenant l'exemple dans lequel vous avez un dataProvider à 6 éléments pour votre ComboBox. Quand vous allez l'ouvrir, une scrollbar (barre de défilement) va apparaitre pour vous permettre d'accéder au 6ème élément. Pour accéder au 6eme (ou 7e, ...) élément, on doit donc effectuer un click de plus alors que ce ne serait pas vraiment nécessaire, on pourrait afficher un DropDown affichant les 6 éléments par exemple.

Pour définir le nombre d'éléments à afficher dans un composant Flex de type List, il existe une propriété nommée "rowCount". Il suffirait donc de mettre votre rowCount à 6 et le tour est joué. Mais on va être plus malin car on ne connait pas forcement le nombre d'élément à afficher à l'avance (peut-être même qu'il peut varier).

On va ici utiliser le Data Binding pour automatiser la tâche et ne pas se soucier du pourquoi et du comment. On va simplement faire un Binding (liaison dynamique) entre la propriété "rowCount" de notre composant de type "liste" et la propriété "length" de notre dataProvider (en admettant que ce soit un Collection comme une ArrayCollection).

Voici un petit exemple:

<mx:ComboBox dataProvider="{_listOperatorsDP}" rowCount="{_listOperatorsDP.length}"/>

Et magie du Binding, notre affichage sera exactement à la taille souhaitée, pas de scrollbar. Alors vous avez sûrement déjà pensé à un cas qui pose problème, c'est le cas où l'on a beaucoup d'élément. Dans ce cas, notre Binding fera que notre liste sera immense et en plus, vous n'aurez potentiellement pas de scrollbar.

La solution est donc de simuler un "rowCountMax" (qui n'existe pas) à l'aide d'une mini-expression de test (test ternaire en ligne):

<mx:ComboBox dataProvider="{_listOperatorsDP}" rowCount="{_listOperatorsDP.length > 15 ? 15 : _listOperatorsDP.length}"/>

Ici, on va s'arrêter à 15 éléments affichés au maximum. A vous d'appliquer ce "tip" dans vos applications pour les rendre plus agréables à utiliser.

Un petit exemple exposant la différence:

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

26oct/099

Créer un projet FlexLibrary pour les assets (icônes, éléments graphiques, …)

Parfois, quand vous compilez un projet Flex, vous allez peut-être vous apercevoir que certaines classes ne sont pas compilées dans le dossier bin-release, car vous avez du code ActionScript qui instancié une classe sous certaines conditions et le compilateur Flex assume que cette classe n'est pas requise.

Cet article est une traduction de l'excellent Creating an image asset library de russback.com.

C'est assez frustrant mais il y a un moyen de contourner ce problème. En créant une instance "dummy" (une instance non utilisée) d'une de ces classes non-compilées, vous pouvez vous assurer  que la classe sera bien compilée dans votre répertoire de destination. Une autre solution consiste à créer une librairie d'assets externe qui va être compilée en un SWC.

Création d'un projet Flex Library

Un projet Flex Library peut être crée de la même manière que tout autre projet, choisissez simplement Flex Library Project dans le menu New au lieu de Flex Project.

asset-library-create-library-project

A première vue, rien n'a changé à part l'icône dans la vue Flex Navigator mais vous verrez vite les bénéfices de cette approche.

asset-library-flex-navigator-view

Création d'une Class

Tout d'abord, on va créer au moins une Class. Pour cet exemple, l'auteur a choisit d'utiliser l'excellente FamFamFam Silk Icon Library, une collection de 700+ images 16x16px qui sont utilisées par de nombreuses interface web (WebDevelopper Toolbar Firefox et autres). Pour cet article, on va ajouter tous les icônes de cette librairie et en exposer seulement deux pour notre application.

Import des Assets

C'est très simple, téléchargez la librairie et déplacez toutes les images dans le projet FlexLibrary. Pour cet exemple, on place les icones dans le dossier /assets/images/famfamfam/silkicons. Il peuvent être placés n'importe où mais cette structure rend l'ajout d'assets d'autres sources plus facile dans la librairie.

Exposition des assets

Pour cet exemple, on a juste besoin de deux de cet icônes. Pour les exposer, on crée une nouvelle classe appelée IconLibrary (dans le package com.russback). Cette classe est une classe Bindable qui a une public static constant de type Classe pour chacun des éléments graphiques que l'on veut exposer:

package com.russback
{
	/**
	 * Class containing constants for each icon image available for use in the application
	 */
	[Bindable]
	public final class IconLibrary
	{

		/**
		 * Displays the accept icon from the FamFamFam Silk Icons library
		 */
		[Embed(source="assets/images/famfamfam/silkicons/accept.png")]
		public static const ACCEPT:Class;

		/**
		 * Displays the bomb icon from the FamFamFam Silk Icons library
		 */
		[Embed(source="assets/images/famfamfam/silkicons/bomb.png")]
		public static const BOMB:Class;

		/**
		 * Constructor
		 */
		public function IconLibrary()
		{
		}

	}
}