<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">

<channel>
	<title>kiorull.com</title>
	
	<link>http://kiorull.com/blog</link>
	<description>the one and only</description>
	<pubDate>Thu, 18 Dec 2008 17:22:04 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/kiorull" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="kiorull" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Simple Flex smilies with HTML support</title>
		<link>http://kiorull.com/blog/programming/flex/simple-flex-smilies-with-html-support/</link>
		<comments>http://kiorull.com/blog/programming/flex/simple-flex-smilies-with-html-support/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 17:22:04 +0000</pubDate>
		<dc:creator>kiorull</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[emoticons]]></category>

		<category><![CDATA[flexlib]]></category>

		<category><![CDATA[flowbox]]></category>

		<category><![CDATA[free source]]></category>

		<category><![CDATA[html support]]></category>

		<category><![CDATA[smilies]]></category>

		<guid isPermaLink="false">http://kiorull.com/blog/?p=12</guid>
		<description><![CDATA[Here I am again, with a new demo of Simple Flex smilies.
This time it supports the HTML produced by a RichTextEditor. It might be the first demo out there that has both smilies (emoticons) and html text that also includes source, although I didn&#8217;t search around :) In any case, it is exploiting the method [...]]]></description>
			<content:encoded><![CDATA[<p>Here I am again, with a new demo of Simple Flex smilies.</p>
<p>This time it supports the HTML produced by a RichTextEditor. It might be the first demo out there that has both smilies (emoticons) and html text that also includes source, although I didn&#8217;t search around :) In any case, it is exploiting the method I posted in the <a href="http://kiorull.com/blog/programming/flex/simple-flex-smilies-emoticons/"title="Simple Flex smilies"  >previous post</a>.</p>
<p>The issues that it has is that it doesn&#8217;t interpret LI tag, for some reason, but maybe in the future I will sort it out.</p>
<p>Explanations will be coming soon. In the meantime here is the link:</p>
<p><strong>Flex smilies with HTML support demo (view source included): <a href="http://kiorull.com/FlexSmiliesHtml/FlexSmiliesHtml.html"title="Flex smilies with HTML support demo"  >here</a></strong>.</p>
<p>I commented the code, so you can peak around. I will write a full explanation like I did in the previous post, but later on this week (maybe weekend?).</p>
<p>The code that parses the HTML is partially hardcoded (for the format produced by RichTextEditor), and partially generic (the code that processes the HTML).</p>
<p>I will be coming again soon with the explanations, in the meantime enjoy and leave me feedback :)</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fkiorull.com%2Fblog%2Fprogramming%2Fflex%2Fsimple-flex-smilies-with-html-support%2F';
  addthis_title  = 'Simple+Flex+smilies+with+HTML+support';
  addthis_pub    = 'kiorull';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://kiorull.com/blog/programming/flex/simple-flex-smilies-with-html-support/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Simple Flex smilies (emoticons)</title>
		<link>http://kiorull.com/blog/programming/flex/simple-flex-smilies-emoticons/</link>
		<comments>http://kiorull.com/blog/programming/flex/simple-flex-smilies-emoticons/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 21:17:28 +0000</pubDate>
		<dc:creator>kiorull</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[emoticons]]></category>

		<category><![CDATA[flexlib]]></category>

		<category><![CDATA[flowbox]]></category>

		<category><![CDATA[free source]]></category>

		<category><![CDATA[smilies]]></category>

		<guid isPermaLink="false">http://kiorull.com/blog/?p=10</guid>
		<description><![CDATA[I recently developed a Flex chat application. A nice feature in every chat is the smilies support. I searched on the net looking for something that somebody else have done already but I found only some guys saying it is hard, it is not something you develop for fun, and so on. Also I found [...]]]></description>
			<content:encoded><![CDATA[<p>I recently developed a Flex chat application. A nice feature in every chat is the smilies support. I searched on the net looking for something that somebody else have done already but I found only some guys saying it is hard, it is not something you develop for fun, and so on. Also I found some guys that did it but haven&#8217;t released the source.</p>
<p>Anyway, I developed a nice smilies&#8217; engine class, only to lose it by switching to another branch (in git) without committing. So, until I will recode the nice and efficient engine, here is another idea that I had regarding this matter.</p>
<p>The open source library <a href="http://code.google.com/p/flexlib/"title="flexlib"  onclick="javascript:pageTracker._trackPageview('/outbound/article/http://code.google.com/p/flexlib/');">flexlib</a> has a nice container, named <a href="http://flexlib.googlecode.com/svn/trunk/docs/flexlib/containers/FlowBox.html"title="FlowBox"  onclick="javascript:pageTracker._trackPageview('/outbound/article/http://flexlib.googlecode.com/svn/trunk/docs/flexlib/containers/FlowBox.html');">FlowBox</a>. To quote it&#8217;s creators:</p>
<p class="quotation">The FlowBox is an extension of Box that implements a  FlowLayout algorithm for laying out children.  FlowBox  will lay out children in a horizontal fashion.  When  the width of the children exceeds the width of the container,  the child is placed on a new row.</p>
<p>That&#8217;s great :) So it is like we now have free container wrapping. What if we broke down the string that contains the smilies and put each word in an container? It would be easier for us to insert smilies, each in it&#8217;s own container, that&#8217;s for sure.</p>
<p><strong>Flex smilies demo (view source included): <a href="http://kiorull.com/Flex/FlexSmilies/FlexSmilies.html"title="Flex smilies"  >here</a>.</strong></p>
<p>If you right-click -> View Source doesn&#8217;t work, it means you have pop-ups blocked.</p>
<p>If you download the source and make it a Flex Project, don&#8217;t forget to download <a href="http://code.google.com/p/flexlib/"title="flexlib"  onclick="javascript:pageTracker._trackPageview('/outbound/article/http://code.google.com/p/flexlib/');">flexlib</a> and link it in your compiler.</p>
<p>As I don&#8217;t like to clutter my code with comments, let me explain some parts of the code. The flow is as follows:</p>
<ol>
<li>the user inserts some text</li>
<li>the user submits the text</li>
<li>the input text is split into words and subsequently into simple text and smilies</li>
<li>we rebuild the output text, creating from each text piece/smiley a display object and putting all in a FlowBox</li>
</ol>
<p>First two points are obvious and I don&#8217;t think they require any explanation, the code below does this:</p>
<p class="srcHead">form</p>
<pre class="srcView"><span class="MXMLComponent_Tag">&lt;mx:Form</span><span class="MXMLDefault_Text"> defaultButton=&#8221;</span><span class="MXMLString">{</span><span class="ActionScriptDefault_Text">submitButton</span><span class="MXMLString">}</span><span class="MXMLDefault_Text">&#8220;</span><span class="MXMLComponent_Tag">&gt;</span>

    <span class="MXMLComponent_Tag">&lt;mx:FormItem</span><span class="MXMLDefault_Text"> label=&#8221;</span><span class="MXMLString">Write something here:</span><span class="MXMLDefault_Text">&#8220;</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:TextInput</span><span class="MXMLDefault_Text"> id=&#8221;</span><span class="MXMLString">messageTI</span><span class="MXMLDefault_Text">&#8221; width=&#8221;</span><span class="MXMLString">200</span><span class="MXMLDefault_Text">&#8220;</span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:Text</span><span class="MXMLDefault_Text"> text=&#8221;</span><span class="MXMLString">Supported smilies are :), :(, :P, :D, ;), :O</span><span class="MXMLDefault_Text">&#8221; </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/mx:FormItem&gt;</span>

    <span class="MXMLComponent_Tag">&lt;mx:FormItem&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:Button</span><span class="MXMLDefault_Text"> id=&#8221;</span><span class="MXMLString">submitButton</span><span class="MXMLDefault_Text">&#8221; label=&#8221;</span><span class="MXMLString">Do Magic!</span><span class="MXMLDefault_Text">&#8221; click=&#8221;</span><span class="ActionScriptDefault_Text">handleSubmit</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">event</span><span class="ActionScriptBracket/Brace">)</span><span class="MXMLDefault_Text">&#8221; </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/mx:FormItem&gt;</span>

    <span class="MXMLComponent_Tag">&lt;mx:FormItem</span><span class="MXMLDefault_Text"> label=&#8221;</span><span class="MXMLString">Split input string:</span><span class="MXMLDefault_Text">&#8220;</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:TextInput</span><span class="MXMLDefault_Text"> id=&#8221;</span><span class="MXMLString">output</span><span class="MXMLDefault_Text">&#8221; width=&#8221;</span><span class="MXMLString">200</span><span class="MXMLDefault_Text">&#8221; </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/mx:FormItem&gt;</span>

<span class="MXMLComponent_Tag">&lt;/mx:Form&gt;</span></pre>
<p class="srcHead">button click event handler function</p>
<pre class="srcView"><span class="ActionScriptReserved">private</span> <span class="ActionScriptfunction">function</span> <span class="ActionScriptDefault_Text">handleSubmit</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">event</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">MouseEvent</span><span class="ActionScriptBracket/Brace">)</span><span class="ActionScriptOperator">:</span><span class="ActionScriptReserved">void</span> <span class="ActionScriptBracket/Brace">{</span>
    <span class="ActionScriptDefault_Text">createEmoticons</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">messageTI</span>.<span class="ActionScriptDefault_Text">text</span><span class="ActionScriptBracket/Brace">)</span>;
    <span class="ActionScriptDefault_Text">messageTI</span>.<span class="ActionScriptDefault_Text">text</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptString">&#8221;</span>;
<span class="ActionScriptBracket/Brace">}</span></pre>
<p>Moving forward, we have the main function that actually does the work, creating the emoticons from text. It takes the <em>string</em> to process as an argument.</p>
<pre class="srcView"><span class="ActionScriptReserved">private</span> <span class="ActionScriptfunction">function</span> <span class="ActionScriptDefault_Text">createEmoticons</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">text</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">String</span><span class="ActionScriptBracket/Brace">)</span><span class="ActionScriptOperator">:</span><span class="ActionScriptReserved">void</span></pre>
<p>First we define the smilies&#8217; list, and their corresponding file termination (i.e. for grin, the file is called emoticon_grin.png).</p>
<pre class="srcView"><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">smilies</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Array</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">Array</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&#8216;:D&#8217;</span>, <span class="ActionScriptString">&#8216;:)&#8217;</span>, <span class="ActionScriptString">&#8216;:O&#8217;</span>, <span class="ActionScriptString">&#8216;:P&#8217;</span>, <span class="ActionScriptString">&#8216;:(&#8217;</span>, <span class="ActionScriptString">&#8216;;)&#8217;</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">smiliesGfx</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Array</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">Array</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&#8216;grin&#8217;</span>, <span class="ActionScriptString">&#8217;smile&#8217;</span>, <span class="ActionScriptString">&#8217;surprised&#8217;</span>, <span class="ActionScriptString">&#8216;tongue&#8217;</span>, <span class="ActionScriptString">&#8216;unhappy&#8217;</span>, <span class="ActionScriptString">&#8216;wink&#8217;</span><span class="ActionScriptBracket/Brace">)</span>;</pre>
<p>Now the string splitting begins. First we split the string into words, storing all the output in <em>initialArray</em>. The splitting is done with a regular expression like <em>/( )/</em> because I want to have in the output the spaces too.</p>
<pre class="srcView"><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">regExp</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">RegExp</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">RegExp</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&#8220;( )&#8221;</span>, <span class="ActionScriptString">&#8220;i&#8221;</span><span class="ActionScriptBracket/Brace">)</span>;

<span class="ActionScriptDefault_Text">initialArray</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">text</span>.<span class="ActionScriptDefault_Text">split</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">regExp</span><span class="ActionScriptBracket/Brace">)</span>;</pre>
<p>Now we&#8217;ll search the smilies in the words (we can have <em>hello:)wazza?</em>, this will pass the first splitting).</p>
<pre class="srcView"><span class="ActionScriptReserved">for</span> <span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">i</span> <span class="ActionScriptOperator">=</span> 0; <span class="ActionScriptDefault_Text">i</span> <span class="ActionScriptOperator">&lt;</span> <span class="ActionScriptDefault_Text">smilies</span>.<span class="ActionScriptDefault_Text">length</span>; <span class="ActionScriptDefault_Text">i</span><span class="ActionScriptOperator">++</span><span class="ActionScriptBracket/Brace">)</span> <span class="ActionScriptBracket/Brace">{</span>
    <span class="ActionScriptDefault_Text">initialArray</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">splitArrayElements</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">smilies</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">i</span><span class="ActionScriptBracket/Brace">]</span>, <span class="ActionScriptDefault_Text">initialArray</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScriptBracket/Brace">}</span></pre>
