package {
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;
    import flash.utils.*;
    import flash.filters.*;
    import flash.net.*;

    [SWF(width="400", height="400", backgroundColor="#FFFFFF", frameRate="30")]

    public class SwfLoader extends Sprite
    {
        private var swfLoader:Loader;           ///< SWF読み込み用Loader
        private var text:TextField;             ///< 画面に表示するテキスト
        private var textFormat:TextFormat;      ///< テキストフォーマット
        private var loadSwfName:String = "";    ///< 読み込んだSWFの名前

        static public const
            SCREEN_W:int = 400,                 ///< 画面の幅
            SCREEN_H:int = 400;                 ///< 画面の高さ

        public function SwfLoader()
        {
            /// 角マル矩形をとりあえず、このSWFのモノとして描画
            var filter:Array = new Array;
            filter.push( new DropShadowFilter() );

            var rrect:Shape = makeRoundRect(120, 120, 20, 0x007700);
            rrect.x = 200;
            rrect.y = 200;
            rrect.filters = filter;
            addChild(rrect);

            /// Loader追加
            swfLoader = new Loader();
            addChild(swfLoader);

            //イベントリスナーの追加
            with(swfLoader.contentLoaderInfo) {
                addEventListener(ProgressEvent.PROGRESS,progressHandler);
                addEventListener(Event.COMPLETE,completeHandler);
                addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
                addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
            }

            // 画面に表示するテキスト
            textFormat = TextButton.makeTextFormat(24, 0x000000);
            text = new TextField();
            text.x = 10;
            text.width = SCREEN_W;
            text.mouseEnabled = false;
            text.selectable = false;
            addChild(text);
            setText("LOADボタンを押すとSWFの読み込み");

            /// ボタン追加
            var load1Button:TextButton = new TextButton(80, 20, "LOAD1");
            load1Button.x = 10;
            load1Button.y = text.y + text.textHeight + 10;
            addChild(load1Button);
            load1Button.addEventListener( MouseEvent.CLICK, load1ButtonClick );

            var load2Button:TextButton = new TextButton(80, 20, "LOAD2");
            load2Button.x = 10;
            load2Button.y = load1Button.y + load1Button.height + 10;
            addChild(load2Button);
            load2Button.addEventListener( MouseEvent.CLICK, load2ButtonClick );

            var clearButton:TextButton = new TextButton(80, 20, "CLEAR");
            clearButton.x = 10;
            clearButton.y = load2Button.y + load2Button.height + 10;
            addChild(clearButton);
            clearButton.addEventListener( MouseEvent.CLICK, clearButtonClick );

            /// とりあえずload2Buttonを押しとく
            load2ButtonClick(null);
        }

        /**
         * 画面に指定の文字列を表示
         * @param str 表示する文字列
         */
        private function setText(str:String):void{
            text.text = str;
            text.setTextFormat(textFormat);
        }

        /**
         * load1ボタンが押された時の処理
         * @param event
         */
        private function load1ButtonClick(event:MouseEvent):void
        {
            var loadFile:String = "http://shin-ishimaru.cocolog-nifty.com/swf/AS30/ShapeRot.swf";
            loadSwf(loadFile);
            loadSwfName = "ShapeRot.swf";
        }

        /**
         * load2ボタンが押された時の処理
         * @param event
         */
        private function load2ButtonClick(event:MouseEvent):void
        {
            var loadFile:String = "http://shin-ishimaru.cocolog-nifty.com/swf/AS30/VectorMove.swf";
            loadSwf(loadFile);
            loadSwfName = "VectorMove.swf";
        }

        /**
         * CLEARボタンが押された時の処理
         * @param event
         */
        private function clearButtonClick(event:MouseEvent):void
        {
            loadSwf("");
            setText("読み込んだSWFの解放");
        }

        /**
        * SWFの読み込み処理
        * @param url SWFのURL
        */
        private function loadSwf(url:String):void {
            swfLoader.load(new URLRequest(url));
        }

        //プログレスイベントの処理
        private function progressHandler(evt:ProgressEvent):void {
            var rate:int=Math.floor((evt.bytesLoaded*100)/evt.bytesTotal);
            trace("ProgressHandler:"+rate);
            setText("読み込み:" + rate + "%");
        }

        //読み込み完了イベントの処理
        private function completeHandler(evt:Event):void {
            trace("読み込み完了:");
            setText(loadSwfName + "を読み込み");
        }

        //セキュリティエラーイベントの処理
        private function securityErrorHandler(evt:SecurityErrorEvent):void {
            trace("セキュリティエラー");
        }

        //IOエラーイベントの処理
        private function ioErrorHandler(evt:IOErrorEvent):void {
            trace("IOエラー");
        }

        //角丸矩形の生成
        private function makeRoundRect(w:uint,h:uint,ew:uint,color:uint):Shape {
            var rrect:Shape=new Shape();
            rrect.graphics.lineStyle(10,0x000000);    //線幅・線色
            rrect.graphics.beginFill(color);         //塗り潰し色
            rrect.graphics.drawRoundRect(0,0,w,h,ew);//XY座標,幅,高さ,角丸幅
            rrect.graphics.endFill();                //塗り潰し終了
            return rrect;
        }

    }
}