import mx.transitions.Tween; /** Classe Rubrique permettant de gérer le menu "accordéon" * @author Dhaya Benmessaoud * @version 1.5 (09-03-2007) * @param DEBUG Affiche les informations de debug * @param LENGTH Nombre de Rubriques * @param LIST Liste des instances de Rubrique * @param MENU MovieClip du menu * @param RUBRIQUE_WIDTH Longueur de la poignée * @param RUBRIQUE_HEIGHT Hauteur de la Rubrique * @param RUBRIQUE_SPACER Espace requis entre les Rubriques * @param DEPLACE_OK Peut se déplacer ou pas * @param VITESSE Vitesse de mouvement * @param VITMAX Vitesse maximum à la limite de la zone * @param nom Nom de l'instance * @param etat 1: Ouvert / 0: Fermé * @param clip MovieClip de la poignée * @param xml Chemin des données XML * @param css Chemin de la feuille CSS * @param t Tableau de données pour les Etiquettes * @param vignette Sous-menu correspondant à la Rubrique * @param banniere Identificateur de bannière */ class Rubrique { public static var DEBUG:Number = 0; // Affiche les informations de debug public static var LENGTH:Number = 0; // Nombre de Rubriques public static var LIST:Array = new Array(); // Liste des instances de Rubrique public static var MENU:MovieClip; // MovieClip du menu /* Paramètres de la poignée et de l'inter-rubrique */ public static var RUBRIQUE_WIDTH:Number = 30; public static var RUBRIQUE_HEIGHT:Number = 350; public static var RUBRIQUE_SPACER:Number = 5; /* Paramètres de dynamique de déplacement */ public static var DEPLACE_OK:Number = 1; public static var VITESSE:Number = 0; public static var VITMAX:Number = 20; /* Paramètres d'instance */ private var nom:String; private var etat:Number; private var clip:MovieClip; private var xml:String; private var css:String; private var t:Array; private var banniere:Number; private var vignette:Vignette; /** Constructeur de la classe * @author Dhaya Benmessaoud * @version 2.0 (08-03-2007) * @param nom Nom de l'instance * @param xml Chemin des données XML * @param css Chemin de la feuille CSS * @param t Tableau des données pour les Etiquettes * @param poignee_mc Chemin du MovieClip externe pour la poignée * @param banniere Identificateur de bannière */ function Rubrique(nom:String, xml:String, css:String, t:Array, poignee_mc:String, banniere:Number) { this.nom = nom; this.etat = 0; var c:MovieClip = MENU.createEmptyMovieClip(nom+"_mc",MENU.getNextHighestDepth()); c.POSITION = LENGTH; var cp:MovieClip = c.createEmptyMovieClip("poignee_mc",c.getNextHighestDepth()); var cp_mcl:MovieClipLoader = new MovieClipLoader(); var cp_mcli:Object = new Object(); cp_mcli.onLoadInit = function(mc:MovieClip):Void { cp.onRelease = function() { LIST[c.POSITION].clic(); } } cp_mcl.addListener(cp_mcli); cp_mcl.loadClip(poignee_mc,cp); this.clip = c; c._x = LENGTH * (RUBRIQUE_WIDTH+RUBRIQUE_SPACER); this.xml = xml; this.css = css; this.t = t; this.banniere = banniere; LENGTH++; LIST.push(this); creerVignette(nom,xml,t,this); if (DEBUG == 1) trace("- Création RUBRIQUE "+nom+" / XML "+xml+" / BANNIERE "+banniere); } public function getEtat():Number { return this.etat; } public function setEtat(etat:Number):Void { this.etat = etat; } /** Fonction de création de vignette * @author Dhaya Benmessaoud * @version 1.0 (08-03-2007) * @param nom Nom de la vignette * @param xml Chemin des données XML * @param t Tableau de données pour les Etiquettes * @param classe Instance de la classe courante */ public function creerVignette(nom:String,xml:String,t:Array,classe:Rubrique) { var docXML:XML = new XML(); docXML.ignoreWhite = true; docXML.load(xml); docXML.onLoad = function (success) { if (success) { var attr:Object = new Object(); attr.nom = nom; attr.longueur = t[1]; attr.hauteur = t[2]; attr.rubriques = new Array(); for (var i:Number = 0; i< docXML.firstChild.childNodes.length; i++) { attr.rubriques[i] = new Array(docXML.firstChild.childNodes[i].childNodes.length,docXML.firstChild.childNodes[i].attributes.couleur,docXML.firstChild.childNodes[i].attributes.id); } var v:Vignette = new Vignette(classe, attr); classe.vignette = v; } } } /** Fonction déclenchée lors du clic sur la poignée d'une Rubrique * @author Dhaya Benmessaoud * @version 1.0 (05-03-2007) */ public function clic():Void { if (DEBUG == 1) trace("+ CLIC sur "+this.nom+" / ETAT "+getEtat()); if (getEtat() == 0) { this.ouvrir(); if (this.vignette.getEtat() == 0) this.vignette.clic(); } else { this.fermer(); if (this.vignette.getEtat() == 1) this.vignette.clic(); } } /** Création du conteneur de données XML * @author Dhaya Benmessaoud * @version 1.0 (05-03-2007) */ public function ouvrir(Void):Void { this.setEtat(1); var clipOuvert:MovieClip = this.clip.createEmptyMovieClip(this.nom+"_ouvert_mc",this.clip.getNextHighestDepth()); clipOuvert._x = RUBRIQUE_WIDTH; this.chargementXML(this, clipOuvert); } /** Destruction du conteneur de données XML * @author Dhaya Benmessaoud * @version 1.0 (05-03-2007) */ public function fermer(Void):Void { this.setEtat(0); var clipOuvert:MovieClip = eval("this.clip."+this.nom+"_ouvert_mc"); clipOuvert.removeMovieClip(); redimensionner(); } /** Chargement des données XML * @author Cathy Carvalho * @version 1.0 (05-03-2007) * @param classe Instance de la classe courante * @param clipOuvert MovieClip du conteneur */ function chargementXML(classe:Rubrique, clipOuvert:MovieClip):Void { if (DEBUG == 1) trace(" + Chargement XML "+this.xml); var docXML:XML = new XML(); docXML.ignoreWhite = true; docXML.load(this.xml); docXML.onLoad = function (success:Boolean):Void { if (success) { classe.chargementCSS(classe, docXML, clipOuvert, classe.t); } }; } /** Chargement des données CSS et Tween d'ouverture * @author Cathy Carvalho * @author Dhaya Benmessaoud * @version 1.0 (05-03-2007) * @param classe Instance de la classe courante * @param docXML Données XML * @param clipOuvert MovieClip du conteneur * @param t Tableau des données pour les Etiquettes */ public function chargementCSS(classe:Rubrique, docXML:XML, clipOuvert:MovieClip, t:Array):Void { if (DEBUG == 1) trace(" + Chargement CSS "+this.css); var styles:TextField.StyleSheet = new TextField.StyleSheet(); styles.onLoad = function (success:Boolean):Void { if (success) { if (DEBUG == 1) trace(" - MenuDoc sur "+clipOuvert); var document:MenuDoc = new MenuDoc(docXML, styles, clipOuvert, t); /* Animation graduée d'ouverture de l'accordéon */ var w:Number = clipOuvert._width + RUBRIQUE_SPACER; var cache:MovieClip = clipOuvert._parent.createEmptyMovieClip("dummy",clipOuvert._parent.getNextHighestDepth()); cache._x = RUBRIQUE_WIDTH; cache.beginFill(0x000000); cache.lineTo(0,0); cache.lineTo(w,0); cache.lineTo(w,RUBRIQUE_HEIGHT); cache.lineTo(0,RUBRIQUE_HEIGHT); cache.lineTo(0,0); cache.endFill(); var tween_lst:Object = new Object(); var tween:Tween = new Tween(clipOuvert,"_width",mx.transitions.easing.Regular.easeOut,0,w,0.5,true); tween.addListener(tween_lst); tween_lst.onMotionChanged = function(tw:Tween, pos:Number):Void { cache._width = pos; classe.redimensionner(); } tween_lst.onMotionFinished = function(tw:Tween):Void { var tween2_lst:Object = new Object(); var tween2:Tween = new Tween(cache,"_alpha", mx.transitions.easing.Regular.easeOut,100,0,0.2,true); tween2.addListener(tween2_lst); tween2_lst.onMotionFinished = function(tw:Tween):Void { cache.removeMovieClip(); } } } } styles.load(this.css); } /** Redimensionnement des Rubriques * @author Dhaya Benmessaoud * @version 1.0 (05-03-2007) */ public function redimensionner(Void):Void { if (LIST.length > 1) { for (var i:Number=1; i Stage.width && DEPLACE_OK == 1 && MENU._parent._ymouse < MENU._y + MENU._height) { var zone:Number = Stage.width/8; if (MENU._parent._xmouse < zone) { var p:Number = (MENU._parent._xmouse - zone) / 100; VITESSE = -p * VITMAX; if (MENU._x < -VITESSE) { MENU._x += VITESSE; MENU._parent.ban_mc.ban.deplacePlans(-VITESSE); } else { MENU._x = 0; } } else if (MENU._parent._xmouse > Stage.width - zone) { var p:Number = (MENU._parent._xmouse - (Stage.width - zone)) / 100; VITESSE = -p * VITMAX; if (MENU._x > Stage.width - MENU._width - VITESSE) { MENU._x += VITESSE; MENU._parent.ban_mc.ban.deplacePlans(-VITESSE); } else { MENU._x = Stage.width - MENU._width; } } else if (VITESSE > 1) { VITESSE -= VITESSE/10; if (MENU._x < -VITESSE) { MENU._x += VITESSE; MENU._parent.ban_mc.ban.deplacePlans(-VITESSE); } else { MENU._x = 0; } } else if (VITESSE < -1) { VITESSE -= VITESSE/10; if (MENU._x > Stage.width - MENU._width - VITESSE) { MENU._x += VITESSE; MENU._parent.ban_mc.ban.deplacePlans(-VITESSE); } else { MENU._x = Stage.width - MENU._width; } } } } }