<?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.DefaultListEffect;
            import mx.collections.ArrayCollection;
            
            [Bindable]
            private var myDP:ArrayCollection = new ArrayCollection(
                ['A','B','C','D','E','F','G','H']);
            
            private function deleteItem():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 < list0.selectedItems.length; i++)
                    toRemove.push(list0.selectedItems[i]);
                for (i = 0; i < toRemove.length; i++)
                    myDP.removeItemAt(myDP.getItemIndex(toRemove[i]));
            }

            private var zcount:int = 0;
            private function addItem():void {
                // Always add the new item after the third item,
                // or after the last item if the length is less than 3.
                myDP.addItemAt("Z"+zcount++,Math.min(3,myDP.length));
            }            
        ]]>
    </fx:Script>

	<fx:Declarations>
	    <!-- Define an instance of the DefaultListEffect effect, 
	         and set its fadeOutDuration and color properties. -->
	    <mx:DefaultListEffect id="myDLE" 
	        fadeOutDuration="1000" 
	        color="0x0000ff"/>
	</fx:Declarations>

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

        <mx:List id="list0" 
            width="150"
            dataProvider="{myDP}" 
            variableRowHeight="true" 
            fontSize="18" 
            allowMultipleSelection="true" 
            itemsChangeEffect="{myDLE}"/>
    
        <mx:Button 
            label="Delete item" 
            click="deleteItem()"/>
        <mx:Button 
            label="Add item" 
            click="addItem()"/>

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