/** * (c) JPH-DEV.NET 2007 * */ package { // import import flash.display.Bitmap; import flash.display.DisplayObject; import flash.display.Loader; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.ProgressEvent; import flash.net.LocalConnection; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.net.URLRequestMethod; import flash.text.TextField; import flash.events.MouseEvent; // import import Thumb; // import import de.alex_uhlmann.animationpackage.*; import de.alex_uhlmann.animationpackage.animation.*; import de.alex_uhlmann.animationpackage.drawing.*; import de.alex_uhlmann.animationpackage.utility.*; import com.robertpenner.easing.*; /** * Document Class. * Dokument Klasse der Applikation. * * @author Jean-Pascal Hövel * */ public dynamic class Main extends MovieClip { /************************************************************************** PUBLIC-VARS ***************************************************************************/ /** * Ladebalken der in der * imageviewer.fla definiert wurde und dort * angepasst werden kann. * */ public var progressBar:MovieClip; /** * TextField das in der * imageviewer.fla definiert wurde und dort * angepasst werden kann. * */ public var statusField:TextField; /** * TextField das in der * imageviewer.fla definiert wurde und dort * angepasst werden kann. * */ public var percentField:TextField; /** * Clip der in der * imageviewer.fla definiert wurde und dort * angepasst werden kann. * */ public var blend:Sprite; /** * Clip der in der * imageviewer_full.fla definiert wurde und dort * angepasst werden kann. * */ public var box:Sprite; /************************************************************************** PRIVATE-VARS ***************************************************************************/ /** * Speichert die geladenen * Bilder. * */ private var images:Array = []; /** * Speichert die aktiven * Bilder. * */ private var pool:Array = []; /** * Halter für Bilder. * */ private var imageHolder:Sprite; /** * Speichert den Index des Momentan * ladenden Bildes. * */ private var currentImage:int = 0; /** * Speichert den Loader. * */ private var loader:Loader; /** * Pausiert die Bilder. * */ private var pause:Boolean; /************************************************************************** CONTRUCTOR ***************************************************************************/ /** * Konstruktor. * */ public function Main(){ // progressBar resetten progressBar.gotoAndStop(0); // blend verstecken blend.alpha = 0; // blend ausrichten blend.width = parent.stage.stageWidth; blend.height = parent.stage.stageHeight; // imageHolder erzeugen imageHolder = new Sprite(); // listener anmelden imageHolder.addEventListener(MouseEvent.ROLL_OVER, function(){ pause = true; }); imageHolder.addEventListener(MouseEvent.ROLL_OUT , function(){ pause = false; }); } /************************************************************************** PUBLIC-METHODS ***************************************************************************/ public function run():void { status = 'Fordere Bilder-Liste an...'; // bildlisten request var request:URLRequest = new URLRequest('iv.php'); request.data = 'command=list&random=' + new Date().time; request.method = URLRequestMethod.POST; // loader var loader:URLLoader = new URLLoader(); // listener loader.addEventListener(Event.COMPLETE , handleImageList); loader.addEventListener(IOErrorEvent.IO_ERROR, handleConnectionError); // senden loader.load(request); } /************************************************************************** PRIVATE-METHODS ***************************************************************************/ /** * Läd Bild für Bild. * */ private function loadThumbs(event:Event = null):void { // wenn kein folge bild von vorne beginnen... if(event === null) { currentImage = 0; } else { // listener vom momentanen löschen images[currentImage].clip.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadThumbs); images[currentImage].clip.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, handleImageProgress); // clip umwandeln images[currentImage].clip = (images[currentImage].clip.contentLoaderInfo.content); // wenn noch bilder vohanden... if(currentImage + 1 < images.length) { currentImage++; } else { // loader resetten status = 'Laden beendet, initialisiere...'; percent = 0; // geladene bilder durchlaufen for(var i:int = 0; i < images.length; i++) { // referenz holen var current:DisplayObject = images[i].clip; // sprite erzeugen images[i].clip = new Sprite(); // sprite übernehmen images[i].clip.addChild(current); // thumb erzeugen images[i].thumb = new Thumb(images[i].name, images[i].clip); // prozent berechnen percent = Math.round((i / (images.length - 1)) * 100); } // main adden imageHolder = addChild(imageHolder); // benachrichtigen status = 'Fertig!'; // loader ausblenden new Alpha(blend, 1, 1000).animate(0, 100); // erstes bild in den pool aufnehmen var first:Object = images.shift(); var clip:Sprite = imageHolder.addChild(first.clip); clip.x = (clip.width + 1) * -1; first.clip = clip; pool.push(first); // bewegung einleiten.. addEventListener(Event.ENTER_FRAME, handleEnterFrame); // beenden return; } } var r:URLRequest = new URLRequest('iv.php'); r.data = 'command=thumb&image=' + (images[currentImage].name) + '&random=' + new Date().time; r.method = URLRequestMethod.POST; images[currentImage].clip = new Loader(); images[currentImage].clip.contentLoaderInfo.addEventListener(Event.COMPLETE, loadThumbs); images[currentImage].clip.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, handleImageProgress); images[currentImage].clip.load(r); status = 'Lade Thumb "' + images[currentImage].name + '" (' + (currentImage + 1) + '/' + images.length + ')'; } /************************************************************************** PRIVATE-SETTER ***************************************************************************/ /** * Legt den Statustext fest. * * @param message * */ private function set status(message:String):void { statusField.text = message; } /** * Legt die Prozentanzeige fest. * * @param message * */ private function set percent(value:Number):void { // feld updaten percentField.text = value.toString() + '%'; // bar updaten progressBar.gotoAndStop(Math.round((progressBar.totalFrames / 100) * value)); } /************************************************************************** EVENT-HANDLER ***************************************************************************/ /** * Behandelt empfangene * Antworten. * * @param event * */ private function handleImageList(event:Event):void { var data:String = event.target.data; // wenn daten empfangen... if(data is String) { try { // xml erzeugen var listXML:XML = new XML(data); listXML.ignoreWhitespace = true; if(listXML.elements('image') is XMLList) { // liste holen var list:XMLList = listXML.elements('image'); // wenn einträge vorhanden... if(list.length() > 0) { // bilder durchlaufen... for(var i:int = 0; i < list.length(); i++) { if(list[i].@file is XMLList) { // mitteilen status = 'Lese Bild: ' + list[i].@file; // bild informationen speichern images.push({name:list[i].@file, clip:null}); } else { status = 'Fehler: Keine gueltige Liste erhalten.'; break; } } // bilder laden loadThumbs(); } else status = 'Fehler: Bild-Liste ist leer'; } else status = 'Fehler: Keine gueltige Liste erhalten.'; } catch(error:Error) { status = 'Fehler: Keine gueltige Liste erhalten.'; } } else status = 'Fehler: Keine gueltige Liste erhalten.'; } /** * Zeigt den Ladestatus des aktuellen Bildes * an. * * @param event ProgressEvent */ private function handleImageProgress(event:ProgressEvent):void { percent = Math.round((event.bytesLoaded / event.bytesTotal) * 100); } /** * Behandlet Fehler bei Anfragen. * * @param event * */ private function handleConnectionError(event:IOErrorEvent):void { status = 'Fehler: Keine Verbindung.'; } /** * Bewegt die Bilder von links nach rechts * in einer Endlosschleife. * * @param event * */ private function handleEnterFrame(event:Event):void { // wenn nicht pausiert.. if(!pause) { // pool durchlaufen.. for(var i:Number = 0; i < pool.length; i++) { // wenn letzes element... if(i == pool.length - 1 || pool.length == 1) { if(pool[i].clip.x >= 0) { // nächstes holen var next:Object = images.shift(); // adden var clip:Sprite = imageHolder.addChild(next.clip); // positionieren clip.x = (clip.width + 1) * -1; // clip ersetzen next.clip = clip; // pool anhängen pool.push(next); } } // wenn erstes element... else if(i == 0) { // wenn ausserhalb der bühne... if(pool[i].clip.x >= parent.stage.stageWidth) { // löschen imageHolder.removeChild(pool[i].clip); // images wieder anhängen images.push(pool.shift()); // beenden break; } } // bewegen pool[i].clip.x += 2; } } } } }