<p>I made up a function that takes a <em>token</em> and an <em>array</em> as arguments and does the following: goes through each array element and if it finds the token within it, it will split the string around that token and throw it into the return array (i.e. if we have <em>bla:)bla</em> with <em>:)</em> as the token, the result will be: [<em>bla</em>, <em>:)</em>, <em>bla</em>]).</p>
<p class="srcHead">array of strings splitting function</p>
<pre class="srcView">
<span class=">private <span class="ActionScriptfunction">function</span> <span class="ActionScriptDefault_Text">splitArrayElements</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">token</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">String</span>, <span class="ActionScriptDefault_Text">arr</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Array</span><span class="ActionScriptBracket/Brace">)</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Array</span> <span class="ActionScriptBracket/Brace">{</span>

    <span class="ActionScriptReserved">if</span> <span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">arr</span>.<span class="ActionScriptDefault_Text">length</span> <span class="ActionScriptOperator">==</span> 0 <span class="ActionScriptOperator">||</span> <span class="ActionScriptDefault_Text">token</span> <span class="ActionScriptOperator">==</span> <span class="ActionScriptString">&#8221;</span><span class="ActionScriptBracket/Brace">)</span> <span class="ActionScriptReserved">return</span> <span class="ActionScriptDefault_Text">arr</span>;

    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">returnArray</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Array</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">Array</span><span class="ActionScriptBracket/Brace">()</span>;
    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">tempArray</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Array</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">Array</span><span class="ActionScriptBracket/Brace">()</span>;

    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">escapedToken</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">String</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">token</span>.<span class="ActionScriptDefault_Text">replace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">/\(|\)|\[|\]/</span>, <span class="ActionScriptString">&#8220;\\$&amp;&#8221;</span><span class="ActionScriptBracket/Brace">)</span>;

    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">regExp</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">RegExp</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">RegExp</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&#8220;(&#8221;</span><span class="ActionScriptOperator">+</span><span class="ActionScriptDefault_Text">escapedToken</span><span class="ActionScriptOperator">+</span><span class="ActionScriptString">&#8220;)&#8221;</span>, <span class="ActionScriptString">&#8220;g&#8221;</span><span class="ActionScriptBracket/Brace">)</span>;

    <span class="ActionScriptReserved">for</span> <span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">i</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">uint</span> <span class="ActionScriptOperator">=</span> 0; <span class="ActionScriptDefault_Text">i</span> <span class="ActionScriptOperator">&lt;</span> <span class="ActionScriptDefault_Text">arr</span>.<span class="ActionScriptDefault_Text">length</span>; <span class="ActionScriptDefault_Text">i</span><span class="ActionScriptOperator">++</span><span class="ActionScriptBracket/Brace">)</span> <span class="ActionScriptBracket/Brace">{</span>
        <span class="ActionScriptDefault_Text">tempArray</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">arr</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">i</span><span class="ActionScriptBracket/Brace">]</span>.<span class="ActionScriptDefault_Text">split</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">regExp</span><span class="ActionScriptBracket/Brace">)</span>;

        <span class="ActionScriptDefault_Text">returnArray</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">returnArray</span>.<span class="ActionScriptDefault_Text">concat</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">tempArray</span><span class="ActionScriptBracket/Brace">)</span>;
    <span class="ActionScriptBracket/Brace">}</span>

    <span class="ActionScriptReserved">return</span> <span class="ActionScriptDefault_Text">returnArray</span>;

