<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication 
    width="531" height="403"
    backgroundColor="#6075C4"
    layout="absolute"
    title="Silly File Listing"
    viewSourceURL="srcview/index.html"
    xmlns:local="*"
    xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
            private var fileSystemWorker:IFileSystemSearcher;

            private function buttonClickHandler():void
            {
                if (!currentState || currentState == "")
                    searchFiles();
                else
                    cancelSearch();
            }

            private function searchFiles():void
            {
                addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                currentState = "processing";
                pathsFound = "";
                fileSystemWorker = new FileSystemSearcher();
                fileSystemWorker.addEventListener(FileSystemSearcherEvent.FILES_READY, filesReadyHandler);
                fileSystemWorker.addEventListener(FileSystemSearcherEvent.COMPLETE, filesCompleteHandler);
                fileSystemWorker.setup(File.userDirectory.nativePath, fileSearchTextInput.text);
                fileSystemWorker.go();
            }

            protected function enterFrameHandler(event:Event):void
            {
                if (!fileSystemWorker)
                {
                    removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
                    return;
                }
                fileSystemWorker.go();
            }

            [Bindable]private var pathsFound:String = "";

            private function filesReadyHandler(event:FileSystemSearcherEvent):void
            {
                for (var i:int = 0; i < event.files.length; i++)
                {
                    pathsFound += File(event.files[i]).nativePath + "\n";
                }
            }

            private function filesCompleteHandler(event:FileSystemSearcherEvent):void
            {
                closeSearch();
            }

            private function closeSearch():void
            {
                currentState = "";
                fileSystemWorker.removeEventListener(FileSystemSearcherEvent.FILES_READY, filesReadyHandler);
                fileSystemWorker.removeEventListener(FileSystemSearcherEvent.COMPLETE, filesCompleteHandler);
                fileSystemWorker.dispose();
                fileSystemWorker = null;
            }

            private function cancelSearch():void
            {
                closeSearch();
            }

            private function scrollPathFoundTextArea():void
            {
                pathsFoundTextArea.verticalScrollPosition = pathsFoundTextArea.maxVerticalScrollPosition;
            }
        ]]>
    </mx:Script>
    <mx:states>
        <mx:State name="processing">
            <mx:SetProperty target="{fileSearchTextInput}" name="enabled" value="false" />
            <mx:SetProperty target="{searchButton}" name="label" value="Cancel" />
            <mx:SetProperty target="{progressBar}" name="includeInLayout" value="true" />
            <mx:SetProperty target="{progressBar}" name="visible" value="true" />
            <mx:SetProperty target="{pathsFoundTextArea}" name="enabled" value="false" />
        </mx:State>
    </mx:states>

    <mx:TextInput id="fileSearchTextInput"
        x="10" y="10"
        width="245"
        disabledColor="#000000"
        enter="searchFiles()" />
    <mx:Button id="searchButton"
        x="265" y="10"
        click="buttonClickHandler()"
        label="Search" />
    <mx:TextArea id="pathsFoundTextArea"
        top="40" left="10" bottom="10" right="10"
        backgroundDisabledColor="#ffffff"
        disabledColor="#000000"
        text="{pathsFound}"
        valueCommit="scrollPathFoundTextArea()" />
    <mx:ProgressBar id="progressBar"
        left="10" right="10"
        verticalCenter="0"
        includeInLayout="false"
        indeterminate="true"
        label="Fetching files"
        labelPlacement="center"
        trackHeight="20"
        visible="false" />
</mx:WindowedApplication>