<br />
<b>Warning</b>:  include() [<a href='function.include'>function.include</a>]: Unable to access /var/www/html/rogue-development/blog2/wp-content/advanced-cache.php in <b>/var/www/html/rogue-development/blog2/wp-settings.php</b> on line <b>62</b><br />
<br />
<b>Warning</b>:  include(/var/www/html/rogue-development/blog2/wp-content/advanced-cache.php) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory in <b>/var/www/html/rogue-development/blog2/wp-settings.php</b> on line <b>62</b><br />
<br />
<b>Warning</b>:  include() [<a href='function.include'>function.include</a>]: Failed opening '/var/www/html/rogue-development/blog2/wp-content/advanced-cache.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in <b>/var/www/html/rogue-development/blog2/wp-settings.php</b> on line <b>62</b><br />
<br />
<b>Notice</b>:  add_option was called with an argument that is <strong>deprecated</strong> since version 2.3 with no alternative available. in <b>/var/www/html/rogue-development/blog2/wp-includes/functions.php</b> on line <b>3468</b><br />
<br />
<b>Notice</b>:  register_sidebar_widget is <strong>deprecated</strong> since version 2.8! Use wp_register_sidebar_widget() instead. in <b>/var/www/html/rogue-development/blog2/wp-includes/functions.php</b> on line <b>3382</b><br />
<br />
<b>Notice</b>:  register_widget_control is <strong>deprecated</strong> since version 2.8! Use wp_register_widget_control() instead. in <b>/var/www/html/rogue-development/blog2/wp-includes/functions.php</b> on line <b>3382</b><br />
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marc's Musings &#187; flex</title>
	<atom:link href="http://www.rogue-development.com/blog2/category/flex/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rogue-development.com/blog2</link>
	<description>Comments and thoughts on technology from Marc Hughes</description>
	<lastBuildDate>Tue, 29 Mar 2011 00:04:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Why I like my proposed catalyst workflow</title>
		<link>http://www.rogue-development.com/blog2/2009/06/why-i-like-my-proposed-catalyst-workflow/</link>
		<comments>http://www.rogue-development.com/blog2/2009/06/why-i-like-my-proposed-catalyst-workflow/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 14:39:25 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[catalyst]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=488</guid>
		<description><![CDATA[I&#8217;ve been an advocate of compiling from Catalyst to a swc in a two previous blog posts.  (A Flash Catalyst / Builder workflow method , Compiling FXP-&#62;SWC, a Catalyst workflow) I&#8217;m hoping to explain why I prefer that workflow here.  With big pretty pictures! First, let us look at the catalyst workflow that&#8217;s been all [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been an advocate of compiling from Catalyst to a swc in a two previous blog posts.  (<a title="Permanent Link to &quot;A Flash Catalyst / Builder workflow method&quot;" rel="bookmark" href="../2009/06/a-flash-catalyst-builder-workflow-method/">A Flash Catalyst / Builder workflow method</a> , <a title="Permanent Link to &quot;Compiling FXP-&gt;SWC, a Catalyst workflow&quot;" rel="bookmark" href="../2009/06/compiling-fxp-swc-a-catalyst-workflow/">Compiling FXP-&gt;SWC, a Catalyst workflow</a>) I&#8217;m hoping to explain why I prefer that workflow here.  With big pretty pictures!</p>
<p>First, let us look at the catalyst workflow that&#8217;s been all the rage in the demos online that introduce catalyst (<a href="http://gotoandlearn.com/">like this one</a>).  Refer to the diagram below.</p>
<p><img class="alignnone size-full wp-image-489" title="workflow1" src="http://www.rogue-development.com/blog2/wp-content/uploads/2009/06/workflow1.png" alt="workflow1" width="639" height="500" /></p>
<p>Pros:</p>
<ul>
<li>Super simple</li>
</ul>
<p>Cons:</p>
<ul>
<li>Limited to one designer and one developer</li>
<li>Limited to a single catalyst project</li>
<li>Developer can&#8217;t start until designer is finished</li>
<li>Once the designer has handed off the file, they can&#8217;t make edits.</li>
</ul>
<p>If your software development process can handle those cons, this &#8220;super simple&#8221; option will rock for you.  But for anything beyond the most trivial of projects, those restrictions will be a deal breaker.  I consider this workflow similar to editing Actionscript in keyframes on the timeline in Flash.  It works, it&#8217;s simple, sometimes it might be the right way of doing things, but most of the time it&#8217;s like shooting yourself in the foot.</p>
<p>Something that hasn&#8217;t been as widely discussed, but that is still part of the official offering from Adobe goes something like this diagram:</p>
<p><img class="alignnone size-full wp-image-490" title="workflow2" src="http://www.rogue-development.com/blog2/wp-content/uploads/2009/06/workflow2.png" alt="workflow2" width="638" height="817" /></p>
<p>In this scenario, the developer creates a plain old Flash Builder project.  While he&#8217;s doing that, the designer creates a .FXPL file.  The developer takes that .FXPL and imports it as a Flex <strong>Library</strong> project, which he then references from his main project.  (Just import the .fxpl like a .fxp, the correct type of project is auto-created) Later, the designer can make changes in Catalyst.  Then the designer exports a new .FXPL file and the developer can re-import it (re-import steps below).</p>
<p>Optionally, the developer can move the classes into a package structure inside Flash Builder.  If there will be more than a single .fxpl imported, this is required since there will be name conflicts.  Currently, the refactor in Flash Builder doesn&#8217;t work 100% for this as the skin references aren&#8217;t updated, hopefully that&#8217;s just a beta-bug and will be fixed.</p>
<p>This is a huge improvement over the previous workflow and will probably work out great for most people.</p>
<p>Pros:</p>
<ul>
<li>Developer and Designer time can overlap</li>
<li>You can have multiple designers and developers (by repeating that middle bit in the diagram</li>
<li>Can use a package structure</li>
<li>An &#8220;official&#8221; Adobe method</li>
</ul>
<p>Cons:</p>
<ul>
<li>Developer is not allowed to edit the Flex Library project that is imported, he can only use classes/assets from it in his main project.</li>
<li>Every time a new .FXPL comes out, the developer must (I bet some of this could be automated!):
<ol>
<li>Delete the current Flex Library project</li>
<li>Import the new .FXPL</li>
<li>Modify the main project to reference this newly imported project</li>
<li>Move the classes in the Flex Library project into a new package structure</li>
<li>Rebuild the swc</li>
<li>Rebuild the app</li>
</ol>
</li>
<li> Does not retain the Main class from catalyst, so all work must be done in sub-components</li>
</ul>
<p>That&#8217;s doing a lot better in the scalability department.  It&#8217;s doing a bit worse in the complexity department.</p>
<p>What if we could automate some of the process of turning a .FXPL into a .swc?  Or even better, what if we could turn a .FXP into a .swc?  Then we&#8217;d have something that looks very similar to the previous workflow, but with one important difference:</p>
<p><img class="alignnone size-full wp-image-491" title="workflow3" src="http://www.rogue-development.com/blog2/wp-content/uploads/2009/06/workflow3.png" alt="workflow3" width="627" height="822" /></p>
<p>Pros:</p>
<ul>
<li>Developer and Designer time can overlap</li>
<li>You can have multiple designers and developers</li>
<li>The script automatically converts the Main catalyst component from an Application object to a Group object so you can use it in your project.  (Coming Soon!  The next version of my script will)</li>
<li>Automatically uses a package structure</li>
</ul>
<p>Cons:</p>
<ul>
<li>Developer is not allowed to edit the Flex Library project that is imported, he can only use classes/assets from it in his main project. (But he only ever sees a swc now, so no worries)</li>
<li>Every time a new .FXP comes out, the developer must somehow get the new .swc (more on this below)</li>
<li>Requires a script to run (requiring whatever environment that script was written in)</li>
</ul>
<p>That may seem like a fairly minor difference, but imagine how much better it scales.</p>
<p>Instead of a single developer and a single designer, picture a whole team of them.  If every developer needs to go modify their workspace every time any designer makes a new .FXPL, they&#8217;ll end up spending too much of their time just managing their build environment.  The more people you add, the worse it gets.</p>
<p>If that script can be run through a command line script, it can be automated.</p>
<p>Most teams that consisting of more than a couple people use a version control system.  That system can be used to distribute .swcs that are generated from the catalyst projects.  Many version control systems have hooks integrated into them so they run a script whenever a certain file or directory is modified.  If yours doesn&#8217;t have than a simple scheduled job could do it.  This can simplify the process even further to:</p>
<ol>
<li>Designer checks .FXP into version control</li>
<li>Script runs, automatically generating the .swc</li>
<li>Developers sync up, getting the new .swc</li>
</ol>
<p>That means, once it&#8217;s set up there is <strong>no</strong> additional work that needs to be done.  The designer works in his tool.  The developer works in his.  Assets are magically propogated.</p>
<p>If you don&#8217;t use a version control system, scheduled jobs and a shared network folder could do the same thing.</p>
<p>This solves the scalability problem.</p>
<p><img class="alignnone size-full wp-image-492" title="workflow4" src="http://www.rogue-development.com/blog2/wp-content/uploads/2009/06/workflow4.png" alt="workflow4" width="394" height="774" /></p>
<p>All that is good-and-well, but that script to generate the .swcs must be awfully hard to do, right?  Wrong.  It was easy.  It&#8217;s done.  Go give it a try.</p>
<p><a href="http://www.rogue-development.com/blog2/2009/06/compiling-fxp-swc-a-catalyst-workflow/">Blog post describing the script</a>.<br />
Download: <a href="http://www.rogue-development.com/uploads/fxp2swc.rb">fxp2swc.rb </a></p>
<p>Any windows based Ruby developers want to take a crack at updating the script to work correctly on windows?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2009/06/why-i-like-my-proposed-catalyst-workflow/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Compiling FXP-&gt;SWC, a Catalyst workflow</title>
		<link>http://www.rogue-development.com/blog2/2009/06/compiling-fxp-swc-a-catalyst-workflow/</link>
		<comments>http://www.rogue-development.com/blog2/2009/06/compiling-fxp-swc-a-catalyst-workflow/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 14:59:59 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[catalyst]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=466</guid>
		<description><![CDATA[The other day, I blogged about an alternate workflow to Catalyst. It was somewhat confusing with a few steps involved. Towards the end of the post I had a couple wishes including: Let me select a package that components get created in. Export a swc with everything in it so we don’t have to go [...]]]></description>
			<content:encoded><![CDATA[<p>The other day, I blogged about <a href="http://www.rogue-development.com/blog2/2009/06/a-flash-catalyst-builder-workflow-method/">an alternate workflow to Catalyst</a>.  It was somewhat confusing with a few steps involved.  Towards the end of the post I had a couple wishes including:</p>
<ol>
<li>Let me select a package that components get created in.</li>
<li>Export a swc with everything in it so we don’t have to go through most of this.</li>
</ol>
<p>Last night I wrote a ruby script capable of doing exactly those two things.  I call it <a href="http://www.rogue-development.com/uploads/fxp2swc.rb">fxp2swc.rb</a>.</p>
<p>Using the script is simple.  First open it up and set the two variables at the top.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re1">@flex_dir</span> = <span class="st0">&quot;/Applications/Adobe<span class="es0">\\</span> Flash<span class="es0">\\</span> Builder<span class="es0">\\</span> Beta/sdks/4.0.0&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">@default_package</span> = <span class="st0">&quot;com.roguedevelopment.catalyst&quot;</span>;</div>
</li>
</ol>
</div>
<p>The flex_dir just tells the script where your Flex SDK is.  The default_package tells it what package you want your catalyst based components made in.</p>
<p>After you edit that, put the script in the same directory as your .fxp files.  Run the script and you should see output like this:</p>
<pre>$ ./fxp2swc.rb
=== FCTest.fxp
 Extracting to FCTest.fxp.tmp
 Creating directory FCTest.fxp.tmp/src/com
 Creating directory FCTest.fxp.tmp/src/com/roguedevelopment
 Creating directory FCTest.fxp.tmp/src/com/roguedevelopment/catalyst
 Creating directory FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest
 Copying Main.mxml
 Copying FCTest.fxp.tmp/src/components/Background.mxml -&gt; FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest
 Copying FCTest.fxp.tmp/src/components/CustomComponent1.mxml -&gt; FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest
 Copying FCTest.fxp.tmp/src/components/LoginButton.mxml -&gt; FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest
 Copying FCTest.fxp.tmp/src/components/LoginForm.mxml -&gt; FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest
 Copying FCTest.fxp.tmp/src/components/TextInput1.mxml -&gt; FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest
 Removing old source locations
 Fixing package names in FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest/Background.mxml
 Fixing package names in FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest/CustomComponent1.mxml
 Fixing package names in FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest/LoginButton.mxml
 Fixing package names in FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest/LoginForm.mxml
 Fixing package names in FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest/Main.mxml
 Fixing package names in FCTest.fxp.tmp/src/com/roguedevelopment/catalyst/FCTest/TextInput1.mxml
 Creating swcconfig.xml
 Invoking compc -load-config+=swcconfig.xml
Loading configuration file /Applications/Adobe Flash Builder Beta/sdks/4.0.0/frameworks/flex-config.xml
Loading configuration file /Users/mhughes/Dropbox/fxg2swc/swcconfig.xml
/Users/mhughes/Dropbox/fxp2swc/FCTest.swc (1463574 bytes)
Deleting temp dir
Done!</pre>
<p>You now have a one .swc for every .fxp file!  As easy as that!</p>
<p>Take the swc, and plop it into the &#8220;libs&#8221; folder of you Flash Builder project, and you can start using the components from it.  They&#8217;ll be in a package that starts with your default_package variable and ends with the name of the .fxp you compiled.  So for my example FCTest.fxp, the package is: com.roguedevelopment.catalyst.FCTest</p>
<p>Here&#8217;s a quick example of what it looks like to use one of those components:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;s:Application</span> <span class="re0">xmlns:fx</span>=<span class="st0">&quot;http://ns.adobe.com/mxml/2009&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">xmlns:s</span>=<span class="st0">&quot;library://ns.adobe.com/flex/spark&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">xmlns:mx</span>=<span class="st0">&quot;library://ns.adobe.com/flex/halo&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp;<span class="re0">minWidth</span>=<span class="st0">&quot;1024&quot;</span> <span class="re0">minHeight</span>=<span class="st0">&quot;768&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">viewSourceURL</span>=<span class="st0">&quot;srcview/index.html&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">xmlns:FCTest</span>=<span class="st0">&quot;com.roguedevelopment.catalyst.FCTest.*&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;FCTest:Background</span> <span class="re0">verticalCenter</span>=<span class="st0">&quot;0&quot;</span> <span class="re0">horizontalCenter</span>=<span class="st0">&quot;0&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/s:Application<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>You can still use the composition or inheritance methods of using those components that <a href="http://www.rogue-development.com/blog2/2009/06/a-flash-catalyst-builder-workflow-method/#useAssets">I blogged about</a> the other day.  Here&#8217;s an <a href="http://rogue-development.com/uploads/catalystWorkflow2/FCTest.html">example showing that with view-source enabled</a>.</p>
<p>I&#8217;m on OSX using Ruby v1.8.6 with this script.  Your mileage may vary on other platforms.  Two things that will likely need to change for Windows users:</p>
<ul>
<li> The compc call should use compc.exe</li>
<li>It uses the unzip command line utility, not sure if that&#8217;s a standard tool on Windows</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2009/06/compiling-fxp-swc-a-catalyst-workflow/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Flash Catalyst / Builder workflow method</title>
		<link>http://www.rogue-development.com/blog2/2009/06/a-flash-catalyst-builder-workflow-method/</link>
		<comments>http://www.rogue-development.com/blog2/2009/06/a-flash-catalyst-builder-workflow-method/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 09:25:22 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[AgileAgenda]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=430</guid>
		<description><![CDATA[Update: Check out the new post where I describe how to compile to a swc. I&#8217;ve been playing around with the Flash Catalyst and Builder betas today and one thing that scares me a little is the built-in designer/developer workflow that&#8217;s implied.  From what I can gather, a designer uses a design tool, imports that [...]]]></description>
			<content:encoded><![CDATA[<p>Update: <a href="http://www.rogue-development.com/blog2/2009/06/compiling-fxp-swc-a-catalyst-workflow/">Check out the new post where I describe how to compile to a swc.</a></p>
<p>I&#8217;ve been playing around with the Flash Catalyst and Builder betas today and one thing that scares me a little is the built-in designer/developer workflow that&#8217;s implied.  From what I can gather, a designer uses a design tool, imports that into Catalyst, and then hands of a .FXP file that a developer then imports into Builder to work on.  Then the developer jumps into the files generated by Catalyst, and modifies them.</p>
<p>For smallish projects, that&#8217;s a slam-dunk.  If you don&#8217;t work on large projects, stop reading here and just stick with that.</p>
<p>But there&#8217;s a number of reasons I really don&#8217;t like this intended workflow for larger projects.</p>
<p>First, it&#8217;s not scaleable.  One catalyst file -&gt; one Flash Builder project.  It&#8217;s awefully hard for a team of 5 designers to work on a single catalyst file.</p>
<p>It implies some exclusivity.  If the designer hands off the .FXP file, they really shouldn&#8217;t continue working on it because the developer will start modifying it.  It&#8217;s kind of like having a Word document that you pass back and forth between the designer and the developer.  If they both want to work on it at the same exact time, you&#8217;ll get race conditions.</p>
<p>Second, I don&#8217;t trust anybody to get a perfect Generated Code &lt;-&gt; User Edited Code tool to work perfectly all the time.  If Catalyst generates some code, I edit that, and then we bring it back into Catalyst, I just know that will break at some point.  (Sorry Adobe guys, I know you&#8217;ll do a rocking job with it, and I know it will almost always work, but it&#8217;s just too hard a problem)</p>
<p>So here&#8217;s a solution I&#8217;ve been playing with:</p>
<p><strong>Step 1: Create your design comp</strong></p>
<p>Here&#8217;s a Photoshop file I created with a pretty simple login form.  Make sure to name your layers so they&#8217;re easy to find later.<strong></strong></p>
<p><strong></strong></p>
<p><img class="aligncenter" title="Design Comp" src="http://www.rogue-development.com/uploads/pics//Photoshop-20090601-202712.png" alt="" width="662" height="473" /></p>
<p><strong></strong></p>
<p><strong>Step 2: Import it into Flash Catalyst just like you&#8217;re supposed to.  Edit it to your heart&#8217;s content.</strong></p>
<p>There&#8217;s a bunch of tutorials out there (<a href="http://gotoandlearn.com/">great one from Lee Brimlow here</a>) that show how to actually use Catalyst.  But one difference from all those tutorials.  We won&#8217;t be using the Main root level item.  So don&#8217;t go crazy adding states to your base stage.  But DO go crazy creating sub-components and adding states and behaviors to those.</p>
<p>Here&#8217;s a screenshot of my Catalyst project.  This is showing off a LoginForm component that I created.  Notice it has a few states with transitions set up between those states.</p>
<p><img class="aligncenter" title="In Flash Catalyst" src="http://www.rogue-development.com/uploads/pics//Flash_Catalyst-20090601-203203.png" alt="" width="649" height="479" /></p>
<p><strong></strong></p>
<p><strong>Step 3: Save it as a .FXP</strong></p>
<p>File-&gt;Save from Flash Catalyst.</p>
<p>For my example, I used FCTest.fxp as the name.</p>
<p><strong> Step 4: Create an empty Flash Builder project (not importing anything here)</strong></p>
<p><strong></strong></p>
<p>Just create a plain old Flash Builder project with a Flex based application in it.  (Make sure you&#8217;re using a Flex 4 SDK!)</p>
<p><strong>Step 5: Take your .FXP from above, and unzip it somewhere</strong></p>
<p>Here&#8217;s the sneaky part.  That .fxp file is really just a zip file that contains a Flash Builder project.  You can unzip it with any standard zip tool.  In OSX I just open a terminal and did a:</p>
<p>unzip FCTest.fxp</p>
<p>It creates a directory structure that looks something like this:</p>
<p><img class="aligncenter" title="Exploded .fxp file" src="http://www.rogue-development.com/uploads/pics//fxpdir-20090601-203746.png" alt="" width="664" height="483" /></p>
<p>Notice the two folders with arrows pointing to them, they&#8217;re important in the next step.</p>
<p><strong> Step 6: Take the components and assets folders from that unzipping and put them in a brand new folder.</strong></p>
<p>We can take those two folders and use them in our Flash Builder project to get access to all of our custom components that we made in Flash Catalyst.  I&#8217;m planning ahead a little bit so I created a &#8220;CatalystAssets&#8221; folder, and a &#8220;FCTest.fxp&#8221; folder inside that, and placed them there.  This will allow me to have assets from many different catalyst files in the future someday.</p>
<p><img class="aligncenter" title="Project Dirs" src="http://www.rogue-development.com/uploads/pics//FCTest-20090601-204408.png" alt="" width="722" height="450" /></p>
<p><strong> Step 7: Link to that folder from your Flash Builder project</strong></p>
<p>Flash Builder can link to source directories outside of the project.  To do that go to Project-&gt;Properties-&gt;Flex Build Path.  Click the &#8220;Add Folder&#8230;&#8221; button and add the FCTest.fxp folder (the folder we created, not the file Catalyst made).</p>
<p><a href="http://www.rogue-development.com/uploads/pics//FCTestbuildPath-20090601-204636.png"><img class="aligncenter" title="Build Properties" src="http://www.rogue-development.com/uploads/pics//FCTestbuildPath-20090601-204636.png" alt="" width="596" height="530" /></a></p>
<p>In Flash Builder&#8217;s Package Explorer you&#8217;ll see something like this after you do that:</p>
<p><img class="aligncenter" title="Package Explorer FC" src="http://www.rogue-development.com/uploads/pics//Flash_-_FCTest_src_com_roguedevelopment_fctest_CompositionExample.as_-_Flash_Builder_-__Users_mhughes_Documents_Adobe_Flash_Builder_Beta-20090601-210429.png" alt="" width="259" height="398" /></p>
<p>The developer should NEVER EDIT anything in the FCTest folder.  Consider that all auto-generated stuff that will wipe out anything you do in there.</p>
<p>The developer can and should work in the normal Flash Builder src folder, likely importing classes and assets from the FCTest folder and using them.</p>
<p><strong> Step 8: Use the Flash Catalyst based assets!</strong><br />
<a name="useAssets" ></a><br />
<strong></strong></p>
<p>For simple components that you don&#8217;t need to add any functionality to, you can just use them in your MXML.  For example, I created a component called Background in my Catalyst file.  To use it in the Flex application you just do something like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;s:Application</span> <span class="re0">xmlns:fx</span>=<span class="st0">&quot;http://ns.adobe.com/mxml/2009&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re0">xmlns:s</span>=<span class="st0">&quot;library://ns.adobe.com/flex/spark&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re0">xmlns:mx</span>=<span class="st0">&quot;library://ns.adobe.com/flex/halo&quot;</span> <span class="re0">minWidth</span>=<span class="st0">&quot;1024&quot;</span> <span class="re0">minHeight</span>=<span class="st0">&quot;768&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;<span class="re0">xmlns:components</span>=<span class="st0">&quot;components.*&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;components:Background</span> <span class="re0">verticalCenter</span>=<span class="st0">&quot;0&quot;</span> <span class="re0">horizontalCenter</span>=<span class="st0">&quot;0&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/s:Application<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>Notice the components namespace with the Background component name.</p>
<p>Adding non-interactive components isn&#8217;t all that interesting.  So what happens if you want to add functionality to components created in catalyst?  There&#8217;s two options here, either use the assets from the .FXP through composition or inheritance.  Here are two examples that show how to do them both:</p>
<p>Extending a Catalyst component through inheritance:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">package com.<span class="me1">roguedevelopment</span>.<span class="me1">fctest</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> components.<span class="me1">LoginForm</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">MouseEvent</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> flash.<span class="me1">utils</span>.<span class="me1">setTimeout</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> mx.<span class="me1">controls</span>.<span class="me1">Alert</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> mx.<span class="me1">events</span>.<span class="me1">FlexEvent</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw3">public</span> <span class="kw2">class</span> InheritenceExample <span class="kw3">extends</span> LoginForm</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> InheritenceExample<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">super</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; addEventListener<span class="br0">&#40;</span>FlexEvent.<span class="me1">CREATION_COMPLETE</span>, creationComplete <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; protected <span class="kw2">function</span> creationComplete<span class="br0">&#40;</span>event:FlexEvent<span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span><span class="br0">&#123;</span> currentState = <span class="st0">&quot;Normal&quot;</span>; <span class="br0">&#125;</span>, <span class="nu0">300</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; textinput2.<span class="me1">displayAsPassword</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; button1.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">CLICK</span>, onLoginButtonClick <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; textinput1.<span class="kw3">setFocus</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; protected <span class="kw2">function</span> onLoginButtonClick<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw2">var</span> correct:<span class="kw3">Boolean</span> = <span class="br0">&#40;</span> textinput1.<span class="kw3">text</span> == <span class="st0">&quot;marc&quot;</span> <span class="br0">&#41;</span> &amp;amp;&amp;amp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span> textinput2.<span class="kw3">text</span> = <span class="st0">&quot;1234&quot;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> correct <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; currentState = <span class="st0">&quot;Working&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span> success , <span class="nu0">1500</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; currentState = <span class="st0">&quot;Error&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span><span class="br0">&#123;</span> currentState = <span class="st0">&quot;Normal&quot;</span>; <span class="br0">&#125;</span>, <span class="nu0">1500</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; protected <span class="kw2">function</span> success<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; Alert.<span class="kw3">show</span><span class="br0">&#40;</span><span class="st0">&quot;Correct log in!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; currentState = <span class="st0">&quot;Normal&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Or, if you want to use composition instead of inheritance you could do something like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">package com.<span class="me1">roguedevelopment</span>.<span class="me1">fctest</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> components.<span class="me1">LoginForm</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">MouseEvent</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw3">import</span> flash.<span class="me1">utils</span>.<span class="me1">setTimeout</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> mx.<span class="me1">controls</span>.<span class="me1">Alert</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> spark.<span class="me1">components</span>.<span class="me1">Group</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">class</span> CompositionExample <span class="kw3">extends</span> Group</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; protected <span class="kw2">var</span> loginForm:LoginForm;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> CompositionExample<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw3">super</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; override protected <span class="kw2">function</span> createChildren<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; loginForm = <span class="kw2">new</span> LoginForm<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; addElement<span class="br0">&#40;</span>loginForm<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">width</span> = <span class="nu0">527</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">height</span> = <span class="nu0">325</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span><span class="br0">&#123;</span> loginForm.<span class="me1">currentState</span> = <span class="st0">&quot;Normal&quot;</span>; <span class="br0">&#125;</span>, <span class="nu0">300</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; loginForm.<span class="me1">textinput2</span>.<span class="me1">displayAsPassword</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; loginForm.<span class="me1">button1</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">CLICK</span>, onLoginButtonClick <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; loginForm.<span class="me1">textinput1</span>.<span class="kw3">setFocus</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; protected <span class="kw2">function</span> onLoginButtonClick<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw2">var</span> correct:<span class="kw3">Boolean</span> = <span class="br0">&#40;</span> loginForm.<span class="me1">textinput1</span>.<span class="kw3">text</span> == <span class="st0">&quot;marc&quot;</span> <span class="br0">&#41;</span> &amp;amp;&amp;amp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span> loginForm.<span class="me1">textinput2</span>.<span class="kw3">text</span> = <span class="st0">&quot;1234&quot;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> correct <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; loginForm.<span class="me1">currentState</span> = <span class="st0">&quot;Working&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span> success , <span class="nu0">1500</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; loginForm.<span class="me1">currentState</span> = <span class="st0">&quot;Error&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span><span class="br0">&#123;</span> loginForm.<span class="me1">currentState</span> = <span class="st0">&quot;Normal&quot;</span>; <span class="br0">&#125;</span>, <span class="nu0">1500</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; protected <span class="kw2">function</span> success<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; Alert.<span class="kw3">show</span><span class="br0">&#40;</span><span class="st0">&quot;Correct log in!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; loginForm.<span class="me1">currentState</span> = <span class="st0">&quot;Normal&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Now that you have your components with some added functionality, you can use them in your main application like you would any other Flex based component.  You can see a working demo, with view-source enabled here:</p>
<p>http://rogue-development.com/uploads/catalystWorkflow/FCTest.html</p>
<p>As you can tell, that seems like a LOT of extra work.  But here&#8217;s the payoff:</p>
<ol>
<li>The designer is free to continue working in Flash Catalyst while the developer works in Flash builder.  Whenever he has changes, he just hands off a brand new .FXP, and the developer repeats steps 5 and 6 to replace some files and then refreshes the Flash Builder workspace.</li>
<li>You can create multiple folders inside that &#8220;CatalystAssets&#8221; folder, and then use assets from multiple FlashCatalyst projects in a single Flash Builder project.</li>
<li>You can add those Flash Catalyst assets to version control and easily distribute them to multiple developers. (Not to mention track changes!)</li>
</ol>
<p>I did up a quick shell-script to unzip the .fxp file, make some directories, and copy the files to the appropriate place.  I can run this whenever the designer gives me a new .fxp.   I think with a little work we could create a Eclipse &#8220;Builder&#8221; (that&#8217;s unrelated to the product name &#8220;Flash Builder&#8221;) that would completely automate this entire process.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">rm</span> -rf .tmp</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">mkdir</span> .tmp</div>
</li>
<li class="li2">
<div class="de2"><span class="kw3">cd</span> .tmp</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">unzip</span> -o ../FCTest.fxp</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">cd</span> ..</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">rm</span> -rf CatalystAssets/FCTest.fxp/com/roguedevelopment/fctest </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">mkdir</span> CatalystAssets/FCTest.fxp</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">mkdir</span> CatalystAssets/FCTest.fxp/assets </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">mv</span> .tmp/src/components CatalystAssets/FCTest.fxp</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">mv</span> .tmp/src/assets/FCTest CatalystAssets/FCTest.fxp/assets</div>
</li>
</ol>
</div>
<p>Some things I wish Flash Catalyst did:</p>
<ol>
<li>Let me select a package that components get created in. (maybe there&#8217;s a way to do that?)</li>
<li>Make it easier to intelligently name the classes and property names that get generated</li>
<li>Export a swc with everything in it so we don&#8217;t have to go through most of this.</li>
</ol>
<p>Well anyways, I give Catalyst 2 thumbs up and even if we have to go through this process for a sane workflow it will save huge amounts of time in our shop.</p>
<p>P.S. I&#8217;m no Catalyst expert so maybe there IS a better workflow that I just haven&#8217;t seen yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2009/06/a-flash-catalyst-builder-workflow-method/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ObjectHandles V2, sneak peek</title>
		<link>http://www.rogue-development.com/blog2/2009/05/objecthandles-v2-sneak-peek/</link>
		<comments>http://www.rogue-development.com/blog2/2009/05/objecthandles-v2-sneak-peek/#comments</comments>
		<pubDate>Fri, 22 May 2009 20:15:04 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[ObjectHandles]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=418</guid>
		<description><![CDATA[Today I&#8217;ve been working on the next major release of ObjectHandles. Below is an example showing off some of the new features. I&#8217;m most excited about the enhanced rotation support.   This new version is focused on making a version that will easily work with MVC frameworks like Moccasin. Some of the changes include: You no [...]]]></description>
			<content:encoded><![CDATA[<p>Today I&#8217;ve been working on the next major release of <a href="http://rogue-development.com/objectHandles.html">ObjectHandles</a>.  Below is an example showing off some of the new features.  I&#8217;m most excited about the enhanced rotation support.    This new version is focused on making a version that will easily work with MVC frameworks like <a href="http://code.google.com/p/moccasin/">Moccasin</a>.   Some of the changes include:</p>
<ul>
<li>You no longer have to re-parent your components.</li>
<li>What and where handles appear is now completely configurable</li>
<li>ObjectHandles modifies your data object instead of moving a component around (there&#8217;s 3 example visual components / data models in the source)</li>
<li>Optionally, object handles won&#8217;t swallow all of your mouse events.</li>
<li>Will now work with non-flex components (still requires Flex SDK to compile, I have to look into that)</li>
<li>Rotation support is completely smooth</li>
<li>Configurable constraints/rules system</li>
<li>Smaller, cleaner code base!</li>
</ul>
<p>Scroll down for demo.</p>
<p><a href="http://rogue-development.com/uploads/moccasin/simpleworld.swf">Click to see</a> the early proof of concept of it working within Mocassin.</p>
<p>ObjectHandles is a library to easily add graphical move/resize user gestures to a Flex based application.</p>
<p>[kml_flashembed fversion="8.0.0" movie="/uploads/ohv2/ObjectHandles2Example.swf" targetclass="flashmovie" publishmethod="static" width="700" height="700" fvars="undefined"]</p>
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p>[/kml_flashembed]</p>
<p><a href="http://rogue-development.com/uploads/moccasin/simpleworld.swf"><br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2009/05/objecthandles-v2-sneak-peek/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Bubbling events in data models</title>
		<link>http://www.rogue-development.com/blog2/2009/04/bubbling-events-in-data-models/</link>
		<comments>http://www.rogue-development.com/blog2/2009/04/bubbling-events-in-data-models/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 20:17:06 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=373</guid>
		<description><![CDATA[I&#8217;ve been using moccasin for a bit now on a smallish project.  One of the cool things it does is give you a sort of event bubbling in your datamodel.  While moccasin is a very specific framework for a very specific sort of application, the more I think about it, the more I like the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using <a href="http://code.google.com/p/moccasin/">moccasin</a> for a bit now on a smallish project.  One of the cool things it does is give you a sort of event bubbling in your datamodel.  While moccasin is a very specific framework for a very specific sort of application, the more I think about it, the more I like the bubbling-events in the data model part as a general solution to a wider variety of problems.</p>
<p>Let&#8217;s look at a very simplified example that illustrates the general idea (actual mocasin implementation varies quite a bit from this).  Imagine this code&#8230;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">class</span> PizzaModel</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#91;</span>Bindable<span class="br0">&#93;</span> <span class="kw3">public</span> <span class="kw2">var</span> sauce:PizzaSauce;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#91;</span>Bindalbe<span class="br0">&#93;</span> <span class="kw3">public</span> <span class="kw2">var</span> <span class="kw3">size</span>:<span class="kw3">Number</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#91;</span>Bindable<span class="br0">&#93;</span> <span class="kw3">public</span> <span class="kw2">class</span> PizzaSauce</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">var</span> <span class="kw3">name</span>:<span class="kw3">String</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">var</span> displayColor:uint;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">class</span> PizzaView <span class="kw3">extends</span> UIComponent</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> setPizza<span class="br0">&#40;</span> pizza:PizzaModel <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;pizza.<span class="me1">addEventListener</span><span class="br0">&#40;</span>ModelChangeEvent.<span class="me1">MODEL_CHANGE</span>, onModelChange<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; protected <span class="kw2">function</span> onModelChange<span class="br0">&#40;</span>event:ModelChangeEvent<span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span> event.<span class="me1">property</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">case</span> <span class="st0">&quot;size&quot;</span>: <span class="co1">// the pizza size changed, handle that.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">case</span> <span class="st0">&quot;sauce/displayColor&quot;</span>: <span class="co1">// the sauce color changed, handle that.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">default</span>: <span class="co1">// some property that we can&#8217;t incrementally </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// update changed, handle that&#8230;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>We have some kind of model object, let&#8217;s call it the <strong>PizzaModel</strong>.</p>
<p>That model has a property, that itself is some kind of complex object.  Lets call that property <strong>sauce</strong>, and the type will be called <strong>PizzaSauce</strong></p>
<p>Now, we have some kind of view object.  Let&#8217;s call it the <strong>PizzaView</strong>.</p>
<p>A normal way to implement something like this would be to have the pizza view listen to events on both the pizza object and it&#8217;s sauce object.  Or it could manually set up some change-watchers that watched the hierarchy to the required properties.  </p>
<p>That&#8217;s all fine and dandy until we get to more complex object hierarchies.  What if we had an arraycollection of toppings and we needed to know when individual properties of those toppings changed?  Now, we&#8217;d have to listen to yet another type of event.</p>
<p>And what happens of those toppings themselves had lists of ingredients we wanted to listen to, suddenly the event chain is getting pretty gnarly to manage.</p>
<p>If we had some kind of magical bubbling model event, we&#8217;d only have to listen at a single location, as shown above.  Especially if there was an expressive way of identifying what changed.</p>
<p>How might something like this be implemented?</p>
<p>Mocassin does it by having a meta-data model that wraps the actual data model and provides this extra functionality.</p>
<p>Another way would be to force the data model objects to all extend from a common superclass (I believe earlier versions of Moccasin did just that)</p>
<p>Someday, I&#8217;d like to explore either creating a general purpose framework for this or extracting it from Moccasin.  I&#8217;m blogging about it hoping someone might do it before I get a chance <img src='http://www.rogue-development.com/blog2/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2009/04/bubbling-events-in-data-models/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex ADDED_TO_STAGE event and scrollbars</title>
		<link>http://www.rogue-development.com/blog2/2009/01/flex-added_to_stage-event-and-scrollbars/</link>
		<comments>http://www.rogue-development.com/blog2/2009/01/flex-added_to_stage-event-and-scrollbars/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 15:19:34 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=281</guid>
		<description><![CDATA[Be careful with ADDED_TO_STAGE event handlers, I ran into a interesting bug today.  Upon resizing the browser window, the current &#8220;activity&#8221; the user was working on would restart.  It should only have restarted when it was added to the stage and was confusing me why it would occur upon resizing a browser window. A little [...]]]></description>
			<content:encoded><![CDATA[<p>Be careful with ADDED_TO_STAGE event handlers, I ran into a interesting bug today.  Upon resizing the browser window, the current &#8220;activity&#8221; the user was working on would restart.  It should only have restarted when it was added to the stage and was confusing me why it would occur upon resizing a browser window.</p>
<p>A little digging, and I figured out why.</p>
<p>If you have a component inside a flex container like a Canvas.  And the container is resized and all of a sudden it requires a scrollbar to fit everything you will get an extra ADDED_TO_STAGE event.  Internally the container removes the component, creates a content pane to scroll around, and moves all of it&#8217;s children from the base container object onto this content pane.  That removal/addition causes the ADDED_TO_STAGE events to fire and caused my bug.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2009/01/flex-added_to_stage-event-and-scrollbars/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One good reason for IoC</title>
		<link>http://www.rogue-development.com/blog2/2009/01/one-good-reason-for-ioc/</link>
		<comments>http://www.rogue-development.com/blog2/2009/01/one-good-reason-for-ioc/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 14:31:27 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[IoC]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=279</guid>
		<description><![CDATA[So often I get asked why it&#8217;s a good idea to use an IoC container and it&#8217;s always difficult for me to explain.  It&#8217;s actually a fairly hard question to answer to somebody who has never used one.  I came across one great example this week. We&#8217;re working on an educational application made up of [...]]]></description>
			<content:encoded><![CDATA[<p>So often I get asked why it&#8217;s a good idea to use an IoC container and it&#8217;s always difficult for me to explain.  It&#8217;s actually a fairly hard question to answer to somebody who has never used one.  I came across one great example this week.</p>
<p>We&#8217;re working on an educational application made up of a series of lessons.  The general flow of our app is:</p>
<ol>
<li>Start Up</li>
<li>Login</li>
<li>Request what the next lesson is from the server.</li>
<li>Do the lesson</li>
<li>Send results</li>
<li>Goto #3</li>
</ol>
<p>To do #3 we have a service object that knows how to make that request to the server and handle the response.</p>
<p>But&#8230;</p>
<p>We don&#8217;t want to have to deal with having a server running all of the time during development of the client.  So we created a brand new class that implements the same interface as that service.  However, instead of asking the server what the next lesson should be, it displays a UI that lets the developer/qa person select a lesson.  With IoC we simply changed the configuration that instantiated that object to use this new class and bamn, it works throughout the application.</p>
<p>Now, I&#8217;m working on a demo of the software for management.  We want it to go through a predefined, fixed, list of lessons for the demo.  I created a new service object that maintains a list of lessons to go through sequentially, updated the config, and bamn&#8230; our demo is ready.</p>
<p>So now, the exact same application code can be run three different ways depending on what configuration we give it.</p>
<p>Now, it&#8217;s certainly easy to do a similar thing using other non-IoC approaches.  Maybe you&#8217;d need a recompile for those (but is that all that bad?).  The benefit with IoC is that it tends to make developing like this automatic.  It pushes developers to code to interfaces and create modules that can be easily replaced with others.  It&#8217;s a developer &#8220;state of mind&#8221; benefit.</p>
<p>In case you&#8217;re curious, we use <a href="http://www.spicefactory.org/parsley/">Parsley</a> as our IoC container.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2009/01/one-good-reason-for-ioc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenID From AIR</title>
		<link>http://www.rogue-development.com/blog2/2008/08/openid-from-air/</link>
		<comments>http://www.rogue-development.com/blog2/2008/08/openid-from-air/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 02:03:35 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[red5]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/08/openid-from-air/</guid>
		<description><![CDATA[I&#8217;ve been working on some web services recently.&#160; There&#8217;s both plain old browser accessed HTML pages plus an AMF interface to them.&#160; One feature of the HTML version is OpenID authentication.&#160; Now OpenID is all fine and dandy for a web application, but we get some problems when we want to use an AIR desktop [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on some web services recently.&#160; There&#8217;s both plain old browser accessed HTML pages plus an AMF interface to them.&#160; One feature of the HTML version is OpenID authentication.&#160; Now OpenID is all fine and dandy for a web application, but we get some problems when we want to use an AIR desktop client to connect and authenticate through OpenID.&#160; </p>
<p>If you&#8217;re not familiar with how OpenID works, here&#8217;s a quick summary.</p>
<ol>
<li>User goes to an application (Usually a web-app)</li>
<li>User types in their OpenID URL to that app</li>
<li>They get forwarded to their OpenID page where they can either grant or deny access.</li>
<li>That page then forwards them back to the original web app with an authentication token set.</li>
</ol>
<p>Obviously, it&#8217;s kind of hard to redirect back to a desktop application.&#160; I was thinking up some wacky work-a-rounds for this but then it hit me. </p>
<p>In the AIR app I can just use the HTML component and point it towards the login form of the web services.&#160; The user can then log in using either username/password or OpenID just like they do on the website.&#160; Now, here&#8217;s the cool part&#8230;&#160; The AIR HTML component shares a network stack with the AIR/Flex NetConnection object.&#160; That means any session/cookies/whatever opened in the HTML component carry through to the remoting calls I want to make from Actionscript. So I can authenticate using a web form, but then consume BlazeDS/LiveCycleDS/AMFPHP/Red5 services using AMF over Netconnection. </p>
<p>I did up a quick proof of concept and it works on both Windows and OSX.&#160; I was able to successfully call a remoting service that requires an authenticated session.&#160; So this was actually a much easier problem to figure out than I had feared. </p>
<p><img src="http://www.rogue-development.com/uploads/adlScreenSnapz014.png" width="600" height="448" /></p>
<p>Now, I&#8217;ll just need to make the web page that loads after a successful login somehow indicate to the AIR app that the user is successfully logged in.&#160; I&#8217;ll probably either use a tiny Flash component that signals over LocalConnection, or I&#8217;ll just make the AIR app watch for when the HTML component gets to a specific URL. I&#8217;m pretty sure I can get this to be a completely seamless experience for the user.</p>
<p>Oh, and as a bonus&#8230; the user can sign up for a new account instead of log into an existing one from &quot;within the app&quot; instead of going to an external website to do that.  </p>
<p><br/>
		      </p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/08/openid-from-air/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Object Handles Spotted?</title>
		<link>http://www.rogue-development.com/blog2/2008/07/object-handles-spotted/</link>
		<comments>http://www.rogue-development.com/blog2/2008/07/object-handles-spotted/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 13:25:23 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[flex]]></category>
		<category><![CDATA[ObjectHandles]]></category>
		<category><![CDATA[OpenSource]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/07/object-handles-spotted/</guid>
		<description><![CDATA[I might have spotted another use of ObjectHandles over at the AsButtonGen webpage.&#160; Over on the text and image tabs you can add stuff to your button that can be resized/moved using some familiar looking handles and mouse cursors.&#160; Also, I recognize a bug with resizing the left bottom corner that was in previous versions [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/firefoxscreensnapz003.png" width="164" height="130" align="right" /><br />
			    I might have spotted another use of <a href="http://rogue-development.com/objectHandles.html">ObjectHandles</a> over at the <a href="http://jirox.net/AsButtonGen/">AsButtonGen</a> webpage.&#160; Over on the text and image tabs you can add stuff to your button that can be resized/moved using some familiar looking handles and mouse cursors.&#160; Also, I recognize a bug with resizing the left bottom corner that was in previous versions of the library. </p>
<p>If it is ObjectHandles, this would be the second time I just ran into a use of them, that&#8217;s pretty cool.  Unfortunately, I couldn&#8217;t find an email address on that site. </p>
<p>But that aside, the site is  neat.&#160; It lets you create some pretty &quot;web 2.0&quot; style buttons with stripes, highlights, etc. </p>
<p>I spent some time on the library yesterday.&#160; I was tyring to get the rotation+resizing thing working better since it&#8217;s been somewhat broken for a while.&#160; I&#8217;ve never needed that feature so it&#8217;s been neglected.&#160; Unfortunately, I&#8217;m running into a bit of a brick wall.&#160; I&#8217;m still trying to figure out exactly what it should do, nevermind how.&#160; Luckily, most of my Trigonometry from High School is coming back to me since it&#8217;s heavy in that department. <br/>
		          </p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/07/object-handles-spotted/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Model Adapters &#8211; A binding pattern using an Adapter</title>
		<link>http://www.rogue-development.com/blog2/2008/07/model-adapters-a-binding-pattern/</link>
		<comments>http://www.rogue-development.com/blog2/2008/07/model-adapters-a-binding-pattern/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 05:26:21 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/07/model-adapters-a-binding-pattern/</guid>
		<description><![CDATA[Binding in Flex is great. It&#8217;s an ultra convienent way to get information from your data model to show up in your views. But it does have some limitations, and to work around those limitations I&#8217;ve been using the &#8220;Model Adapter&#8221; aka the &#8220;Wrapper&#8221; or just plain &#8220;Adapter&#8221; pattern (some info, and more). The basic [...]]]></description>
			<content:encoded><![CDATA[<p>Binding in Flex is great.  It&#8217;s an ultra convienent way to get information from your data model to show up in your views.  But it does have some limitations, and to work around those limitations I&#8217;ve been using the &#8220;Model Adapter&#8221; aka the &#8220;Wrapper&#8221; or just plain &#8220;Adapter&#8221; pattern (<a href="http://en.wikipedia.org/wiki/Wrapper_pattern">some info</a>, <a href="http://developerlife.com/tutorials/?p=19">and more</a>).</p>
<p>The basic idea is you shouldn&#8217;t have to modify your data model to use it in a specific view.  If you need to <strong>filter</strong>, <strong>sort</strong>, or <strong>summarize</strong> the data for a view you can do that through an Adapter so your model doesn&#8217;t need to understand that logic and you&#8217;re view isn&#8217;t reliant on a specific implementation of your model.</p>
<p><strong>Example</strong>: If you had a list of books in an array, and you want to filter by some property of books (say publisher) you shouldn&#8217;t apply the filter directly to the model.  Instead, create an adapter that can watch that array, and have that adapter apply the filter (or sort, or whatever).</p>
<p><strong>More Examples</strong>:  Consider <a href="http://www.tomsnyder.com/timelinerxe/">Timeliner XE,</a> a product I&#8217;ve been working on at my day-job.  The main data model is a list of events.  There are several views for that data.  We have a text based / grid view, and some graphical views.  Here&#8217;s a couple screenshots:</p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/adlscreensnapz012.png" alt="" width="628" height="388" /></p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/adlscreensnapz013.png" alt="" width="628" height="388" /></p>
<p>Each of those screenshots has 2 views active at a time, the grid, and then a seperate graphical view.  That makes 3 views that all want to bind to our data model.  But, notice the grid has 5 events in it, while the graphical views only have 3.  This is because only 3 of those events are valid to plot (they have a date).  It&#8217;d be nice if we only had to bind to a list of events that actually has the data we want.</p>
<p>Now take a look at these three screenshots from <a href="http://www.agileagenda.com/">AgileAgenda</a>, my project scheduling application.</p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/agileagendascreensnapz007.png" alt="" width="570" height="427" /><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/agileagendascreensnapz008.png" alt="" width="570" height="427" /><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/agileagendascreensnapz009.png" alt="" width="593" height="429" /></p>
<p>In all of these the data we have is a list of tasks.  The first two show one view with two different filters applied to the data.  The third shows a large grid with all of our tasks, and a much shorter pulldown that only has the tasks that are also milestones.  (A milestone is a specific type of task)</p>
<p>To create an adapter:</p>
<ul>
<li>Create a new adapter class</li>
<li>Create a constructor for that class that takes in the &#8220;source&#8221; data model, and any options that might be specific to the adapter.</li>
<li>Add event listeners to the &#8220;source&#8221; model.</li>
<li>Write event handlers in the adapter to update the adapter&#8217;s internal state when the source changes.</li>
<li>Write accessors in the adapter, so other components can get data from it.</li>
</ul>
<p><strong>A simple example&#8230;</strong></p>
<p><a href="http://rogue-development.com/uploads/model_adapter/ModelAdapterExample.html">Click here</a> to run a simple example.  <a href="http://rogue-development.com/uploads/model_adapter/srcview/index.html">View-source</a> is enabled in that. Here&#8217;s a screenshot of the example:</p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/firefoxscreensnapz001.png" alt="" width="387" height="471" /></p>
<p>When you run the example, it creates a simple data model, populates that data model with 4 sample items, and then creates 4 panels.  Each of those panels represents a view. The example also creates 4 different model adapters all from the same data model, but with different options set.  Then each panel gets a different adapter.</p>
<p>As you add items to the data model, you can see that the 4 views update depending on whether or not they are filtered and sorted.</p>
<p><strong>Our Data Model:</strong></p>
<pre>package
{
    public  DataItemExample
    {
        public var name:String;
        public var amount:Number;
        public var active:Boolean;
    }
}</pre>
<p>&#8212;-</p>
<pre>package
{
    import mx.collections.ArrayCollection;

    public  DataModelExample
    {
        [Bindable] public var myDataItems:ArrayCollection = new ArrayCollection();

    }
}</pre>
<p>As you can see, it&#8217;s a pretty simple data model.  There are items with a name, amount and active properties, and then there is DataModelExample class with an array of those.  Notice that no view-specific data is in there.</p>
<p>Now, lets create our adapter and name it &#8220;AdapterExample&#8221;</p>
<p>First, create a constructor and some variables to hold some information about the adapter.  We&#8217;ll have 2 options. onlyActiveItems and sorted.  For sorted, we&#8217;ll also create a Sort object to actually do the sort for us.  And we&#8217;ll also create an array to hold our filtered/sorted list of items.  Note that we add an event listener for the COLLECTION_CHANGE event.  This is how we&#8217;ll propogate changes from the data model to our adapter.  We&#8217;ll see the handler for that later.</p>
<pre> public  AdapterExample extends EventDispatcher
    {
        protected var model:DataModelExample;
        protected var filteredDataItems:ArrayCollection = new ArrayCollection();
        protected var _onlyActiveItems:Boolean;
        protected var _sorted:Boolean = false;
        protected var sort:Sort;        

        public function AdapterExample(dataModel:DataModelExample, onlyActiveItems:Boolean, sorted:Boolean)
        {
            _sorted = sorted;
            _onlyActiveItems = onlyActiveItems;

            model = dataModel;
            model.myDataItems.addEventListener(CollectionEvent.COLLECTION_CHANGE, onItemsChanged );    

            if(sorted)
            {
                sort = new Sort();
                sort.fields = [new SortField("name",true)];
            }

            rebuildFilteredArray();
        }</pre>
<p>Notice that we called rebuildFilteredArray above.  Lets write that next.    All this method does is loop through our data model and grab all the items from it (respecting our filtering option) and adds them to our internal array.  It also applies the sort if neccessary.  At the end we dispatch two events which will be used for binding later.</p>
<pre>  protected function rebuildFilteredArray() : void
        {
            var tmp:Array = [];
            for each ( var item:DataItemExample in model.myDataItems )
            {
                if( (! _onlyActiveItems ) || (item.active) )
                {
                    tmp.push(item);
                }
            }                        

            filteredDataItems = new ArrayCollection(tmp);

            if( sort )
            {
                filteredDataItems.sort = sort;
                filteredDataItems.refresh();
            }

            dispatchEvent(new Event("dataItemsUpdated") );
            dispatchEvent(new Event("totalChanged") );
        }</pre>
<p>So now if we made an adapter it would start up, read in the source data model, and populate our internal array of items.  But it wouldn&#8217;t respond to changes in the source data model.  So lets create the event handler that we set up in the constructor. We&#8217;ll also create  a couple helper methods</p>
<pre>    protected function onItemsChanged(event:CollectionEvent):void
        {
            switch(event.kind)
            {
                case CollectionEventKind.ADD: addItems(event.items); break;
                case CollectionEventKind.REMOVE: removeItems(event.items); break;

                case CollectionEventKind.MOVE:
                case CollectionEventKind.REFRESH:
                case CollectionEventKind.REPLACE:
                case CollectionEventKind.RESET:    rebuildFilteredArray();
                                                break;

                case CollectionEventKind.UPDATE:  

            }

        }

        protected function addItems(items:Array):void
        {
            for each ( var item:DataItemExample in items )
            {
                if( (! _onlyActiveItems ) || (item.active) )
                {
                    filteredDataItems.addItem(item);
                }
            }
            dispatchEvent(new Event("totalChanged") );
        }

        protected function removeItems(items:Array):void
        {
            for each ( var item:DataItemExample in items )
            {
                var index:int = filteredDataItems.getItemIndex(item);
                if( index != -1 )
                {
                    filteredDataItems.removeItemAt(index);
                }
            }
            dispatchEvent(new Event("totalChanged") );
        }</pre>
<p>For adding/removing items we&#8217;re going to our internal array and manually adding or removing items from it.  We&#8217;re making sure to account for filtered items, but the sort object is taking care of the sorting for us.</p>
<p>For the other types of events,  we&#8217;re kind of cheating.  We only really care about adding / removing operations so we&#8217;ll just rebuild our entire internal array on other types of events.  If your application uses those types of events often, you should implement them in the adapter in a more efficient manner.</p>
<p><strong>Exposing data from the Adapter</strong></p>
<p>We now have the internal state of the adapter updating as the model changes.  So the only thing left to do in there is expose some properties so we can get at that info from our view.  Let&#8217;s write two bindable getters.  One of them will summarize the data (get total()) the other will give us our filtered list (get dataItems())</p>
<p>Note that we set the event=&#8221;" property in the [Bindable] tags so our views can correctly know when these properties change.</p>
<pre>  [Bindable(event="dataItemsUpdated")]
        public function get dataItems() : ArrayCollection
        {
            return filteredDataItems;
        }

        [Bindable(event="totalChanged")]
        public function get total() : Number
        {
            var total:Number = 0;
            for each ( var item:DataItemExample in filteredDataItems )
            {
                total += item.amount;
            }    

            return total;
        }</pre>
<p><strong>Using the Adapter</strong></p>
<p>Once you&#8217;ve done all of that, you can actually use your adapter.  So create your data model, create your adapter, and use it!</p>
<pre> [Bindable] protected var dataModel:DataModelExample = new DataModelExample();
 [Bindable] protected var example1:AdapterExample = new AdapterExample( dataModel, true ,true);</pre>
<p>&#8230;</p>
<pre>    <span class="MXMLComponent_Tag">&lt;mx:Panel</span><span class="MXMLDefault_Text"> x="</span><span class="MXMLString">10</span><span class="MXMLDefault_Text">" y="</span><span class="MXMLString">218</span><span class="MXMLDefault_Text">" width="</span><span class="MXMLString">250</span><span class="MXMLDefault_Text">" height="</span><span class="MXMLString">200</span><span class="MXMLDefault_Text">" layout="</span><span class="MXMLString">absolute</span><span class="MXMLDefault_Text">" title="</span><span class="MXMLString">Filtered, Sorted</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:Label</span><span class="MXMLDefault_Text"> x="</span><span class="MXMLString">10</span><span class="MXMLDefault_Text">" y="</span><span class="MXMLString">132</span><span class="MXMLDefault_Text">" text="</span><span class="MXMLString">Total:</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:Label</span><span class="MXMLDefault_Text"> x="</span><span class="MXMLString">56</span><span class="MXMLDefault_Text">" y="</span><span class="MXMLString">132</span><span class="MXMLDefault_Text">" text="</span><span class="MXMLString">{</span>example1.total<span class="MXMLString">}</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:List</span><span class="MXMLDefault_Text"> x="</span><span class="MXMLString">10</span><span class="MXMLDefault_Text">" y="</span><span class="MXMLString">4</span><span class="MXMLDefault_Text">" width="</span><span class="MXMLString">210</span><span class="MXMLDefault_Text">" height="</span><span class="MXMLString">120</span><span class="MXMLDefault_Text">" dataProvider="</span><span class="MXMLString">{</span>example1.dataItems<span class="MXMLString">}</span><span class="MXMLDefault_Text">" labelField="</span><span class="MXMLString">name</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span><span class="MXMLComponent_Tag">&lt;/mx:List&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/mx:Panel&gt;</span></pre>
<p>If you look at the source of the example, we actually create 4 adapters with varying options.</p>
<p><strong>Beyond this basic example</strong></p>
<p>If you want your adapter to respect changes to individual items, your items should implement the IPropertyChangeNotifier interface.  So in our example if we edited an item so it&#8217;s active flag changed, the views would not update.  To make that work we would implement that IPropertyChangeNotifier interface, and then write some code for the CollectionEventKind.UPDATE event.</p>
<p>Often times only one or two views are visible at a time and it&#8217;d be nice if all the views in the background weren&#8217;t madly updating themselves every change.  To accomplish that I often write an enable() disable() method on the adapter.  They usually look something like this:</p>
<p>protected function enable() : void</p>
<p>{</p>
<p>model.myDataItems.addEventListener(CollectionEvent.COLLECTION_CHANGE, onItemsChanged );</p>
<p>rebuildFilteredArray();</p>
<p>}</p>
<p>protected function disable() : void</p>
<p>{</p>
<p>model.myDataItems.removeEventListener(CollectionEvent.COLLECTION_CHANGE, onItemsChanged );</p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/07/model-adapters-a-binding-pattern/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>The Essential Guide to Open Source Flash Development</title>
		<link>http://www.rogue-development.com/blog2/2008/07/the-essential-guide-to-open-source-flash-development/</link>
		<comments>http://www.rogue-development.com/blog2/2008/07/the-essential-guide-to-open-source-flash-development/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 13:34:22 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[red5]]></category>
		<category><![CDATA[Schedule]]></category>
		<category><![CDATA[XRay]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/07/the-essential-guide-to-open-source-flash-development/</guid>
		<description><![CDATA[The book I&#8217;ve been working on, The Essential Guide to Open Source Flash Development, is now out in stores.  It&#8217;s hard to believe that I started working on it about 11 months ago!  It&#8217;s really great to see all of that hard work finally in print. So What is it about? The book does a [...]]]></description>
			<content:encoded><![CDATA[<p>The book I&#8217;ve been working on, <em>The Essential Guide to Open Source Flash Development</em>, is now out in stores.  It&#8217;s hard to believe that I started working on it about 11 months ago!  It&#8217;s really great to see all of that hard work finally in print.</p>
<p><img src="http://rogue-development.com/uploads/book.jpg" alt="" width="600" height="528" /></p>
<p>So What is it about?</p>
<p>The book does a few things.  First, about a third of the book introduces you to some open source tools for doing flash development.  Things like FlashDevelop, MTASC, SwfMill, ANT, and ASDT.  It&#8217;ll show you how to create an AS2 and an AS3 based flash application using completely free and open software.  This goes all the way from installing the tools, creating a sample app, writing up some unit tests for it, and then  to publishing it to the web.  Along the way it&#8217;ll give you a brief introduction to each tool, explain what it does, and then give a quick example of how to use it.  (That&#8217;s the 5 chapters I wrote)</p>
<p>The remaining 2/3 of the book dedicates a chapter to various open source projects going into a little more detail about them.  There&#8217;s a chapter on Papervision 3D, SWX, FUSE/Go, HAXE, AMFPHP, two for Red5 and a couple more.</p>
<p>This was a lot of fun to work on, and my only regret is not getting to know the other authors better.</p>
<p>If you&#8217;re looking for a place to buy it, check out <a href="http://www.bookpool.com/sm/1430209933">Bookpool</a>.   I worked for them for a year and they&#8217;re really stellar guys.  They offer good prices, but more importantly;  as long as the book is in stock, they do their damndest to get it on a truck the day you order it. (Of course, you&#8217;re at the mercy of the publisher if it&#8217;s out of stock)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/07/the-essential-guide-to-open-source-flash-development/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Talk tonight on ObjectHandles+Degrafa (Attend online!)</title>
		<link>http://www.rogue-development.com/blog2/2008/07/talk-tonight-on-objecthandlesdegrafa-attend-online/</link>
		<comments>http://www.rogue-development.com/blog2/2008/07/talk-tonight-on-objecthandlesdegrafa-attend-online/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 12:07:30 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[flex]]></category>
		<category><![CDATA[ObjectHandles]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=221</guid>
		<description><![CDATA[As mentioned in a previous post, I&#8217;m giving a talk to the BFAIG group on creating a simple diagramming application in Flex using ObjectHandles and Degrafa.  It&#8217;s been delayed until tonight at 7:00pm EST.  If you&#8217;re interested in seeing it, this is a joint in-person and online meeting.  I&#8217;m actually attending from a remote location, [...]]]></description>
			<content:encoded><![CDATA[<p>As mentioned in a <a href="http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/">previous post</a>, I&#8217;m giving a talk to the <a href="http://www.bfaig.org/">BFAIG</a> group on creating a simple diagramming application in Flex using ObjectHandles and Degrafa.  It&#8217;s been delayed until tonight at 7:00pm EST.  If you&#8217;re interested in seeing it, this is a joint in-person and online meeting.  I&#8217;m actually attending from a remote location, so the online experience should be pretty good.  You can get info about how to attend online at the <a href="http://www.bfaig.org/blog/?p=85">BFAIG Blog</a> post.</p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/06/safariscreensnapz009.png" alt="" width="613" height="471" /></p>
<ul>
<li><a href="http://rogue-development.com/uploads/degrafa_oh2/">Run the application</a> (Flex application with view-source enabled)</li>
<li><a href="http://www.rogue-development.com/objectHandles/diagramTutorial/">Creating a simple diagramming application</a> (14 Minute Video)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/07/talk-tonight-on-objecthandlesdegrafa-attend-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Printing horrors</title>
		<link>http://www.rogue-development.com/blog2/2008/06/printing-horrors/</link>
		<comments>http://www.rogue-development.com/blog2/2008/06/printing-horrors/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 13:45:32 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=219</guid>
		<description><![CDATA[Printing in a Flash/Flex application can be tricky to get right.  I&#8217;ve been working on a very print-heavy application recently.  We&#8217;ve been having a long standing intermittent bug where we print a large document, but some things on that document that were created through the Flash drawing API wouldn&#8217;t be on the paper. We added [...]]]></description>
			<content:encoded><![CDATA[<p>Printing in a Flash/Flex application can be tricky to get right.  I&#8217;ve been working on a very <a href="http://www.tomsnyder.com/timelinerxe/">print-heavy application</a> recently.  We&#8217;ve been having a long standing intermittent bug where we print a large document, but some things on that document that were created through the Flash drawing API wouldn&#8217;t be on the paper.</p>
<p>We added a</p>
<p><strong>var options:Object = canvas.prepareToPrint( canvas );</strong></p>
<p>Before the print and a</p>
<p><strong>canvas.finishPrint( options, canvas);</strong></p>
<p>After the print, and it seems to have solved our problem even though the documentation says we shouldn&#8217;t ordinarily need to explicitly call those.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/06/printing-horrors/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Xray Viewer updated</title>
		<link>http://www.rogue-development.com/blog2/2008/06/xrayviewer-updated/</link>
		<comments>http://www.rogue-development.com/blog2/2008/06/xrayviewer-updated/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 12:10:15 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[XRay]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/06/xrayviewer-updated/</guid>
		<description><![CDATA[The XRayViewer has been broken for quite some time. I had originally done it with an AIR beta, and that has since stopped working. So there&#8217;s now a newly compiled version just waiting for you to grab. What is the XRayViewer? So you may be asking yourself What exactly is the XRayViewer? All this little [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://rogue-development.com/images/icon128.png" alt="" width="128" height="128" /></p>
<p>The <a href="http://rogue-development.com/xrayviewer.html">XRayViewer</a> has been broken for quite some time.  I had originally done it with an AIR beta, and that has since stopped working.  So there&#8217;s now a newly compiled version just waiting for you to grab.</p>
<p><img src="http://rogue-development.com/images/xrayviewerscreenshot.png" alt="" width="645" height="518" /></p>
<h2>What is the XRayViewer?</h2>
<p>So you may be asking yourself <em>What exactly is the XRayViewer? </em></p>
<p>All this little app does is host the XRay connector and let you load a local swf. Then it displays the swf with some simple controls to play/stop/advance/back. The big benefit is you can then use <a href="http://www.osflash.org/xray/">XRay</a> (By <a href="http://www.rockonflash.com/">John Grden</a> + Others) to inspect the swf without changing any code around.</p>
<p>There&#8217;s three new (very minor) features in this version:</p>
<ol>
<li>There&#8217;s a button to launch the XRay interface in your default browser.</li>
<li>The path to the loaded swf is displayed in the top toolbar.  (You can copy &amp; paste that into Xray so you don&#8217;t have to navigate as far into the hierarchy)</li>
<li>New logo / icons</li>
</ol>
<h2>Now Open Source!</h2>
<p>The entire project is now licensed under the MIT license.  If you install the application and then right click on it you can &#8220;View Source&#8221; to get the source code for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/06/xrayviewer-updated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a simple diagramming application</title>
		<link>http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/</link>
		<comments>http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 11:20:52 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[ObjectHandles]]></category>
		<category><![CDATA[OpenSource]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/</guid>
		<description><![CDATA[Tonight, I&#8217;ll be giving a short talk to BFAIG on using ObjectHandles and Degrafa to make a simple diagramming application.  This application demonstrates the basics of working with Degrafa, and also shows how easy it is to make an interface that allows users to resize and move objects on screen. The example application has source [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight, I&#8217;ll be giving a short talk to <a href="http://www.bfaig.org/">BFAIG</a> on using <a href="http://www.rogue-development.com/objectHandles.html">ObjectHandles</a> and Degrafa to make a simple diagramming application.  This application demonstrates the basics of working with Degrafa, and also shows how easy it is to make an interface that allows users to resize and move objects on screen.</p>
<p>The example application has source attached, and is licensed under the MIT license.  I hope someone can take it and make some really great application out of it.  Please drop me an email if you do!</p>
<p>I recorded a practice-run I did, so here it is&#8230;</p>
<ul>
<li><a href="http://rogue-development.com/uploads/degrafa_oh2/">Run the application</a> (Flex application with view-source enabled)</li>
<li><a href="http://www.rogue-development.com/objectHandles/diagramTutorial/">Creating a simple diagramming application</a> (14 Minute Video)</li>
</ul>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/06/safariscreensnapz009.png" alt="" width="613" height="471" /></p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

