blob: e263c2c356ebfd9bf913beef8326e31acb83338e [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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();
}
}
}