Soyez le premier à donner votre avis sur cette source.
Vue 5 304 fois - Téléchargée 517 fois
package org{ /**********************************************************************************************************************************************\ \ I M P O R T / / \ \**********************************************************************************************************************************************/ // --------------- >>> DISPLAY import flash.display.Sprite; // --------------- >>> EVENT import flash.events.Event; import flash.events.MouseEvent; // --------------- >>> NET import flash.net.URLRequest; import flash.net.URLLoader; // --------------- >>> CONTROLS / DATA import fl.controls.List; import fl.controls.Button; import fl.data.DataProvider; public class NavXml extends Sprite { /**********************************************************************************************************************************************\ \ V A R I A B L E S / / \ \**********************************************************************************************************************************************/ // --------------- >>> --------------- >>> V A R I A B L E S D U X M L ! //-------------------------------------------------------------------------------------------------- ! public var XMLLoader:URLLoader = new URLLoader(); public var languageXML:XML = new XML(); public var listeXML : XMLList; // tableau permettant de mettre en place le nombre de catégorie même si on ne le connait pas public var categorie : Array = new Array() public var nbreCategorie : int = new int(); // --------------- >>> --------------- >>> V A R I A B L E S D ' A F F I C H A G E ! //------------------------------------------------------------------------------------------------------------ ! public var globalLecteur : Sprite = new Sprite;//sprite qui portera les éléments d'affichage public var conteneurListe : List = new List();//composant List pour naviguer dans le xml //série de outon permettant le retour au niveau précédent public var retourCategorie : Button = new Button(); public var retourArtiste : Button = new Button(); public var retourAlbum : Button = new Button(); //variable permettant de savoir à quel niveau de choix on est public var niveau : int = 0; //variable permettant de stoker le genre par son identifiant pour naviguer ensuite dans le XML public var numGenre : int; //variable permettant de stoker l'artiste par son identifiant pour naviguer ensuite dans le XML public var numArtiste : int; //variable permettant de stoker l'album par son identifiant pour naviguer ensuite dans le XML public var numAlbum : int; /**********************************************************************************************************************************************\ \ F O N C T I O N S / / \ \**********************************************************************************************************************************************/ // --------------- >>> --------------- >>> F O N C T I O N S D E T R A I T T E M E N T X M L ! //-------------------------------------------------------------------------------------------------------------------------- ! public function NavXml(){ //appel du XML XMLLoader.load(new URLRequest("xml/liste.xml")); XMLLoader.addEventListener(Event.COMPLETE, completXML); } private function completXML(eventObj:Event):void { //trace("!!! completeHandlerArr >> lance XML !!!"); languageXML = new XML(eventObj.currentTarget.data); //trace("languageXML = "+languageXML);// --> renvoie le xml entier listeXML = languageXML.children(); // pour déterminer le nbre de catégorie on utilisse la boucle ci-dessous... ne me demander pas comment j'en suis arrivé là ! for ( var item in listeXML){ trace("item = "+item); var dp:Array = new Array(); dp.push(item); } //détermination du nbre de catégorie nbreCategorie = dp.length + 1; //trace("nbreCategorie = "+nbreCategorie); miseEnPlace(); } private function miseEnPlace() : void { //affichage du sprite addChild(globalLecteur); globalLecteur.x = 100; globalLecteur.y = 10; //affichage du composant List globalLecteur.addChild(conteneurListe); // !!! listeXML[i].@id -- > renvoie les intitulé de l'identifiant des genres (catégorie) for (var i : int = 0; i < nbreCategorie; i++) { //on prend le nom (id de la balise xml) et on lui attribue un identifiant //on rentre les catégories dans le tableau categorie categorie.push({label:listeXML[i].@id , id : i}); } //on interdit la sélection multiple conteneurListe.allowMultipleSelection = false; //on remplit le composant conteneurListe.dataProvider = new DataProvider(categorie); conteneurListe.addEventListener(Event.CHANGE, choix); } private function choix(pEvt : Event):void{ //trace(" - - - - - - - - - - - - > > CHOIX CATÉGORIE"); //trace("pEvt.target = "+pEvt.currentTarget.selectedItem.id); //on supprime l'écouteur conteneurListe.removeEventListener(Event.CHANGE, choix); //on met "niveau" sur 1 pour savoir ou l'on est --> cela servira pour les bouton de retour à savoir les éouteur qu'il faudra annuler niveau = 1; //on met en stock le numéro (id) du genre selectionné numGenre = pEvt.currentTarget.selectedItem.id; //on place un bouton de retour au catégorie globalLecteur.addChild(retourCategorie); retourCategorie.label = "retour catégorie"; retourCategorie.x = 0; retourCategorie.y = 120; retourCategorie.addEventListener(MouseEvent.CLICK , retourCat); //on met en place l'affichage des artistes de la catégorie //on crée un nouveau xml relatif à l'identifiant (pEvt.currentTarget.selectedItem.id) de la selection var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[pEvt.currentTarget.selectedItem.id].@id)); //trace("XMLTrans = "+XMLTrans); var XMLListeTrans:XMLList = XMLTrans.children(); var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total //trace("limite = "+limite); var dp:Array = new Array(); for (var i : int = 0; i < limite; i++) { dp.push({label:XMLListeTrans[i].@id , id : i}); // dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau } conteneurListe.allowMultipleSelection = false; conteneurListe.dataProvider = new DataProvider(dp); conteneurListe.addEventListener(Event.CHANGE, choixArtiste); } private function choixArtiste(pEvt : Event):void{ trace(" - - - - - - - - - - - - > > CHOIX ARTISTE"); //trace("pEvt.target = "+pEvt.currentTarget.selectedItem.id); //on supprime l'écouteur conteneurListe.removeEventListener(Event.CHANGE, choixArtiste); //on met "niveau" sur 1 pour savoir ou l'on est --> cela servira pour les bouton de retour à savoir les éouteur qu'il faudra annuler niveau = 2; //on met en stock le numéro (id) du genre selectionné numArtiste = pEvt.currentTarget.selectedItem.id; //on place un bouton de retour au catégorie globalLecteur.addChild(retourArtiste); retourArtiste.label = "retour artistes"; retourArtiste.x = 0; retourArtiste.y = 150; retourArtiste.addEventListener(MouseEvent.CLICK , retourArt); //var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id));//renvoie tout jazz si jazz sélectionné //var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[pEvt.currentTarget.selectedItem.id].@id);// renvoie le nom de l'artiste var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[pEvt.currentTarget.selectedItem.id]);//renvoie tout ce qui a trait à l'auteur //languageXML.legenre.(@id==listeXML[pEvt.currentTarget.selectedItem.id].@id) //trace("XMLTrans = "+XMLTrans); var XMLListeTrans:XMLList = XMLTrans.children(); var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total //trace("limite = "+limite); var dp:Array = new Array(); for (var i : int = 0; i < limite; i++) { dp.push({label:XMLListeTrans[i].@id , id : i}); // dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau } conteneurListe.allowMultipleSelection = false; conteneurListe.dataProvider = new DataProvider(dp); conteneurListe.addEventListener(Event.CHANGE, choixAlbum); } private function choixAlbum(pEvt : Event):void{ trace(" - - - - - - - - - - - - > > CHOIX ALBUM"); //trace("pEvt.target = "+pEvt.currentTarget.selectedItem.id); //on supprime l'écouteur conteneurListe.removeEventListener(Event.CHANGE, choixAlbum); //on met "niveau" sur 1 pour savoir ou l'on est --> cela servira pour les bouton de retour à savoir les éouteur qu'il faudra annuler niveau = 3; //on met en stock le numéro (id) du genre selectionné numAlbum = pEvt.currentTarget.selectedItem.id; //on place un bouton de retour au catégorie globalLecteur.addChild(retourAlbum); retourAlbum.label = "retour album"; retourAlbum.x = 0; retourAlbum.y = 180; retourAlbum.addEventListener(MouseEvent.CLICK , retourAlb); var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[pEvt.currentTarget.selectedItem.id]);//renvoie tout ce qui a trait à l'auteur //languageXML.legenre.(@id==listeXML[pEvt.currentTarget.selectedItem.id].@id) trace("XMLTrans = "+XMLTrans); var XMLListeTrans:XMLList = XMLTrans.children(); var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total trace("limite = "+limite); var dp:Array = new Array(); for (var i : int = 0; i < limite; i++) { dp.push({label:XMLListeTrans[i].@id , id : i}); // dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau } conteneurListe.allowMultipleSelection = false; conteneurListe.dataProvider = new DataProvider(dp); conteneurListe.addEventListener(Event.CHANGE, choixMorceau); } private function choixMorceau(pEvt : Event):void{ //trace("pEvt.target = "+pEvt.currentTarget.selectedItem.id); //ici appel de fonction fonction du morceau choisi trace("choixMorceau :: "+languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[numAlbum].titre[pEvt.currentTarget.selectedItem.id]);//renvoie la partie xml entière trace("choixMorceau :: titre = "+languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[numAlbum].titre[pEvt.currentTarget.selectedItem.id].@id); trace("choixMorceau :: url = "+languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[numAlbum].titre[pEvt.currentTarget.selectedItem.id].morceau); //ou bien /*var target = languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[numAlbum].titre[pEvt.currentTarget.selectedItem.id]; trace("choixMorceau :: url = "+target.morceau);*/ } // --------------- >>> --------------- >>> F O N C T I O N S D E S B O U T O N S D E R E T O U R ! //-------------------------------------------------------------------------------------------------------------------------------- ! //RETOUR AUX CATÉGORIES private function retourCat(pEvt : MouseEvent){ conteneurListe.removeEventListener(Event.CHANGE, choixMorceau); trace("retourCat :: niveau = "+niveau); //on désactive le bouton conteneurListe.removeEventListener(Event.CHANGE, choixArtiste); globalLecteur.removeChild(retourCategorie); retourCategorie.removeEventListener(MouseEvent.CLICK , retourCat); //on teste pour savoir si d'autre bouton sont affichés -- > suppression des boutons d'un niveau supérieur if(niveau == 2){ trace("retourCat :: niveau (2) = "+niveau); conteneurListe.removeEventListener(Event.CHANGE, choixAlbum); retourArtiste.removeEventListener(MouseEvent.CLICK , retourArt); globalLecteur.removeChild(retourArtiste); } else if(niveau == 3){ trace("retourCat :: niveau (3) = "+niveau); retourArtiste.removeEventListener(MouseEvent.CLICK , retourArt); globalLecteur.removeChild(retourArtiste); conteneurListe.removeEventListener(Event.CHANGE, choixAlbum); retourAlbum.removeEventListener(MouseEvent.CLICK , retourAlb); globalLecteur.removeChild(retourAlbum); } //on remet le niveau à 0 niveau = 0; //on réatribue les catégories à la List conteneurListe.allowMultipleSelection = false; conteneurListe.dataProvider = new DataProvider(categorie); conteneurListe.addEventListener(Event.CHANGE, choix); } //RETOUR AUX ARTISTES private function retourArt(pEvt : MouseEvent){ conteneurListe.removeEventListener(Event.CHANGE, choixMorceau); //on désactive le bouton conteneurListe.removeEventListener(Event.CHANGE, choixAlbum); retourArtiste.removeEventListener(MouseEvent.CLICK , retourArt); globalLecteur.removeChild(retourArtiste); if(niveau == 3){ trace("retourArt :: niveau (3) = "+niveau); conteneurListe.removeEventListener(Event.CHANGE, choixAlbum); retourAlbum.removeEventListener(MouseEvent.CLICK , retourAlb); globalLecteur.removeChild(retourAlbum); } //on remet le niveau à 1 niveau = 1; //on réatribue les artistes. var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id)); //trace("XMLTrans = "+XMLTrans); var XMLListeTrans:XMLList = XMLTrans.children(); var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total //trace("limite = "+limite); var dp:Array = new Array(); for (var i : int = 0; i < limite; i++) { dp.push({label:XMLListeTrans[i].@id , id : i}); // dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau } conteneurListe.allowMultipleSelection = false; conteneurListe.dataProvider = new DataProvider(dp); conteneurListe.addEventListener(Event.CHANGE, choixArtiste); } //RETOUR AUX ALBUMS private function retourAlb(pEvt : MouseEvent){ conteneurListe.removeEventListener(Event.CHANGE, choixMorceau); conteneurListe.removeEventListener(Event.CHANGE, choixAlbum); retourAlbum.removeEventListener(MouseEvent.CLICK , retourAlb); globalLecteur.removeChild(retourAlbum); var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste]);//renvoie tout ce qui a trait à l'auteur //languageXML.legenre.(@id==listeXML[pEvt.currentTarget.selectedItem.id].@id) trace("XMLTrans = "+XMLTrans); var XMLListeTrans:XMLList = XMLTrans.children(); var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total trace("limite = "+limite); var dp:Array = new Array(); for (var i : int = 0; i < limite; i++) { dp.push({label:XMLListeTrans[i].@id , id : i}); // dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau } conteneurListe.allowMultipleSelection = false; conteneurListe.dataProvider = new DataProvider(dp); conteneurListe.addEventListener(Event.CHANGE, choixAlbum); } /**********************************************************************************************************************************************\ \ F I N D U P A C K A G E / / \ \**********************************************************************************************************************************************/ } }
dans les filtres artist doit être remplacé par author
C'est génial !, Un peu comme noël en juillet !
Merci d'avoir pris autant de temps pour m'expliquer la "chose". Si je peux te rendre la pareille (bon pas en as c'est sur), je suis à ton service.
Merci à vous deux pour votre attention.
L'usage d'un "this" n'est pas possible.
Qund tu créer une classe si la fonction n'as pas besoin de référence propre à l'objet. C'est a dire qu'elle n'utilise que des référerences externes arguments, variables locales, etc.. Alors il est préférable de la passer en static. Comme dans mon exemple ci-dessus "__aNoeud()".
Ajoute une "ComboBox" à la bibliothèque.
Attribue la classe "Index" à ton fla.
Contenu de la classe "index":
package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.net.URLLoader;
import fl.controls.List;
import fl.controls.Button;
import fl.controls.ComboBox;
import fl.data.DataProvider;
//
public class Index
extends Sprite
{
private var __playList :XML = new XML();
private var __conteneur : Sprite = new Sprite;
private var __filtresCB : ComboBox = new ComboBox;
private var __choixCB : ComboBox = new ComboBox;
private var __trackList : List = new List();
public function Index():void{
//
// Pas besoin de garder le loader, ca utilise de la mémore pour rien...
var loader :URLLoader= new URLLoader();
loader.load(new URLRequest("xml/liste.xml"));
loader.addEventListener(Event.COMPLETE, __analyseData );
//
// Liste des filtres..-.
var dpCB :XML= <filtres>
<label>Catégorie</label><data>category</data>
<label>Artiste</label><data>artist</data>
<label>Album</label><data>album</data>
<label>Titre</label><data>title</data>
<label>Année</label><data>year</data>
</filtres> ;
//
__filtresCB.setSize(150,22);
__filtresCB.dataProvider = new DataProvider(dpCB);
__filtresCB.prompt= "Voir par..."
__filtresCB.rowCount= 20 ;
__filtresCB.addEventListener(Event.CHANGE,__montrerFiltres );
__conteneur.addChild(__filtresCB );
__trackList.y= 50 ;
__trackList.setSize(150,200) ;
__conteneur.addChild(__trackList ) ;
__choixCB.y= 25 ;
__choixCB.setSize(150,22) ;
__choixCB.rowCount= 20 ;
__choixCB.addEventListener(Event.CHANGE,__montrerChoix );
}
//
private function __analyseData( eventObj:Event ):void {
__playList= new XML(eventObj.currentTarget.data);
addChild(__conteneur ) ;
}
//
private function __montrerFiltres( $e:Event ):void{
__trackList.dataProvider= new DataProvider();
// Vide la liste actuelle...
var filtre :String= $e.target.selectedItem.data ;
// Le filtre choissi par l'utilisateur...
var liste :XMLList ;
var tableau :Array= [] ;
var value :String ;
var child :XML ;
var track :XML ;
// Pour tous les noeuds "track" de la liste...
for each( track in __playList.track )
{
// La liste des noeuds ayant le nom demandé (filtre)...
liste= track[filtre].children();
// Pour chaque noeud de la liste (au sein de track)
// On vérifie qu'il se soit pas déjà dans le tableau
for each( child in liste )
{
// SI N'EST PAS DANS LA LISTE L'AJOUTER:
// Utilisé un "string" et non un XML, car sinon Flash considera
// chaque XMl comme différent même si leur contenu est absolument identique...
value= child ;
if( tableau.indexOf(value)==-1 ) tableau.push(value);
}
}
__choixCB.dataProvider= __tableauEnProvider(tableau);
if(__choixCB.stage==null ) __conteneur.addChild(__choixCB ) ;
}
//
private function __montrerChoix( $e:Event ):void{
var filtre :String= __filtresCB.selectedItem.data ;
var choix :String= $e.target.selectedItem.data ;
// On recommence mais avec le nouveau choix et sans enlever les doubles
// Car on souhaite voir TOUTES les chansons du même filtre...
var selection :XML= <selection/> ;
var tableau :Array= [] ;
var value :String ;
var child :XML ;
var track :XML ;
// Pour tous les noeuds "track" de la lite...
for each( track in __playList.track )
{
// La liste des noeuds ayant le nom demandé (filtre)...
if( __aNoeud(track,filtre,choix) ) selection.appendChild( track.copy() );
}
__trackList.dataProvider= __listeEnProvider( selection.track ) ;
}
//
private static function __tableauEnProvider( tableau:Array ):DataProvider{
var element :String ;
var dp :DataProvider= new DataProvider() ;
for each( element in tableau ) dp.addItem( {label:element,data:element} );
return dp ;
}
//
private static function __listeEnProvider( liste:XMLList ):DataProvider{
var element :XML ;
var dp :DataProvider= new DataProvider() ;
for each( element in liste ){
trace( element );
dp.addItem( {label:element.title,data:element} );
}
return dp ;
}
//
private static function __aNoeud( track:XML, name:String, value:String ):Boolean{
var liste :XMLList= track.child(name);
if( liste.length()==0 ) return false ;
//
var noeud :XML ;
for each( noeud in liste ) if ( noeud.text()[0]==value) return true ;
return false ;
}
}
}
Et voila...
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.