package {

    import flash.events.ContextMenuEvent;
    import flash.ui.ContextMenu;
    import flash.util.trace;
    
    import mx.controls.listClasses.ListData;
    import flash.ui.ContextMenuItem;

    public class MyContextMenuManager
    {
        // ContextMenuItems holds the context menu items we want to add

        public var ContextMenuItems:Array = new Array( "I'm first!", "I'm second!" );
        
        // Constructor

        public function MyContextMenuManager(){}

        public function BuildContextMenu():ContextMenu {
            
            var gridMenu:ContextMenu = new ContextMenu();
            gridMenu.hideBuiltInItems();
            
            // create the menu items

            for( var x:Number=0; x<ContextMenuItems.length; x++ )
            {
                var item:ContextMenuItem = new ContextMenuItem(ContextMenuItems[x]);
                item.addEventListener("menuItemSelect", MenuHandler, false);
                gridMenu.customItems.push(item);
            }
            return gridMenu;
        }
        
        public function MenuHandler(event:ContextMenuEvent):void {
            
            var target:Object = event.mouseTarget;
            var selectedContextMenuItem:ContextMenuItem = event.target;
            var selectedListRenderer:listRenderer;
            
            /* The user may click right on an object inside the renderer
             * ... in our case it would be the label. If so, the target is the label
             * so we must account for that
             */
            if( ! (target is listRenderer) )
            {
                selectedListRenderer         = target.parent.parent;
                
            // otherwise they are clicking right on the renderer itself...

            // outside of the label

            } else {
                selectedListRenderer         = listRenderer(event.mouseTarget);
            }
            // get the listData

            var myListData        :ListData         = ListData(selectedListRenderer.listData);
            
            // get the selected row index from the listData

            var selectedRowIndex:Number         = myListData.rowIndex;
            
            trace( "The selected row index is: " + selectedRowIndex );
            trace( "The selected rows label is: " + myListData.text);
            
            trace( "The selected context menu item is: " + selectedContextMenuItem.caption + "\n" );
            
        }
    }
    
}