| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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. |
| // |
| //////////////////////////////////////////////////////////////////////////////// |
| package |
| { |
| import flash.events.Event; |
| import flash.events.KeyboardEvent; |
| import flash.events.MouseEvent; |
| import flash.geom.Point; |
| import flash.ui.Keyboard; |
| |
| import mx.collections.ArrayCollection; |
| import mx.controls.Button; |
| import mx.controls.List; |
| import mx.controls.TextInput; |
| import mx.core.UIComponent; |
| import mx.events.FlexEvent; |
| import mx.events.FlexMouseEvent; |
| import mx.events.ListEvent; |
| import mx.managers.PopUpManager; |
| |
| [Event(name="textChange", type="flash.events.Event")] |
| [Event(name="itemSelected", type="SearchBoxEvent")] |
| |
| public class SearchBox extends UIComponent |
| { |
| [Embed("assets/icon_close.png")] |
| private var closeIcon:Class; |
| |
| private var textInput:TextInput; |
| private var closeButton:Button; |
| private var list:List; |
| |
| private var isListVisible:Boolean = false; |
| |
| public var text:String; |
| |
| public function set dataProvider(dp:ArrayCollection):void |
| { |
| list.dataProvider = dp; |
| if (dp != null && dp.length > 0) |
| { |
| if (!isListVisible) popup(); |
| list.selectedIndex = 0; |
| } |
| else |
| { |
| if (isListVisible) removePopup(); |
| } |
| } |
| |
| override protected function createChildren():void |
| { |
| super.createChildren(); |
| |
| textInput = new TextInput(); |
| textInput.addEventListener(Event.CHANGE, textInput_changeHandler); |
| textInput.addEventListener(KeyboardEvent.KEY_DOWN, textInput_keyDownHandler); |
| addChild(textInput); |
| |
| closeButton = new Button(); |
| closeButton.setStyle("icon", closeIcon) |
| closeButton.setStyle("skin", null) |
| closeButton.addEventListener(MouseEvent.CLICK, closeHandler); |
| closeButton.width = 20; |
| addChild(closeButton); |
| |
| list = new List(); |
| list.setStyle("dropShadowEnabled", true); |
| list.addEventListener(ListEvent.ITEM_CLICK, selectItem); |
| systemManager.addEventListener(Event.RESIZE, removePopup, false, 0, true); |
| } |
| |
| override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void |
| { |
| super.updateDisplayList(unscaledWidth, unscaledHeight); |
| |
| textInput.width = unscaledWidth - closeButton.width; |
| textInput.height = unscaledHeight; |
| |
| closeButton.height = unscaledHeight; |
| closeButton.move(unscaledWidth - closeButton.width, 0); |
| } |
| |
| override protected function measure():void |
| { |
| super.measure(); |
| this.measuredWidth = 160; |
| this.measuredHeight = textInput.measuredHeight; |
| } |
| |
| private function textInput_keyDownHandler(event:KeyboardEvent):void |
| { |
| switch (event.keyCode) |
| { |
| case Keyboard.DOWN: |
| if (isListVisible) |
| list.selectedIndex++; |
| else |
| popup(); |
| break; |
| case Keyboard.UP: |
| if (isListVisible && list.selectedIndex > 0) |
| { |
| list.selectedIndex--; |
| } |
| textInput.setSelection(textInput.text.length, textInput.text.length); |
| break; |
| case Keyboard.ENTER: |
| if (isListVisible) selectItem(); |
| break; |
| case Keyboard.ESCAPE: |
| if (isListVisible) removePopup(); |
| break; |
| } |
| } |
| |
| private function textInput_changeHandler(event:Event):void |
| { |
| text = textInput.text; |
| dispatchEvent(new Event("textChange")); |
| } |
| |
| private function list_mouseDownOutsideHandler(event:MouseEvent):void |
| { |
| removePopup(); |
| } |
| |
| private function selectItem(event:ListEvent = null):void |
| { |
| dispatchEvent(new SearchBoxEvent(SearchBoxEvent.ITEM_SELECTED, list.selectedItem)); |
| removePopup(); |
| } |
| |
| private function popup():void |
| { |
| PopUpManager.addPopUp(list, this); |
| isListVisible = true; |
| list.width = textInput.width; |
| var point:Point = new Point(0, unscaledHeight); |
| point = localToGlobal(point); |
| point = list.parent.globalToLocal(point); |
| list.move(point.x, point.y); |
| list.addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, list_mouseDownOutsideHandler); |
| } |
| |
| private function removePopup(event:Event=null):void |
| { |
| PopUpManager.removePopUp(list); |
| list.removeEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, list_mouseDownOutsideHandler); |
| isListVisible = false; |
| } |
| |
| private function closeHandler(event:MouseEvent):void |
| { |
| textInput.text = ""; |
| textInput.setFocus(); |
| } |
| |
| } |
| } |