<?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:Application 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:Application>