Тема: htmlText <img>
Показать сообщение отдельно
Старый 25.02.2009, 20:06
qazwsx вне форума Посмотреть профиль Найти все сообщения от qazwsx
  № 13  
Ответить с цитированием
qazwsx
Banned

Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
Код 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х символов текста


Последний раз редактировалось qazwsx; 25.02.2009 в 20:17.