I have to do the same for a project the ui component is a combo box

kindly note: You will need some icons to be created you can listed to
the events being fired.

Added To Selection  Removed From Selection



******************************************************************

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas
        horizontalScrollPolicy="off" verticalScrollPolicy="off"
        xmlns:mx="http://www.adobe.com/2006/mxml";
        xmlns:flexlib="http://code.google.com/p/flexlib/";
        >


        <mx:Metadata>
        [ Event(name="addedToSelection",
type="com.yourcompany.common.events.ToFromListBoxChangeEvent") ]
        [ Event(name="removedFromSelection",
type="com.yourcompany.common.events.ToFromListBoxChangeEvent") ]
        [ Event(name="selectionChanged", type="flash.events.Event") ]
    </mx:Metadata>


        <mx:Script>
                <![CDATA[
                        import 
com.yourcompany.common.events.ToFromListBoxChangeEvent;
                        import mx.events.DragEvent;
                        import mx.collections.ArrayCollection;

                        /** Events fired due to data changes */
                        public static const ADDED_TO_SELECTION          : 
String                = 
"addedToSelection";
                        public static const REMOVED_FROM_SELECTION      : 
String                =  
"removedFromSelection";
                        public static const SELECTION_CHANGED           : 
String                =       "selectionChanged";


                        [Bindable] private var _dsAvailable:ArrayCollection;
                        [Bindable] private var _dsSelected:ArrayCollection;


                        public var filterKeys:Array = new Array();
                        private var _filterFunction:Function;



                        /**
                         * Transfer data between the source list and the 
destination list
                         */
                        private function MoveDataBetweenList(srcList:List, 
destList:List,
type:String):void{

                                var srcData:ArrayCollection = 
srcList.dataProvider as ArrayCollection;

                                var destData:ArrayCollection = 
destList.dataProvider as
ArrayCollection;

                                var itemIndex:uint;

                                /* temp object will hold the object before the 
object is moved... */
                                var itemData:Object;

                                /* list of objects that have been moved */
                                var changeList:Array = new Array();


                                        if( type == "ALL" ){

                                                while( srcData.length ){
                                                        itemData = 
srcData.removeItemAt( 0 );
                                                        destData.addItem( 
itemData );
                                                        changeList.push( 
itemData );
                                                }

                                        }else{

                                                while( 
srcList.selectedIndices.length ){
                                                        itemIndex = 
srcList.selectedIndices[0];
                                                        itemData = 
srcData.removeItemAt( itemIndex );
                                                        destData.addItem( 
itemData );
                                                        changeList.push( 
itemData );
                                                }
                                        }


                                        /* ok let us now fire the change event. 
*/
                                        srcData.refresh();
                                        destData.refresh();

                                        /** fire selection changed event */
                                        fireChangeEvent( destList, changeList );

                        }       // MoveDataBetweenLists...





                         /**
                         * function called when a drag-drop occurs on one of 
the lists...
                         */
                protected function dragDropHandler( e:DragEvent ):void{

                        var changeList:Array = e.dragSource.dataForFormat(
e.dragSource.formats[0] ) as Array;

                        var destList:List = e.currentTarget as List;

                        fireChangeEvent( destList, changeList );

                }       //dragDropHandler...



                /* central location that fires the change events... */
                protected function fireChangeEvent( destList:List,
changeList:Array) : void {

                        /* dispatch an event with the object reference... */
                        switch ( destList.name ) {

                                case "selectedList" :

                                        trace( "dispatching event:" + 
ADDED_TO_SELECTION );

                                        dispatchEvent( new 
ToFromListBoxChangeEvent(
ADDED_TO_SELECTION, changeList ) );

                                break;

                                case "availableList" :

                                        trace( "dispatching event:" + 
REMOVED_FROM_SELECTION );

                                        dispatchEvent( new 
ToFromListBoxChangeEvent(
REMOVED_FROM_SELECTION, changeList ) );

                                break;

                        }       // switch

                }






                        /**
                         * function called when the filterText has changed 
requesting an
initilization of the filter sequence....
                         */
                        private function filterAvailable(e:Event) : void {

                                if( availableFilter.text.length ){
                                        dsAvailable.filterFunction = 
filterDatasetRecords;
                                        dsAvailable.refresh();
                                }else{
                                        dsAvailable.filterFunction = null;
                                        dsAvailable.refresh();
                                }

                        }



                        /**
                         * Filter function based on the values entered by the 
user
                         */
                        private function 
filterDatasetRecords(item:Object):Boolean{

                                var strComp:String = availableFilter.text;
                                var strTemp:String;

                                /*if we have been provided with a filter 
function then.... */
                                if( _filterFunction != null )  return 
_filterFunction( item, 
strComp );


                                /* ok we are not provided with a filter 
function, try to determine
the value your self. */
                                if( filterKeys.length ){

                                        // list of key's have been provided 
that inform us what elements
do they want us to search agains.

                                        for(var i:uint = 0; i < 
filterKeys.length; i++){

                                                        strTemp = String( 
item[filterKeys[i]] );

                                                        if( 
strTemp.toLowerCase().search( strComp.toLowerCase() ) >= 0 )
                                                                return true;

                                        }



                                } else {

                                        /* Loop through all key's in an object 
to match a value */

                                        for (var key:String in item){

                                                strTemp = String( item[key] );

                                                if( 
strTemp.toLowerCase().search( strComp.toLowerCase() ) >= 0 )
                                                                        return 
true;

                                        }

                                }

                                return false;
                        }





                    /**
                         * Setters and getters
                         */
                        public function set 
dsAvailable(ds:ArrayCollection):void        {
_dsAvailable = ds;      }
                        public function get dsAvailable():ArrayCollection       
                {return
_dsAvailable};

                        public function set dsSelected(ds:ArrayCollection):void 
{
_dsSelected = ds;       }
                        public function get dsSelected():ArrayCollection        
                {return
_dsSelected};


                        public function set labelFunction(value:Function):void
                    {
                        availableList.labelFunction = value;
                        selectedList.labelFunction = value;
                    }

                    public function set labelField(value:String):void
                {
                        availableList.labelField = value;
                        selectedList.labelField = value;
                }


                public function set filterFunction( value:Function ):void
                {
                        _filterFunction = value;
                }

                public function get filterFunction( ):Function{
                        return _filterFunction
                }


                ]]>
        </mx:Script>


        <flexlib:PromptingTextInput id="availableFilter" left="0" top="0"
