в выпадающем списке редактируемый текст, как контролировать положение курсора с помощью actionscript3? - PullRequest
0 голосов
/ 31 января 2011

У меня есть класс, который наследуется от 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>&lt;fc:AutoComplete&gt;</code> tag inherits all the tag attributes
     *  of its superclass, and adds the following tag attributes:</p>
     *
     *  <pre>
     *  &lt;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>"
     *  /&gt;
     *  
* * @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; я

Ответы [ 2 ]

1 голос
/ 31 января 2011

Это невозможно с Flash.Все, что вы можете сделать, - это прослушивать события клавиш и вместо того, чтобы позволить пользователю нормально писать, перехватывать их и добавлять символ для нажатой клавиши в нужном вам месте.

0 голосов
/ 01 февраля 2011

Каждый может проверить полный пример. Демонстрация компонентов http://flashcommander.org/blog/flex-4-autocomplete

...