<?xml version="1.0"?>
<!--
  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.
  -->

<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx"
				paddingBottom="0" paddingTop="0" paddingLeft="0" paddingRight="0"
				height="100%" width="100%">

     <fx:Script>
        <![CDATA[
            import mx.effects.DefaultTileListEffect;
            import mx.effects.easing.Elastic;
            import mx.collections.ArrayCollection;
            import mx.effects.Move;
            
            [Bindable]
            private var myDP:ArrayCollection = new ArrayCollection(
                ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P']);

            private function deleteItems():void {
                // As each item is removed, the index of the other items changes.
                // So first get the items to delete, then determine their indices
                // as you remove them.
                var toRemove:Array = [];
                for (var i:int = 0; i < tlist0.selectedItems.length; i++)
                    toRemove.push(tlist0.selectedItems[i]);
                for (i = 0; i < toRemove.length; i++)
                    myDP.removeItemAt(myDP.getItemIndex(toRemove[i]));
            }

            private var zcount:int = 0;
            private function addItems():void {
                myDP.addItemAt("Z"+zcount++,Math.min(2,myDP.length));
            }            
        ]]>
    </fx:Script>
    
	<fx:Declarations>
	    <!-- Define an instance of the DefaultTileListEffect effect, 
	         and set its moveDuration and color properties. -->
	    <mx:DefaultTileListEffect id="myDTLE" 
	        moveDuration="100" 
	        color="0x0000ff"/>
	</fx:Declarations>

    <mx:Panel title="DefaultTileListEffect Example"
				paddingBottom="10" paddingTop="10" paddingLeft="10" paddingRight="10"
				height="100%" width="100%">

        <mx:TileList id="tlist0" 
            height="100%" width="100%" 
            columnCount="4" rowCount="4" 
            fontSize="18" fontWeight="bold"
            direction="horizontal" 
            dataProvider="{myDP}" 
            allowMultipleSelection="true" 
            offscreenExtraRowsOrColumns="2" 
            itemsChangeEffect="{myDTLE}" />
    
        <mx:Button 
            label="Delete selected item(s)" 
            click="deleteItems()"/>
        <mx:Button 
            label="Add item" 
            click="addItems()"/>

    </mx:Panel> 
</mx:Module>