<span class="ActionScriptBracket/Brace">}</span></pre>
<p>Now back to the main function. Now we have an array that contains all the initial string split nicely into words, smilies and spaces. During the splitting, some empty elements appear. Also, I will get rid of all the spaces, as there will be enough separation between words in the final result.</p>
<pre class="srcView"><span class="ActionScriptReserved">for</span> <span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">i</span> <span class="ActionScriptOperator">=</span> 0; <span class="ActionScriptDefault_Text">i</span> <span class="ActionScriptOperator">&lt;</span> <span class="ActionScriptDefault_Text">initialArray</span>.<span class="ActionScriptDefault_Text">length</span>; <span class="ActionScriptDefault_Text">i</span><span class="ActionScriptOperator">++</span><span class="ActionScriptBracket/Brace">)</span>
    <span class="ActionScriptReserved">if</span> <span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">initialArray</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">i</span><span class="ActionScriptBracket/Brace">]</span> <span class="ActionScriptOperator">!=</span> <span class="ActionScriptString">&#8221;</span> <span class="ActionScriptOperator">&amp;&amp;</span> <span class="ActionScriptDefault_Text">initialArray</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">i</span><span class="ActionScriptBracket/Brace">]</span> <span class="ActionScriptOperator">!=</span> <span class="ActionScriptString">&#8216; &#8216;</span><span class="ActionScriptBracket/Brace">)</span>
        <span class="ActionScriptDefault_Text">outputArray</span>.<span class="ActionScriptDefault_Text">push</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">initialArray</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">i</span><span class="ActionScriptBracket/Brace">])</span>;</pre>
