package {
    import flash.desktop.*;
    import flash.display.*;
    import flash.events.*;
    import flash.filesystem.*;
    import flash.net.*;
    import flash.text.*;

    [SWF(width="240", height="240", backgroundColor="#FFFFFF")]

    public class DragDropBmp extends Sprite
    {
        private var base:Sprite;            ///< ベース    
        private var textField:TextField;    ///< テキストフィールド
        private var loader:Loader;          ///< ローダー

        static public const
            WND_WIDTH:uint = 240,       ///< ウインドウの幅
            WND_HEIGHT:uint = 240;      ///< ウインドウの高さ

        public function DragDropBmp()
        {
            //ベースの生成
            base=new Sprite();
            base.graphics.beginFill(0xffffff);
            base.graphics.drawRect(0,0,WND_WIDTH,WND_HEIGHT);
            base.graphics.endFill();
            addChild(base);

            // loaderの作成
            loader = new Loader();
            base.addChild(loader);

            //リスナーの追加
            with(loader.contentLoaderInfo) {
                addEventListener(Event.COMPLETE,completeHandler);
                addEventListener(HTTPStatusEvent.HTTP_STATUS,httpStatusHandler);
                addEventListener(Event.INIT,initHandler);
                addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
                addEventListener(Event.OPEN,openHandler);
                addEventListener(ProgressEvent.PROGRESS,progressHandler);
                addEventListener(Event.UNLOAD,unLoadHandler);
            }

            //テキストフィールドの生成
            textField=new TextField();
            textField.text="画像ファイル(GIF,PNG,JPG)をこのウインドウにドラッグしてみて。";
            textField.autoSize=TextFieldAutoSize.LEFT;
            textField.wordWrap = true;
            textField.width = WND_WIDTH;
            textField.height = WND_HEIGHT;
            base.addChild(textField);

            //イベントの追加
            base.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,onDragEnter);
            base.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,onDragDrop);

        }

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

            // ウインドウの中央に
            loader.x = (WND_WIDTH - loader.width)/2;
            loader.y = (WND_HEIGHT - loader.height)/2;
        }

        //HTTPステータスイベントの処理
        private function httpStatusHandler(evt:HTTPStatusEvent):void {
            trace("HTTPステータス:"+evt);
        }

        //初期化イベントの処理
        private function initHandler(evt:Event):void {
            trace("初期化:"+evt);
        }

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

        //オープンイベントの処理
        private function openHandler(evt:Event):void {
            trace("オープン:"+evt);
        }

        //プログレスイベントの処理
        private function progressHandler(evt:ProgressEvent):void {
            trace("プログレス:"+evt.bytesLoaded+"/"+evt.bytesTotal);
        }

        //アンロードイベントの処理
        private function unLoadHandler(evt:Event):void {
            trace("アンロード:"+evt);
        }

        //ドラッグインイベントの処理
        public function onDragEnter(evt:NativeDragEvent):void {
            //クリップボードの取得
            var cb:Clipboard=evt.clipboard;

            //ドラッグ可能かどうかのチェック
            if ( cb.hasFormat(ClipboardFormats.URL_FORMAT) ) {
                //ドロップの許可
                NativeDragManager.acceptDragDrop(base);
            }
        }

        // ファイルパスから拡張子が合致するか調べる
        public function cmpFileExtension(filePath:String, fileExt:String):Boolean {

            // 本当は正規表現できっちりやったほうがよいと思うが、^がなんかうまく動かないので、とりあえず            
            var reg:RegExp = new RegExp(fileExt, "i");
            var ret:int = filePath.search(reg);

            if(ret == -1){
                return false;
            }

            if( (filePath.length-fileExt.length) == ret ){
                return true;
            }
            return false;
        }

        //ドロップイベントの処理
        public function onDragDrop(evt:NativeDragEvent):void {
            trace("onDragDrop");
            var result:String="DragDropBmp\n\n";

            //クリップボードの取得
            var cb:Clipboard=evt.clipboard;

            if (cb.hasFormat(ClipboardFormats.URL_FORMAT)) {
                var url:String=String(cb.getData(ClipboardFormats.URL_FORMAT));
                result+="URL:"+url+"\n\n";

                var file:File;
                var fsr:FileStream;

                if( cmpFileExtension(url, ".txt") ){

                    // テキストファイルの場合
                    file = new File(url);
                    fsr = new FileStream();
                    fsr.open(file,FileMode.READ);
                    result += fsr.readMultiByte(file.size,"utf-8");
                    fsr.close();

                }else if( cmpFileExtension(url, ".gif") ||
                    cmpFileExtension(url, ".png") ||
                    cmpFileExtension(url, ".jpg") ||
                    cmpFileExtension(url, ".jpeg")
                    ){

                    //  画像ファイルの場合
                    loader.load(new URLRequest(url));
                    trace(loader.width);
                }

            }

            textField.text=result;
        }

    }
}