change="filterAvailable(event)" width="47%" prompt="Filter available
records" />
        <mx:List toolTip="drag and drop or select and use arrows to move"
                                id="availableList" 
dataProvider="{_dsAvailable}"  width="47%"
top="25" bottom="5" left="0"
                                                                
allowMultipleSelection="true" dragEnabled="true"
dragMoveEnabled="true" dropEnabled="false"
                                                                
dragStart="selectedList.dropEnabled = true;"
                                                                
dragComplete="selectedList.dropEnabled = false;"
                                                                
dragDrop="dragDropHandler(event)" />



        <mx:VBox horizontalAlign="center" verticalAlign="middle"
horizontalCenter="0" verticalCenter="0">
                <mx:Image source="@Embed('/assets/icons/add_all.png')"
click="MoveDataBetweenList( availableList, selectedList, 'ALL' )"
useHandCursor="true" buttonMode="true" />
                <mx:Image source="@Embed('/assets/icons/add_selected.png')"
click="MoveDataBetweenList( availableList, selectedList, 'SEL' )"
useHandCursor="true" buttonMode="true"  />
                <mx:Image source="@Embed('/assets/icons/remove_selected.png')"
click="MoveDataBetweenList( selectedList, availableList, 'SEL' )"
useHandCursor="true" buttonMode="true"  />
                <mx:Image source="@Embed('/assets/icons/remove_all.png')"
click="MoveDataBetweenList( selectedList, availableList, 'ALL' )"
useHandCursor="true" buttonMode="true"  />
        </mx:VBox>


        <mx:Label text="Selected Values" top="0" right="2" width="47%" />
        <mx:List                toolTip="drag and drop or select and use arrows 
to move"
                                        id="selectedList" 
dataProvider="{_dsSelected}"  width="47%"
top="15" bottom="5" right="2"
                                                                
allowMultipleSelection="true" dragEnabled="true"
dragMoveEnabled="true" dropEnabled="false"
                                                                
dragStart="availableList.dropEnabled = true;"
                                                                
dragComplete="availableList.dropEnabled = false;"
                                                                
dragDrop="dragDropHandler(event)"
                                                                />

</mx:Canvas>



******************************************************************















*****************************************************************
Event Object
******************************************************************

package com.yourcompany.common.events
{
        import flash.events.Event;

        public class ToFromListBoxChangeEvent extends Event
        {

                /* data container */
                public var data:Array;

                public function ToFromListBoxChangeEvent(type:String, 
data:Array = null)
                {
                        // constructor
                        super(type, true, true);

                        /** asign the data object to the container... */
                        this.data = data;

                }


                override public function clone():Event
                {
                        return new ToFromListBoxChangeEvent( type, this.data );
                }


        }
}


Reply via email to