<?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>Alex Uhlmann</title>
	<atom:link href="http://blogs.adobe.com/auhlmann/feed" rel="self" type="application/rss+xml" />
	<link>http://blogs.adobe.com/auhlmann</link>
	<description>Technical Architect, Adobe Professional Services</description>
	<lastBuildDate>Fri, 29 Jul 2011 15:50:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Cairngorm Updates</title>
		<link>http://blogs.adobe.com/auhlmann/2011/07/cairngorm-updates.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2011/07/cairngorm-updates.html#comments</comments>
		<pubDate>Fri, 29 Jul 2011 15:50:32 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/?p=37</guid>
		<description><![CDATA[Over the past weeks we’ve migrated our SVN code repository to SourceForge, released new versions of our libraries (maven repository) but most importantly added two additional non-Adobe members to our team! Welcome Pascal Romanens from Kalyss and Brian Lay from &#8230; <a href="http://blogs.adobe.com/auhlmann/2011/07/cairngorm-updates.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Over the past weeks we’ve migrated our SVN code repository to <a href="https://sourceforge.net/adobe/cairngorm/code/">SourceForge</a>, released new versions of our <a href="https://sourceforge.net/adobe/cairngorm/wiki/CairngormLibraries/">libraries</a> <a href="http://svn.code.sf.net/adobe/cairngorm/code/cairngorm3/maven-repository/">(maven repository)</a> but most importantly added two additional non-Adobe members to our team!</p>
<p>Welcome Pascal Romanens from Kalyss and Brian Lay from HP!</p>
<p>Brian will probably focus mostly on the navigation library and Pascal already added features and bugfixes to the Persistence library.</p>
<p>If you’re interested in contributing to Cairngorm, please contact <a href="http://www.droff.com/">Francois Le Droff</a> (ledroff att adobe dott com)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2011/07/cairngorm-updates.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm 3 &#8211; Revised Guidelines and Core Principles</title>
		<link>http://blogs.adobe.com/auhlmann/2010/10/cairngorm-3-revised-guidelines-and-core-principles.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2010/10/cairngorm-3-revised-guidelines-and-core-principles.html#comments</comments>
		<pubDate>Sat, 23 Oct 2010 18:28:43 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Cairngorm]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/?p=27</guid>
		<description><![CDATA[We&#8217;ve revised the guidelines section. In my opinion, one very significant new area are the Core Principles. These are principles that we feel are crucial to adhere to when developing enterprise RIAs. They are also easier to agree upon between &#8230; <a href="http://blogs.adobe.com/auhlmann/2010/10/cairngorm-3-revised-guidelines-and-core-principles.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>We&#8217;ve revised the <a href="https://sourceforge.net/adobe/cairngorm/wiki/CairngormGuidelines/">guidelines section</a>. In my opinion, one very significant new area are the <a href="https://sourceforge.net/adobe/cairngorm/wiki/CorePrinciples/">Core Principles</a>. These are principles that we feel are crucial to adhere to when developing enterprise RIAs. They are also easier to agree upon between teams even if some areas (such as an IoC framework choice) might be more difficult to agree upon. Looking for commonality between teams can help bring more consistency eventually.</p>
<p>Additionally, don&#8217;t forget the <a href="http://max.adobe.com/schedule/by-session/flex-and-livecycle-data-services-best-practices-from-the-trenches/c9ddc167-eeac-4147-9f55-0711b9596e6d">MAX presentations</a> of <a href="http://www.jroller.com/francoisledroff/">Francois Le Droff </a> and <a href="http://blogs.adobe.com/yderidder/">Yaniv De Ridder</a>; who will touch on build automation and the impact of multi-screen on client side architecture. Afterwards, I hope we can add some outputs of it to Cairngorm.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2010/10/cairngorm-3-revised-guidelines-and-core-principles.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cairngorm 3 – Migration to Open@Adobe, Library Updates and MAX Presentations</title>
		<link>http://blogs.adobe.com/auhlmann/2010/10/cairngorm-3-%e2%80%93-migration-to-openadobe-library-updates-and-max-presentations.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2010/10/cairngorm-3-%e2%80%93-migration-to-openadobe-library-updates-and-max-presentations.html#comments</comments>
		<pubDate>Tue, 19 Oct 2010 21:53:45 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/?p=24</guid>
		<description><![CDATA[Over the past months Cairngorm 3 has moved to a new location, the new Open@Adobe space at SourceForge. Last week we’ve released new versions from our navigation, module, integration, observer and popup libraries. The how-to documents linked through the libraries &#8230; <a href="http://blogs.adobe.com/auhlmann/2010/10/cairngorm-3-%e2%80%93-migration-to-openadobe-library-updates-and-max-presentations.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Over the past months <a href="https://sourceforge.net/adobe/cairngorm/home/">Cairngorm 3 has moved to a new location</a>, the new <a href="https://sourceforge.net/adobe/">Open@Adobe space at SourceForge</a>. Last week we’ve released new versions from our navigation, module, integration, observer and popup <a href="https://sourceforge.net/adobe/cairngorm/wiki/CairngormLibraries">libraries</a>. The how-to documents linked through the <a href="https://sourceforge.net/adobe/cairngorm/wiki/CairngormLibraries">libraries page</a> show what’s changed and add further documentation.</p>
<p>If you’re at MAX, make sure you checkout the session from <a href="http://www.jroller.com/francoisledroff/">Francois Le Droff </a> and <a href="http://blogs.adobe.com/yderidder/">Yaniv De Ridder</a>, who will present <a href="http://bit.ly/90swvA">technical insights from a large-scale RIA project built inside Adobe</a>, which uses Cairngorm 3 guidelines, tools and libraries.</p>
<p>Additionally, <a href="http://blogs.adobe.com/xagnetti/">Xavier Agnetti</a> and <a href="http://www.rialvalue.com/blog/">Xavi Beumala</a> will <a href="https://max.adobe.com/schedule/by-session/flexpmd-your-canary-in-a-coal-mine/e5bef8ba-cbc9-4594-9f49-89f42b25606f">discuss FlexPMD</a>, which is a crucial tool we use in our projects. More tools we’ve found important are linked through our tools section.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2010/10/cairngorm-3-%e2%80%93-migration-to-openadobe-library-updates-and-max-presentations.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm 3 Released</title>
		<link>http://blogs.adobe.com/auhlmann/2010/05/cairngorm_3_rel.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2010/05/cairngorm_3_rel.html#comments</comments>
		<pubDate>Tue, 18 May 2010 21:04:27 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/2010/05/cairngorm_3_rel.html</guid>
		<description><![CDATA[I&#8217;m excited to announce that Cairngorm 3 is released! Cairngorm communicates best practices for enterprise Flex and AIR application development, contributed by Adobe Technical Services and partners. Cairngorm is our opinion on applying modularity, IoC, agile testing, build automation and &#8230; <a href="http://blogs.adobe.com/auhlmann/2010/05/cairngorm_3_rel.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m excited to announce that <a href="https://sourceforge.net/adobe/cairngorm/home/">Cairngorm 3 is released</a>! Cairngorm communicates best practices for enterprise Flex and AIR application development, contributed by Adobe Technical Services and partners. Cairngorm is our opinion on applying modularity, IoC, agile testing, build automation and everything else we find crucial to build enterprise Flex and AIR applications. It is one set of guidelines, tools and libraries you can hand-off to enterprise development teams. Based on our own experience of many large-scale projects, Cairngorm attempts to share this opinion; early and often in order to get your feedback quicker and to advance the Flash platform in the enterprise.<br />
Since going into public Beta in October last year, I think we&#8217;ve made a significant step towards making the guidelines coherent, many libraries robust and the tools section a best-of-breed filter for the tools we&#8217;ve been using successfully in practice. This is a living project! Expect changes as we&#8217;ll receive feedback and our own thinking evolves; Cairngorm will evolve. Cairngorm is a success for us, if it portrays what works for us and can work for our partners and the external community leveraging the Flash Platform.<br />
Cairngorm starts <a href="https://sourceforge.net/adobe/cairngorm/home/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2010/05/cairngorm_3_rel.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm 3 Beta is Out!</title>
		<link>http://blogs.adobe.com/auhlmann/2009/10/cairngorm_3_bet.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2009/10/cairngorm_3_bet.html#comments</comments>
		<pubDate>Mon, 05 Oct 2009 23:27:00 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Cairngorm]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/2009/10/cairngorm_3_bet.html</guid>
		<description><![CDATA[I&#8217;m excited to announce that we&#8217;ve redefined Cairngorm to increase its scope. Tom Sugden announced our intentions here last month. We&#8217;ve now published the first content on opensource.adobe.com. Instead of only providing a specific implementation of an MVC architecture, our &#8230; <a href="http://blogs.adobe.com/auhlmann/2009/10/cairngorm_3_bet.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m excited to announce that we&#8217;ve redefined Cairngorm to increase its scope. <a href="http://blogs.adobe.com/tomsugden/2009/09/coming_soon_cairngorm_3_1.html">Tom Sugden announced</a> our intentions here last month. We&#8217;ve now published the first content on <a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm+3">opensource.adobe.com</a>.<br />
Instead of only providing a specific implementation of an MVC architecture, our team within the Adobe Technical Services organization took a step back and collected some of the most important knowledge that helped us deliver enterprise Flex applications over the last few years of consulting projects. This includes modular application development, layered architecture, domain-driven design, loose coupling, quality guidelines, build automation strategies, agile testing, code coverage best practices, and more. We present Cairngorm in three parts:</p>
<p><span id="more-21"></span></p>
<ul>
<li>Guidelines that explain our motivations and how to implement them.</li>
<li>Tools that help us adhere to our guidelines and streamline our development process.</li>
<li>Libraries that extend existing architectural frameworks and solve recurring problems.</li>
</ul>
<p>This collected knowledge shows how large-scale enterprise application development can be achieved with the Flash Platform today.<br />
Our goal is to promote a kind of application development that is clear, consistent, testable and scalable. These aspirations are independent of whatever application framework you chose to use. The specific MVC framework of Cairngorm 2 remains as is and is not deprecated. It has been in use now for almost a decade and its simple, prescriptive nature allowed developers with a background in J2EE core patterns to apply it successfully.<br />
However, the increasing scale of some Flex applications and progression in the frameworks space in other languages demands a different focus, hence the success of recent Inversion-of-Control frameworks such as Parsley, Spring ActionScript, Swiz, Flicc and more. Cairngorm embraces this change, but does not want to compete by transforming into another IoC framework. Instead, we encourage the further development, standardisation and consolidation of the current situation. We want to explain how the design patterns advocated by Cairngorm can be applied with these new frameworks, while providing a more complete picture of what we find crucial in delivering successful, large-scale Flex applications.<br />
Our goal is to be responsive and to release early and often. Therefore, aside from releasing content that has proven to work for us for many years, we will also release libraries that are in experimental stages. Our goal is to get quicker feedback from you and to provide more value to the Flash platform community at large.<br />
Cairngorm 3 Beta starts <a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm+3">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2009/10/cairngorm_3_bet.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe TV: Agile Testing of Enterprise RIAs with Flex and LiveCycle ES</title>
		<link>http://blogs.adobe.com/auhlmann/2009/01/adobe_tv_agile.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2009/01/adobe_tv_agile.html#comments</comments>
		<pubDate>Thu, 22 Jan 2009 20:11:27 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/2009/01/adobe_tv_agile.html</guid>
		<description><![CDATA[Adobe TV now hosts the full MAX 2008 session about Agile Testing of Enterprise RIAs with Flex and LiveCycle ES from Herve Dupriez and me. Herve talks about the LCES part and I about Flex. This presentation focuses on how &#8230; <a href="http://blogs.adobe.com/auhlmann/2009/01/adobe_tv_agile.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Adobe TV now hosts the full MAX 2008 session about <a href="http://tv.adobe.com/#vi+f15384v1033">Agile Testing of Enterprise RIAs with Flex and LiveCycle ES</a> from Herve Dupriez and me. Herve talks about the LCES part and I about Flex.<br />
This presentation focuses on how your architectural design could look like to make agile testing feasible and efficient. It’s explaining principles we’ve been following at projects that can make Test Driven Development of RIAs a reality.<br />
It also touches upon code coverage tooling available for Flex and its recommended usage. Checkout <a href="http://code.google.com/p/flexcover/">Flexcover</a>, the open source code coverage tool. Flexcover was created by <a href="http://joeberkovitz.com/blog/">Joe Berkovitz</a> and some months ago I joined his efforts after I developed an internal tool that followed another approach using only Flash Player APIs. Joe&#8217;s approach is actually customizing the open source Flex compiler and can therefore achieve object code branch coverage. Join the Flexcover project to keep it going!<br />
During the presentation I’ve mentioned further information about IoC frameworks that my collegue Ed Eustace already <a href="http://code.google.com/p/flex-ioc-examples">put online</a>. Also, Michael Labriola’s presentation at MAX 08 “Testing Flex Applications” spend more time comparing different testing tools. This is not online at Adobe TV yet, but upcoming.<br />
Also check out the presentations from my other colleagues at Adobe Professional Services:</p>
<ul>
<li><a href="http://tv.adobe.com/#vi+f15384v1016">RIA Development with Cairngorm &#8211; Tips from the Experts<br />
from Peter Martin and Eric Garza</a></li>
<li>Architectural Best Practices for Flex and LiveCycle ES Application from Steven Webster and Tunde Turner</li>
<li><a href="http://tv.adobe.com/#vi+f15383v1064">Television on AIR &#8211; Creating Custom Media Player Experiences from Xavi Beumala Segura, John Bennett Kyle Glossy and Mark Hirsch</a></li>
<li>
<a href="http://tv.adobe.com/#vi+f15384v1017">Delivering Collaborative Apps with AIR and LiveCycle Data Services from Alistair McLeod and Xavier Agnetti</a>
</li>
<li><a href="http://tv.adobe.com/#vi+f15383v1051">Lazy Innovation: Strategy for the Design of Innovative User Experiences from George Neill and Jerome Doran</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2009/01/adobe_tv_agile.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Download Flight Effect</title>
		<link>http://blogs.adobe.com/auhlmann/2009/01/download_flight.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2009/01/download_flight.html#comments</comments>
		<pubDate>Thu, 22 Jan 2009 19:54:58 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Effects]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/2009/01/download_flight.html</guid>
		<description><![CDATA[Imagine an airplane that takes off the ground, flies across a distance and lands at an arbitrary destination. This post will explain how to do the same in Flex, using the Flight effect, which you can download here. Before I &#8230; <a href="http://blogs.adobe.com/auhlmann/2009/01/download_flight.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Imagine an airplane that takes off the ground, flies across a distance and lands at an arbitrary destination. This post will explain how to do the same in Flex, using the Flight effect, which you can download here.<br />
Before I explain any further, take a look at <a href="http://alex-uhlmann.de/flash/adobe/blog/store_with_flighteffect/">a running example</a>. I&#8217;ve taken the Cairngormstore and added the Flight effect to the point when the user wants to add a product to his shopping cart. Simply click on the &#8220;Add to Cart&#8221; button to see the effect playing.<br />
<img alt="store_with_flighteffect.JPG" src="http://weblogs.macromedia.com/auhlmann/archives/store_with_flighteffect.JPG" width="504" height="613" /><br />
The key here is that the product doesn&#8217;t immediately appear in the shopping cart DataGrid control as the user presses the &#8220;Add to Cart&#8221; button. Instead, the Flight effect animates the product into the shopping cart control. Download it <a href="http://blogs.adobe.com/auhlmann/flightEffect.zip">here</a>.</p>
<p><span id="more-18"></span><br />
The implementation of this effect is surly too exaggerated for any real life application and I strongly recommend consulting your User Experience experts before using an effect such as this. However, if applied responsibly, animating visual state changes of your applications instead of just setting and using movement to manage the user&#8217;s attention can help with cognition. Consult people who understand user experience design before using effects like this.<br />
<strong>What is it?</strong><br />
The flight effect moves a display object either along a straight line or a quadratic bezier curve. While playing the display object is being scaled up and down to mimic a flight object taking off and landing (with using a good bit of imagination)<br />
I&#8217;ll explain the usage of this effect with a simpler example. This flight effect is a standard Flex effect, so you can use it in ActionScript, Behaviours, Transitions etc. The following example shows a login panel moving and rotating to the bottom right corner of the screen. It plays in a Canvas container and all we need to set up the effect is to apply a simple Transition tag to the view state change.</p>
<pre>
&lt;mx:states&gt;
&lt;mx:State name="stateA"&gt;
&lt;mx:SetProperty target="{ login1 }" name="x" value="519"/&gt;
&lt;mx:SetProperty target="{ login1 }" name="y" value="323"/&gt;
&lt;/mx:State&gt;
&lt;/mx:states&gt;
&lt;mx:transitions&gt;
&lt;mx:Transition effect="{ mover }" /&gt;
&lt;/mx:transitions&gt;
&lt;mx:Sequence id="mover"&gt;
&lt;mxeffects:Flight
target="{ login1 }"
duration="2000"
maximumHeight="2"
rotate="true" /&gt;
&lt;/mx:Sequence&gt;
&lt;sides:Login
id="login1"
change="currentState = ( currentState == 'stateA' ) ? '' : 'stateA';"/&gt;
</pre>
<p>BTW: Behind the scences, Flight uses a MoveOnQuadCurve effect that I ported from <a href="http://alex-uhlmann.de/flash/animationpackage/">AnimationPackage</a>. You could also use this effect without Flight if you wish.<br />
<strong>Flying across Flex container constraints</strong><br />
Since we use a Canvas container in the example above, the Panel component can be moved to arbitrary positions within that Canvas container. However, in some applications, like in the Cairngormstore sample application, we need to move across different containers. How I did this in Cairngormstore and how you can do the same in your applications will be the topic of the next section.<br />
<strong>Flight Effect Applied</strong><br />
As pointed out in the end of the last section, the effect by itself isn&#8217;t enough if you want display objects to move across Flex containers. This section will show how I achieved this in the Cairngormstore sample application and how you can apply the same concept to your application. You can by the way also use a simple Move effect using the same concept.<br />
But before I start with any implementation, let me please remind you on using this effect responsibly. As with many effects, applied in the wrong way, effects can dramatically reduce the user experience instead if increasing it. Consult a User Experience expert before you apply it to your application.<br />
<strong>10000 feet overview</strong><br />
In order to let the flight object (our airplane) cross Flex container boundaries we need professional assistance. A FlightCaptain object can help us with</p>
<ul>
<li>starting up our airplane.</li>
<li>finding our origin and destination coordinates.</li>
<li>flying the airplane according to a specified route.</li>
</ul>
<p>If this sounds all a bit strange to you, follow me with a little example.<br />
Let&#8217;s fly one box from the black area to the red area.<br />
With clicking the button, the user tells the FlightCaptain to get going:</p>
<pre>
var captain : FlightCaptain = new FlightCaptain();
captain.airplaneType = Login;
captain.origin = login;
captain.destination = destinationContainer;
captain.play();
</pre>
<p>We tell him the type of plane we would like him to use (a custom Panel component of type Login), and the start and destination locations.<br />
In the above example the FlightCaptain creates a new airplane of type Login, flies it to the destination location and once landed, he removes it (he would put it back into the hanger)<br />
But in your specific application, you might want the FlightCaptain to move not just copy the display object that we tell him is the airplane.<br />
We can do that with removing the display object specified with the origin property when FlightCaptain is taking off&#8230;</p>
<pre>
captain.addEventListener( TweenEvent.TWEEN_START, acualTakeOffTime );
</pre>
<p>&#8230;and adding it to the display list once the captain lands.</p>
<pre>
captain.addEventListener( TweenEvent.TWEEN_START, acualTakeOffTime );
</pre>
<p>Important to note here is that we use the TweenEvent.TWEEN_START event. This event is triggered when the first tween update is performed, meaning we are sure our airplane is in the air (popup is created) and we can safely remove our old display object.<br />
We also have access to the route our FlightCaptain is taking. His route property is a Flight effect. We can i.e. tell him to take a long way round with modifying the xBetween and yBetween properties of route.</p>
<pre>
captain.flight.yBetween = 1000;
</pre>
<p>Here&#8217;s the full code:</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:sides="view.sides.*"
layout="horizontal"&gt;
&lt;mx:Script&gt;
&lt;![CDATA[
import mx.events.TweenEvent;
import mx.events.EffectEvent;
import mx.core.Container;
import view.sides.Login;
import com.adobe.ac.mxeffects.FlightCaptain;
private var originContainer : Container;
private var destinationContainer : Container;
private function fly() : void
{
destinationContainer = ( login.parent == blackBox ) ? redBox : blackBox;
originContainer = ( destinationContainer == blackBox ) ? redBox : blackBox;
var captain : FlightCaptain = new FlightCaptain();
captain.addEventListener( TweenEvent.TWEEN_START, acualTakeOffTime );
captain.addEventListener( TweenEvent.TWEEN_END, acualLandingTime );
captain.airplaneType = Login;
captain.origin = login;
captain.destination = destinationContainer;
captain.configureFlight();
captain.play();
}
private function acualTakeOffTime( event : TweenEvent ) : void
{
originContainer.removeChild( login );
}
private function acualLandingTime( event : TweenEvent ) : void
{
destinationContainer.addChild( login );
}
]]&gt;
&lt;/mx:Script&gt;
&lt;mx:Canvas
id="blackBox"
backgroundColor="black"
width="400" height="400"
&gt;
&lt;sides:Login
id="login" left="8" top="8"
change="fly()" /&gt;
&lt;/mx:Canvas&gt;
&lt;mx:Canvas
id="redBox"
backgroundColor="red"
width="400" height="400"/&gt;
&lt;/mx:Application&gt;
</pre>
<p><strong><br />
Behind the captain&#8217;s curtain</strong><br />
How does the FlightCaptain do his job? This section explains how you he manages to fly across Flex containers.<br />
Let&#8217;s first take a look into FlightCaptain&#8217;s play method.<br />
At first we get the airplane of the specified type&#8230;</p>
<pre>
airplane = getPlaneFromHanger();
</pre>
<p>&#8230;which simply creates a popup using PopUpManager.</p>
<pre>
private function getPlaneFromHanger() : IFlexDisplayObject
{
return PopUpManager.createPopUp( DisplayObject( Application.application ), typeOfPlane );
}
</pre>
<p>Then he finds out about the actual coordinates where he is expected to start and land.</p>
<pre>
var originCoords : Point = findOriginCoords( origin );
var destinationCoords : Point = findDestinationCoords( destination );
</pre>
<p>This translates the local coordinates of our specified origin and destination display objects into a global coordinate system. We need to do this because our origin and destination display objects are potentially deeply nested somewhere between various Flex containers. Our FlightCaptain prefers to fly high up in the sky (in popup coordinate space, which understands global coordinates), therefore we need to translate.</p>
<pre>
private function findOriginCoords( origin : DisplayObject ) : Point
{
var originTopLeft : Point = new Point( 0, 0 );
originTopLeft = origin.localToGlobal( originTopLeft );
return originTopLeft;
}
private function findDestinationCoords( destination : DisplayObject ) : Point
{
var destinationTopLeft : Point = new Point( 0, 0 );
destinationTopLeft = destination.localToGlobal( destinationTopLeft );
return destinationTopLeft;
}
</pre>
<p>Have fun <a href="http://blogs.adobe.com/auhlmann/flightEffect.zip">with it</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2009/01/download_flight.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lighted Distortion Effects and Tour de Flex</title>
		<link>http://blogs.adobe.com/auhlmann/2009/01/lighted_distort.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2009/01/lighted_distort.html#comments</comments>
		<pubDate>Thu, 22 Jan 2009 19:36:10 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Effects]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/2009/01/lighted_distort.html</guid>
		<description><![CDATA[There&#8217;s a slightly updated version of the distortion effects shipping with the amazing Tour de Flex AIR application (flex.org/tour). This update adds another feature that our User Experience team found &#8220;adding to reality&#8221;. Lighting! Lighting works on all effects supplied. &#8230; <a href="http://blogs.adobe.com/auhlmann/2009/01/lighted_distort.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>There&#8217;s a slightly updated version of the distortion effects shipping with the amazing <a href="http://www.flex.org/tour">Tour de Flex AIR application</a> (<a href="http://www.flex.org/tour">flex.org/tour</a>). This update adds another feature that our User Experience team found &#8220;adding to reality&#8221;. Lighting!<br />
Lighting works on all effects supplied. Here&#8217;s how it looks like on CubeRotate:<br />
<img alt="lightingcube1.gif" src="http://weblogs.macromedia.com/auhlmann/archives/lightingcube1.gif" width="296" height="212" /><br />
But see all the effects in action <a href="http://www.alex-uhlmann.de/flash/adobe/blog/distortionEffects/effectCube/">from this example</a>. Download it <a href="http://weblogs.macromedia.com/auhlmann/archives/DistortionEffects.zip">here</a> directly.<br />
And if you&#8217;re interested in the <a href="http://blogs.adobe.com/auhlmann/cubeExampleSource.zip">source code of the cube example, download it here</a>.</p>
<p><span id="more-19"></span><br />
The above version is still Flash Player 9 and Flex, 2, 3 compatible. If you can target Flash Player 10, make sure you check out the new 3D functionality, which makes effects such as these easier to do and more efficient.<br />
Also, <a href="http://www.tink.ws/blog/">Tink</a> has released a new Flex effects library (<a href="http://www.efflex.org">efflex.org</a>) that also adds distortion effects. I&#8217;d definitely recommend checking out Tink&#8217;s work or even considering participating in this new exciting open source project. Great work Tink!<br />
<strong><br />
Here is How You Can Use it:</strong><br />
Generally you define a lighting source. When your lighting source is located on the top left then the effects will turn brighter once your display object turns towards the top or left.<br />
To do that you just have to set two properties</p>
<ul>
<li>-horizontalLightingLocation takes either a LEFT and RIGHT value (use DistortionConstants for setting this or FlexBuilder&#8217;s code hints).</li>
<li>-verticalLightingLocation takes either TOP or BOTTOM.</li>
<li>-lightingStrength is an optional property, which defaults to 7.5 if not set.</li>
</ul>
<p>Lighting is turned off by default. To activate it you just need to set either the horizontalLightingLocation, verticalLightingLocation or both properties.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2009/01/lighted_distort.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Distortion Effects &#8211; Updated</title>
		<link>http://blogs.adobe.com/auhlmann/2007/03/distortion_effe.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2007/03/distortion_effe.html#comments</comments>
		<pubDate>Mon, 05 Mar 2007 00:37:52 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Effects]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/2007/03/distortion_effe.html</guid>
		<description><![CDATA[Here&#8217;s a new version of the distortion effects. Thanks for all your tremendous feedback on the previously released distortion effects. Some of that feedback is now included in this updated version. This version adds various features and updates. Here&#8217;s an &#8230; <a href="http://blogs.adobe.com/auhlmann/2007/03/distortion_effe.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Here&#8217;s a new version of the distortion effects.<br />
Thanks for all your tremendous feedback on the <a href="http://weblogs.macromedia.com/auhlmann/archives/2006/11/download_distor.cfm">previously released distortion effects</a>. Some of that feedback is now included in <a href="http://weblogs.macromedia.com/auhlmann/archives/DistortionEffects.zip">this updated version</a>. This version adds various features and updates. Here&#8217;s an excerpt:<br />
<strong>Exceed Bounds</strong><br />
Much of the feedback I&#8217;ve received was about making the flip effect more realistic. The hint was to let its bounds overlap while the flip effect is coming towards the user. (flipping in). The new exceedBounds property on the Flip effect does exactly that and is now turned on by default!<br />
<img alt="exceedBounds.gif" src="http://weblogs.macromedia.com/auhlmann/archives/exceedBounds.gif" width="306" height="268" /><br />
<strong>Pop mode UP</strong><br />
The Pop effect now has an additional mode. The default mode is DOWN, which pops a display object off a stack/pile, away from the user. The new UP mode pops it towards the user.<br />
<img alt="popDown.gif" src="http://weblogs.macromedia.com/auhlmann/archives/popDown.gif" width="433" height="318" /></p>
<p><span id="more-17"></span><br />
<strong>Scaling Support</strong><br />
Some of you have experienced issues with distortions done on display objects that are below other display objects, which are being scaled. You can scale display objects either using UIComponent&#8217;s or DisplayObject&#8217;s scaleX, scaleY properties or with modifying the DisplayObject&#8217;s transform matrix (a and d properties). This version of the distortion effects supports any scalings applied to any parent display objects in your display list.<br />
<strong>Support of More Environments</strong><br />
My goal with these effects always was to support all possible environments where you can use these effects and distortions. With environments I meant i.e. using distortions or utilities in a non Flex framework environment, using only the Flash Player API. But also the use in different Flex framework containers and effect setups, i.e. States and Transitions, hideEffects, ActionScript effects, with ViewStacks, custom containers etc.<br />
This version increases the number of environments to support to the point that I currently haven&#8217;t heard of an environment that isn&#8217;t supported. If you have one, let me know and feel free to send me an isolated example and I&#8217;ll try to help out.<br />
This version added support for some States and Transition usages i.e. with supporting multiple siblings and improves error handling in case views cannot be initialized.<br />
See them in action <a href="http://www.alex-uhlmann.de/flash/adobe/blog/distortionEffects/effectCube/">here</a>.<br />
Download <a href="http://weblogs.macromedia.com/auhlmann/archives/DistortionEffects.zip">here</a>!<br />
And if you&#8217;re interested in the <a href="http://blogs.adobe.com/auhlmann/cubeExampleSource.zip">source code of the cube example, download it here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2007/03/distortion_effe.html/feed</wfw:commentRss>
		<slash:comments>160</slash:comments>
		</item>
		<item>
		<title>Creating a Popup in a Cairngorm Architecture</title>
		<link>http://blogs.adobe.com/auhlmann/2007/02/creating_a_popu.html</link>
		<comments>http://blogs.adobe.com/auhlmann/2007/02/creating_a_popu.html#comments</comments>
		<pubDate>Mon, 12 Feb 2007 14:02:14 +0000</pubDate>
		<dc:creator>Alex Uhlmann</dc:creator>
				<category><![CDATA[Cairngorm]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/auhlmann/2007/02/creating_a_popu.html</guid>
		<description><![CDATA[Often I see this question coming up: &#8220;How should I best create a popup in my Cairngorm application?&#8221; I think of creating a popup control as something only views should be concerned about. It’s like creating other view components, managing &#8230; <a href="http://blogs.adobe.com/auhlmann/2007/02/creating_a_popu.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Often I see this question coming up:</p>
<blockquote><p>&#8220;How should I best create a popup in my Cairngorm application?&#8221;</p></blockquote>
<p>I think of creating a popup control as something only views should be concerned about. It’s like creating other view components, managing states of view components or effects. Therefore this question isn&#8217;t just about creating popups, instead it&#8217;s about how to invoke methods that belong to the view. (BTW: I often hear from our User Experience team that they try to prevent popups where possible)</p>
<p><span id="more-15"></span><br />
First and foremost, I’d try to let your views directly call a method that dispatches a popup.<br />
However, most of the use cases that came up when questions like the above have been asked are slightly more complex. Users for example want to create a popup in a completely different part of the application. Or they receive an asynchronous remote service response, only want to react to the user with a popup at that point in time and work in a context where no view references are available, such as a typical Cairngorm Command.<br />
Some users have created the code needed for creating a popup directly in the result method of a command or in a model object that’s been called by the result method of a command.<br />
Sticking to my above rule; that only views should be concerned about popups, I think both solutions are not the optimal approach. A command should just be an encapsulated request to your model and a model itself should also not be concerned about any UI behavior. I’d argue we need to tell the model about the state change that has just occurred in your application, but in a model context. For example you might set a loggedIn property on a Login model object to true in order to signal that the login process was successful after a positive remote service response.<br />
<strong>So, how can our views react to that state change in our model?</strong><br />
In a typical Cairngorm application, we may bind UI controls to properties of our model objects. But for creating a Popup control, there’s no UI component where we can bind to. How do we best let a view invoke a view related method after a certain state change in our model occurred?<br />
Let’s take a step by step approach using a very simple Cairngorm application, that retrieves a list of employees and displays them in a popup after successful retrieval.<br />
Please do ask your UX team if something like this is really a good idea in a real world application. For the sake of this example we don’t care about the user experience here!<br />
This step by step tutorial will walk you through the relevant parts. You can <a href="http://www.alex-uhlmann.de/flash/adobe/blog/cairngormpopup/">see and download</a> (via right click &gt; View Source) the complete application here. Let&#8217;s go:<br />
<strong>Dispatch a Cairngorm Event.</strong><br />
Let the view dispatch a user gesture via a Cairngorm Event in order to trigger the remote service:<br />
On a mx:Button’s click event, the getEmployees method dispatches the Cairngorm event:<br />
Excerpt from GetEmployeesCommand.as:</p>
<pre>
private function getEmployees() : void
{
var event : GetEmployeesEvent = new GetEmployeesEvent();
event.employees = model.employees;
CairngormEventDispatcher.getInstance().dispatchEvent( event );
}
</pre>
<p><strong>Call and handle the remote service and modify your model.</strong><br />
The handling GetEmployeesCommand’s execute method calls a server side method. Its result method modifies the model. Here, it retrieves the model object Employeee via the ModelLocator.<br />
Excerpt from GetEmployeesCommand.as:</p>
<pre>
private var employees : Employees;
public function execute( event : CairngormEvent ) : void
{
employees = GetEmployeesEvent( event ).employees;
employees.hasEmployees = false;
var delegate : EmployeeDelegate = new EmployeeDelegate( this );
delegate.getEmployees();
}
public function result( event : Object ) : void
{
employees.employees = IList( event.result );
employees.hasEmployees = true;
}
</pre>
<p>Employees.as:</p>
<pre>
package com.adobe.cairngorm.samples.popup.model
{
import mx.collections.IList;
public class Employees
{
[Bindable]
public var employees : IList;
[Bindable]
public var hasEmployees : Boolean;
}
}
</pre>
<p>Note that we modify the hasEmployees property of the Empoyees model object.<br />
<strong>Let the view react react for you!</strong><br />
And here comes the crux: You can use the mx:Binding tag or the <a href="http://weblogs.macromedia.com/auhlmann/archives/2006/09/using_binding_s.cfm">Observe/ObserveValue tag</a>  to invoke a view method, once the hasEmployees Boolean value changes.<br />
I’d recommend using the ObserveValue tag to listen to a specific value of a state change of your model. More precisely, you can bind the source property of it to the bindable hasEmployees property of your model object Employees.</p>
<pre>
&lt;ac:ObserveValue
source="{ model.employees.hasEmployees }"
handler="{ createEmployeeList }"
value="{ true }"/&gt;
</pre>
<p>You could have also used the Observe tag to listen all updates of the hasEmployees property. For more information, check <a href="http://weblogs.macromedia.com/auhlmann/archives/2006/09/using_binding_s.cfm">this</a> out.<br />
The ObserveValue tag above will invoke the createEmployeeList method defined in a Script block of the same MXML file. This method will invoke the popup.</p>
<pre>
private function createEmployeeList() : void
{
var application : DisplayObject = DisplayObject( Application.application );
var popup : IFlexDisplayObject = PopUpManager.createPopUp( application, EmployeeList, true );
PopUpManager.centerPopUp( popup );
var concretePopup : EmployeeList = EmployeeList( popup );
concretePopup.employees = model.employees;
}
</pre>
<p>That&#8217;s it! Through a state change in your model, you view has reacted. Furthermore, you can now let many other objects observing this particular state of your model and they can all act independently.<br />
Cheers!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/auhlmann/2007/02/creating_a_popu.html/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>
