PDA

Просмотр полной версии : Растягивающееся TextField


gloomyBrain
17.11.2009, 22:29
Пытаюсь сделать текстовое поле, которое при вводе текста самостоятельно растягивается по высоте (ширина задана жестко).
Но есть нюанс - хочу вводить не просто текст, а текст с тэгами HTML.
Для этого применяю вот такой подход:

public class RubberTextField extends TextField {

public function RubberTextField() {

super();
super.type = TextFieldType.INPUT;
super.border = true;
super.borderColor = 0x000000;
super.multiline = true;
super.wordWrap = true;

super.addEventListener(TextEvent.TEXT_INPUT, onInput);
super.addEventListener(Event.CHANGE, onInput);


}

private function onInput(evt:Event):void {

if (evt is TextEvent) {

evt = (evt as TextEvent);
evt.preventDefault();
super.htmlText = super.htmlText + (evt as TextEvent).text;
super.setSelection(super.htmlText.length, super.htmlText.length);

}

super.height = this.textHeight + 8;

}

}

Но почему-то каждый новый символ появляется с новой строки.
не могу понять, в чем причина и как этого избёгнуть ? =)

UPD:
трейс выдает вообще что-то ужасное =) каждый символ ставится в кучу тэгов типа <p>, <font> и тп
По сути, мне нужно вставить новый текст между этими тэгами, но может как-то это можно сделать автоматически?

SamFR
17.11.2009, 22:41
Лучше всего использовать text и textFormat. А вообще, с изменением размеров текстового поля в момент ввода куча глюков. Можно попробовать для начала реализовать растягивание без форматирования, а там уж, если получится, и с ним.

gloomyBrain
17.11.2009, 22:45
У меня глюков нет никаких =) Возьмите код и попробуйте. Да и проблема-то не в том
Да, я согласен насчет text + textFormat, однако продолжаю упорствовать над htmlText =)

SamFR
17.11.2009, 23:12
Да? Значит я что-то делал не так :)

Автоматически – вряд ли... Скорее всего, придётся написать функцию преобразования позиции символа в обычном тексте в позицию в html-тексте, и с помощью неё вставлять введённый символ в html-текст. А сам html-текст хранить в дополнительной переменной, так как TextField изменяет значение своего свойства htmlText, дописывая туда всякие теги типа TEXTFORMAT. Хотя я не полностью в этом уверен, но вроде бы несколько раз сталкивался.

С функцией преобразования проблем особых быть не должно, она должна просто пропускать все теги. Единственно что, могут быть небольшие сложности с <p>, <br> и пробелами между тегами, которые, насколько я помню, в некоторых случаях пропускаются. Это если писать компонент для произвольного html-текста. Если же чётко задать допускаемый формат html-разметки, то многое упрощается.

Добавлено через 4 минуты
И ещё немного не в тему)
Мне кажется, лучше блок if в обработчике из вашего примера переписать так:

if (evt is TextEvent) {
var textEvt:TextEvent = evt as TextEvent;
textEvt.preventDefault();
super.htmlText = super.htmlText + textEvt.text;
super.setSelection(super.htmlText.length, super.htmlText.length);
}