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
-~----------~----~----~----~------~----~------~--~---

Répondre à