<?xml version="1.0" encoding="utf-8"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<s:Application 
            xmlns:fx="http://ns.adobe.com/mxml/2009"
            xmlns:s="library://ns.adobe.com/flex/spark"
            xmlns:mx="library://ns.adobe.com/flex/mx"
            width="100%" height="800"
            initialize="initApp()">

    <fx:Script>
    <![CDATA[

        import mx.core.UIComponent;
        import mx.collections.*;
        import mx.core.mx_internal;
        use namespace mx_internal;


        [Bindable] private var theList:ArrayCollection = new ArrayCollection();
        [Bindable] private var theListView:ListCollectionView = new ListCollectionView (theList);
        private var iterator:int = 0;
        private var connection:LocalConnection;
        private var commandconnection:LocalConnection;
        private var pixelconnection:LocalConnection;
        private var pixelcommandconnection:LocalConnection;
        private var mouseconnection:LocalConnection;
        private var mousecommandconnection:LocalConnection;
        private var objectconnection:LocalConnection;
        private var objectcommandconnection:LocalConnection;
        private var playbackconnection:LocalConnection;
        private var playbackcommandconnection:LocalConnection;

        private function initApp():void
        {

            theListView.filterFunction = filterData;

            connection = new LocalConnection();
            connection.allowDomain("*");
            connection.client = this;

            commandconnection = new LocalConnection();
            commandconnection.allowDomain("*");
            commandconnection.addEventListener(StatusEvent.STATUS, statusHandler);

            pixelconnection = new LocalConnection();
            pixelconnection.allowDomain("*");
            pixelconnection.client = this;

            pixelcommandconnection = new LocalConnection();
            pixelcommandconnection.allowDomain("*");
            pixelcommandconnection.addEventListener(StatusEvent.STATUS, statusHandler);

            mouseconnection = new LocalConnection();
            mouseconnection.allowDomain("*");
            mouseconnection.client = this;

            mousecommandconnection = new LocalConnection();
            mousecommandconnection.allowDomain("*");
            mousecommandconnection.addEventListener(StatusEvent.STATUS, statusHandler);

            objectconnection = new LocalConnection();
            objectconnection.allowDomain("*");
            objectconnection.client = this;

            objectcommandconnection = new LocalConnection();
            objectcommandconnection.allowDomain("*");
            objectcommandconnection.addEventListener(StatusEvent.STATUS, statusHandler);

            playbackconnection = new LocalConnection();
            playbackconnection.allowDomain("*");
            playbackconnection.client = this;

            playbackcommandconnection = new LocalConnection();
            playbackcommandconnection.allowDomain("*");
            playbackcommandconnection.addEventListener(StatusEvent.STATUS, statusHandler);

            connect();
            
            toggleSniffersEnabled();
        }

        private function connect():void
        {
            try
            {
                connection.connect("_EventSniffer");
            }
            catch (e:Error)
            {
                appendLog("connection failed");
            }

            try
            {
                pixelconnection.connect("_PixelSniffer");
            }
            catch (e:Error)
            {
                appendLog("pixel connection failed");
            }

            try
            {
                mouseconnection.connect("_MouseSniffer");
            }
            catch (e:Error)
            {
                appendLog("mouse connection failed");
            }

            try
            {
                objectconnection.connect("_ObjectSniffer");
            }
            catch (e:Error)
            {
                appendLog("object connection failed");
            }

            try
            {
                playbackconnection.connect("_PlaybackSniffer");
            }
            catch (e:Error)
            {
                appendLog("playback connection failed");
            }
        }

        private function statusHandler(event:Event):void
        {
        }

        [Bindable]
        public var enableLogging:Boolean = true;

        public function enableSniffer():void
        {
            enableLogging = true;
        }

        public function disableSniffer():void
        {
            enableLogging = false;
        }

        /**
        * Called by the sniffer.
        **/
        public function appendLog(info:Object):void
        {
            if (!enableLogging)
                return;

            /**
                if (eventName==null) 
                {
                    eventName=" ";
                }
                if (event==null) 
                {
                    event=" ";
                }
            **/

            iterator++;

/**
            trace ("RECEIVED item " + iterator + ":");
            trace ("    dataSource: " + info.dataSource); // Event, Object, Mouse...
            trace ("    target: " + info.target);
            trace ("    eventName: " + info.eventName);
            trace ("    event: " + info.event);
**/
                        
            theList.addItem ({sequence:iterator, dataSource:info.dataSource, target:info.target, event:info.event, eventName:info.eventName});
            /// call refresh
            theListView.refresh();
        }

        public function filterData (o:Object):Boolean { 

            // Do the easy event check before the more expensive ones.
            if (o.dataSource == "Event"){
                if (!eventsList.selected)
                    return false;

                if (rbIncludeEvents.selected && (eventMap[o.eventName] != 1 && !match(o.eventName, eventWildCards)))
                    return false;
    
                if (rbExcludeEvents.selected && (eventMap[o.eventName] == 1 || match(o.eventName, eventWildCards)))
                    return false;
            }

            if (!mouseList.selected && (o.dataSource == "Mouse" || o.dataSource == "Pixel" ))
                return false;

            if (!mustellaOutputList.selected && o.dataSource == "Mustella_Output")
                return false;

            if (!objectList.selected && o.dataSource == "Object")
                return false;

            if (rbIncludeTargets.selected && (targetMap[o.target] != 1 && !match(o.target, targetWildCards)))
                return false;

            if (rbExcludeTargets.selected && (targetMap[o.target] == 1 || match(o.target, targetWildCards)))
                return false;

            return true;
        }

        /**
        * Enable or disable sniffers based on the checkboxes.
        * This is called locally when the checkboxes are changed,
        * and remotely by other sniffers when the SWF under test
        * starts up.
        **/
        public function toggleSniffersEnabled():void{

            if(eventsList.selected == true){
                commandconnection.send("_EventSnifferCommands", "enableSniffer");
            }else{
                commandconnection.send("_EventSnifferCommands", "disableSniffer");
            }

            if(mouseList.selected == true){
                mousecommandconnection.send("_MouseSnifferCommands", "enableSniffer");
                pixelcommandconnection.send("_PixelSnifferCommands", "enableSniffer");
            }else{
                mousecommandconnection.send("_MouseSnifferCommands", "disableSniffer");
                pixelcommandconnection.send("_PixelSnifferCommands", "disableSniffer");
            }
        }

        private function scrollLog():void
        {
            if (log.maxVerticalScrollPosition != log.verticalScrollPosition)
                log.verticalScrollPosition = log.maxVerticalScrollPosition;
        }

        private var _targetList:String;
        private var targetListChanged:Boolean = false;

        public function get targetList():String
        {
            var s:String = targets.text;
            s = s.replace("\r", ",");
            return s;
        }

        public function set targetList(s:String):void
        {
            _targetList = s;
            targetListChanged = true;
            invalidateProperties();
        }

        private var _eventList:String;
        private var eventListChanged:Boolean = false;

        public function get eventList():String
        {
            var s:String = events.text;
            s = s.replace("\r", ",");
            return s;
        }

        public function set eventList(s:String):void
        {
            _eventList = s;
            eventListChanged = true;
            invalidateProperties();
        }

        private var filterChanged:Boolean = false;

        /**
        * If the target or event include/exclude lists
        * changed, process the new settings.
        **/
        override protected function commitProperties():void
        {
            var s:String;
            var n:int;
            var i:int;

            if (eventListChanged)
            {
                eventListChanged = false;
                s = _eventList.replace(",", "\r");
                events.text = s;
                filterChanged = true;
            }

            if (targetListChanged)
            {
                targetListChanged = false;
                s = _targetList.replace(",", "\r");
                targets.text = s;
                filterChanged = true;
            }

            if (filterChanged)
            {
                filterChanged = false;

                s = events.text;
                var names:Array = s.split("\r");
                n = names.length;
                eventMap = {};
                eventWildCards = [];
                for (i = 0; i < n; i++)
                {
                    s = names[i];
                    if (s.indexOf('*') >= 0)
                        eventWildCards.push(s);
                    else
                        eventMap[names[i]] = 1;
                }

                s = targets.text;
                names = s.split("\r");
                n = names.length;
                targetMap = {};
                targetWildCards = [];
                for (i = 0; i < n; i++)
                {
                    s = names[i];
                    if (s.indexOf('*') >= 0)
                        targetWildCards.push(new RegExp(s.replace("*", ".*")));
                    else
                        targetMap[names[i]] = 1;
                }

            }

            super.commitProperties();
            theListView.refresh();
        }

        private var eventMap:Object = {};
        private var targetMap:Object = {};

        private var eventWildCards:Array = [];
        private var targetWildCards:Array = [];

        private function changeFilter():void
        {
            filterChanged = true;
            invalidateProperties();
        }

        private function match(target:String, wildCards:Array):Boolean
        {
            var n:int = wildCards.length;
            for (var i:int = 0; i < n; i++)
            {
                if (RegExp(wildCards[i]).test(target))
                    return true;
            }
            return false;
        }

        private function getAProperty():void
        {
            objectcommandconnection.send("_ObjectSnifferCommands", "dumpObject", target.text);
        }

        private function listAllProperties():void
        {
            objectcommandconnection.send("_ObjectSnifferCommands", "listProperties", target.text);
        }

        [Bindable]
        public var paused:Boolean = true;

        public function getPausedState():void
        {
            if (paused)            
                pausePlayback();
        }                

        public function pausePlayback():void
        {
            paused = true;
            playbackcommandconnection.send("_PlaybackCommands", "pause")
        }

        public function playback():void
        {
            paused = false;
            playbackcommandconnection.send("_PlaybackCommands", "playback")
        }

        public function stepit():void
        {
            playbackcommandconnection.send("_PlaybackCommands", "step")
        }

        /**
        * Someone has changed the Events, Mouse Stuff,
        * Test Output, or Objects checkbox(es).
        **/
        private function handleSnifferListChange(e:Event):void{
            theListView.refresh();
            toggleSniffersEnabled();            
        }
    ]]>
    </fx:Script>

    <s:layout>
        <s:VerticalLayout />
    </s:layout>

	<mx:Spacer width="1024" />

    <!-- Each row of data looks like this: {sequence, dataSource, target, event, eventName} -->
    <mx:DataGrid id="log" dataProvider="{theListView}" rowCount="20" width="100%" updateComplete="scrollLog()" > 
           <mx:columns>
                   <mx:DataGridColumn dataField="sequence" dataTipField="sequence" headerText="#" width="80" editable="false"/>
                   <mx:DataGridColumn dataField="target" dataTipField="target" headerText="Target" width="1000" editable="false" itemRenderer="mx.controls.Label"/>
                   <mx:DataGridColumn dataField="eventName" dataTipField="eventName" headerText="Event Name" width="1000" editable="false" itemRenderer="SnifferCellRenderer">
            </mx:DataGridColumn>
           </mx:columns>
    </mx:DataGrid>

    <mx:HBox width="100%" defaultButton="{events}" borderStyle="solid" paddingTop="1" paddingBottom="1" paddingLeft="1" paddingRight="1">
        <mx:Label text="Filter by Type: "/>
        <mx:CheckBox id="eventsList" selected="true" label="Events" change="handleSnifferListChange(event)" />
        <mx:CheckBox id="mustellaOutputList" selected="true" label="Test Output"  change="handleSnifferListChange(event)" />
        <mx:CheckBox id="objectList" selected="true" label="Objects"  change="handleSnifferListChange(event)" />
        <mx:CheckBox id="mouseList" selected="false" label="Mouse Stuff" change="handleSnifferListChange(event)" />
    </mx:HBox>

    <mx:Box width="100%" borderStyle="solid" paddingTop="1" paddingBottom="1"
                            paddingLeft="1" paddingRight="1" enabled="{eventsList.selected}" >
        <mx:Label text="Filter by Target/Event: " />
        <mx:HBox width="100%" >
            <mx:HBox width="50%" borderStyle="solid" paddingTop="1" paddingBottom="1" paddingLeft="1" paddingRight="1">
                <mx:Box width="20%">
                <mx:RadioButton id="rbIncludeTargets" groupName="targetRB" label="include targets"/>
                <mx:RadioButton id="rbExcludeTargets" groupName="targetRB" label="exclude targets" selected="true" />
                </mx:Box>
                <mx:Box width="80%">
                <mx:TextArea id="targets" width="100%" height="100" focusOut="changeFilter()"/>
                </mx:Box>
            </mx:HBox>
            <mx:HBox width="50%" borderStyle="solid" paddingTop="1" paddingBottom="1" paddingLeft="1" paddingRight="1">
                <mx:Box width="20%">
                <mx:RadioButton id="rbIncludeEvents" groupName="eventRB" label="include events"/>
                <mx:RadioButton id="rbExcludeEvents" groupName="eventRB" label="exclude events" selected="true"/>
                </mx:Box>
                <mx:Box width="80%">
                <mx:TextArea id="events" width="100%" height="100" focusOut="changeFilter()"/>
                </mx:Box>
            </mx:HBox>
        </mx:HBox>
    
        <mx:Button label="Apply Filters"  click="changeFilter()" />    
    </mx:Box>

    <mx:HBox width="100%" defaultButton="{getProperty}" enabled="{objectList.selected}" >
        <mx:TextInput width="100%" id="target"/>
        <mx:Button id="getProperty" label="Get Property" click="getAProperty()" />
        <mx:Button id="listProperties" label="List Properties" click="listAllProperties()" />
    </mx:HBox>

    <s:Group width="100%">
        <s:Rect id="headerBackground" left="0" right="0" top="0" height="24">
            <s:fill>
                <s:SolidColor color="0xCCCCCC" />
            </s:fill>
        </s:Rect>

        <s:HGroup width="100%">
            <s:HGroup width="100%" paddingLeft="5">
                <s:Label text="Playback Control:" paddingTop="5"/>
                <s:Button id="pause" label="Pause" enabled="{!paused}" click="pausePlayback()" skinClass="skins.pauseButtonSkin" />
                <s:Button id="play" label="Play" enabled="{paused}" click="playback()" skinClass="skins.playButtonSkin" />
                <s:Button id="step" label="Step" enabled="{paused}" click="stepit()" skinClass="skins.stepButtonSkin" />
            </s:HGroup>

            <s:HGroup width="100%" >
                <s:Label text="Logging:" paddingTop="5" />
                <s:Button label="start" enabled="{!enableLogging}" click="enableSniffer()" />
                <s:Button label="stop" enabled="{enableLogging}" click="disableSniffer()" />
                <s:Button label="mark" click="appendLog({dataSource:'Marker', target:'------------ ' + getTimer() + ' -------------', event:'', eventName:''})" />
                <s:Button label="clear" click="theList.removeAll(); iterator=0;" />
                <s:Label id="pixel" text="Current Pixel Color" visible="false" />
            </s:HGroup>
    
        </s:HGroup>
    </s:Group>

</s:Application>
