<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pixlib Flash Platform Framework</title>
	<atom:link href="http://blog.pixlib.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.pixlib.net</link>
	<description>Happy codding with Pixlib!</description>
	<lastBuildDate>Wed, 30 Jan 2013 20:18:39 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>PixIOC &#8211; L&#8217;inversion de Contrôle with Pixlib enfin dévoilée</title>
		<link>http://blog.pixlib.net/2012/04/19/pixioc-linversion-de-controle-with-pixlib-enfin-devoilee/</link>
		<comments>http://blog.pixlib.net/2012/04/19/pixioc-linversion-de-controle-with-pixlib-enfin-devoilee/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 18:31:03 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Extension]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PixNews]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=639</guid>
		<description><![CDATA[PixIOC, L'inversion de Contrôle made with Pixlib est arrivée. <a href="http://blog.pixlib.net/2012/04/19/pixioc-linversion-de-controle-with-pixlib-enfin-devoilee/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong>PixIOC</strong> est une extension de <strong>Pixlib</strong> permettant de réaliser des architectures IoC c&#8217;est à dire avec le concept d&#8217;inversion de contrôle.</p>
<p>Loin de moi l&#8217;idée de faire un court sur la conception IoC ici, les IoC&#8217;s Lover se reconnaitront.</p>
<p>Pour les Pixlib&#8217;s addict, sachez seulement que l&#8217;IoC a été complètement refondu, plus performante, plus puissante en terme de possibilité d&#8217;inversion et aussi plus facile à étendre, maintenir et customiser pour pourquoi supporter la définition de contexte dans d&#8217;autres structure que XML (pas JSON, etc.).</p>
<p>La librairie <strong>PixIOC</strong> est disponible sur la page des <a title="Pixlib download" href="http://blog.pixlib.net/pixlib-downloads/">téléchargements</a>.</p>
<p><em>Happy coding with <strong>Pixlib</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2012/04/19/pixioc-linversion-de-controle-with-pixlib-enfin-devoilee/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Découverte du MVC dans Pixlib</title>
		<link>http://blog.pixlib.net/2011/05/24/decouverte-du-mvc-dans-pixlib/</link>
		<comments>http://blog.pixlib.net/2011/05/24/decouverte-du-mvc-dans-pixlib/#comments</comments>
		<pubDate>Tue, 24 May 2011 14:22:41 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Core]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=571</guid>
		<description><![CDATA[Voici un petit article qui décrit l&#8217;organisation MVC d&#8217;un projet Pixlib 3.0. Ce n&#8217;est pas un hasard, si le pattern MVC est décliné dans de nombreux langages et présent dans le coeur de la plupart des framework orientés applicatif. La &#8230; <a href="http://blog.pixlib.net/2011/05/24/decouverte-du-mvc-dans-pixlib/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Voici un petit article qui décrit l&#8217;organisation <strong>MVC</strong> d&#8217;un projet <strong>Pixlib 3.0</strong>.</p>
<p>Ce n&#8217;est pas un hasard, si le pattern <strong>MVC</strong> est décliné dans de nombreux langages et présent dans le coeur de la plupart des <strong>framework orientés applicatif</strong>. La découpe d&#8217;un projet sous la forme <strong>Modèle-Vue-Contrôleur</strong> apporte beaucoup de souplesse et donc un gain de temps non négligeable dans le maintien et l&#8217;évolution d&#8217;une application.<br />
<span id="more-571"></span></p>
<h4>Courte synthèse sur le pattern Modèle-Vue-Contrôleur</h4>
<p>Le <strong>MVC</strong> est un modèle de conception qui regroupe les classes d&#8217;une application en 3 groupes :<br />
• le groupe des <strong>Modèles</strong>, qui correspond au code permettant de gérer et manipuler les <strong>données</strong> ;<br />
• le groupe des <strong>Vues</strong>, qui rassemble tout ce qui sert d&#8217;<strong>interface</strong> avec laquelle l&#8217;utilisateur va interagir ;<br />
• le groupe des <strong>Contrôleurs</strong>, qui traite les <strong>événements</strong> et notifie qui de droit des changements éventuels.</p>
<p>Bien que très formelle, <strong>l&#8217;organisation</strong> d&#8217;un projet sous forme de <strong>MVC</strong> offre une structure <strong>propre</strong> et <strong>solide</strong>. Plus de détails sur <a href="http://fr.wikipedia.org/wiki/Modèle-Vue-Contrôleur">l&#8217;article de Wikipedia : Modèle-Vue-Contrôleur</a></p>
<p>Le <strong>MVC</strong> dans <strong>Pixlib</strong> peut aussi être appelé <strong>MVC+FC</strong> (<strong>Model-View-Command</strong><strong>+FrontController</strong>), car la partie <strong>contrôleur</strong> est composée d&#8217;un <strong>FrontController</strong> et d&#8217;un ensemble de <strong>Commandes</strong>.</p>
<h4>Le MVC est global dans Pixlib</h4>
<p>Organisé autour de 3 <strong>Locators</strong> globaux, basés sur une logique de <strong>Singleton</strong> (<a href="http://fr.wikipedia.org/wiki/Singleton_(patron_de_conception)">Singleton(patron de conception)</a>), le <strong>MVC « made Pixlib »</strong> permet d&#8217;atteindre de manière globale chaque élément de l&#8217;application.</p>
<p>Chaque <strong>Locator</strong> est un <strong>agrégateur</strong> :</p>
<ul>
<li>le <strong>PXModelLocator</strong> agrège les <strong>PXModel</strong> ;</li>
<li>le <strong>PXViewLocator</strong> agrège les <strong>PXView</strong> ;</li>
<li>le <strong>PXFrontController</strong> agrège les <strong>PXCommandes</strong>.</li>
</ul>
<h5>PXView, PXModel et leurs Locators.</h5>
<p>Le groupe des vues et des modèles fonctionne de la même manière.<br />
<strong>PXView</strong> et <strong>PXModel</strong> sont des <strong>interfaces</strong>, qui possèdent une <strong>implémentation abstraite</strong> (<a href="http://fr.wikipedia.org/wiki/Classe_abstraite">Classe abstraite</a>) (<strong>PXAbstractView</strong> et <strong>PXAbstractModel</strong>) que l&#8217;on va étendre pour en faire un usage concret.</p>
<p>Donc en pratique, chaque vue doit étendre la classe <strong>PXAbstractView</strong>;</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> MyView <span class="kw1">extends</span> PXAbstractView
<span class="br0">&#123;</span>
	<span class="kw1">public</span> <span class="kw3">function</span> MyView<span class="br0">&#40;</span>viewName <span class="sy0">:</span> <span class="kw5">String</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="kw1">super</span><span class="br0">&#40;</span><span class="kw1">null</span><span class="sy0">,</span> viewName<span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>et chaque modèle doit étendre la classe <strong>PXAbstractModel</strong>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> MyModel <span class="kw1">extends</span> PXAbstractModel
<span class="br0">&#123;</span>
	<span class="kw1">public</span> <span class="kw3">function</span> MyModel<span class="br0">&#40;</span>modelName <span class="sy0">:</span> <span class="kw5">String</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="kw1">super</span><span class="br0">&#40;</span><span class="kw1">null</span><span class="sy0">,</span> modelName<span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Ces deux classes prennent comme arguments dans le constructeur : le <em>owner</em> que nous laisserons pour le moment à null (pour en savoir plus rendez-vous sur : <a title="La notion de Plugin dans Pixlib" href="http://blog.pixlib.net/2011/05/23/la-notion-de-plugin-le-multi-mvc-dans-pixlib">La notion de Plugin, le multi-MVC dans Pixlib</a>), et le <em>name</em> qui servira d&#8217;identifiant unique.</p>
<p>Lors de l&#8217;instanciation de ces classes, l&#8217;argument name va être utilisé comme identifiant unique par le locator (<strong>PXModelLocator</strong> pour <strong>MyModel</strong> et <strong>PXViewLocator</strong> pour <strong>MyView</strong>). Ce qui va nous permettre de récupérer les instances de modèles et de vues depuis n&#8217;importe quel endroit de notre application.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="co1">// stockage implicite dans les Locators faits lors de l'instanciation</span>
<span class="kw1">new</span> MyModel<span class="br0">&#40;</span><span class="st0">&quot;idUnique&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">new</span> MyView<span class="br0">&#40;</span><span class="st0">&quot;idUnique&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// qui permet une récupération des instances de manière globale.</span>
PXModelLocator<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>locate<span class="br0">&#40;</span><span class="st0">&quot;inUnique&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// retourne l'instance de MyModel</span>
PXViewLocator<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>locate<span class="br0">&#40;</span><span class="st0">&quot;inUnique&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// retourne l'instance de MyView</span></pre></div></div></div></div></div></div></div>


<h5>PXCommandes et PXFrontController</h5>
<p>Légèrement différent, <strong>PXFrontController</strong> permet de lier des commandes à un identifiant et de les exécuter selon nos besoins.<br />
Tout comme les modèles et les vues, les commandes ont une <strong>interface</strong> <strong>PXCommand</strong> et une <strong>implémentation Abstraite</strong> <strong>PXAbstractCommand</strong> qu&#8217;il faudra étendre pour l&#8217;utiliser.</p>
<p>Le code de base d&#8217;une commande est donc :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> MyCommand <span class="kw1">extends</span> PXAbstractCommand
<span class="br0">&#123;</span>
	<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onExecute<span class="br0">&#40;</span>event <span class="sy0">:</span> <span class="kw5">Event</span> = <span class="kw1">null</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		<span class="co1">// notification de fin d'exécution, car commande asynchrones!</span>
		fireCommandEndEvent<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Pour pouvoir l&#8217;utiliser via le <strong>contrôleur</strong>, nous devons ajouter <strong>MyCommand</strong> au <strong>PXFrontController</strong>, en utilisant un <strong>EventType</strong> comme <strong>identifiant unique</strong>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw2">var</span> controller <span class="sy0">:</span> PXFrontController = PXFrontController<span class="sy0">.</span>getBaseController<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
controller<span class="sy0">.</span>pushCommandClass<span class="br0">&#40;</span><span class="st0">&quot;onCommand&quot;</span><span class="sy0">,</span> MyCommand<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Ce qui nous permettra depuis n&#8217;importe quel endroit de lancer l&#8217;exécution de la <strong>commande</strong> en passant au <strong>FrontController</strong> un événement qui a comme EventType l&#8217;identifiant de notre commande.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1">PXFrontController<span class="sy0">.</span>getBaseController<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>handleEvent<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw5">Event</span><span class="br0">&#40;</span><span class="st0">&quot;onCommand&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p><em>À noter que les <strong>commandes</strong> dans <strong>Pixlib</strong> sont <strong>asynchrones</strong>, ce qui oblige d&#8217;appeler la méthode <strong>fireCommandEndEvent</strong>() pour notifier la fin de leurs exécutions. </em></p>
<h4>Qui communique avec qui ?</h4>
<p>Maintenant que vous savez instancier et récupérer les modèles, vues et commandes au sein de <strong>Pixlib</strong>, voyons comment organiser tout ce petit monde dans une application.</p>
<h5>Des modèles vers les vues</h5>
<p>Le <strong>couplage faible</strong> est un maitre mot dans un projet <strong>Pixlib</strong>.<br />
C&#8217;est pour cette raison que l&#8217;organisation de la communication entre les modèles et les vues est gérée depuis l&#8217;extérieur.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw2">var</span> view <span class="sy0">:</span> PXView = <span class="kw1">new</span> MyView<span class="br0">&#40;</span><span class="st0">&quot;MyView&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw2">var</span> model <span class="sy0">:</span> MyModel = <span class="kw1">new</span> MyModel<span class="br0">&#40;</span><span class="st0">&quot;MyModel&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
model<span class="sy0">.</span>addListener<span class="br0">&#40;</span>view<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Les modèles ne connaissent pas les vues et vice versa.<br />
La communication se passe via le système événementiel et la notification de changement.</p>
<p>En pratique, lorsqu&#8217;un modèle subit un changement, il le notifie.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> MyModel <span class="kw1">extends</span> PXAbstractModel
<span class="br0">&#123;</span>
	<span class="kw1">public</span> <span class="kw3">function</span> <span class="kw7">change</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		logger<span class="sy0">.</span>debug<span class="br0">&#40;</span><span class="st0">&quot;Model change&quot;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		notifyChanged<span class="br0">&#40;</span><span class="kw1">new</span> PXStringEvent<span class="br0">&#40;</span><span class="st0">&quot;onChange&quot;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="sy0">,</span> <span class="st0">&quot;ma nouvelle String&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>La ou les vues abonnées au modèle reçoivent cette notification et réagissent en conséquence.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> MyView <span class="kw1">extends</span> PXAbstractView
<span class="br0">&#123;</span>
	<span class="kw1">public</span> <span class="kw3">function</span> onChange<span class="br0">&#40;</span>event <span class="sy0">:</span> PXStringEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		logger<span class="sy0">.</span>debug<span class="br0">&#40;</span><span class="st0">&quot;Model send me new string &quot;</span> <span class="sy0">+</span> event<span class="sy0">.</span><span class="kw7">value</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<h5>Des vues vers les commandes</h5>
<p>Principal point d&#8217;entrée des applications, les vues sont en général à l&#8217;origine de l&#8217;exécution des commandes.<br />
Grâce à la méthode <strong>firePrivateEvent</strong>, les vues peuvent exécuter n&#8217;importe quelles commandes agrégées sur le <strong>PXFrontController</strong> du <strong>MVC</strong>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="co1">// agrégation de la commande « MyCommand » sur le PXFrontController</span>
<span class="kw2">var</span> controller <span class="sy0">:</span> PXFrontController = PXFrontController<span class="sy0">.</span>getBaseController<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
controller<span class="sy0">.</span>pushCommandClass<span class="br0">&#40;</span><span class="st0">&quot;onCommand&quot;</span><span class="sy0">,</span> MyCommand<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// exécution de MyCommand depuis une vue</span>
firePrivateEvent<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw5">Event</span><span class="br0">&#40;</span><span class="st0">&quot;onCommand&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<h5>Les commandes vers les modèles ou les vues</h5>
<p>Étant les gestionnaires de l&#8217;application, les commandes permettent de modifier des vues, des modèles ou l&#8217;exécution de nouvelles commandes.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> CheckCommand <span class="kw1">extends</span> PXAbstractCommand
<span class="br0">&#123;</span>
	<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onExecute<span class="br0">&#40;</span>event <span class="sy0">:</span> <span class="kw5">Event</span> = <span class="kw1">null</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		<span class="co1">// modification d'un modèle</span>
		getModel<span class="br0">&#40;</span><span class="st0">&quot;MyModel&quot;</span><span class="br0">&#41;</span><span class="sy0">.</span>release<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="co1">// modification d'une vue</span>
		getView<span class="br0">&#40;</span><span class="st0">&quot;MyView&quot;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw7">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="co1">// execution d'une autre commande</span>
		firePrivateEvent<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw5">Event</span><span class="br0">&#40;</span><span class="st0">&quot;onChange&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		fireCommandEndEvent<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p><strong>En résumé :</strong></p>
<ul>
<li>le <strong>MVC</strong> dans <strong>Pixlib</strong> est <strong>global</strong><strong> ;</strong></li>
<li>chaque groupe de classe possède un <strong>Locator</strong> (<strong>PXModelLocator</strong> pour les modèles, <strong>PXViewLocator</strong> pour les vues, <strong>PXFrontController</strong> pour les commandes) ;</li>
<li>les modèles notifient les vues ;</li>
<li>les vues lancent des commandes ;</li>
<li>les commandes permettent de modifier les modèles et/ou les vues, ainsi que l&#8217;exécution de nouvelles commandes ;</li>
</ul>
<p>&nbsp;</p>
<p><strong>Pour continuer :</strong></p>
<ul>
<li><a title="La notion de Plugin dans Pixlib" href="http://blog.pixlib.net/2011/05/23/la-notion-de-plugin-le-multi-mvc-dans-pixlib">La notion de Plugin, le multi-MVC dans Pixlib</a> ;</li>
<li><a title="Exemple MVC dans Pixlib" href="http://code.google.com/p/pixlib/downloads/detail?name=Simple_MVC_demo.zip">Le code source d&#8217;un exemple de MVC dans Pixlib</a>.</li>
</ul>
<p>&nbsp;</p>
<p><em>Happy codding with <strong>Pixlib</strong>!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2011/05/24/decouverte-du-mvc-dans-pixlib/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La notion de Plugin, le multi-MVC dans Pixlib</title>
		<link>http://blog.pixlib.net/2011/05/23/la-notion-de-plugin-le-multi-mvc-dans-pixlib/</link>
		<comments>http://blog.pixlib.net/2011/05/23/la-notion-de-plugin-le-multi-mvc-dans-pixlib/#comments</comments>
		<pubDate>Mon, 23 May 2011 17:41:57 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Core]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=599</guid>
		<description><![CDATA[Comme nous l&#8217;avons vu lors de la découverte du MVC dans Pixlib. Le core de Pixlib structure les projets Flash sous la forme d&#8217;un MVC+FC, où chaque modèle, vue et commande possède un identifiant unique. Ces identifiants permettent de cibler &#8230; <a href="http://blog.pixlib.net/2011/05/23/la-notion-de-plugin-le-multi-mvc-dans-pixlib/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Comme nous l&#8217;avons vu lors de <a title="Découverte du MVC dans Pixlib" href="http://blog.pixlib.net/2011/05/24/decouverte-du-mvc-dans-pixlib/">la découverte du MVC dans Pixlib</a>. Le core de <strong>Pixlib</strong> structure les projets Flash sous la forme d&#8217;un <strong>MVC+FC</strong>, où chaque modèle, vue et commande possède un identifiant unique. Ces identifiants permettent de cibler ces derniers de manière globale dans une application <strong>Pixlib</strong>.</p>
<p>Le souci avec cette <strong>gestion globale</strong> du <strong>MVC</strong> est qu&#8217;il est très risqué de charger plusieurs « projets Pixlib » dans une même application (risque de télescopage au niveau des identifiants). Apparu avec <strong>lowRA</strong> (Pixlib v2), le <strong>Plugin</strong> permet de supprimer cette limitation !</p>
<p><span id="more-599"></span></p>
<h4>Un plugin == un owner == un channel</h4>
<p>Un <strong>plugin</strong> est égal à l&#8217;<strong>encapsulation</strong> d&#8217;un <strong>MVC+FC</strong> (composé de <strong>n modèles</strong>, <strong>n vues</strong>, <strong>n commandes + FrontController</strong> et d&#8217;<strong><strong>PXPluginChannel</strong></strong>).</p>
<p>On retrouve dans chaque instance de la classe <strong>PXAbstractPlugin</strong> (ou interface PXPlugin), une instance de <strong>PXModelLocator</strong>, <strong>PXViewLocator</strong> et <strong>PXFrontController</strong> lier au plugin. Le <strong>plugin</strong> est utilisé comme un <strong>filtre</strong> au niveau des <strong>Locators</strong>,  par ce biais, les <strong>identifiants</strong> utilisés pour récupérer les <strong>PXModel</strong>, <strong>PXView</strong> et <strong>PXCommand</strong> sont <strong>uniques</strong> seulement <strong>au sein</strong> d&#8217;une instance de <strong>PXAbstractPlugin</strong>. Plus de souci donc, si deux modèles utilisent le même identifiant, du moment qu&#8217;ils sont instanciés dans deux plugins différents.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> MyPlugin <span class="kw1">extends</span> PXAbstractPlugin
<span class="br0">&#123;</span>
	<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> initialize<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		<span class="kw1">super</span><span class="sy0">.</span>initialize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw2">var</span> view <span class="sy0">:</span> PXView = <span class="kw1">new</span> MyView<span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">,</span> <span class="st0">&quot;MyView&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw2">var</span> model <span class="sy0">:</span> MyModel = <span class="kw1">new</span> MyModel<span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">,</span> <span class="st0">&quot;MyModel&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		controller<span class="sy0">.</span>pushCommandClass<span class="br0">&#40;</span><span class="st0">&quot;onCheck&quot;</span><span class="sy0">,</span> CheckCommand<span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>En pratique, lors de l&#8217;instanciation d&#8217;un <strong>PXModel</strong> ou d&#8217;une <strong>PXView</strong>, on donne comme valeur à la propriété <strong>owner</strong> l&#8217;instance du <strong>plugin</strong> auquel elle appartient. Implicitement, le modèle ou la vue va automatiquement s&#8217;enregistrer auprès du bon Locator.</p>
<p>Pour récupérer une de mes instances</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1">PXModelLocator<span class="sy0">.</span>getInstance<span class="br0">&#40;</span>MyPluginInstance<span class="br0">&#41;</span><span class="sy0">.</span>locate<span class="br0">&#40;</span><span class="st0">&quot;MyModel&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
PXViewLocator<span class="sy0">.</span>getInstance<span class="br0">&#40;</span>MyPluginInstance<span class="br0">&#41;</span><span class="sy0">.</span>locate<span class="br0">&#40;</span><span class="st0">&quot;MyView&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<h4>Communication entre plugins</h4>
<p>Pouvoir faire tourner plusieurs MVC dans une même application c&#8217;est bien, pouvoir les faire communiquer entre eu c&#8217;est mieux!</p>
<p>À l&#8217;instar de la méthode <strong><em>firePrivateEvent</em></strong> qui permet d&#8217;envoyer un événement au <strong>PXFrontController</strong> du plugin. Il existe deux méthodes au sein de la classe <strong>PXAbstractPlugin</strong> pour communiquer avec les plugins voisins.</p>
<p>La méthode <strong><em>firePublicEvent</em></strong>, qui permet d&#8217;envoyer un événement à tous les plugins abonnés au plugin émetteur via l&#8217;une des deux méthodes : <strong><em>addPluginListener</em></strong>, <strong><em>addPluginEventListener</em></strong>.</p>
<p>La méthode <em><strong>fireExternalEvent</strong></em> quant à elle permet de cibler un plugin receveur en prenant en 2e argument le <strong>PXPluginChannel</strong> du plugin cible.</p>
<p>// Main</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw2">var</span> pluginB <span class="sy0">:</span> PXPlugin = <span class="kw1">new</span> PluginB<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw2">var</span> pluginC <span class="sy0">:</span> PXPlugin = <span class="kw1">new</span> PluginC<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw2">var</span> pluginA <span class="sy0">:</span> PluginA = <span class="kw1">new</span> PluginA<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
pluginA<span class="sy0">.</span>addPluginListener<span class="br0">&#40;</span>pluginB<span class="br0">&#41;</span><span class="sy0">;</span>
pluginA<span class="sy0">.</span>addPluginEventListener<span class="br0">&#40;</span><span class="st0">&quot;onShout&quot;</span><span class="sy0">,</span> pluginC<span class="br0">&#41;</span><span class="sy0">;</span>
pluginA<span class="sy0">.</span>talk<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
pluginA<span class="sy0">.</span>shout<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
pluginA<span class="sy0">.</span>kill<span class="br0">&#40;</span>pluginC<span class="sy0">.</span>channel<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>// PluginA</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> PluginA <span class="kw1">extends</span> PXAbstractPlugin
<span class="br0">&#123;</span>
	<span class="kw1">public</span> <span class="kw3">function</span> PluginA<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		registerInternalChannel<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="co1">// only use for non IoC context</span>
		<span class="kw1">super</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw3">function</span> talk<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		firePublicEvent<span class="br0">&#40;</span><span class="kw1">new</span> PXStringEvent<span class="br0">&#40;</span><span class="st0">&quot;onTalk&quot;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="sy0">,</span> <span class="st0">&quot;Hello I'm Plugin A&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw3">function</span> shout<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		firePublicEvent<span class="br0">&#40;</span><span class="kw1">new</span> PXStringEvent<span class="br0">&#40;</span><span class="st0">&quot;onShout&quot;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="sy0">,</span> <span class="st0">&quot;I'm Plugin A and I'm nervous !&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw3">function</span> kill<span class="br0">&#40;</span>channel <span class="sy0">:</span> PXEventChannel<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		fireExternalEvent<span class="br0">&#40;</span><span class="kw1">new</span> PXStringEvent<span class="br0">&#40;</span><span class="st0">&quot;onKill&quot;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="sy0">,</span> <span class="st0">&quot;I'm Plugin A and I Want kill you !&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> channel<span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>// PluginB</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> PluginB <span class="kw1">extends</span> PXAbstractPlugin
<span class="br0">&#123;</span>
	<span class="kw1">public</span> <span class="kw3">function</span> PluginB<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		registerInternalChannel<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="co1">// only use for non IoC context</span>
		<span class="kw1">super</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw3">function</span> onTalk<span class="br0">&#40;</span>event <span class="sy0">:</span> PXStringEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		logger<span class="sy0">.</span>debug<span class="br0">&#40;</span><span class="st0">&quot;I receive a message : &quot;</span> <span class="sy0">+</span> event<span class="sy0">.</span><span class="kw7">value</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>// PluginC</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">public</span> <span class="kw4">class</span> PluginC <span class="kw1">extends</span> PXAbstractPlugin
<span class="br0">&#123;</span>
	<span class="kw1">public</span> <span class="kw3">function</span> PluginC<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		registerInternalChannel<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="co1">// only use for non IoC context</span>
		<span class="kw1">super</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw3">function</span> onShout<span class="br0">&#40;</span>event <span class="sy0">:</span> PXStringEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		logger<span class="sy0">.</span>debug<span class="br0">&#40;</span>event<span class="sy0">.</span><span class="kw7">value</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw3">function</span> onKill<span class="br0">&#40;</span>event <span class="sy0">:</span> PXStringEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
	<span class="br0">&#123;</span>
		logger<span class="sy0">.</span>debug<span class="br0">&#40;</span>event<span class="sy0">.</span><span class="kw7">value</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p><strong>Important</strong>, lors de l&#8217;extension de la classe <strong>PXAbstractPlugin</strong> pour un usage non <strong>IOC</strong>, il est important d&#8217;appeler la méthode <em>registerInternalChannel(this);</em> afin de pouvoir définir le <strong>PXPluginChannel</strong> du plugin.</p>
<p>À l&#8217;image du PXEventChannel dans l&#8217;<a title="PixLogger extension – Tracer vos messages" href="http://blog.pixlib.net/2011/02/28/pixlogger-extension-tracer-vos-messages/">API de logging</a>, le <strong>PXPluginChannel</strong> sert de « <strong>canal de diffusion</strong> » propre au <strong>MVC</strong> du plugin.</p>
<p>&nbsp;</p>
<p>Retrouvez les sources de l&#8217;exemple sur la page de <a title="Exemple d'un MVC + plugin dans Pixlib" href="http://code.google.com/p/pixlib/downloads/detail?name=Simple_MVC%2BPlugin_demo.zip">téléchargement du Google code</a>.</p>
<p>&nbsp;</p>
<p><em>Happy coding with <strong>Pixlib</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2011/05/23/la-notion-de-plugin-le-multi-mvc-dans-pixlib/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PixTMS &#8211; La localisation de vos applications</title>
		<link>http://blog.pixlib.net/2011/05/08/pixtms-la-localisation-de-vos-applications/</link>
		<comments>http://blog.pixlib.net/2011/05/08/pixtms-la-localisation-de-vos-applications/#comments</comments>
		<pubDate>Sun, 08 May 2011 15:32:07 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Extension]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[localisation]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[pixlib]]></category>
		<category><![CDATA[traduction]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=557</guid>
		<description><![CDATA[Pixlib TMS Extension allow easy and powerful application localisation. <a href="http://blog.pixlib.net/2011/05/08/pixtms-la-localisation-de-vos-applications/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong>PixTMS</strong>, nouvelle extension de <strong>Pixlib</strong>, permet de réaliser facilement la localisation de vos applications <strong>Flash</strong>.</p>
<p><strong>PixTMS</strong> pour <strong>Pix</strong>lib <strong>T</strong>ranslation <strong>M</strong>anagement <strong>S</strong>ystem va permettre de gérer vos traductions avec le support de fichiers :</p>
<ul>
<li>XML</li>
<li>XLIFF</li>
<li>MO / PO</li>
<li>Fichier de propriétés</li>
</ul>
<p>Voyons comment cela fonctionne.</p>
<p><span id="more-557"></span></p>
<p>Tout d&#8217;abord, une présentation rapide du système de classes mis à disposition dans cette librairie.</p>
<p><strong>PXLanguage</strong> est le singleton (le pilier) qui va s&#8217;occuper d&#8217;aller récupérer les traductions et ensuite un ensemble de classes permettant de définir les différents types de données gérés pour les traductions (bundle) :</p>
<ul>
<li><strong>PXXMLLanguageBundle</strong> : données <strong>XML</strong></li>
<li><strong>PXXLIFFLanguageBundle</strong> : données au format <strong>XLIFF</strong></li>
<li><strong>PXPropLanguageBundle</strong> : fichier de propriétés</li>
<li><strong>PXPOLanguageBundle</strong> : données au format <strong>PO</strong></li>
<li><strong>PXMOLanguageBundle</strong> : données binaire <strong>MO</strong></li>
</ul>
<p>Ces classes tourne autour de l&#8217;interface principale <strong>PXILanguageBundle</strong> (et d&#8217;une classe abstraite <strong>PXLanguageBundle</strong>).</p>
<p>Le système de traduction mis en place par <strong>PixTMS</strong> permet de  charger des documents externes, mais aussi d&#8217;utiliser des données qui sont packagées lors de la compilation (embeded).</p>
<h3>1. Présentation et traductions packagées</h3>
<p>Prenons un premier exemple avec l&#8217;utilisation de l&#8217;extension <a title="PixEmbed – Nouvelle extension de Pixlib pour faciliter l’intégration d’éléments" href="http://blog.pixlib.net/2011/03/12/pixembed-nouvelle-extension-de-pixlib-pour-faciliter-lintegration-delements/"><strong>PixEmbed</strong></a> de <strong>Pixlib</strong> :</p>
<p>Tout d&#8217;abord un fichier XML de traduction rapide :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="xml"><pre class="de1"><span class="sc3"><span class="re1">&lt;file<span class="re2">&gt;</span></span></span>
 <span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span>
     <span class="sc3"><span class="re1">&lt;trans-unit</span> <span class="re0">id</span>=<span class="st0">&quot;NAME&quot;</span><span class="re2">&gt;</span></span>Travail de bas niveaux sur Actionscript 3.0<span class="sc3"><span class="re1">&lt;/trans-unit<span class="re2">&gt;</span></span></span>
 <span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/file<span class="re2">&gt;</span></span></span></pre></div></div></div></div></div></div></div>


<p>Comme déjà vu dans une précédente leçon, on va créer nos embed :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">public</span> <span class="kw4">class</span> MyEmbed
	<span class="br0">&#123;</span>
		<span class="br0">&#91;</span>Embed<span class="br0">&#40;</span><span class="kw7">source</span>=<span class="st0">&quot;fr-FR.xml&quot;</span><span class="sy0">,</span> mimeType=<span class="st0">&quot;application/octet-stream&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
		<span class="kw1">public</span> <span class="kw2">var</span> frFR <span class="sy0">:</span> <span class="kw5">Class</span><span class="sy0">;</span>
&nbsp;
		<span class="br0">&#91;</span>Embed<span class="br0">&#40;</span><span class="kw7">source</span>=<span class="st0">&quot;en-US.xml&quot;</span><span class="sy0">,</span> mimeType=<span class="st0">&quot;application/octet-stream&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
		<span class="kw1">public</span> <span class="kw2">var</span> enUS <span class="sy0">:</span> <span class="kw5">Class</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>&nbsp;</p>
<p>Et maintenant, on va gérer les traductions à proprement parler :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>embed<span class="sy0">.</span>PXEmbedEngine<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">load</span><span class="sy0">.</span>PXResourceLocator<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXDebug<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXTraceLayout<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>addLogListener<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>tms<span class="sy0">.</span>PXLanguage<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>tms<span class="sy0">.</span>bundles<span class="sy0">.</span>PXXMLLanguageBundle<span class="sy0">;</span>
&nbsp;
	<span class="kw1">import</span> <span class="kw6">flash.events</span><span class="sy0">.</span><span class="kw5">Event</span><span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On rajoute une sortie pour les messages de Pixlib, ici le classique &quot;trace&quot;</span>
			addLogListener<span class="br0">&#40;</span>PXTraceLayout<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On déclare les embed</span>
			PXEmbedEngine<span class="sy0">.</span>addParser<span class="br0">&#40;</span><span class="st0">&quot;frFR&quot;</span><span class="sy0">,</span> PXEmbedEngine<span class="sy0">.</span><span class="kw7">parseXML</span><span class="br0">&#41;</span><span class="sy0">;</span>
			PXEmbedEngine<span class="sy0">.</span>addParser<span class="br0">&#40;</span><span class="st0">&quot;enUS&quot;</span><span class="sy0">,</span> PXEmbedEngine<span class="sy0">.</span><span class="kw7">parseXML</span><span class="br0">&#41;</span><span class="sy0">;</span>
			PXEmbedEngine<span class="sy0">.</span>embed<span class="br0">&#40;</span>MyEmbed<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On récupère le singleton</span>
			<span class="kw2">var</span> lang <span class="sy0">:</span> PXLanguage = PXLanguage<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On ajoutes 2 bundles en utilisant des bundles XML (&lt;em&gt;PXXMLLanguageBundle&lt;/em&gt;) et</span>
			<span class="co1">//on récupère les données XML brute depuis nos ressources.</span>
			lang<span class="sy0">.</span>addBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXXMLLanguageBundle<span class="br0">&#40;</span><span class="st0">&quot;fr-FR&quot;</span><span class="sy0">,</span> PXResourceLocator<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>locateXML<span class="br0">&#40;</span><span class="st0">&quot;frFR&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			lang<span class="sy0">.</span>addBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXXMLLanguageBundle<span class="br0">&#40;</span><span class="st0">&quot;en-US&quot;</span><span class="sy0">,</span> PXResourceLocator<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>locateXML<span class="br0">&#40;</span><span class="st0">&quot;enUS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On écoute les changements de langue possible</span>
			lang<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span>PXLanguage<span class="sy0">.</span>onChangeEVENT<span class="sy0">,</span> _onChange<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On définie la langue courante, ce qui aura pour effet de charger</span>
			<span class="co1">//la traduction automatiquement. Et l'évènement &lt;em&gt;#&lt;strong&gt;onChangeEvent&lt;/strong&gt;&lt;/em&gt; sera</span>
			<span class="co1">//envoyé</span>
			lang<span class="sy0">.</span>current = <span class="st0">&quot;fr-FR&quot;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _onChange<span class="br0">&#40;</span>event <span class="sy0">:</span> <span class="kw5">Event</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On récupère la traduction identifiée par &quot;NAME&quot; dans notre fichier XML.</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>PXLanguage<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>getString<span class="br0">&#40;</span><span class="st0">&quot;NAME&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<h3>2. Les traductions externes</h3>
<p>Bien évidement, il est aussi possible de charger  des traductions depuis l&#8217;extérieur.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXDebug<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXTraceLayout<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>addLogListener<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>services<span class="sy0">.</span>PXHTTPService<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>tms<span class="sy0">.</span>PXLanguage<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>tms<span class="sy0">.</span>bundles<span class="sy0">.</span>PXLoadableBundle<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>tms<span class="sy0">.</span>bundles<span class="sy0">.</span>PXXLIFFLanguageBundle<span class="sy0">;</span>
&nbsp;
	<span class="kw1">import</span> <span class="kw6">flash.events</span><span class="sy0">.</span><span class="kw5">Event</span><span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On rajoute une sortie pour les messages de Pixlib, ici le classique &quot;trace&quot;</span>
			addLogListener<span class="br0">&#40;</span>PXTraceLayout<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On récupère le singleton</span>
			<span class="kw2">var</span> lang <span class="sy0">:</span> PXLanguage = PXLanguage<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On charge nos traductions en utilisant un service HTTP</span>
			lang<span class="sy0">.</span>addBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXLoadableBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXXLIFFLanguageBundle<span class="br0">&#40;</span><span class="st0">&quot;fr-FR&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">new</span> PXHTTPService<span class="br0">&#40;</span><span class="st0">&quot;fr-FR.xlf&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			lang<span class="sy0">.</span>addBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXLoadableBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXXLIFFLanguageBundle<span class="br0">&#40;</span><span class="st0">&quot;en-US&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">new</span> PXHTTPService<span class="br0">&#40;</span><span class="st0">&quot;en-US.xlf&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			lang<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span>PXLanguage<span class="sy0">.</span>onChangeEVENT<span class="sy0">,</span> _onChange<span class="br0">&#41;</span><span class="sy0">;</span>
			lang<span class="sy0">.</span>current = <span class="st0">&quot;en-US&quot;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _onChange<span class="br0">&#40;</span>event <span class="sy0">:</span> <span class="kw5">Event</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>PXLanguage<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>getString<span class="br0">&#40;</span><span class="st0">&quot;NAME&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Pour le chargement externe, on utilise donc un <span style="text-decoration: underline;">bundle</span> particulier qui est le <strong>PXLoadableBundle</strong>.</p>
<p>Ce bundle prend comme argument, le type de traduction à gérer  (XML, XLIFF, PO, etc) sous forme de <strong>PXILanguageBundle</strong> et ensuite un <a title="Pixlib Services – L’extension pour les appels distants" href="http://blog.pixlib.net/2011/03/04/pixlib-services-lextension-pour-les-appels-distants/"><strong>PXService</strong></a> permettant de définir comment seront chargées ces traductions.</p>
<p>&nbsp;</p>
<h3>3. Gestion des fichiers de traductions</h3>
<p>Afin de pouvoir découper vos traductions il est possible de définir un identifiant pour chaque bundle.</p>
<p>Pratique pour créer des traductions spécifiques pour telle ou telle partie d&#8217;une application.<br />
Cet identifiant est un argument du constructeur :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="co1">//Bundle par défault (sans identifiant explicite)</span>
lang<span class="sy0">.</span>addBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXLoadableBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXMLLanguageBundle<span class="br0">&#40;</span><span class="st0">&quot;fr-FR&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">new</span> PXHTTPService<span class="br0">&#40;</span><span class="st0">&quot;fr/home.xml&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">//bundles dédiés</span>
lang<span class="sy0">.</span>addBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXLoadableBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXMLLanguageBundle<span class="br0">&#40;</span><span class="st0">&quot;fr-FR&quot;</span><span class="sy0">,</span> <span class="kw1">null</span><span class="sy0">,</span> <span class="st0">&quot;home&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">new</span> PXHTTPService<span class="br0">&#40;</span><span class="st0">&quot;fr/home.xml&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
lang<span class="sy0">.</span>addBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXLoadableBundle<span class="br0">&#40;</span><span class="kw1">new</span> PXMLLanguageBundle<span class="br0">&#40;</span><span class="st0">&quot;fr-FR&quot;</span><span class="sy0">,</span> <span class="kw1">null</span><span class="sy0">,</span> <span class="st0">&quot;error&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">new</span> PXHTTPService<span class="br0">&#40;</span><span class="st0">&quot;fr/error.xml&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Ensuite, pour récupérer les  traductions, il suffit de cibler le bundle désiré :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">private</span> <span class="kw3">function</span> _onChange<span class="br0">&#40;</span>event <span class="sy0">:</span> <span class="kw5">Event</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
<span class="br0">&#123;</span>
	<span class="co1">//On récupère dans le bundle par défault</span>
	PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>PXLanguage<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>getString<span class="br0">&#40;</span><span class="st0">&quot;NAME&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">//On récupère dans le bundle &quot;home&quot;</span>
	PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>PXLanguage<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>getString<span class="br0">&#40;</span><span class="st0">&quot;MESSAGE&quot;</span><span class="sy0">,</span> <span class="st0">&quot;home&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>&nbsp;</p>
<h3>4. Récupérer une traduction</h3>
<p>Comme vu dans les divers exemple ci dessus, on utilise la méthode <strong><em>#getString()</em></strong> afin de récupérer la valeur d&#8217;une traduction dans le langage et le bundle désiré. Cette méthode gère aussi 2 paramètres optionnels supplémentaire afin de mieux contrôler la récupération des données.</p>
<p>Le <span style="text-decoration: underline;">3 ème</span> paramètre est la valeur par défaut à retourner dans le cadre où la traduction demandée n&#8217;existe pas :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">private</span> <span class="kw3">function</span> _onChange<span class="br0">&#40;</span>event <span class="sy0">:</span> <span class="kw5">Event</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
<span class="br0">&#123;</span>
	<span class="co1">//On récupère dans le bundle par défault. Si 'NAME' n'est pas défini</span>
	<span class="co1">//alors on retournera &quot;Pixlib&quot;</span>
	PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>PXLanguage<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>getString<span class="br0">&#40;</span><span class="st0">&quot;NAME&quot;</span><span class="sy0">,</span> <span class="kw1">null</span><span class="sy0">,</span> <span class="st0">&quot;Pixlib&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Et le <span style="text-decoration: underline;">4 ème</span> paramètre lui est un tableau de substitution que l&#8217;on peut envoyer directement.</p>
<p>Une fois la traduction retrouvée, la substituion avec les valeurs de ce tableau sera réalisé. Les substitutions fonctionnant sous le modèle défini par la méthode <em><strong>PXStringUtils#substitute()</strong></em>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw1">private</span> <span class="kw3">function</span> _onChange<span class="br0">&#40;</span>event <span class="sy0">:</span> <span class="kw5">Event</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
<span class="br0">&#123;</span>
	<span class="co1">//On récupère dans le bundle &quot;home&quot;, et on réalise une substitution sur la traduction.</span>
	<span class="co1">//Dans le fichier de traduction, notre texte devra être formaté par exemple : My name is {0} on {1}</span>
	PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>PXLanguage<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>getString<span class="br0">&#40;</span><span class="st0">&quot;MESSAGE&quot;</span><span class="sy0">,</span> <span class="st0">&quot;home&quot;</span><span class="sy0">,</span> <span class="kw1">null</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="st0">&quot;Pixlib&quot;</span><span class="sy0">,</span> <span class="st0">&quot;AS3&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<h3>5. Les téléchargements</h3>
<ul>
<li>la <a title="PixTMS documentation" href="http://www.pixlib.net/framework/doc/pixtms/">documentation</a></li>
<li>la page des <a title="Pixlib Downloads" href="http://blog.pixlib.net/pixlib-downloads/">téléchargements</a></li>
</ul>
<p><em>Happy coding with <strong>Pixlib</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2011/05/08/pixtms-la-localisation-de-vos-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PixPref &#8211; La gestion facile de préférences</title>
		<link>http://blog.pixlib.net/2011/05/08/pixpref-la-gestion-facile-de-preferences/</link>
		<comments>http://blog.pixlib.net/2011/05/08/pixpref-la-gestion-facile-de-preferences/#comments</comments>
		<pubDate>Sun, 08 May 2011 15:13:48 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Extension]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[amf]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[pixlib]]></category>
		<category><![CDATA[production]]></category>
		<category><![CDATA[sharedobject]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=549</guid>
		<description><![CDATA[PxiPref, nouvelle extension de Pixlib, permet une gestion facile et multi supports de vos préférences <a href="http://blog.pixlib.net/2011/05/08/pixpref-la-gestion-facile-de-preferences/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong>PixPref</strong>, nouvelle extension de <strong>Pixlib</strong>, permet de gérer simplement vos <span style="text-decoration: underline;">préférences</span> au niveau de votre application <strong>Flash</strong>.</p>
<p>En parlant de &#8220;<span style="text-decoration: underline;">préférences</span>&#8221; nous parlons de &#8220;données utilisateur, configuration personnalisée etc&#8221; qui seront sauvegardées (et récupérer) au sein de votre application.</p>
<p>Voyons comment tout cela se passe.</p>
<p><span id="more-549"></span></p>
<p>Tout d&#8217;abord, <strong>PixPref</strong> à une dépendance forte avec l&#8217;extension <strong><a title="Pixlib Services – L’extension pour les appels distants" href="http://blog.pixlib.net/2011/03/04/pixlib-services-lextension-pour-les-appels-distants/">PixService</a> </strong>déjà livrée avec <strong>Pixlib</strong>. En effet, la gestion des préférences, de base, est gérée par le biais de services <strong>Pixlib</strong>.</p>
<p>Il est donc possible d&#8221;enregistrer les préférences avec :</p>
<ul>
<li>un service <strong>AMF</strong></li>
<li>un service <strong>HTTP</strong></li>
<li>un service <strong>SharedObject</strong></li>
<li>et l&#8217;utilisation de <strong>fichiers</strong> sur le disque (pour les applications <strong>Adobe AIR</strong>)</li>
</ul>
<p><span style="text-decoration: underline;">note</span> : La gestion des préférences proposée en natif est standard (lecture/écriture); il  est donc possible de <em>surcharger</em> certaines méthodes ou <em>services</em> afin de créer une gestion &#8220;sécurisée&#8221; et/ou&#8221;cryptée&#8221; par exemple, de vos données.</p>
<p><strong>PixPref</strong> permet simplement de changer de <strong>stratégie</strong> de sauvegarde parmi les services proposés.</p>
<p>Prenons un  exemple pour enregistrer les préférences via un <strong>SharedObject</strong>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXDebug<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXTraceLayout<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>addLogListener<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>prefs<span class="sy0">.</span>PXPreferences<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>prefs<span class="sy0">.</span>event<span class="sy0">.</span>PXPreferencesEvent<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>prefs<span class="sy0">.</span>strategy<span class="sy0">.</span>PXSOStrategy<span class="sy0">;</span>
&nbsp;
	<span class="kw1">import</span> <span class="kw6">flash.system</span><span class="sy0">.</span><span class="kw5">Capabilities</span><span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On rajoute une sortie pour les messages de Pixlib, ici le classique &quot;trace&quot; de Flash</span>
			addLogListener<span class="br0">&#40;</span>PXTraceLayout<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On créé un groupe de préférences sous l'identifiant &quot;system&quot;.</span>
			<span class="kw2">var</span> pref <span class="sy0">:</span> PXPreferences = PXPreferences<span class="sy0">.</span><span class="kw1">get</span><span class="br0">&#40;</span><span class="st0">&quot;system&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On utilise une solution SharedObject pour enregistrer / charger les préférences</span>
			pref<span class="sy0">.</span>strategy = <span class="kw1">new</span> PXSOStrategy<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On définie quelques propriétés qui seront définies dans nos préférences.</span>
			pref<span class="sy0">.</span>setValue<span class="br0">&#40;</span><span class="st0">&quot;OS&quot;</span><span class="sy0">,</span> <span class="kw5">Capabilities</span><span class="sy0">.</span><span class="kw7">os</span><span class="br0">&#41;</span><span class="sy0">;</span>
			pref<span class="sy0">.</span>setValue<span class="br0">&#40;</span><span class="st0">&quot;Name&quot;</span><span class="sy0">,</span> <span class="st0">&quot;My name is Pixlib&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On rajoute des écouteurs sur le statut des opérations</span>
			pref<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span>PXPreferencesEvent<span class="sy0">.</span>onPreferencesSaveEVENT<span class="sy0">,</span> _onSave<span class="br0">&#41;</span><span class="sy0">;</span>
			pref<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span>PXPreferencesEvent<span class="sy0">.</span>onPreferencesLoadEVENT<span class="sy0">,</span> _onLoad<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On enregistre les données.</span>
			pref<span class="sy0">.</span><span class="kw7">save</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _onSave<span class="br0">&#40;</span>event <span class="sy0">:</span> PXPreferencesEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span><span class="st0">&quot;Preferences are saved, try to reload them&quot;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			event<span class="sy0">.</span>preferences<span class="sy0">.</span><span class="kw7">load</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _onLoad<span class="br0">&#40;</span>event <span class="sy0">:</span> PXPreferencesEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span><span class="st0">&quot;Preferences are loaded&quot;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw2">var</span> pref <span class="sy0">:</span> PXPreferences = event<span class="sy0">.</span>preferences<span class="sy0">;</span>
&nbsp;
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>pref<span class="sy0">.</span>getValue<span class="br0">&#40;</span><span class="st0">&quot;OS&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>pref<span class="sy0">.</span>getValue<span class="br0">&#40;</span><span class="st0">&quot;Name&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>pref<span class="sy0">.</span><span class="kw7">data</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Les préférences sont gérées par identifiant, c&#8217;est à dire que pour une même application, on peut gérer plusieurs groupes de préférences. Ici, on enregistre des préférences identifié sous le nom &#8220;<em>system</em>&#8220;.</p>
<p>On peut récupérer ou créer d&#8217;autres groupes de préférences en utilisant la méthode  :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw2">var</span> pref <span class="sy0">:</span> PXPreferences = PXPreferences<span class="sy0">.</span><span class="kw1">get</span><span class="br0">&#40;</span><span class="st0">&quot;IDENTIFIANT_GROUPE_PRÉFÉRENCES&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Ensuite il suffit de définir la <strong>stratégie</strong> que l&#8217;on veut utiliser pour manipuler les préférences.<br />
Ici on utilise un stratégie permettant de gérer les préférences dans un <strong>SharedObject</strong> de Flash :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1">pref<span class="sy0">.</span>strategy = <span class="kw1">new</span> PXSOStrategy<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Pour les autres stratégies déployées dans <strong>PixPref</strong>, voici leur utilisation :</p>
<ul>
<li>pref.strategy = new <strong>PXAMFStrategy</strong>(&#8220;gateway.php&#8221;, &#8220;PrefService&#8221;, &#8220;load&#8221;, &#8220;save&#8221;);</li>
<li>pref.strategy = new <strong>PXHTTPStrategy</strong>(&#8220;load.php&#8221;, &#8220;save.php&#8221;, URLRequestMethod.POST);</li>
<li>pref.strategy = new <strong>PXFileStrategy</strong>();</li>
</ul>
<p><span style="text-decoration: underline;">note</span> : quand la stratégie utilisée est  <strong>PXFileStrategy</strong>, le fichier manipulé se trouve dans le dossier de l&#8217;application sous le nom de l&#8217;identifiant choisi pour les préférences.</p>
<p>Les préférences peuvent être ensuite chargées ou sauvegardées via les méthodes <em>load()</em> ou <em>save()</em>, quelque soit la stratégie utilisée.</p>
<p>Enfin, des  écouteurs peuvent être définis pour écouter l&#8217;état des préférences :</p>
<ul>
<li><strong>PXPreferencesEvent</strong>#<em>onPreferencesLoadEVENT</em> : quand les préférences sont chargées</li>
<li><strong>PXPreferencesEvent</strong>#<em>onPreferencesSaveEVENT</em> : quand les préférences sont enregistrées</li>
<li><strong>PXPreferencesEvent</strong>#<em>onPreferenceEditEVENT</em> : quand un champ des préférences est modifié</li>
<li><strong>PXPreferencesEvent</strong>#<em>onPreferenceDeleteEVENT</em> : quand un champ des préférences est supprimé</li>
</ul>
<p>Afin de personnaliser l&#8217;enregistrement et le chargement des préférences (par exemple une gestion cryptée des données), il est possible de déterminer des &#8220;<em>serializer</em> et <em>deserializer</em>&#8221; de données directement depuis la classe <strong>PXPreference</strong>; par exemple :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw2">var</span> pref <span class="sy0">:</span> PXPreferences = PXPreferences<span class="sy0">.</span><span class="kw1">get</span><span class="br0">&#40;</span><span class="st0">&quot;system&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
pref<span class="sy0">.</span>serializer = <span class="kw1">new</span> AESSerializer<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
pref<span class="sy0">.</span>deserializer = <span class="kw1">new</span> AESDeserializer<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Ceci permettant tout type de traitement sur les données enregistrées et/ou chargées.</p>
<p>Enfin, si vous désirez créer une nouvelle stratégie pour manipuler vos préférences, il suffit d&#8217;implémenter l&#8217;interface <strong>PXPreferencesStrategy</strong>.</p>
<p>Plus simplement encore, vous pouvez étendre la classe abstraite <strong>PXAbstractStrategy</strong> qui étant déjà cette interface et qui donne en plus des comportements par défaut utilise à la gestion des données.</p>
<p>Les différents liens pour les téléchargements:</p>
<ul>
<li>Page de <a title="Pixlib Downloads" href="http://www.pixlib.net/pixlib-downloads/">téléchargements</a></li>
<li>la <a href="http://www.pixlib.net/framework/doc/pixpref/">documentation</a></li>
</ul>
<p><em>Happy coding with <strong>Pixlib</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2011/05/08/pixpref-la-gestion-facile-de-preferences/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PixKey &#8211; Pixlib et les raccourcis claviers</title>
		<link>http://blog.pixlib.net/2011/03/16/pixkey-pixlib-et-les-raccourcis-claviers/</link>
		<comments>http://blog.pixlib.net/2011/03/16/pixkey-pixlib-et-les-raccourcis-claviers/#comments</comments>
		<pubDate>Wed, 16 Mar 2011 21:33:39 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Extension]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[pixlib]]></category>
		<category><![CDATA[shortcut]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=528</guid>
		<description><![CDATA[PixKey, extension de Pixlib, permettant de gérer facilement et rapidement les raccourcis claviers de vos applications Flash. <a href="http://blog.pixlib.net/2011/03/16/pixkey-pixlib-et-les-raccourcis-claviers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Nouvelle petite extension pour <strong>Pixlib</strong> avec <strong>PixKey</strong>, permettant une gestion rapide et facile des <span style="text-decoration: underline;">raccourcis clavier</span> dans vos applications Flash.</p>
<p><strong>PixKey</strong> permet de créer des groupes de raccourcis clavier que vous pouvez activer tous en même temps dans votre application ou bien activer à la demande, groupe par groupe, suivant vos besoins.</p>
<p>Voyons comment utiliser cette extension.</p>
<p><span id="more-528"></span></p>
<p>Dans sa forme la plus simple, <strong>PixKey</strong> permet de gérer des <span style="text-decoration: underline;">raccourcis clavier</span> (avec une touche ou une combinaison de touches) de manière très simple :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>commands<span class="sy0">.</span>PXDelegate<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKey<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKeyBundle<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKeyShortcutEvent<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXDebug<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXTraceLayout<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>addLogListener<span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On rajoute une sortie pour les messages de Pixlib, ici le classique &quot;trace&quot; de Flash</span>
			addLogListener<span class="br0">&#40;</span>PXTraceLayout<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On créé un groupe de raccourci clavier identifié sous le nom &quot;UserPanel&quot;</span>
			<span class="kw2">var</span> bundle <span class="sy0">:</span> PXKeyBundle = <span class="kw1">new</span> PXKeyBundle<span class="br0">&#40;</span><span class="st0">&quot;UserPanel&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			bundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_test<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>Y<span class="br0">&#41;</span><span class="sy0">;</span>
			bundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_test<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span><span class="kw8">CONTROL</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>Y<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//Par défaut les raccourcis clavier créés ne sont pas activés</span>
			<span class="co1">//dans l'application; on charge donc notre groupe ici.</span>
			bundle<span class="sy0">.</span><span class="kw7">load</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On envoie un raccourci clavier</span>
			bundle<span class="sy0">.</span>fire<span class="br0">&#40;</span>PXKey<span class="sy0">.</span>Y<span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _test<span class="br0">&#40;</span>event <span class="sy0">:</span> PXKeyShortcutEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//Un message apparait à chaque fois que le raccourci clavier est activé,</span>
			<span class="co1">//soit par l'utilisateur, soit par la méthode &quot;fire()&quot;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span><span class="st0">&quot;Activated &quot;</span> <span class="sy0">+</span> event<span class="sy0">.</span><span class="kw7">shortcut</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>L&#8217;utilisation est simple, on crée un groupe avec un identifiant unique auquel nous affectons une combinaison de &#8220;raccourcis clavier / commandes&#8221;.<br />
Par défaut un groupe de raccourcis n&#8217;est pas activé, il faut utiliser la méthode &#8220;<em>load()</em>&#8220;. Une fois chargé, à chaque fois que l&#8217;utilisateur utilisera la combinaison de raccourci clavier définie, la commande associée sera exécutée.<br />
On peut aussi, comme cela est illustré dans l&#8217;exemple, forcer l&#8217;activation d&#8217;un raccourci clavier via la méthode &#8220;<em>fire()</em>&#8221; de notre groupe.</p>
<p>Maintenant, voyons la gestion de groupes multiples.<br />
Par le biais de la classe <strong>PXKeyBundleManager</strong>, nous allons pouvoir contrôler différents groupes de raccourcis clavier.<br />
De manière globale ou de manière unique suivant l&#8217;utilisation et le comportement dont aurons besoin dans notre application.</p>
<p><strong>1. Utilisation simultanée</strong><br />
Dans ce cas, <span style="text-decoration: underline;">tous</span> les groupes enregistrés dans le gestionnaire <strong>PXKeyBundleManager</strong> sont <span style="text-decoration: underline;">activés</span> dans notre application.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>commands<span class="sy0">.</span>PXDelegate<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKey<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKeyBundle<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKeyBundleManager<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKeyShortcutEvent<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXDebug<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXTraceLayout<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>addLogListener<span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On rajoute une sortie pour les messages de Pixlib, ici le classique &quot;trace&quot; de Flash</span>
			addLogListener<span class="br0">&#40;</span>PXTraceLayout<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On créé un nouveau groupe de définition de raccourci clavier à gérer.</span>
			<span class="co1">//Ici, notre groupe sera défini pour des interactions nommées &quot;UserPanel&quot;</span>
			<span class="kw2">var</span> userBundle <span class="sy0">:</span> PXKeyBundle = <span class="kw1">new</span> PXKeyBundle<span class="br0">&#40;</span><span class="st0">&quot;UserPanel&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			userBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleUserHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>O<span class="br0">&#41;</span><span class="sy0">;</span>
			userBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleUserHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span><span class="kw8">CONTROL</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>S<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On créé un nouveau groupe de raccourcis clavier qui seront utilisés</span>
			<span class="co1">//et référencés pour les &quot;Dialog&quot;.</span>
			<span class="kw2">var</span> dialogBundle <span class="sy0">:</span> PXKeyBundle = <span class="kw1">new</span> PXKeyBundle<span class="br0">&#40;</span><span class="st0">&quot;Dialog&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			dialogBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleDialogHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>Y<span class="br0">&#41;</span><span class="sy0">;</span>
			dialogBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleDialogHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>N<span class="br0">&#41;</span><span class="sy0">;</span>
			dialogBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleDialogHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span><span class="kw8">ESCAPE</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//Notre manager va pouvoir traiter tous les paquets simultanément</span>
			PXKeyBundleManager<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw7">mode</span> = PXKeyBundleManager<span class="sy0">.</span>MULTI_BUNDLE<span class="sy0">;</span>
&nbsp;
			<span class="co1">//On enregistre ici nos deux groupes précédemment créés</span>
			PXKeyBundleManager<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>register<span class="br0">&#40;</span>userBundle<span class="sy0">,</span> <span class="kw1">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
			PXKeyBundleManager<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>register<span class="br0">&#40;</span>dialogBundle<span class="sy0">,</span> <span class="kw1">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//Maintenant, les deux groupes sont activés en même temps. Tous</span>
			<span class="co1">//les raccourcis clavier (dans &quot;UserPanel&quot; ou &quot;Dialog&quot;) sont disponibles</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _bundleUserHandler<span class="br0">&#40;</span>event <span class="sy0">:</span> PXKeyShortcutEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On affiche un message quand un raccourci du groupe &quot;UserPanel&quot;</span>
			<span class="co1">//est activé</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span><span class="st0">&quot;Activated &quot;</span> <span class="sy0">+</span> event<span class="sy0">.</span><span class="kw7">shortcut</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _bundleDialogHandler<span class="br0">&#40;</span>event <span class="sy0">:</span> PXKeyShortcutEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On affiche un message quand un raccourci du groupe &quot;Dialog&quot;</span>
			<span class="co1">//est activé</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span><span class="st0">&quot;Activated &quot;</span> <span class="sy0">+</span> event<span class="sy0">.</span><span class="kw7">shortcut</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Ici nous avons créé 2 groupes distincts de raccourcis clavier et indiqué au gestionnaire de prendre en charge tous les groupes (<strong>PXKeyBundleManager</strong>.<em>MULTI_BUNDLE</em>).<br />
Si l&#8217;utilisateur réalise un raccourci clavier défini dans l&#8217;un ou l&#8217;autre de nos groupes (&#8220;<em>UserPanel</em>&#8221; et &#8220;<em>Dialog</em>&#8220;) la commande associée sera alors exécutée.</p>
<p><strong>2. Utilisation unique</strong></p>
<p>Nous allons réaliser pratiquement la même chose, mais notre gestionnaire ne prendra en compte qu&#8217;un <span style="text-decoration: underline;">seul</span> groupe à la fois (<strong>PXKeyBundleManager</strong>.<em>SINGLE_BUNDLE</em>).</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>commands<span class="sy0">.</span>PXDelegate<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKey<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKeyBundle<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKeyBundleManager<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>key<span class="sy0">.</span>PXKeyShortcutEvent<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXDebug<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXTraceLayout<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>addLogListener<span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On rajoute une sortie pour les messages de Pixlib, ici le classique &quot;trace&quot; de Flash</span>
			addLogListener<span class="br0">&#40;</span>PXTraceLayout<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On créé un nouveau groupe de définition de raccourci clavier à gérer.</span>
			<span class="co1">//Ici, notre groupe sera défini pour des interactions nommées &quot;UserPanel&quot;</span>
			<span class="kw2">var</span> userBundle <span class="sy0">:</span> PXKeyBundle = <span class="kw1">new</span> PXKeyBundle<span class="br0">&#40;</span><span class="st0">&quot;UserPanel&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			userBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleUserHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>O<span class="br0">&#41;</span><span class="sy0">;</span>
			userBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleUserHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span><span class="kw8">CONTROL</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>S<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On créé un nouveau groupe de raccourcis clavier qui seront utilisés</span>
			<span class="co1">//et référencés pour les &quot;Dialog&quot;.</span>
			<span class="kw2">var</span> dialogBundle <span class="sy0">:</span> PXKeyBundle = <span class="kw1">new</span> PXKeyBundle<span class="br0">&#40;</span><span class="st0">&quot;Dialog&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			dialogBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleDialogHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>Y<span class="br0">&#41;</span><span class="sy0">;</span>
			dialogBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleDialogHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span>N<span class="br0">&#41;</span><span class="sy0">;</span>
			dialogBundle<span class="sy0">.</span>pushCommand<span class="br0">&#40;</span><span class="kw1">new</span> PXDelegate<span class="br0">&#40;</span>_bundleDialogHandler<span class="br0">&#41;</span><span class="sy0">,</span> PXKey<span class="sy0">.</span><span class="kw8">ESCAPE</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//Notre manager ne pourra traiter qu'un groupe à la fois.</span>
			PXKeyBundleManager<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw7">mode</span> = PXKeyBundleManager<span class="sy0">.</span>SINGLE_BUNDLE<span class="sy0">;</span>
&nbsp;
			<span class="co1">//On enregistre ici nos deux groupes précédemment créés</span>
			PXKeyBundleManager<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>register<span class="br0">&#40;</span>userBundle<span class="br0">&#41;</span><span class="sy0">;</span>
			PXKeyBundleManager<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>register<span class="br0">&#40;</span>dialogBundle<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On charge le groupe de raccourcis &quot;UserPanel&quot;</span>
			PXKeyBundleManager<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw7">load</span><span class="br0">&#40;</span><span class="st0">&quot;UserPanel&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _bundleUserHandler<span class="br0">&#40;</span>event <span class="sy0">:</span> PXKeyShortcutEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On affiche un message quand un raccourci du groupe &quot;UserPanel&quot;</span>
			<span class="co1">//est activé</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span><span class="st0">&quot;Activated &quot;</span> <span class="sy0">+</span> event<span class="sy0">.</span><span class="kw7">shortcut</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On charge le groupe de raccourcis &quot;Dialog&quot;. Maintenant, seul ce groupe</span>
			<span class="co1">//est activé, les anciens raccourcis du groupe &quot;UserPanel&quot; ne sont plus</span>
			<span class="co1">//écoutés.</span>
			PXKeyBundleManager<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw7">load</span><span class="br0">&#40;</span><span class="st0">&quot;Dialog&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _bundleDialogHandler<span class="br0">&#40;</span>event <span class="sy0">:</span> PXKeyShortcutEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="co1">//On affiche un message quand un raccourci du groupe &quot;Dialog&quot;</span>
			<span class="co1">//est activé</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span><span class="st0">&quot;Activated &quot;</span> <span class="sy0">+</span> event<span class="sy0">.</span><span class="kw7">shortcut</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On charge le groupe de raccourcis &quot;UserPanel&quot;. Maintenant, seul ce groupe</span>
			<span class="co1">//est activé, les anciens raccourcis du groupe &quot;Dialog&quot; ne sont plus</span>
			<span class="co1">//écoutés.</span>
			PXKeyBundleManager<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw7">load</span><span class="br0">&#40;</span><span class="st0">&quot;UserPanel&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Au début de notre application, seul le groupe &#8220;<em>UserPanel</em>&#8221; est activé et donc seuls les raccourcis définis dans ce groupe peuvent être réalisés.<br />
Mais une fois déclenché, comme illustré dans notre exemple, on active l&#8217;autre groupe &#8220;<em>Dialog</em>&#8221; et à ce moment-là, seuls les raccourcis du groupe &#8220;<em>Dialog</em>&#8221; peuvent être réalisés.</p>
<p>Voilà un outil simple et complet qui vous permettra de rajouter rapidement une couche d&#8217;&#8221;interactivité clavier&#8221; dans vos applications Flash.</p>
<p>Les différents liens pour les téléchargements:</p>
<ul>
<li>Page de <a title="Pixlib Downloads" href="http://blog.pixlib.net/pixlib-downloads/">téléchargements</a></li>
<li>la <a href="http://www.pixlib.net/framework/doc/pixkey/">documentation</a></li>
</ul>
<p><em>Happy coding with <strong>Pixlib</strong> !</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2011/03/16/pixkey-pixlib-et-les-raccourcis-claviers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PixEmbed &#8211; Nouvelle extension de Pixlib pour faciliter l&#8217;intégration d&#8217;éléments</title>
		<link>http://blog.pixlib.net/2011/03/12/pixembed-nouvelle-extension-de-pixlib-pour-faciliter-lintegration-delements/</link>
		<comments>http://blog.pixlib.net/2011/03/12/pixembed-nouvelle-extension-de-pixlib-pour-faciliter-lintegration-delements/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 12:07:58 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Extension]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PixNews]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[element]]></category>
		<category><![CDATA[embed]]></category>
		<category><![CDATA[loading]]></category>
		<category><![CDATA[production]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=500</guid>
		<description><![CDATA[PixEmbed, Extension de Pixlib, permet d'intégrer simplement des éléments dans les projets Flash. <a href="http://blog.pixlib.net/2011/03/12/pixembed-nouvelle-extension-de-pixlib-pour-faciliter-lintegration-delements/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong>PixEmbed</strong> est une petite et rapide extension de <strong>Pixlib</strong> qui simplifie beaucoup la vie.</p>
<p>En effet, pour optimiser les chargements ou pour d&#8217;autres raisons, il peut être pratique d&#8217;intégrer (embed) des éléments directement au niveau de la compilation d&#8217;un projet Flash.<br />
<strong>PixEmbed</strong> arrive pour faire le pont entre <em>Embed</em> et le <strong>PXResourceLocator</strong> de <strong>Pixlib</strong>. Le <strong>PXResourceLocator</strong> devenant de plus en plus un cœur des éléments disponibles dans les projets <strong>Pixlib</strong>.<br />
<span id="more-500"></span><br />
L&#8217;utilisation de <strong>PixEmbed</strong> est vraiment très simple. Tout d&#8217;abord il faut créer une classe intégrant les éléments :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">public</span> <span class="kw4">class</span> MyEmbed
	<span class="br0">&#123;</span>
		<span class="br0">&#91;</span>Embed<span class="br0">&#40;</span><span class="kw7">source</span>=<span class="st0">&quot;list.xml&quot;</span><span class="sy0">,</span> mimeType=<span class="st0">&quot;application/octet-stream&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
		<span class="kw1">public</span> <span class="kw2">var</span> DataXML <span class="sy0">:</span> <span class="kw5">Class</span><span class="sy0">;</span>
&nbsp;
		<span class="br0">&#91;</span>Embed<span class="br0">&#40;</span><span class="kw7">source</span>=<span class="st0">&quot;list.xml&quot;</span><span class="sy0">,</span> mimeType=<span class="st0">&quot;application/octet-stream&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
		<span class="kw1">public</span> <span class="kw2">var</span> RawXML <span class="sy0">:</span> <span class="kw5">Class</span><span class="sy0">;</span>
&nbsp;
		<span class="br0">&#91;</span>Embed<span class="br0">&#40;</span><span class="kw7">source</span>=<span class="st0">&quot;picto.jpg&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
		<span class="kw1">public</span> <span class="kw2">var</span> DataJPG <span class="sy0">:</span> <span class="kw5">Class</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Ensuite, il faut dire à <strong>Pixlib</strong> que nous allons utiliser cette classe pour gérer nos éléments :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>embed<span class="sy0">.</span>PXEmbedEngine<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">load</span><span class="sy0">.</span>PXResourceLocator<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXDebug<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXTraceLayout<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>addLogListener<span class="sy0">;</span>
&nbsp;
	<span class="kw1">import</span> <span class="kw6">flash.display</span><span class="sy0">.</span><span class="kw5">DisplayObject</span><span class="sy0">;</span>
	<span class="kw1">import</span> <span class="kw6">flash.utils</span><span class="sy0">.</span><span class="kw5">ByteArray</span><span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			addLogListener<span class="br0">&#40;</span>PXTraceLayout<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//Ici on rajoute un traitement pour que notre &quot;DataXML&quot; soit tranformée en XML (sinon on a un simple ByteArray).</span>
			PXEmbedEngine<span class="sy0">.</span>addParser<span class="br0">&#40;</span><span class="st0">&quot;DataXML&quot;</span><span class="sy0">,</span> PXEmbedEngine<span class="sy0">.</span><span class="kw7">parseXML</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On intégre nos éléments</span>
			PXEmbedEngine<span class="sy0">.</span>embed<span class="br0">&#40;</span>MyEmbed<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On  récupère le logo via le PXResourceLocator</span>
			<span class="kw2">var</span> logo <span class="sy0">:</span> <span class="kw5">DisplayObject</span> = PXResourceLocator<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>locate<span class="br0">&#40;</span><span class="st0">&quot;DataJPG&quot;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="kw5">DisplayObject</span><span class="sy0">;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>logo<span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On  récupère le xml sachant qu'on a défini un &quot;parser&quot; plus haut pour ça</span>
			<span class="kw2">var</span> xml <span class="sy0">:</span> <span class="kw5">XML</span> = PXResourceLocator<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>locateXML<span class="br0">&#40;</span><span class="st0">&quot;DataXML&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>xml<span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">//On  récupère un embed de XML classique, c'est à dire un ByteArray</span>
			<span class="kw2">var</span> ba <span class="sy0">:</span> <span class="kw5">ByteArray</span> = PXResourceLocator<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span>locate<span class="br0">&#40;</span><span class="st0">&quot;RawXML&quot;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="kw5">ByteArray</span><span class="sy0">;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw5">XML</span><span class="br0">&#40;</span>ba<span class="sy0">.</span><span class="kw7">readUTFBytes</span><span class="br0">&#40;</span>ba<span class="sy0">.</span><span class="kw7">length</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p><strong>PixEmbed</strong> est simple à utiliser et facilite la vie dans les développements. On peut passer par une phase de chargement externe à une phase d&#8217;intégration dans le code vraiment rapidement.</p>
<p>La librairie <strong>PixEmbed</strong> est disponible sur la page des <a title="Pixlib download" href="http://blog.pixlib.net/pixlib-downloads/">téléchargements</a>, les sources sur le <a href="http://code.google.com/p/pixlib/source/checkout">SVN</a> et la documentation <a href="http://www.pixlib.net/framework/doc/pixembed/">ici</a>.</p>
<p><em>Happy coding with <strong>Pixlib</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2011/03/12/pixembed-nouvelle-extension-de-pixlib-pour-faciliter-lintegration-delements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Made with Pixlib</title>
		<link>http://blog.pixlib.net/2011/03/07/made-with-pixlib/</link>
		<comments>http://blog.pixlib.net/2011/03/07/made-with-pixlib/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 15:07:33 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[PixNews]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[pixlib]]></category>
		<category><![CDATA[production]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=421</guid>
		<description><![CDATA[Il a maintenant longtemps que Pixlib est utilisé en production. De simple réalisation aux projets les plus ambitieux, Pixlib a toujours su rentré dans un processus de production stable et robuste.
NRJ, Bouygues Telecom, Audi, Ubisoft, Electronic Art sont des exemples de clients pour lesquels Pixlib a apporté sa puissance et sa stabilité. Adobe Site of the Day en avril 2010. <a href="http://blog.pixlib.net/2011/03/07/made-with-pixlib/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Sites produits, événementiels, outils de créations, jeu multijoueurs, causales games, bornes interactives…<br />
C&#8217;est en voyant la diversité des projets que l&#8217;on réalise la flexibilité qu&#8217;apporte <strong>Pixlib</strong>.</p>
<p>NRJ, Bouygues Telecom, Audi, Ubisoft, Electronic Art…<br />
Que ça soit dans un simple navigateur ou décliné sur des téléphones portables; au fil des années, les plus grandes marques ont pu se mettre en valeur sur les supports digitaux grâce à la <strong>puissance</strong> et la <strong>stabilité</strong> de ce framework.</p>
<p>Rendez-vous sur la page <a href="http://blog.pixlib.net/pixlib-references/">références</a> pour découvrir une sélection de projets réalisés avec <strong>Pixlib</strong>.</p>
<p>À titre d&#8217;exemple «OnDemand <strong>David Guetta</strong>», <strong>Adobe Site of the Day</strong> d&#8217;avril 2010.</p>
<blockquote><p>Le framework Pixlib et son extension PixIoC ont été retenus pour OnDemand 2009, car nous étions confrontés à un développement as3 exprimant des besoins en totale conformité avec les principes de l&#8217;IoC: réalisation d&#8217;une application complexe (principes de &#8220;Separation Of Concerns&#8221; et &#8220;Component Oriented Programming&#8221;) déclinée pour de nombreux clients finaux (Configuration Management against &#8220;Scattered Configuration&#8221;) et évolutive (Handling &#8220;Unpredictable Lifecycle&#8221;). À la différence de simples librairies ou classes utilitaires as3 IoC, l&#8217;implémentation IoC de Pixlib qui s&#8217;inscrit dans un cadre architectural connu (MVC/FC) nous aura permis de développer de manière structurée et collaborative.</p></blockquote>
<p>N&#8217;hésitez pas à nous contacter pour y ajouter vos projets!</p>
<p><em>Happy coding with <strong>Pixlib</strong> !</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2011/03/07/made-with-pixlib/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pixlib Services &#8211; L&#8217;extension pour les appels distants</title>
		<link>http://blog.pixlib.net/2011/03/04/pixlib-services-lextension-pour-les-appels-distants/</link>
		<comments>http://blog.pixlib.net/2011/03/04/pixlib-services-lextension-pour-les-appels-distants/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 08:52:56 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Extension]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[pixlib]]></category>
		<category><![CDATA[remoting]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[sharedobject]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=408</guid>
		<description><![CDATA[L'extension PixService de Pixlib permet de faire des appels distants. Appels HTTP, AMF et même plus simplement des appels sur des SharedObject Flash. <a href="http://blog.pixlib.net/2011/03/04/pixlib-services-lextension-pour-les-appels-distants/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Nouvelle leçon, cette fois-ci sur l&#8217;utilisation de l&#8217;extension <strong><a href="http://blog.pixlib.net/pixlib-downloads/">PixService</a></strong> permettant de réaliser des appels distants.</p>
<p>Appels qui permettront de charger des données simplement et aussi faire des appels à des services distants (<strong>AMF</strong>, <strong>HTTP&#8230;</strong>) complexes.</p>
<p><span id="more-408"></span></p>
<p>L&#8217;extension <strong>PixService</strong> contient plusieurs implémentations concrètes :</p>
<ul>
<li><strong>PXHTTPService</strong> : Appels à des pages distantes retournant des données ;</li>
<li><strong>PXStreamService</strong> : Appels à des pages distantes retournant un objet <em>URLStream ;</em></li>
<li><strong>PXSharedObjectService</strong> : Appels à un <em>SharedObject ;</em></li>
<li><strong>PXAMFService</strong> : Appel à un service <em>AMF ;</em></li>
<li><strong>PXAMFMultipleServices</strong> : Appels multiples à des services <em>AMF</em> (en une passe).</li>
</ul>
<p>L&#8217;<strong>API</strong> définie dans le <strong>core</strong> de <strong>Pixlib</strong> permet pour chacun de ces services de  :</p>
<ul>
<li>définir des arguments à ajouter lors de l&#8217;appel ;</li>
<li>d&#8217;abonner des écouteurs pour suivre l&#8217;état de l&#8217;appel ;</li>
<li>définir un processus de dé sérialisation des données, si besoin.</li>
</ul>
<p>Prenons un premier exemple avec la classe <strong>PXHTTPService</strong>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXDebug<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXTraceLayout<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>addLogListener<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>services<span class="sy0">.</span>PXHTTPService<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>services<span class="sy0">.</span>PXService<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>services<span class="sy0">.</span>PXServiceEvent<span class="sy0">;</span>
&nbsp;
	<span class="kw1">import</span> <span class="kw6">flash.net</span><span class="sy0">.</span><span class="kw5">URLRequestMethod</span><span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			addLogListener<span class="br0">&#40;</span>PXTraceLayout<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw2">var</span> username <span class="sy0">:</span> <span class="kw5">String</span> = <span class="st0">&quot;Anonymous&quot;</span><span class="sy0">;</span>
			<span class="kw2">var</span> pwd <span class="sy0">:</span> <span class="kw5">String</span> = <span class="st0">&quot;&quot;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw2">var</span> service <span class="sy0">:</span> PXService = <span class="kw1">new</span> PXHTTPService<span class="br0">&#40;</span><span class="st0">&quot;http://www..../getSession.php&quot;</span><span class="sy0">,</span> <span class="kw5">URLRequestMethod</span><span class="sy0">.</span><span class="kw8">POST</span><span class="br0">&#41;</span><span class="sy0">;</span>
			service<span class="sy0">.</span>setArguments<span class="br0">&#40;</span><span class="st0">&quot;login&quot;</span><span class="sy0">,</span> username<span class="sy0">,</span> <span class="st0">&quot;pass&quot;</span><span class="sy0">,</span> pwd<span class="br0">&#41;</span><span class="sy0">;</span>
			service<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span>PXServiceEvent<span class="sy0">.</span>onDataResultEVENT<span class="sy0">,</span> _onResult<span class="br0">&#41;</span><span class="sy0">;</span>
			service<span class="sy0">.</span>execute<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _onResult<span class="br0">&#40;</span>event <span class="sy0">:</span> PXServiceEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>event<span class="sy0">.</span>result<span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Ci-dessus nous effectuons donc un simple appel à la page &#8220;<em>getSession.php</em>&#8221; en spécifiant que nous enverrons des arguments en mode &#8220;POST&#8221;.</p>
<p>Nous passons ensuite nos deux arguments via la méthode &#8220;<strong><em>setArguments()</em></strong>&#8221; qui pour le <strong>PXHTTPService</strong> fonctionne sous forme de paire &#8220;nom/valeur&#8221;. Ici la propriété &#8220;<em>login</em>&#8220;, puis sa valeur, puis la propriété &#8220;<em>pass</em>&#8221; et sa valeur.</p>
<p>On ajoute ensuite un écouteur pour surveiller le résultat renvoyé par cet appel.</p>
<p>Bien entendu, il est possible d&#8217;utiliser directement la classe <strong>PXHTTPService</strong> au lieu de passer par l&#8217;interface <strong>PXService</strong>. Ceci permettant d&#8217;utiliser les méthodes spécifiques à cette classe.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw2">var</span> service <span class="sy0">:</span> PXHTTPService = <span class="kw1">new</span> PXHTTPService<span class="br0">&#40;</span><span class="st0">&quot;http://www..../getSession.php&quot;</span><span class="sy0">,</span> <span class="kw5">URLRequestMethod</span><span class="sy0">.</span><span class="kw8">POST</span><span class="br0">&#41;</span><span class="sy0">;</span>
service<span class="sy0">.</span>addVariable<span class="br0">&#40;</span><span class="st0">&quot;login&quot;</span><span class="sy0">,</span> username<span class="br0">&#41;</span><span class="sy0">;</span>
service<span class="sy0">.</span>addVariable<span class="br0">&#40;</span><span class="st0">&quot;pass&quot;</span><span class="sy0">,</span> pwd<span class="br0">&#41;</span><span class="sy0">;</span>
service<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span>PXServiceEvent<span class="sy0">.</span>onDataResultEVENT<span class="sy0">,</span> _onResult<span class="br0">&#41;</span><span class="sy0">;</span>
service<span class="sy0">.</span>execute<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Cette règle est applicable à toutes les classes de <strong>PixService</strong>.</p>
<p>Les autres appels fonctionnent de la même manière (merci <strong>PXService</strong>), mais voyons le cas un peu plus spécifique de la classe <strong>PXAMFMultiServices</strong>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXDebug<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>PXTraceLayout<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span><span class="kw7">log</span><span class="sy0">.</span>addLogListener<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>services<span class="sy0">.</span>PXAMFMultiServices<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>services<span class="sy0">.</span>PXService<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>services<span class="sy0">.</span>PXServiceEvent<span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			addLogListener<span class="br0">&#40;</span>PXTraceLayout<span class="sy0">.</span>getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw2">var</span> username <span class="sy0">:</span> <span class="kw5">String</span> = <span class="st0">&quot;Anonymous&quot;</span><span class="sy0">;</span>
			<span class="kw2">var</span> pwd <span class="sy0">:</span> <span class="kw5">String</span> = <span class="st0">&quot;&quot;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw2">var</span> services <span class="sy0">:</span> PXAMFMultiServices = <span class="kw1">new</span> PXAMFMultiServices<span class="br0">&#40;</span><span class="st0">&quot;http://www.../index.php&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			services<span class="sy0">.</span>addService<span class="br0">&#40;</span><span class="st0">&quot;HelloWorld&quot;</span><span class="sy0">,</span> <span class="st0">&quot;getPrompt&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">// listen for specific service response and pass specific arguments</span>
			<span class="kw2">var</span> session <span class="sy0">:</span> PXService = services<span class="sy0">.</span>addService<span class="br0">&#40;</span><span class="st0">&quot;SessionService&quot;</span><span class="sy0">,</span> <span class="st0">&quot;getSession&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			session<span class="sy0">.</span>setArguments<span class="br0">&#40;</span>username<span class="sy0">,</span> pwd<span class="br0">&#41;</span><span class="sy0">;</span>
			session<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span>PXServiceEvent<span class="sy0">.</span>onDataResultEVENT<span class="sy0">,</span> _onSession<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="co1">// listen for global response</span>
			services<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span>PXServiceEvent<span class="sy0">.</span>onDataResultEVENT<span class="sy0">,</span> _onResult<span class="br0">&#41;</span><span class="sy0">;</span>
			services<span class="sy0">.</span>execute<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _onSession<span class="br0">&#40;</span>event <span class="sy0">:</span> PXServiceEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>event<span class="sy0">.</span>result<span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _onResult<span class="br0">&#40;</span>event <span class="sy0">:</span> PXServiceEvent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			PXDebug<span class="sy0">.</span>DEBUG<span class="br0">&#40;</span>event<span class="sy0">.</span>result<span class="sy0">,</span> <span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>La classe <strong>PXAMFMultiServices</strong> permet d&#8217;attaquer plusieurs services <em><strong>AMF</strong></em> en un seul appel distant. Via la méthode &#8220;<em><strong>addService()</strong></em>&#8221; il est donc possible d&#8217;ajouter de nouveaux appels avec pour chacun d&#8217;entre eux des paramètres et même des écouteurs; chaque service étant des <strong>PXService</strong> à part entière.</p>
<p>La librairie <strong>PixService</strong> est disponible sur la page des <a title="Pixlib downloads" href="http://blog.pixlib.net/pixlib-downloads/" target="_self">téléchargements</a>, les sources sur le <a title="Pixlib SVN Sources" href="http://code.google.com/p/pixlib/source/checkout" target="_blank">SVN</a> et la documentation <a title="PixService Documentation" href="http://www.pixlib.net/framework/doc/pixservice/" target="_blank">ici</a>.</p>
<p><em>Happy coding with <strong>Pixlib</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2011/03/04/pixlib-services-lextension-pour-les-appels-distants/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PixShare extension &#8211; Partager en toute simplicité</title>
		<link>http://blog.pixlib.net/2011/03/02/pixshare-extension-partager-en-toute-simplicite/</link>
		<comments>http://blog.pixlib.net/2011/03/02/pixshare-extension-partager-en-toute-simplicite/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 21:41:49 +0000</pubDate>
		<dc:creator>PixTeam</dc:creator>
				<category><![CDATA[Extension]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[pixlib]]></category>
		<category><![CDATA[share]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.pixlib.net/?p=470</guid>
		<description><![CDATA[L'extension PixShare permet simplement de partager vos liens via les réseaux sociaux ou par email. <a href="http://blog.pixlib.net/2011/03/02/pixshare-extension-partager-en-toute-simplicite/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Présentation et petite leçon sur une nouvelle extension de <strong>Pixlib</strong>, la bien nommée <strong>PixShare</strong>.</p>
<p><strong>PixShare</strong>, permet de réaliser du partage d&#8217;informations de manière rapide.<br />
<strong>PixShare</strong>, dans son implémentation actuelle, permet de partager sur les réseaux sociaux comme :</p>
<ul>
<li><strong>Facebook</strong></li>
<li><strong>Twitter</strong></li>
<li><strong>Google Buzz</strong></li>
<li><strong>LinkedIn</strong></li>
<li><strong>Delicious</strong></li>
<li><strong>Orkut</strong></li>
</ul>
<p>ainsi que par le biais d&#8217;un simple</p>
<ul>
<li><strong>E-Mail</strong></li>
</ul>
<p>Voyons comment utiliser cette nouvelle extension.<br />
<span id="more-470"></span><br />
Exemple pour partager un lien sur <strong>Facebook</strong>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw4">package</span>
<span class="br0">&#123;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>core<span class="sy0">.</span>PXBaseDocument<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>share<span class="sy0">.</span>PXPostSharing<span class="sy0">;</span>
	<span class="kw1">import</span> net<span class="sy0">.</span>pixlib<span class="sy0">.</span>share<span class="sy0">.</span>strategy<span class="sy0">.</span>sharing<span class="sy0">.</span>PXFacebookSharing<span class="sy0">;</span>
&nbsp;
	<span class="kw1">import</span> <span class="kw6">flash.display</span><span class="sy0">.</span><span class="kw5">Sprite</span><span class="sy0">;</span>
	<span class="kw1">import</span> <span class="kw6">flash.events</span><span class="sy0">.</span><span class="kw5">MouseEvent</span><span class="sy0">;</span>
&nbsp;
	<span class="kw1">public</span> <span class="kw4">class</span> Sample <span class="kw1">extends</span> PXBaseDocument
	<span class="br0">&#123;</span>
		<span class="kw1">override</span> <span class="kw1">protected</span> <span class="kw3">function</span> onDocumentReady<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			<span class="kw2">var</span> button <span class="sy0">:</span> <span class="kw5">Sprite</span> = <span class="kw7">addChild</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw5">Sprite</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="kw5">Sprite</span><span class="sy0">;</span>
			<span class="kw1">with</span><span class="br0">&#40;</span>button<span class="sy0">.</span><span class="kw7">graphics</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="kw7">beginFill</span><span class="br0">&#40;</span>0x000000<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw7">drawRect</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">50</span><span class="sy0">,</span> <span class="nu0">30</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw7">endFill</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="br0">&#125;</span>
			button<span class="sy0">.</span><span class="kw7">buttonMode</span> = <span class="kw1">true</span><span class="sy0">;</span>
			button<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span><span class="kw5">MouseEvent</span><span class="sy0">.</span><span class="kw8">CLICK</span><span class="sy0">,</span> _onClick<span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>	
&nbsp;
		<span class="kw1">private</span> <span class="kw3">function</span> _onClick<span class="br0">&#40;</span>event <span class="sy0">:</span> <span class="kw5">MouseEvent</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw1">void</span>
		<span class="br0">&#123;</span>
			event<span class="sy0">.</span>StopImmediatePropagation<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw2">var</span> post <span class="sy0">:</span> PXPostSharing = <span class="kw1">new</span> PXPostSharing<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			post<span class="sy0">.</span>platform = <span class="kw1">new</span> PXFacebookSharing<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
 			post<span class="sy0">.</span>share<span class="br0">&#40;</span><span class="st0">&quot;New Pixlib 3.0 Flash Framework&quot;</span><span class="sy0">,</span> <span class="st0">&quot;http://blog.pixlib.net&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Au click sur le bouton, le navigateur ouvrira une &#8220;<em>popup</em>&#8221; pour afficher le système de partage de <strong>Facebook</strong> (ce qui est le comportement par défaut).</p>
<p>Pour les applications hors navigateur, une stratégie existe pour ouvrir une fenêtre <strong>Adobe AIR</strong>.(d&#8217;autres supports verront ou pourront voir le jour dans le futur).</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw2">var</span> post <span class="sy0">:</span> PXPostSharing = <span class="kw1">new</span> PXPostSharing<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
post<span class="sy0">.</span>platform = <span class="kw1">new</span> PXFacebookSharing<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
post<span class="sy0">.</span>support = <span class="kw1">new</span> PXAIRWindowStrategy<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
post<span class="sy0">.</span>share<span class="br0">&#40;</span><span class="st0">&quot;New Pixlib 3.0 Flash Framework&quot;</span><span class="sy0">,</span> <span class="st0">&quot;http://blog.pixlib.net&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Le format du partage, par défaut, est le suivant :</p>
<ul>
<li>un titre</li>
<li>un lien</li>
</ul>
<p>Mais pour certains réseaux comme <strong>Orkut</strong> par exemple, ou bien simplement pour les envois par <strong>E-Mail</strong>, il est possible de passer un 3e paramètre, optionnel, à la méthode #share(), afin d&#8217;accéder à des paramètres complémentaires.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw2">var</span> opts <span class="sy0">:</span> PXSharingOptions = <span class="kw1">new</span> PXSharingOptions<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
opts<span class="sy0">.</span><span class="kw7">message</span> = <span class="st0">&quot;This is the Email's body&quot;</span><span class="sy0">;</span>
&nbsp;
<span class="kw2">var</span> post <span class="sy0">:</span> PXPostSharing = <span class="kw1">new</span> PXPostSharing<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
post<span class="sy0">.</span>platform = <span class="kw1">new</span> PXEmailSharing<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
post<span class="sy0">.</span>share<span class="br0">&#40;</span><span class="st0">&quot;New Pixlib 3.0 Flash Framework&quot;</span><span class="sy0">,</span> <span class="st0">&quot;http://blog.pixlib.net&quot;</span><span class="sy0">,</span> opts<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>ou encore :</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="actionscript3"><pre class="de1"><span class="kw2">var</span> opts <span class="sy0">:</span> PXSharingOptions = <span class="kw1">new</span> PXSharingOptions<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
opts<span class="sy0">.</span>thumbnail = <span class="st0">&quot;http://blog.pixlib.net/thumbnail.jpg&quot;</span><span class="sy0">;</span>
&nbsp;
<span class="kw2">var</span> post <span class="sy0">:</span> PXPostSharing = <span class="kw1">new</span> PXPostSharing<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
post<span class="sy0">.</span>platform = <span class="kw1">new</span> PXGoogleBuzzSharing<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
post<span class="sy0">.</span>share<span class="br0">&#40;</span><span class="st0">&quot;Incredible site here&quot;</span><span class="sy0">,</span> <span class="st0">&quot;http://blog.pixlib.net&quot;</span><span class="sy0">,</span> opts<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>La classe <strong>PXSharingOptions</strong> est une classe dite <strong>dynamique</strong>, vous pouvez donc lui ajouter les paramètres que vous souhaitez si vous désirez créer vos propres stratégies de partage.</p>
<p><strong>PixShare</strong> extension :</p>
<ul>
<li><a href="http://www.pixlib.net/framework/bin/pixshare/pixshare.swc" target="_blank">Librairie SWC</a></li>
<li><a href="http://www.pixlib.net/framework/bin/pixshare/pixshare.swf" target="_blank">Librairie SWF</a></li>
<li><a href="http://www.pixlib.net/framework/doc/pixshare/" target="_blank">Documentation</a></li>
<li><a href="http://code.google.com/p/pixlib/source/list" target="_blank">SVN source</a></li>
</ul>
<p><em>Happy coding with <strong>Pixlib</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pixlib.net/2011/03/02/pixshare-extension-partager-en-toute-simplicite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.076 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2013-05-22 03:03:05 -->
