У меня есть класс, который наследуется от ComboBox. Я хочу реализовать функцию для управления положением курсора. Есть встроенная функция?заранее спасибо
<code>////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2003-2006 Adobe Macromedia Software LLC and its licensors.
// All Rights Reserved. The following is Source Code and is subject to all
// restrictions on such code as contained in the End User License Agreement
// accompanying this product.
//
////////////////////////////////////////////////////////////////////////////////
package ac
{
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.events.FocusEvent;
import flash.net.SharedObject;
import flash.ui.Keyboard;
import mx.core.UIComponent;
import mx.controls.ComboBox;
import mx.collections.ArrayCollection;
import mx.collections.ListCollectionView;
//--------------------------------------
// Events
//--------------------------------------
/**
* Dispatched when the <code>filterFunction</code> property changes.
*
* You can listen for this event and update the component
* when the <code>filterFunction</code> property changes.</p>
*
* @eventType flash.events.Event
*/
[Event(name="filterFunctionChange", type="flash.events.Event")]
/**
* Dispatched when the <code>typedText</code> property changes.
*
* You can listen for this event and update the component
* when the <code>typedText</code> property changes.</p>
*
* @eventType flash.events.Event
*/
[Event(name="typedTextChange", type="flash.events.Event")]
//--------------------------------------
// Excluded APIs
//--------------------------------------
[Exclude(name="editable", kind="property")]
/**
* The AutoComplete control is an enhanced
* TextInput control which pops up a list of suggestions
* based on characters entered by the user. These suggestions
* are to be provided by setting the <code>dataProvider
* </code> property of the control.
* @mxml
*
* <p>The <code><fc:AutoComplete></code> tag inherits all the tag attributes
* of its superclass, and adds the following tag attributes:</p>
*
* <pre>
* <fc:AutoComplete
* <b>Properties</b>
* keepLocalHistory="false"
* lookAhead="false"
* typedText=""
* filterFunction="<i>Internal filter function</i>"
*
* <b>Events</b>
* filterFunctionChange="<i>No default</i>"
* typedTextChange="<i>No default</i>"
* />
*
* * @includeExample ../../../../../../docs/com/adobe/flex/extras/controls/example/AutoCompleteCountriesData/AutoCompleteCountriesData.mxml* * @see mx.controls.ComboBox * * / открытый класс AutoComplete расширяет ComboBox {// -------------------------------------------------------------------------- // // Конструктор // // -------------------------------------------------------------------------- / ** * Конструктор.* / public function AutoComplete () {super ();// Сделать ComboBox похожим на обычное текстовое поле editable = true;if (keepLocalHistory) addEventListener ("focusOut", focusOutHandler);SetStyle ( "arrowButtonWidth", 0);SetStyle ( "FontWeight", "нормальный");SetStyle ( "cornerRadius", 0);SetStyle ( "paddingLeft", 0);SetStyle ( "paddingRight", 0);rowCount = 7;} // -------------------------------------------------------------------------- // // Переменные // // -------------------------------------------------------------------------- / ** * @private * / private var cursorPosition: Number = 0;/ ** * @private * / private var prevIndex: Number = -1;/ ** * @private * / private var removeHighlight: Boolean = false;/ ** * @private * / private var showDropdown: Boolean = false;/ ** * @private * / private var ShowingDropdown: Boolean = false;/ ** * @private * / private var tempCollection: Object;/ ** * @private * / private var usingLocalHistory: Boolean = false;/ ** * @private * / private var dropdownClosed: Boolean = true;// -------------------------------------------------------------------------- // // Переопределенные свойства // // -------------------------------------------------------------------------- // ---------------------------------- // редактируемый // ---------------------------------- / ** * @private * / переопределить общедоступную функцию, установленную для редактирования (значение: Boolean): void {// Это сделано для предотвращения сброса пользователем значения в false super.editable = true;} / ** * @private * / переопределить набор открытых функций dataProvider (value: Object): void {super.dataProvider = value;if (! usingLocalHistory) tempCollection = value;} // ---------------------------------- // labelField // ---------------------------------- / ** * @private * / переопределить открытый набор функций labelField (значение: String): void {super.labelField= значение;invalidateProperties ();invalidateDisplayList ();} // -------------------------------------------------------------------------- // // Свойства // // -------------------------------------------------------------------------- // ---------------------------------- // filterFunction // ---------------------------------- / ** * @private * Хранилище для свойства filterFunction.* / private var _filterFunction: Function = defaultFilterFunction;/ ** * @private * / private var filterFunctionChanged: Boolean = true;[Bindable ("filterFunctionChange")] [Inspectable (category = "General")] / ** * Функция, используемая для выбора элементов, соответствующих критериям * функции.* Функция фильтра должна иметь следующую подпись: * *
f(item:~~, text:String):Boolean
* *, где возвращаемое значение равно
true
, если указанный элемент * должен отображаться в качестве предложения.* Всякий раз, когда в элементе управления автозаполнения происходит изменение текста, эта * функция фильтра запускается для каждого элемента в
dataProvider
.* *
Реализация по умолчанию для filterFunction работает следующим образом:
* Если был напечатан «AB», он отобразит все элементы, соответствующие * «AB ~~» (ABaa, ABcc, abAc и т. Д.).
* *
Пример использования настраиваемой функции filterFunction - это когда типизированный текст * является регулярным выражением, и мы хотим отобразить все * элементы, входящие в набор.
* * @example *
* public function myFilterFunction(item:~~, text:String):Boolean
* {
* public var regExp:RegExp = new RegExp(text,"");
* return regExp.test(item);
* }
*
** / public function get filterFunction (): Function {return _filterFunction;} / ** * @private * / набор открытых функций filterFunction (значение: Function): void {// Допускается пустая функция filterFunction, но не пустая функция filterFunction if (value! = null) {_filterFunction = value;filterFunctionChanged = true;invalidateProperties ();invalidateDisplayList ();dispatchEvent (new Event ("filterFunctionChange"));} else _filterFunction = defaultFilterFunction;} // ---------------------------------- // filterFunction // ---------------------------------- / ** * @private * Хранилище для свойства keepLocalHistory.* / private var _keepLocalHistory: Boolean = false;/ ** * @private * / private var keepLocalHistoryChanged: Boolean = true;[Bindable ("keepLocalHistoryChange")] [Inspectable (category = "General")] / ** * При значении true элемент управления отслеживает записи *, введенные в элемент управления, и сохраняет историю * каклокальный общий объект.Когда истина, * завершение-функция и dataProvider игнорируются.* * @default "false" * / открытая функция get keepLocalHistory (): Boolean {return _keepLocalHistory;} / ** * @private * / набор открытых функций keepLocalHistory (значение: Boolean): void {_keepLocalHistory = значение;} //---------------------------------- // смотреть вперед //---------------------------------- / ** * @private * Хранилище для свойства lookAhead.* / private var _lookAhead: Boolean = false;/ ** * @private * / private var lookAheadChanged: Boolean;[Bindable ("lookAheadChange")] [Inspectable (category = "Data")] / ** * lookAhead решает, нужно ли автоматически дополнять текст в текстовом поле * первым элементом в раскрывающемся списке или нет.* * @default "false" * / открытая функция get lookAhead (): Boolean {return _lookAhead;} / ** * @private * / открытый набор функций lookAhead (значение: Boolean): void {_lookAhead = value;lookAheadChanged = true;} // ---------------------------------- // typedText // ---------------------------------- / ** * @private * Хранилище для свойства typedText.* /private var _typedText: String = "";
/ **
* @частный
* /
приватная переменная typedTextChanged: Boolean;
[Bindable ( "typedTextChange")]
[Осматриваемом (категория = "Данные")]
/ **
* Строка для отслеживания текста изменена как
* результат взаимодействия с пользователем.
* /
публичная функция get typedText (): String
{
return _typedText;
}
/ **
* @частный
* /
открытый набор функций typedText (input: String): void
{
_typedText = input;
typedTextChanged = true;
invalidateProperties ();
invalidateDisplayList ();
dispatchEvent (new Event ("typedTextChange"));
}
// ------------------------------------------------ --------------------------
//
// Переопределенные методы
//
// ------------------------------------------------ --------------------------
/ **
* @частный
* /
переопределить защищенную функцию commitProperties (): void
{
super.commitProperties ();
если (! выпадающий)
SelectedIndex = -1;
если (раскрывающийся)
{
если (typedTextChanged)
{
cursorPosition = textInput.selectionActivePosition; // mansoor change: selectionBeginIndex;
updateDataProvider ();
// Если нет предложений, нет необходимости показывать выпадающий список
if (collection.length == 0 || typedText == "" || typedText == null)
{
dropdownClosed = TRUE;
showDropdown = ложь;
}
еще
{
showDropdown = true;
selectedIndex = 0;
}
}
}
}
/ **
* @частный
* /
переопределить защищенную функцию focusOutHandler (событие: FocusEvent): пусто
{
super.focusOutHandler (событие)
if (keepLocalHistory && dataProvider.length == 0)
addToLocalHistory ();
}
/ **
* @частный
* /
переопределить открытую функцию getStyle (styleProp: String): *
{
if (styleProp! = "openDuration")
return super.getStyle (styleProp);
еще
{
если (dropdownClosed)
return super.getStyle (styleProp);
еще
вернуть 0;
}
}
/ **
* @частный
* /
переопределить защищенную функцию keyDownHandler (событие: KeyboardEvent): пусто
{
super.keyDownHandler (событие);
если (! event.ctrlKey)
{
// UP "keydown" событие на самом верхнем элементе в раскрывающемся списке
// или событие ESCAPE "keydown" должно изменить текст в тексте
// поле к исходному тексту
if (event.keyCode == Keyboard.UP && prevIndex == 0)
{
textInput.text = _typedText;
textInput.selectRange (textInput.text.length, textInput.text.length); // mansoor: setSelection (textInput.text.length, textInput.text.length);
selectedIndex = -1;
}
иначе if (event.keyCode == Keyboard.ESCAPE && ShowingDropdown)
{
textInput.text = _typedText;
textInput.selectRange (textInput.text.length, textInput.text.length); // mansoor: setSelection (textInput.text.length, textInput.text.length);
показываяDropdown = false;
dropdownClosed = TRUE;
}
еще если (event.keyCode == Keyboard.ENTER)
{
if (keepLocalHistory && dataProvider.length == 0)
addToLocalHistory ();}
еще если (lookAhead && event.keyCode == Keyboard.BACKSPACE
|| event.keyCode == Keyboard.DELETE)
removeHighlight = true;
}
еще
if (event.ctrlKey && event.keyCode == Keyboard.UP)
dropdownClosed = TRUE;
prevIndex = selectedIndex;
}
/ **
* @частный
* /
измерение защищенной функции (): void
{
super.measure ();
measureWidth = mx.core.UIComponent.DEFAULT_MEASURED_WIDTH;
}
/ **
* @частный
* /
переопределить защищенную функцию updateDisplayList (unscaledWidth: Number,
unscaledHeight: Number): недействительный
{
super.updateDisplayList (unscaledWidth, unscaledHeight);
// UP "keydown" событие на самом верхнем элементе в выпадении
// вниз список изменяет текст в текстовом поле на ""
if (selectedIndex == -1)
textInput.text = typedText;
если (раскрывающийся)
{
если (typedTextChanged)
{
// Это необходимо, потому что вызов super.updateDisplayList () устанавливает текст
// в textInput to "" и, таким образом, значение
// набирается пользователем losts
if (lookAhead && showDropdown && typedText! = "" &&! removeHighlight)
{
var label: String = itemToLabel (collection [0]);
var index: Number = label.toLowerCase (). indexOf (_typedText.toLowerCase ());
если (индекс == 0)
{
textInput.text = _typedText + label.substr (_typedText.length);
textInput.selectRange (textInput.text.length, _typedText.length); // setSelection (textInput.text.length, _typedText.length);
}
еще
{
textInput.text = _typedText;
textInput.selectRange (cursorPosition, cursorPosition);
removeHighlight = false;
}
}
еще
{
textInput.text = _typedText;
textInput.selectRange (cursorPosition, cursorPosition);
removeHighlight = false;
}
typedTextChanged = false;
}
еще, если (typedText)
// Устанавливает выбор, когда пользователь перемещается по списку предложений через
// стрелки клавиш.
textInput.selectRange (_typedText.length, textInput.text.length);
}
if (showDropdown &&! dropdown.visible)
{
// Это необходимо для контроля продолжительности раскрывающегося списка
super.open ();
showDropdown = false;
показываяDropdown = true;
если (dropdownClosed)
dropdownClosed = ложь;
}
}
/ **
* @частный
* /
переопределить защищенную функцию textInput_changeHandler (событие: событие): пусто
{
super.textInput_changeHandler (событие);
// Сохраняет текст, введенный пользователем в переменную
typedText = текст;
}
// ------------------------------------------------ --------------------------
//
// Методы
//
// ------------------------------------------------ --------------------------
/ **
* @частный
* Если keepLocalHistory включен, сохраняет набранный текст
* пользователем в локальной истории на клиентском компьютере
* /
приватная функция addToLocalHistory (): void
{if (id! = null && id! = "" && text! = null && text! = "")
{
var so: SharedObject = SharedObject.getLocal ("AutoCompleteData");
var saveData: Array = so.data.suggestions;
// Пока не было создано ни одного общего объекта
если (сохраненные данные == ноль)
saveData = new Array ();
var i: Number = 0;
флаг var: Boolean = false;
// Проверяем, есть ли эта запись в ранее сохраненных данных общего объекта
для (я = 0; я