<p>The basic idea now is to create a <em>FlowBox</em> and, for each element of the <em>outputArray</em>, put a <em>Text</em> if we have a word or an <em>Image</em> if we have a smiley. There are also a lot of calls to <em>validateNow()</em> function. This function validates and updates the properties and layout of the caller object. Don&#8217;t ask me why, but we need this, else the <em>FlowBox</em> will appear empty. Also, the <em>dummyFix</em> is there because in the case that you will imput numbers only, the text will not appear. After composing the <em>FlowBox</em>, we add it to the <em>mainContainer</em> which is a <em>VBox</em> (chosen so to simulate a possible chat behaviour).</p>
<p class="srcHead">FlowBox composition</p>
<pre class="srcView"><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">flowBox</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">FlowBox</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">FlowBox</span><span class="ActionScriptBracket/Brace">()</span>;

<span class="ActionScriptDefault_Text">mainContainer</span>.<span class="ActionScriptDefault_Text">addChild</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">flowBox</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScriptDefault_Text">mainContainer</span>.<span class="ActionScriptDefault_Text">validateNow</span><span class="ActionScriptBracket/Brace">()</span>;

<span class="ActionScriptDefault_Text">flowBox</span>.<span class="ActionScriptDefault_Text">setStyle</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&#8216;horizontalGap&#8217;</span>, <span class="ActionScriptString">&#8216;0&#8242;</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScriptDefault_Text">flowBox</span>.<span class="ActionScriptDefault_Text">width</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">Math</span>.<span class="ActionScriptDefault_Text">floor</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">mainContainer</span>.<span class="ActionScriptDefault_Text">width</span> <span class="ActionScriptOperator">*</span> 0.95<span class="ActionScriptBracket/Brace">)</span>;

