Bonjour,
En guise d'apprentissage je suis en train de réaliser un agrégateur de
flux rss. je m'inspire du widgets-rss de netvibes.
J'ai lu sur ce groupe un article sur le "code behind" (
http://weblogs.macromedia.com/paulw/archives/presentationpatterns/codebehind/demo/srcview/index.html
) et je trouve cette méthode élégante (et surtout rassurante pour
commencer car je connais + l'as3 que le MXML...)
voila où j'en suis arrivé pour le moment sur mon projet (je sais pas
si je peux l'uploader ici ?, alors je copie-colle...) :
ma classe MXML principale
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:lecteur_rss="LecteurRss.*"
width="800" height="600"
layout="vertical"
name="Lecteur">
<lecteur_rss:BarreDeControleMXML />
<mx:states>
<mx:State name="ajout">
<mx:AddChild position="lastChild">
<lecteur_rss:LecteurRssMXML/>
</mx:AddChild>
</mx:State>
</mx:states>
</mx:Application>
la barre de controle MXML
<?xml version="1.0" encoding="utf-8"?>
<lecteur_rss:BarreDeControleCLass
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:lecteur_rss="LecteurRss.*"
name="BarreDeControle">
<mx:Button
id="add_flux"
label="Ajouter" />
<mx:TextInput
id="url_txt"
width="100%"
text="http://www.clubic.com/xml/news.xml"
color="#AAAAAA"/>
</lecteur_rss:BarreDeControleCLass>
<!-- icon="@Embed(source='ressources/add.png')" -->
et sa classe AS associée
package LecteurRss
{
import flash.events.MouseEvent;
import mx.containers.ApplicationControlBar;
import mx.controls.Button;
import mx.controls.TextInput;
import mx.core.UIComponent;
import mx.events.FlexEvent;
public class BarreDeControleCLass extends ApplicationControlBar
{
public var add_flux:Button
public var url_txt:TextInput;
public function BarreDeControleCLass()
{
this.dock = true;
addEventListener(FlexEvent.CREATION_COMPLETE, init );
}
private function init( e:FlexEvent ) :void
{
add_flux.addEventListener(MouseEvent.CLICK, onAddFlux,
false, 0,
true );
}
private function onAddFlux( e:MouseEvent ):void
{
UIComponent(parent).currentState = "ajout";
}
}
}
le panel de lecture MXML
<?xml version="1.0" encoding="utf-8"?>
<lecteur_rss:LecteurRssClass
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:lecteur_rss="LecteurRss.*"
width="400" height="308"
horizontalScrollPolicy="off"
layout="absolute"
name="lecteurRSS"
title="Flux">
<mx:List
id="listeItems"
width="100%" height="100%"
variableRowHeight="true"
alternatingItemColors="[#EEEEEE,#FFFFFF]"/>
</lecteur_rss:LecteurRssClass>
et sa classe associée
package LecteurRss
{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import mx.collections.ArrayCollection;
import mx.containers.Panel;
import mx.controls.Alert;
import mx.controls.List;
import mx.core.ClassFactory;
import mx.events.FlexEvent;
public class LecteurRssClass extends Panel
{
public var listeItems:List;
private var newsCollection:ArrayCollection = new
ArrayCollection();
private var l:URLLoader;
public function LecteurRssClass()
{
addEventListener(FlexEvent.CREATION_COMPLETE, init );
}
private function init(e:FlexEvent):void
{
/*
var flux_url:String = "http://www.flashandmath.com/rss/
flash_and_math.xml";
var flux_url:String =
"http://www.canardpc.com/feed.php";
*/
var flux_url:String =
parentApplication.controlBar.url_txt.text;
var flux:Flux = new Flux( flux_url );
var req:URLRequest = new URLRequest( flux.url );
l = new URLLoader;
try {
l.load( req );
} catch (error:SecurityError)
{
Alert.show(error.message,"Erreur");
}
l.addEventListener(IOErrorEvent.IO_ERROR,
onErreur);
l.addEventListener(Event.COMPLETE, onChargementFini );
}
private function onChargementFini( e:Event ):void
{
// TODO : tester si le flux est bien valide
var xml:XML = new XML(e.target.data)
var nbNews:int = xml.channel.item.length();
// newsCollection comme dataProvider de listeItems
listeItems.dataProvider = newsCollection;
listeItems.itemRenderer = new ClassFactory(
NewsRendererMXML );
for(var i:int = 0 ; i < nbNews ; i++)
{
// TODO : faire un objet News
var news:Object = new Object();
news.titre = xml.channel.item[i].title;
news.lien = xml.channel.item[i].link;
news.description = xml.channel.item[i].description;
news.date = xml.channel.item[i].pubDate;
news.index = i;
newsCollection.addItem( news );
}
}
private function ListLabelFunction(item:Object):String
{
return "("+item.date+")\n"+item.titre;
}
private function onErreur( error:IOErrorEvent ):void
{
Alert.show(error.text,"Erreur");
}
}
}
et enfin l'itemRenderer MXML de List
<?xml version="1.0" encoding="utf-8"?>
<lecteur_rss:NewsRendererClass
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:lecteur_rss="LecteurRss.*">
<mx:Text
height="100%"
id="item_txt"/>
</lecteur_rss:NewsRendererClass>
et sa classe AS associée
package LecteurRss
{
import mx.containers.VBox;
import mx.controls.Text;
import mx.events.FlexEvent;
public class NewsRendererClass extends VBox
{
public var item_txt:Text;
public function NewsRendererClass()
{
addEventListener( FlexEvent.DATA_CHANGE, init, false,
0, true );
// A voir, ici pb si j'utilise CREATION_COMPLETE
//addEventListener( FlexEvent.CREATION_COMPLETE, init,
false, 0,
true );
}
private function init( e:FlexEvent ) :void
{
item_txt.selectable = false;
item_txt.text = "("+data.date+") \n" + data.titre;
item_txt.toolTip = data.description;
}
}
}
Mon début de projet fonctionne mais il y a du bricolage, et j'aurai
besoin d'un coup de pouce pour le restructurer avant de continuer
voici les points sur lesquels je butte :
1) l'apparition de composants
pour l'instant j'ai reussi a faire un truc avec le State dans
LecteurRssMXML, est ce une bonne methode ?
ca ne me semble pas tres pratique surtout je suis plutôt habitué aux
addChild (que j'ai pas réussi a faire ...)
2) la communication entre les différents composants
pour le moment j'ai fait un :
UIComponent(parent).currentState = "ajout";
dans ma barre de controle pour effectuer le changement d'état
et
parentApplication.controlBar.url_txt.text;
dans lecteurRSSClass.as pour recup l'url qui est dans la barre de
commande
3) et enfin j'ai eu un pb avec le FlexEvent.CREATION_COMPLETE et le
composant List
Dans NewsRendererClass si j'utilise FlexEvent.CREATION_COMPLETE, ma
Liste boucle toujours sur les n 1er items, n etant le nombre
d'éléments initialement affichés
d'avance merci pour vos remarques et conseils !
--~--~---------~--~----~------------~-------~--~----~
Vous avez reçu ce message, car vous êtes abonné au groupe Groupe "FCNG" de
Google Groupes.
Pour transmettre des messages à ce groupe, envoyez un e-mail à
l'adresse [email protected]
Pour résilier votre abonnement à ce groupe, envoyez un e-mail à
l'adresse [email protected]
Pour afficher d'autres options, visitez ce groupe à l'adresse
http://groups.google.com/group/FCNG?hl=fr
-~----------~----~----~----~------~----~------~--~---