I am trying to disable ComboBox drop down items. I found an example on Alex's site for disabling items in a List so I took that and set it as the DropDownFactory in the combo box. But it doesn't work completely. I can still key down and get an outline of the disabled item. I am curious why this example works in a list but not in a combo box. Here is my code:
Application File >>>>>>>>>>>>>>>>>>>>>>>>>>> <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*" layout="absolute"> <mx:Script> <![CDATA[ [Bindable] public var dp:Array = [ { label: "Category (17)" }, { label: " Alpha (0)" }, { label: " Beta" }, { label: "Category (0)" }, { label: " Delta" }, { label: " Gamma" }, { label: " Epsilon" } ]; private function noCollections(data:Object):Boolean { if (data.label.indexOf("(0)") != -1) return true; return false; } ]]> </mx:Script> <mx:ComboBox dropdownFactory="DisabledItemsList" dataProvider="{dp}"/> <local:DisabledItemsList dataProvider="{dp}"/> </mx:Application> DisabledItemsList.as >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> package { import flash.events.MouseEvent; import flash.ui.Keyboard; import mx.controls.List; import mx.controls.listClasses.IListItemRenderer; /** * A List that uses a disableFunction to determine if an item can be selected or not */ public class DisabledItemsList extends List { public function DisabledItemsList() { super(); } private function disabledFunction(data:Object):Boolean { if (data.label.indexOf("(0)") != -1) return true; return false; } /** * The function to apply that determines if the item is "disabled" or not. * Takes one argument, which is the data item * Returns true if item cannot be selected. */ // public var disabledFunction:Function; override protected function drawItem(item:IListItemRenderer, selected:Boolean=false, highlighted:Boolean=false, caret:Boolean=false, transition:Boolean=false):void { if(disabledFunction(item.data)) { item.enabled = false; selected = false; highlighted = false; } super.drawItem(item, selected, highlighted, caret, transition); } override protected function mouseEventToItemRenderer (event:MouseEvent):IListItemRenderer { var listItem:IListItemRenderer = super.mouseEventToItemRenderer(event); if (listItem) { if (listItem.data) { if (disabledFunction(listItem.data)) { return null; } } } return listItem; } private var selectionUpward:Boolean; override protected function moveSelectionVertically(code:uint, shiftKey:Boolean, ctrlKey:Boolean):void { if (code == Keyboard.DOWN) selectionUpward = false; else selectionUpward = true; super.moveSelectionVertically(code, shiftKey, ctrlKey); } override protected function finishKeySelection():void { super.finishKeySelection(); var i:int; var uid:String; var rowCount:int = listItems.length; var partialRow:int = (rowInfo[rowCount-1].y + rowInfo [rowCount-1].height > listContent.height) ? 1 : 0; var listItem:IListItemRenderer; listItem = listItems[caretIndex - verticalScrollPosition][0]; if (listItem) { if (listItem.data); { if (disabledFunction(listItem.data)) { // find another visible item that is enabled // assumes there is one that is fully visible rowCount = rowCount - partialRow; var idx:int = caretIndex - verticalScrollPosition; if (selectionUpward) { // look up; for (i = idx - 1; i >= 0; i--) { listItem = listItems[i][0]; if (! disabledFunction(listItem.data)) { selectedIndex = i - verticalScrollPosition; return; } } for (i = idx + 1; i < rowCount; i++) { listItem = listItems[i][0]; if (! disabledFunction(listItem.data)) { selectedIndex = i - verticalScrollPosition; return; } } } else { // look down; for (i = idx + 1; i < rowCount; i++) { listItem = listItems[i][0]; if (! disabledFunction(listItem.data)) { selectedIndex = i - verticalScrollPosition; return; } } for (i = idx - 1; i >= 0; i--) { listItem = listItems[i][0]; if (! disabledFunction(listItem.data)) { selectedIndex = i - verticalScrollPosition; return; } } } } } } } } }