<span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">dummyFix</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Label</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">Label</span><span class="ActionScriptBracket/Brace">()</span>;

<span class="ActionScriptDefault_Text">flowBox</span>.<span class="ActionScriptDefault_Text">addChild</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">dummyFix</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScriptDefault_Text">flowBox</span>.<span class="ActionScriptDefault_Text">validateNow</span><span class="ActionScriptBracket/Brace">()</span>;

<span class="ActionScriptDefault_Text">dummyFix</span>.<span class="ActionScriptDefault_Text">text</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptString">&#8220;Your message:&#8221;</span>;
<span class="ActionScriptDefault_Text">dummyFix</span>.<span class="ActionScriptDefault_Text">validateNow</span><span class="ActionScriptBracket/Brace">()</span>;

<span class="ActionScriptReserved">for</span> <span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">i</span> <span class="ActionScriptOperator">=</span> 0; <span class="ActionScriptDefault_Text">i</span> <span class="ActionScriptOperator">&lt;</span> <span class="ActionScriptDefault_Text">outputArray</span>.<span class="ActionScriptDefault_Text">length</span>; <span class="ActionScriptDefault_Text">i</span><span class="ActionScriptOperator">++</span><span class="ActionScriptBracket/Brace">)</span>
    <span class="ActionScriptReserved">if</span> <span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">smilies</span>.<span class="ActionScriptDefault_Text">indexOf</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">outputArray</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">i</span><span class="ActionScriptBracket/Brace">])</span> <span class="ActionScriptOperator">==</span> <span class="ActionScriptOperator">-</span>1<span class="ActionScriptBracket/Brace">)</span> <span class="ActionScriptBracket/Brace">{</span>
        <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">label</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Text</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">Text</span><span class="ActionScriptBracket/Brace">()</span>;
        <span class="ActionScriptDefault_Text">label</span>.<span class="ActionScriptDefault_Text">text</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">outputArray</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">i</span><span class="ActionScriptBracket/Brace">]</span>;
        <span class="ActionScriptDefault_Text">label</span>.<span class="ActionScriptDefault_Text">validateNow</span><span class="ActionScriptBracket/Brace">()</span>;
        <span class="ActionScriptDefault_Text">flowBox</span>.<span class="ActionScriptDefault_Text">addChild</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">label</span><span class="ActionScriptBracket/Brace">)</span>;
        <span class="ActionScriptDefault_Text">flowBox</span>.<span class="ActionScriptDefault_Text">validateNow</span><span class="ActionScriptBracket/Brace">()</span>;
    <span class="ActionScriptBracket/Brace">}</span> <span class="ActionScriptReserved">else</span> <span class="ActionScriptBracket/Brace">{</span>
        <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">image</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Image</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">Image</span><span class="ActionScriptBracket/Brace">()</span>;
        <span class="ActionScriptDefault_Text">image</span>.<span class="ActionScriptDefault_Text">load</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&#8216;assets/emoticon_&#8217;</span><span class="ActionScriptOperator">+</span> <span class="ActionScriptDefault_Text">smiliesGfx</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">smilies</span>.<span class="ActionScriptDefault_Text">indexOf</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">outputArray</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">i</span><span class="ActionScriptBracket/Brace">])]</span> <span class="ActionScriptOperator">+</span> <span class="ActionScriptString">&#8216;.png&#8217;</span><span class="ActionScriptBracket/Brace">)</span>;
        <span class="ActionScriptDefault_Text">flowBox</span>.<span class="ActionScriptDefault_Text">addChild</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">image</span><span class="ActionScriptBracket/Brace">)</span>;
        <span class="ActionScriptDefault_Text">flowBox</span>.<span class="ActionScriptDefault_Text">validateNow</span><span class="ActionScriptBracket/Brace">()</span>;
    <span class="ActionScriptBracket/Brace">}</span>

    <span class="ActionScriptDefault_Text">mainContainer</span>.<span class="ActionScriptDefault_Text">validateNow</span><span class="ActionScriptBracket/Brace">()</span>;

