
Код AS1/AS2:
class Systems.Components.TextFieldSuite
{
private var tf:TextField;
private var smiles:Array = [];
private var str:Number = 0;
private var smilingArea:MovieClip;
private static var smile_str:Array = ['XD', ':)', ':(', ':*', '8)', ':/', ';)', ':O', ':D', '%)', ':[', ':P'];
private static var SPLIT_LINES_SYMBOL:String = String.fromCharCode('13');
private static var WORD_SPLITTER:String = ' ';
private static var SYMBOL_WIDTH:Number = 8;
private static var LINE_HEIGHT:Number = 18;
private static var SMILE_GABARITES:Number = 16.6;
private static var SMILE_Y_PADDING:Number = 0.9;
private static var SMILE_X_PADDING:Number = 5.8;
private var whitesLine:String = '';
public var active:Boolean = false;
public function TextFieldSuite(textField:TextField)
{
tf = textField;
whitesLine = generateWhitesLine();
calculateStringSize();
configuration();
}
public function get strSize():Number
{
return str;
}
public function _enabled(stat:Boolean):Void
{
smilingArea._visible = stat;
active = stat;
changeText();
}
private function configuration():Void
{
tf.onScroller = Delegate.create(this, onScroll);
}
private function onScroll():Void
{
changeText();
}
public function resizeWidth():Void
{
calculateStringSize();
changeText();
}
private function calculateStringSize():Void
{
var textField:TextField = _root.lineSplendor;
textField._width = tf._width;
var tfW:Number = textField.textWidth / 8;
str = tfW;
}
public function resizeHeight():Void
{
changeText();
}
public function htmlChanged():Void
{
var buf:String = tf.htmlText;
tf.htmlText = '';
tf.htmlText = buf;
changeText();
}
private function strRend(arg:String):Array
{
var lines:Array = []
var line:String = '';
var whitesCount:Number = 0;
var s:Array = arg.split(' ');
// //trace(s);
// //trace("ARG: " + arg);
var sLen:Number = s.length;
for (var i = 0; i < sLen; i++)
{
var word:String = s[i];
//var wLen:Number = word.length;
if (word.length > str)
{
lines.push(line + addWhites(whitesCount));
line = '';
var words:Array = strSplit(word, str);
var wordsLength:Number = words.length;
for (var j:Number = 0; j < wordsLength; j++)
{
var wrd:String = words[j];
if (wrd.length == str)
lines.push(wrd);
else
line = wrd;
}
}
else
{
if (word != '')
{
var bLine:String = line + addWhites(whitesCount) + word;
var compareLength:Number = bLine.length;
if (compareLength > str)
{
lines.push(line)
whitesCount = 0;
line = word;
}
else
{
line = bLine;
whitesCount = 0;
}
}
whitesCount++;
}
}
if (line.length != 0)
lines.push(line);
//trace("LINES: "+lines);
return lines;
}
private function addWhites(count:Number):String
{
return whitesLine.substr(0, count);
}
private function cuteText(txt:String, startLine:Number, endLine:Number):Array{
var lines:Array = [];
var spl:Array = txt.split(SPLIT_LINES_SYMBOL);
var splLen:Number = spl.length;
for (var i:Number = 0; i < splLen; i++)
{
var string:String = spl[i];
var wrapedString:Array = strRend(string);
if (wrapedString[0].length == 0 && wrapedString.length > 1)
wrapedString.shift();
//trace(wrapedString);
lines = lines.concat(wrapedString);
}
return lines.splice(startLine, endLine - startLine);
}
//qqqqqqqq rrrrrrrrrrrrrrr;E ttttttttttttttt:Q
private function addAddobTextFieldMagicFeatures(str:String):String
{
for (var i:Number = 0, condition:Boolean = true; condition; condition = str.charAt(i) == WORD_SPLITTER, i++)
{
}
//trace("STRINGI: "+str + ', \n' + str.substr(i -1 ));
return str.substr(i - 1);
}
private function strSplit(text:String, range:Number):Array
{
var ret:Array = [];
var sLen:Number = text.length;
for(;text.length != 0;)
{
var line:String = text.substr(0, range);
text = text.substr(range);
ret.push(line);
}
return ret;
}
private function changeText():Void
{
if (!active)
return;
var tStr:String = tStr = tf.text;
var sLength:Number = smiles.length;
smilingArea.removeMovieClip();
smilingArea = _root.createEmptyMovieClip('smilingArea_', 50);
var lines:Array = cuteText(tStr, tf.scroll - 1, tf.bottomScroll);
var lLen:Number = lines.length;
//trace(lines);
for (var i:Number = 0, c:Number = 0; i < lLen; i++)
{
var strings:Array = splitStr(lines[i]);
var strLen:Number = strings.length;
for (var j:Number = 0; j < strLen; j++, c++)
{
var s:String = strings[j].str;
var smile:String = strings[j].smile;
var x:Number = s.length * SYMBOL_WIDTH + tf._x + SMILE_X_PADDING;
var y:Number = i * LINE_HEIGHT + tf._y + SMILE_Y_PADDING;
var smile:MovieClip = smilingArea.attachMovie('smile_'+smile+'', 'smile'+c, 50+c, {_width:SMILE_GABARITES, _height:SMILE_GABARITES, _x:x, _y:y});
//trace("STR: "+s);
///trace("STRING LENGTH: "+sLength);
///trace("LINE: "+i);
//trace("LIN:O: "+lines[i]);
//smiles.push(smile);
}
}
}
private function splitStr(str:String):Array
{
var sLen:Number = smile_str.length;
var ret:Array = [];
for(var i:Number = 0; i<sLen; i++)
{
var smile:String = smile_str[i];
for (
var index:Number = str.indexOf(smile);
index != -1;
index = str.indexOf(smile, index + smile.length))
{
var s:String = str.substr(0, index);
ret.push({str:s, smile:smile});
}
}
return ret;
}
private function generateWhitesLine():String
{
var ret:String = ''
for (var i:Number = 0; i < 50; i++)
{
ret += ' ';
}
return ret;
}
}
smile_str - Это айди смайлов в библиотеке.
SYMBOL_WIDTH - Ширина 1 символа(Не спрашивайте как я это получил... Методоп тыка щитал P.S Использовался FixedSys size 15, P.P.S Шрифт должен быть обязательно моноширийный).
LINE_HEIGHT - Высота 1 строки(опять тоже самое...)
SMILE_GABARITES - Габариты смайла
SMILE_Y_PADDING - Дельта смайла по Y опять же помойму методом тыка щитал... %).
SMILE_X_PADDING - Дельта смайла по X
htmlChanged - Должно вызыватся при изменении текста в текстовом поле.
resizeHeight, resizeWidth - Вызываются при изменении высоты и соответственно ширины текстового поля.
Пример использования:

Код AS1/AS2:
import Systems.Components.TextFieldSuite;
var tf:TextField = createTextField('test', 1);
var suite:TextFieldSuite = new TextFieldSuite(tf);
Смайлы будут находится над текстом но текст под ними будет выделятся. 1 Смайл тут занимает место 2х символов текста