<span class="ActionScriptBracket/Brace">}</span></pre>
<p>And that&#8217;s it :) In case you missed the link above, try the demo <a href="http://kiorull.com/Flex/FlexSmilies/FlexSmilies.html"title="Flex smilies"  >here</a> (view source included).</p>
<p>Now this isn&#8217;t the most optimised code you&#8217;ve seen, but I wrote it like this for clarity&#8217;s sake. Many improvements can be done (like spliting the string in one command with a regular expression, instead of doing all those useless <em>for</em> cycles; or checking if the text has any emoticons at all; yeah, some things would be nice:) ) but this is only a demo. Maybe if I have time I will create a component out of it, but certainly after I remake all the code for the other method.</p>
<p>The good part is that you have smilies support fast without much fuss. The bad part is that for every word you get an object on the screen. Depending on the size of your chat application and other goodies that you provide around it, this could make the client perform terribly. At least I suppose so, I am not fully certain, but a performance hit should happen.</p>
<p>Ah well, next time I&#8217;ll talk about smilies I will show you a much better method that in theory should be the best resource-wise.</p>
<p>Thanks for reading and share this with the world (for your convenience, you can use the <em>bookmark</em> button at the bottom of the post). I am sure many people are still searching for something like this :)</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fkiorull.com%2Fblog%2Fprogramming%2Fflex%2Fsimple-flex-smilies-emoticons%2F';
  addthis_title  = 'Simple+Flex+smilies+%28emoticons%29';
  addthis_pub    = 'kiorull';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://kiorull.com/blog/programming/flex/simple-flex-smilies-emoticons/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bloggingcruiser operational!</title>
		<link>http://kiorull.com/blog/internet/blogging/bloggingcruiser-operational/</link>
		<comments>http://kiorull.com/blog/internet/blogging/bloggingcruiser-operational/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 14:37:08 +0000</pubDate>
		<dc:creator>kiorull</dc:creator>
		
		<category><![CDATA[Blogging]]></category>

		<category><![CDATA[blog]]></category>

		<category><![CDATA[firefox]]></category>

		<category><![CDATA[internet explorer]]></category>

		<guid isPermaLink="false">http://kiorull.com/blog/?p=7</guid>
		<description><![CDATA[After some time to convince dear Internet Explorer that I want a nice looking blog, the blog is finally working and looking great in both Firefox and Internet Explorer.
By the way, people that do not have yet Firefox, please do yourself and myself a favour and download&#38;install it: http://www.mozilla.com/firefox/. Thanks!
So, welcome all and enjoy your [...]]]></description>
			<content:encoded><![CDATA[<p>After some time to convince dear Internet Explorer that I want a nice looking blog, the blog is finally working and looking great in both Firefox and Internet Explorer.</p>
<p>By the way, people that do not have yet Firefox, please do yourself and myself a favour and download&amp;install it: <a href="http://www.mozilla.com/firefox/"title="http://www.mozilla.com/firefox/"  onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.mozilla.com/firefox/');">http://www.mozilla.com/firefox/</a>. Thanks!</p>
<p>So, welcome all and enjoy your stay at <a href="http://kiorull.com"title="http://kiorull.com"  >kiorull.com</a>!</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fkiorull.com%2Fblog%2Finternet%2Fblogging%2Fbloggingcruiser-operational%2F';
  addthis_title  = 'Bloggingcruiser+operational%21';
  addthis_pub    = 'kiorull';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://kiorull.com/blog/internet/blogging/bloggingcruiser-operational/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Under construction</title>
		<link>http://kiorull.com/blog/internet/blogging/under-construction/</link>
		<comments>http://kiorull.com/blog/internet/blogging/under-construction/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 23:59:46 +0000</pubDate>
		<dc:creator>kiorull</dc:creator>
		
		<category><![CDATA[Blogging]]></category>

		<guid isPermaLink="false">http://kiorull.com/blog/?p=1</guid>
		<description><![CDATA[My blog is under construction. Please check back soon :)

  addthis_url    = 'http%3A%2F%2Fkiorull.com%2Fblog%2Finternet%2Fblogging%2Funder-construction%2F';
  addthis_title  = 'Under+construction';
  addthis_pub    = 'kiorull';

]]></description>
			<content:encoded><![CDATA[<p>My blog is under construction. Please check back soon :)</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fkiorull.com%2Fblog%2Finternet%2Fblogging%2Funder-construction%2F';
  addthis_title  = 'Under+construction';
  addthis_pub    = 'kiorull';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://kiorull.com/blog/internet/blogging/under-construction/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
