<?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>boxedfolder.com - Flex, Flash &#38; Web &#187; flash &amp; flex</title>
	<atom:link href="http://www.boxedfolder.com/blog/category/flash-flex/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.boxedfolder.com</link>
	<description></description>
	<lastBuildDate>Wed, 03 Feb 2010 18:21:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Milky: Remember the Milk AS3 API Kit</title>
		<link>http://www.boxedfolder.com/blog/2010/02/03/milky-remember-the-milk-as3-api-kit/</link>
		<comments>http://www.boxedfolder.com/blog/2010/02/03/milky-remember-the-milk-as3-api-kit/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 18:21:10 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=618</guid>
		<description><![CDATA[Ich möchte in einem kurzen Blogeintrag auf ein Remember the Milk AS3 API Kit hinweisen, welches ich vor ein paar Tagen auf Github geladen habe. ]]></description>
			<content:encoded><![CDATA[<p>Ich möchte in einem kurzen Blogeintrag auf ein <strong>Remember the Milk AS3 API Kit </strong>hinweisen, welches ich vor ein paar Tagen auf <strong>Github</strong> geladen habe. Mit <strong>Milky</strong> lässt sich auf die gesamte verfügbare API von <a class="blank" title="Remember the Milk" href="http://www.rememberthemilk.com">rememberthemilk.com</a> zugreifen. Daten werden wahlweise per <strong>VO</strong> oder <strong>XML</strong> verarbeitet. Ich habe das Ganze aktuell noch relativ undokumentiert bereitgestellt, bin aber der Meinung dass man mit Hilfe der <strong>asdocs</strong> relativ schnell an die passende Schnittstelle kommt und damit produktiv arbeiten kann. Ich denke für Leute die eine AIR-Anwendung oder ein RTM Flash-Widget planen ist das sicher eine Erleichterung.</p>
<p>Die Autorisierung innerhalb der RTM-API ist anfänglich etwas verwirrend. Ähnlich wie es bei <a class="blank" title="Flickr" href="http://www.flickr.com">Flickr</a> gehandhabt wird, ist auch RTM abhängig von einem Token. Eventuell werde ich im nächsten Artikel etwas genauer auf das Login bzw. die Autorisierung eingehen. Weitere Informationen dazu gibt es allerdings auch auf der offiziellen API Dokumentation.</p>
<p>Link zu <a class="blank" title="Milky" href="http://github.com/bfolder/Milky">Milky</a>.<br />
Link zur <a class="blank" title="Remember the Mik API" href="http://www.rememberthemilk.com/services/api/">Remember the Milk API</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2010/02/03/milky-remember-the-milk-as3-api-kit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Flash-Plattform &amp; das iPhone</title>
		<link>http://www.boxedfolder.com/blog/2010/01/06/die-flash-plattform-das-iphone/</link>
		<comments>http://www.boxedfolder.com/blog/2010/01/06/die-flash-plattform-das-iphone/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 16:22:19 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[iPhone & mobile]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=597</guid>
		<description><![CDATA[Ich wollte das neue Jahr gleich mal dazu nutzen einen kleinen Beitrag über das iPhone, Flash und meine Einschätzung zur ganzen Sache zu schreiben. ]]></description>
			<content:encoded><![CDATA[<p>Ich wollte das neue Jahr gleich mal dazu nutzen einen kleinen Beitrag über das iPhone, Flash und meine Einschätzung zur ganzen Sache zu schreiben. Wie wir alle wissen sollte es Ende des Jahres eine (public) Beta von Flash CS5 geben, welche den Export-To-iPhone erlaubt. Diese Beta ist nun abgeblasen worden. Das ganze hat für vielerlei Aufregung gesorgt, weil natürlich ein Haufen Leute unheimlich gierig sind in den Mobilen-Markt (das iPhone in diesem Fall) zu drängen.</p>
<p>Ich schätze die gesamte Lage etwas verhaltener ein. Zum einen erkenne  ich noch nicht wie sich <strong>Flash CS5</strong> dazu eignet wirkliche Anwendungen mit mobilem Interface zu dispatchen. Hier fehlt es schlichtweg an passenden (nativen) Komponenten. Zum anderen bin ich mir unsicher ob Performance und Qualität solcher Anwendungen für den erwarteten Erfolg ausreichen. Bisher hörte ich nur, dass aus CS5 veröffentlichte iPhone Apps verhältnismäßig größer sind als die native Konkurrenz.</p>
<p>Persönlich bin ich vielmehr gespannt auf das mobile <strong>Flex-Framework</strong> mit dem <strong>Codenamen  &#8220;Slider&#8221;</strong>. Dieses soll das dispatchen einer Anwendung auf die gängigen mobilen Plattformen erlauben. Es bietet neben einer leichtgewichtigen Struktur auch UI-Komponenten die für die mobile Plattform entwickelt werden. Das ganze soll, so wird gemunkelt, im Laufe des Jahres benutzbar sein.</p>
<p>Ich möchte an dieser Stelle auch noch auf einen <a class="blank" title="Video-Flash" href="http://www.video-flash.de/index/iphone-frameworks-sdk-web-entwickler/">Artikel</a> von Florian Plag aufmerksam machen. Dieser listet die teilweise bereits erhältlichen Flash und nicht-Flash Alternativen zur iPhone-Entwicklung auf. Ich würde allerdings jedem ans Herz legen sich eventuell ein gutes <strong>Objective-C</strong> Buch zu schnappen, bevor man sich auf Scriptsprachen wie z.B. <strong>Lua</strong> fixiert. Was ich bisher gesehen habe, kann Objektive-C in vielen Bereichen eine durchaus elegante Sprache sein.</p>
<p>Link zu <a class="blank" title="Flex Slider" href="http://labs.adobe.com/technologies/flex/mobile/">Flex-&#8221;Slider&#8221;</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2010/01/06/die-flash-plattform-das-iphone/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>navigateToUrl und Popup-Blocker</title>
		<link>http://www.boxedfolder.com/blog/2009/12/14/navigatetourl-und-popup-blocker/</link>
		<comments>http://www.boxedfolder.com/blog/2009/12/14/navigatetourl-und-popup-blocker/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 11:21:00 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[jquery & javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flash player]]></category>
		<category><![CDATA[navigatetourl]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=589</guid>
		<description><![CDATA[Einige mehr oder weniger moderne Browser, wie der Internet Explorer 8, meinen einfach alles blockieren zu müssen was nicht im Fenster "_self" aufgerufen wird.]]></description>
			<content:encoded><![CDATA[<p>Vielleicht wird der Eine oder Andere das leidige Thema <em>navigateToUrl</em> und Popup-Blocker schmerzlich selber erlebt haben. Denn einige mehr oder weniger moderne Browser, wie der Internet Explorer 8, meinen einfach alles blockieren zu müssen was nicht im Fenster &#8220;_self&#8221; aufgerufen wird. Das gilt auch wenn kein weiteres Argument angegeben wird, also z.B. auch <em>navigateToURL(&#8220;http://www.google.de&#8221;)</em>.</p>
<p>Eine gute Methode um dieses Verhalten auszuhebeln, ist es, die Javascript Schnittstelle des Browsers anzusprechen und dementsprechend ein neues Fenster zu generieren. In diesem Zusammenhang kann ich auf eine tolle und kompakte Klasse verweisen, die genau das tut:</p>
<p><span id="more-589"></span></p>
<p><a class="blank" href="http://www.zorked.com/wp-content/uploads/2008/08/URLNavigator.as" title="URLNavigator Klasse">URLNavigator.as</a>:</p>
<pre>
<code>package com.zorked {
	import flash.external.ExternalInterface;
	import flash.net.*;

	public class URLNavigator {

		/**
		 * Utility function to wrap up changing pages. Avoids over-aggressive popup blockers.
		 * @param url		The URL to change to. Either a String or a URLRequest
		 * @param window	The target browser window/tab, generally _self, _top, or _blank
		 * @usage URLNavigator.ChangePage("http://www.google.com", "_blank");
		 */
		public static function ChangePage(url:*, window:String = "_self"):void {
			var req:URLRequest = url is String ? new URLRequest(url) : url;
			if (!ExternalInterface.available) {
				navigateToURL(req, window);
			} else {
				var strUserAgent:String = String(ExternalInterface.call("function() {return navigator.userAgent;}")).toLowerCase();
				if (strUserAgent.indexOf("firefox") != -1 || (strUserAgent.indexOf("msie") != -1 &amp;&amp; uint(strUserAgent.substr(strUserAgent.indexOf("msie") + 5, 3)) &gt;= 7)) {
					ExternalInterface.call("window.open", req.url, window);
				} else {
					navigateToURL(req, window);
				}
			}
		}

	}
}</code>
</pre>
<p>Was wird hier gemacht? Nun im Prinzip macht die Klasse einen Check ob es sich um gewisse Browser-Versionen handelt und führt dementsprechend einen normalen navigateToURL-Request aus, oder er ruft die Javascript Methode <i>window.open()</i> auf. Man ist im Grunde auf der sicheren Seite und gegen die Popup-Blocker Schikane einiger Browser gut gerüstet.</p>
<p>Link zum <a class="blank" href="http://www.zorked.com/flash/flash-and-navigatetourl-popup-blocking/" title="Artikel">Artikel</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/12/14/navigatetourl-und-popup-blocker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Composite &amp; Command: Undo-Funktion noch flexibler</title>
		<link>http://www.boxedfolder.com/blog/2009/11/30/composite-command-undo-funktion-noch-flexibler/</link>
		<comments>http://www.boxedfolder.com/blog/2009/11/30/composite-command-undo-funktion-noch-flexibler/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 11:01:49 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[composite]]></category>
		<category><![CDATA[designpattern]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=542</guid>
		<description><![CDATA[In dem vorherigen Artikel über das Command Pattern, hab ich eine kleine Beispielanwendung vorgestellt. Diese demonstriert wie man mit Hilfe des Command-Entwurfmusters ganz leicht eine Undo-Funktion entwerfen kann.]]></description>
			<content:encoded><![CDATA[<p>In dem <a title="AS3: Undo-Funktion mit dem Command Pattern" href="http://www.boxedfolder.com/blog/2009/10/15/as3-undo-funktion-mit-dem-command-pattern/">vorherigen</a> Artikel über das <strong>Command-Pattern</strong>, hab ich eine kleine Beispielanwendung vorgestellt. Diese demonstriert wie man mit Hilfe des <strong>Command-Entwurfmusters</strong> ganz leicht eine Undo-Funktion entwerfen kann. Wie bereits angekündigt, möchte ich in diesem Eintrag noch einmal kurz in die besprochene Anwendung schauen und das ganze mit dem Composite-Pattern strukturell etwas erweitern um sie noch einmal in ihrer Flexibilität aufzubessern.</p>
<p>In der überarbeiteten Version unserer Anwendung geht es nun darum, dass es die Möglichkeit gibt den Kreis nicht nur in x- und y-Richtung zu bewegen, sondern auch dessen Alpha-Wert anzupassen.<br />
<span id="more-542"></span></p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_UndoExample2_934060341"
			class="flashmovie"
			width="500"
			height="550">
	<param name="movie" value="http://www.boxedfolder.com/wp-content/uploads/2009/11/UndoExample2/UndoExample2.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.boxedfolder.com/wp-content/uploads/2009/11/UndoExample2/UndoExample2.swf"
			name="fm_UndoExample2_934060341"
			width="500"
			height="550">
	<!--<![endif]-->
		
<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>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>(Rechtsklick-View Source um Quellcode einzusehen)</p>
<p>In diesem Beispiel brauchen wir also neben dem <em>MoveCommand <span style="font-style: normal;">noch einen zweiten Befehlstypen, welcher in der Lage ist den Alpha-Wert eines entsprechenden Sprites zu verändern und wieder rückgängig zu machen. Er muss also das </span>ICommand<span style="font-style: normal;">-Interface implementieren.</span></em></p>
<p><em><span style="font-style: normal;">AlphaCommand.as:</span></em></p>
<pre><code>package com.boxedfolder.examples.undo
{
	import flash.display.Sprite;

	public class AlphaCommand implements ICommand
	{
		private var _sprite:Sprite;

		private var _alpha:Number;

		private var _targetAlpha:Number;

		public function AlphaCommand(sprite:Sprite, targetAlpha:Number)
		{
			_targetAlpha = targetAlpha;
			_alpha = sprite.alpha;
			_sprite = sprite;
		}

		public function execute():void
		{
			_sprite.alpha = _targetAlpha;
		}

		public function undo():void
		{
			_sprite.alpha = _alpha;
		}
	}
}</code></pre>
<p>Um eine Struktur zu erhalten, die es uns ermöglicht viele kleinere Commands sequentiell abzuarbeiten, bedienen wir uns des <strong>Composite-Patterns</strong>. Wir erstellen uns dazu einen <em>MacroCommand, </em>welcher potentiell beliebig viele Unterbefehle einschließen kann.</p>
<p>MacroCommand.as:</p>
<pre><code>package com.boxedfolder.examples.undo
{
	public class MacroCommand implements ICommand
	{
		private var commandStack:Array = [];

		public function execute():void
		{
			var command:ICommand;

			for(var i:int = 0; i &lt; commandStack.length; ++i)
			{
				command = commandStack[i] as ICommand;
				command.execute();
			}
		}

		public function undo():void
		{
			var command:ICommand;

			while(commandStack.length &gt; 0)
			{
				command = commandStack.pop() as ICommand;
				command.undo();
			}
		}

		public function addSubCommand(command:ICommand):void
		{
			commandStack.push(command);
		}
	}
}</code></pre>
<p>Da die Klasse <em>MacroCommand</em> das Interface <em>ICommand</em> implementiert ist eine Instanz in der Lage wie ein regulärer Befehl aufgerufen zu werden. Anstatt allerdings selber Funktionalität zu implementieren, wird durch die Unterbefehle iteriert und deren <em>execute()</em>- bzw. <em>undo()</em>-Methode ausgeführt. Zusätzliche Subcommands lassen sich via der Methode <em>addSubCommand()</em> hinzufügen.</p>
<p>Um jetzt diese Befehlskette in unsere Anwendung zu integrieren, müssen wir den <em>MacroCommand</em> instantiieren, Subcommands hinzufügen und dessen <em>execute()</em>-Methode aufrufen.</p>
<p>UndoExample.as:</p>
<pre><code>package
{
	import com.boxedfolder.examples.undo.AlphaCommand;
	import com.boxedfolder.examples.undo.ICommand;
	import com.boxedfolder.examples.undo.MacroCommand;
	import com.boxedfolder.examples.undo.MoveCommand;

	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFieldType;

	[SWF(height="550", width="550", backgroundColor="#ffffff", frameRate="50")]

	public class UndoExample extends Sprite
	{
		//... verkürzt

		private var commandStack:Array = [];

		public function UndoExample()
		{
			setupVisuals();
		}

		private function setupVisuals():void
		{
		     //....verkürzt
		}

		private function buttonHandler(e:MouseEvent):void
		{
			if(e.target == goButton)
				changeObject();

			if(e.target == undoButton)
				undo();
		}

		private function changeObject():void
		{
<strong style="border:none;">
			var command:MacroCommand;
			var yv:Number = Number(yTextField.text);
			var xv:Number = Number(xTextField.text);
			var av:Number = Number(aTextField.text);

			if(!isNaN(yv) &amp;&amp; !isNaN(xv) &amp;&amp; !isNaN(av))
			{
				command = new MacroCommand();
				command.addSubCommand(new MoveCommand(circle, xv, yv));
				command.addSubCommand(new AlphaCommand(circle, av));

				commandStack.push(command);
				command.execute();
			}</strong>
		}

		private function undo():void
		{
			var command:ICommand;

			if(commandStack.length &gt; 0)
			{
				command = commandStack.pop() as ICommand;
				command.undo();
			}
		}
	}
}</code></pre>
<p>Der Vorteil dieser Struktur liegt in der Flexibilität. Wir verwenden einfach mehreren <em>MacroCommands</em> um so Funktionalität zu bündeln und den kompletten Befehlsverbund leicht Rückgängig zu machen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/11/30/composite-command-undo-funktion-noch-flexibler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actionscript 3 und MVC: Artikelserie</title>
		<link>http://www.boxedfolder.com/blog/2009/11/02/actionscript-3-und-mvc-artikelserie/</link>
		<comments>http://www.boxedfolder.com/blog/2009/11/02/actionscript-3-und-mvc-artikelserie/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 19:26:54 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[designpattern]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=534</guid>
		<description><![CDATA[Hiermit möchte ich auf eine interessante Artikel Serie aufmerksam machen, die sich mit MVC Strukturen innerhalb von Actionscript 3 und Flash-Anwendungen beschäftigt. ]]></description>
			<content:encoded><![CDATA[<p>Hiermit möchte ich auf eine interessante Artikelserie aufmerksam machen, welche sich mit MVC-Strukturen innerhalb von Actionscript 3 und Flash-Anwendungen beschäftigt. Die Serie besteht aus insgesamt vier Artikeln. Die Strukturen werden anhand einer Beispielanwendung hinreichend praktisch erläutert.</p>
<p>Ich kann jedem empfehlen, dort mal einen Blick reinzuwerfen. Alternativ ist natürlich immer ein MVC-Framework eine gute Wahl. Für Flash/Flex gibt es eine recht große Auswahl. Ich benutze aktuell <a class="blank" title="PureMVC" href="http://www.puremvc.org">PureMVC</a> für diverse Projekte, weitere sind z.B. <a class="blank" title="Mate" href="http://mate.asfusion.com/">Mate</a>, <a class="blank" title="Swiz" href="http://code.google.com/p/swizframework/">Swiz</a>, <a class="blank" title="Cairngorm" href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm">Cairngorm</a> oder <a class="blank" title="Parsley MVC Framework" href="http://www.spicefactory.org/parsley/">Parsley</a>. Die einzelnen Frameworks unterscheiden sich häufig in Art und Anzahl der benutzten Patterns.</p>
<p>Zum Thema Flex-Frameworks hat auch David Tucker kürzlich einen interessanten Blogeintrag geschrieben. Dieser behandelt einige Probleme diverser Frameworks und zeigt Alternativen auf.</p>
<p>Link zum <a class="blank" title="David Tuckers Blog" href="http://www.davidtucker.net/2009/10/13/the-current-state-of-flex-frameworks/">Artikel von David Tucker</a>.<br />
Link zum  Artikel <a class="blank" title="AS3 MVC Part1" href="http://www.as3dp.com/2009/09/21/truckin-through-actionscript-30-mvc-part-i—structures-and-materials/">Truckin´ Through ActionScript 3.0 MVC: Part 2</a><br />
Link zum  Artikel <a class="blank" title="AS3 MVC Part1" href="http://www.as3dp.com/2009/10/04/truckin-through-actionscript-30-mvc-part-ii—reality-sui-generis-or-collection-of-spare-parts/">Truckin´ Through ActionScript 3.0 MVC: Part 2<br />
</a>Link zum  Artikel <a class="blank" title="AS3 MVC Part3" href="http://www.as3dp.com/2009/10/31/truckin-through-actionscript-30-mvc-part-iii—an-analog-compass/">Truckin´ Through ActionScript 3.0 MVC: Part 3<br />
</a>Link zum  Artikel <a class="blank" title="AS3 MVC Part4" href="http://www.as3dp.com/2009/11/01/truckin’-through-actionscript-30-mvc-part-iv—making-changes/">Truckin´ Through ActionScript 3.0 MVC: Part 4</a></p>
<p>UPDATE:<br />
Link zum  Artikel <a title="AS3 MVC Part5" href="http://www.as3dp.com/2009/11/03/truckin’-through-actionscript-30-mvc-part-v—purpose-and-use/">Truckin´ Through ActionScript 3.0 MVC: Part 5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/11/02/actionscript-3-und-mvc-artikelserie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3: Undo-Funktion mit dem Command Pattern</title>
		<link>http://www.boxedfolder.com/blog/2009/10/15/as3-undo-funktion-mit-dem-command-pattern/</link>
		<comments>http://www.boxedfolder.com/blog/2009/10/15/as3-undo-funktion-mit-dem-command-pattern/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 09:14:46 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[designpattern]]></category>
		<category><![CDATA[flash]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=496</guid>
		<description><![CDATA[Wenn man eine Flash Anwendung entwickelt, in welcher der Benutzer vieles falsch machen kann, ist es oft ratsam eine Funktion bereitzustellen die es ihm ermöglichst verschiedene Arbeitsschritte rückgängig zu machen.]]></description>
			<content:encoded><![CDATA[<p>Wenn man eine Flash Anwendung entwickelt, in welcher der Benutzer vieles falsch machen kann, ist es oft ratsam eine Funktion bereitzustellen die es ihm ermöglichst verschiedene Arbeitsschritte rückgängig zu machen. Doch wie implementiert man so eine <strong>Undo-Funktion</strong> genau? In diesem Artikel möchte ich mit einem kleinen Beispiel zeigen wie sich ein solches Problem unter Einsatz des <strong>Command Patterns</strong> sauber lösen lässt.<br />
<span id="more-496"></span></p>
<p>Nachfolgend habe ich rudimentär zwei Buttons und zwei Eingabefelder zusammen mit einem Kreis auf einer Bühne platziert. Man kann mit Hilfe der Eingabefelder offensichtlich die x- und y-Positionen des Kreises verändern. Der Clou daran ist, dass man auch einen Undo-Befehl ausführen kann, welcher jeweils die letzte Aktion rückgängig macht.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_UndoExample_1383825071"
			class="flashmovie"
			width="500"
			height="500">
	<param name="movie" value="http://www.boxedfolder.com/wp-content/uploads/2009/10/UndoExample/UndoExample.swf" />
	<param name="quality" value="best" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.boxedfolder.com/wp-content/uploads/2009/10/UndoExample/UndoExample.swf"
			name="fm_UndoExample_1383825071"
			width="500"
			height="500">
		<param name="quality" value="best" />
	<!--<![endif]-->
		
<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>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Als erstes bin ich hergegangen und habe ein <strong>Command-Interface</strong> mit dem Namen <em>ICommand</em> definiert. Dieses Interface beschreibt die beiden Methoden die ich benötige. Zum einen natürlich die <em>execute()</em>-Methode, welche die eigentliche Funktionalität beinhaltet und zum anderen die <em>undo()</em>-Methode:</p>
<pre><code>package com.boxedfolder.examples.undo
{
	public interface ICommand
	{
		function execute():void;
		function undo():void;
	}
}</code></pre>
<p>Die Klasse <i>MoveCommand</i>, welche konkret für die Bewegung meines Objekts zuständig ist sieht nun folgendermaßen aus:</p>
<pre><code>package com.boxedfolder.examples.undo
{
	import flash.display.Sprite;

	public class MoveCommand implements ICommand
	{
		private var _addedY:int;

		private var _addedX:int;

		private var _sprite:Sprite

		public function MoveCommand(sprite:Sprite, addedX:int, addedY:int)
		{
			_addedX = addedX;
			_addedY = addedY;
			_sprite = sprite;
		}

		public function execute():void
		{
			_sprite.x += _addedX;
			_sprite.y += _addedY;
		}
		public function undo():void
		{
			_sprite.x -= _addedX;
			_sprite.y -= _addedY;
		}
	}
}</code></pre>
<p>Mit unserer konkreten MoveCommand-Klasse, haben wir nun das Werkzeug, mit Hilfe der Methode <em>execute()</em> eine Bewegung in x- und y-Richtung an einem Sprite durchzuführen. Des weiteren speichert eine Move-Command Instanz, die hinzugefügten Werte und merkt sich also indirekt die alte Position des Sprites. Die Methode <em>undo()</em> nimmt die gespeicherten Werte und zieht sie vom referenzierten Sprite wieder ab. Sie macht also den gesamten Vorgang rückgängig.</p>
<p>Die Dokumenten-Klasse <em>UndoExample</em> sieht wie folgt aus:</p>
<pre>
<code>package
{
	import com.boxedfolder.examples.undo.ICommand;
	import com.boxedfolder.examples.undo.MoveCommand;

	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFieldType;

	[SWF(height="550", width="550", backgroundColor="#ffffff", frameRate="50")]

	public class UndoExample extends Sprite
	{
		//... verkürzt

		private var commandStack:Array = [];

		public function UndoExample()
		{
			setupVisuals();
		}

		private function setupVisuals():void
		{
		     //....verkürzt
		}

		private function buttonHandler(e:MouseEvent):void
		{
			if(e.target == goButton)
				changeObject();

			if(e.target == undoButton)
				undo();
		}

		private function changeObject():void
		{
			var command:ICommand;
			var yv:Number = Number(yTextField.text);
			var xv:Number = Number(xTextField.text);

			if(!isNaN(yv) &amp;&amp; !isNaN(xv))
			{
				command = new MoveCommand(circle, xv, yv);
				commandStack.push(command);
				command.execute();
			}
		}

		private function undo():void
		{
			var command:ICommand;

			if(commandStack.length &gt; 0)
			{
				command = commandStack.pop() as ICommand;
				command.undo();
			}
		}
	}
}</code>
</pre>
<p>Wir legen jeden Command, welchen wir instantiieren und ausführen, am Ende eines Arrays ab. Dies bietet uns sozusagen ein<strong> Command-Stapel</strong>. Wenn der Benutzer den Undo-Button betätigt, wird die Methode <em>undo()</em> des Commands aufgerufen, welcher sich am ende des Arrays befindet. Gleichzeitig wird besagter Command aus dem Array entfernt.</p>
<p>In diesem simplen Beispiel sieht man wie man mit einfachen Mitteln eine Struktur aufbaut, in der ein Benutzer beliebig viele Schritte einzeln zurückgehen kann. In einem weiteren Artikel möchte ich das Beispiel noch etwas komplexer machen und die Struktur unter Anderem mit Hilfe des <strong>Composite Patterns</strong> verfeinern. Der komplette Source Code des oberen Beispiels lässt sich mit Rechtsklick und der Option &#8220;View Source&#8221; einsehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/10/15/as3-undo-funktion-mit-dem-command-pattern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flash als CMS?</title>
		<link>http://www.boxedfolder.com/blog/2009/07/25/flash-als-cms/</link>
		<comments>http://www.boxedfolder.com/blog/2009/07/25/flash-als-cms/#comments</comments>
		<pubDate>Sat, 25 Jul 2009 02:40:14 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[amf]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[webservice]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=417</guid>
		<description><![CDATA[Mich haben in letzter Zeit öfter mal Leute angesprochen und gefragt wie es denn funktioniert eine komplette Flash Website an ihr CMS zu koppeln. Natürlich...]]></description>
			<content:encoded><![CDATA[<p>Mich haben in letzter Zeit öfter mal Leute angesprochen und gefragt wie es denn funktioniert eine komplette Flash Website an ihr <strong>CMS</strong> zu koppeln. Natürlich gibt es da für einige Front-End Lösungen von namhaften Systemen wie z.B. <strong>Drupal</strong> oder <strong>Wordpress</strong> (in manchen Fällen sogar per <strong>Webservice</strong>/<strong>AMF</strong>). Allerdings bin ich vor einiger Zeit auf ein Round-Up gestoßen dass spezielle Content Management Systeme vorstellt, die extra als &#8220;Flash CMS&#8221; betitelt sind. Dementsprechend verfügen diese in vielen Fällen über ein Front- und Backend mit Flash Oberfläche.  Der Artikel bei <a class="blank" title="flashEnabledBlog" href="http://flashenabledblog.com/">FlashEnabledBlog</a> ist zwar schon knapp ein Jahr alt, ich hab ihn trotzdem aus aktuellem Anlass noch einmal herausgekramt weil ich meine dass solche Lösungen für den ein oder anderen interessant sein könnten.</p>
<p>Im Detail zeigt der Artikel mehrere kommerzielle und nicht kommerzielle Lösungen zum darstellen von Multimedia Content auf der Flash Plattform, listet Vor- und Nachteile auf und gibt Auskunft über den eventuellen Preis. Ich muss allerdings gestehen dass ich keins davon bisher getestet habe. Wenn Interesse da ist, einfach mal selber testen und schauen ob es den Anforderungen entspricht.</p>
<p>Link zum <a class="blank" title="CMS Round Up bei FlashEnabledBlog" href="http://flashenabledblog.com/2008/09/16/flash-cms/">Artikel</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/07/25/flash-als-cms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm: ViewHelper vs. Presentation Model</title>
		<link>http://www.boxedfolder.com/blog/2009/06/21/cairngorm-viewhelper-vs-presentation-model/</link>
		<comments>http://www.boxedfolder.com/blog/2009/06/21/cairngorm-viewhelper-vs-presentation-model/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 18:35:38 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[cairngom]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[mate]]></category>
		<category><![CDATA[puremvc]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=356</guid>
		<description><![CDATA[Das Benutzen eines Architektur-Frameworks gehört ja heutzutage zum guten Ton. Im eigentlichen Sinne macht ein solches Framework verstärkt Sinn, wenn man mit in einem Team eine skalierbare Anwendung erstellen möchte und viel Wert auf Sauberkeit und Übersichtlichkeit legt.]]></description>
			<content:encoded><![CDATA[<p>Die Benutzung eines <strong>Architektur-Frameworks</strong> gehört ja heutzutage zum guten Ton. Im eigentlichen Sinne macht ein solches Framework verstärkt Sinn, wenn man in einem Team eine skalierbare Anwendung erstellen möchte und viel Wert auf Sauberkeit und Übersicht legt. Im Prinzip ist so ein Framework aber auch bei kleineren Projekten super nützlich um eine Anwendung für zukünftige Erweiterungen flexibel zu halten.</p>
<p>In meinem letzten Projekt hab ich mich für das von <strong>Adobe</strong> initiierte Framework - <strong>Cairngorm</strong> &#8211; entschieden. Im Laufe der Entwicklung hab ich mich natürlich mit den Ups und Downs rumärgern müssen die Cairngorm so mit sich bringt. Um sich einige Probleme in Sachen Flexibilität des Frameworks näher zu bringen, muss man sich die Struktur einmal kurz verdeutlichen.</p>
<p>Es läuft in der Regel folgendermaßen ab: Der View dispatched Events, die vom Controller aufgefangen werden und dementsprechende Commands instanziert. Diese Commands sind entkoppelt vom View und verändern nur die Daten in unserem Model. Das Model wiederum updated via Data Binding unsere View-Komponenten. Soweit so gut.</p>
<p><span id="more-356"></span></p>
<p><a class="blank" title="Cairngorm Class Diagram" href="http://www.cairngormdocs.org/cairngormDiagram/cairngorm2_rpc.swf"><img title="Cairngorm2 RPCe" src="http://www.boxedfolder.com/wp-content/uploads/2009/06/cairngorm.jpg" alt="Cairngorm2 RPC" /></a></p>
<p>Wenn es darum geht komplexere Probleme zu lösen, die rein vom Gefühl nicht durch einfaches Data Binding gelöst werden können, steht man in Cairngorm vor einigen Entscheidungen zu denen man auch im Netz etliche Diskussionen findet.</p>
<p>Um mal ein Beispiel des Problems zu nennen:<br />
In meiner Applikation will ein User ein Popup aufrufen, welches mit Daten von einem Server gefüttert wurde. Er klickt dafür z.B. auf einen Button, dieser schickt ein Event los, daraufhin wird ein passender Command ausgeführt. <em>Die Frage ist nun, wo implementiere ich die konkrete Methode um das Popup im View zu instanziieren?</em> Ich müsste nach klassischer Cairngorm Best-Practise mein Model aktualisieren, welches wiederum per Data Binding das Popup startet. Gut, dies kann ich einfach mit einem Flag im Model lösen, auf den das View bei Änderung entsprechend reagiert. Im Endeffekt wird aber nicht nur mein Model bei großen Anwendungen durch etliche Flags unnötig aufgeblasen, sondern die Anwendung legt durch viele Listener, Methoden und Referenzen drastisch an Komplexität zu.</p>
<p>In &#8220;alten&#8221; (2006) Dokumentationen werden für diese Probleme oftmals die sogenannten <strong>ViewHelper</strong>- und <strong>ViewLocator</strong>-Klassen referenziert, die für solche Aufgaben zur Verfügung gestellt wurden. Losgelöst vom Command &amp; Model hält ein ViewHelper die View-Komponenten auf dem laufenden.</p>
<p>Aktuelle Cairngorm Dokumentationen schlagen eine Einbindung des sogenannten <strong>Presentation</strong> <strong>Models</strong> vor, was dieses speziell im Cairngorm Fall bedeutet kann man unter Anderem <a class="blank" title="Cairngorm &amp; The Presentation Model" href="http://www.dehats.com/drupal/?q=node/48">hier</a> nachlesen. Für mein bereits fortgeschrittenes Projekt dürfte die Umstellung auf ein Presentation Model aber Aufwand und viel Refactoring darstellen. Etwas was ich aktuell nicht leisten will. Auch bin ich mir unsicher ob die einfacher Umschichtung der Zuständigkeiten alle meine Probleme löst.</p>
<p><em>Was bedeutet das also für mein konkretes Popup Problem? Auf ViewHelper setzen, was vom Cairngorm Team nicht mehr empfohlen wird? Die klassische Model/Flag/Listener Alternative, was mein Model noch mehr aufbläht?</em> <em>Oder die Methode die wohl am ungünstigen ist: Einfach alles im Command direkt implementieren?</em></p>
<p>Aufgrund mangelnder klarer Dokumentationen und der daraus resultierenden uneindeutigen und wechselhaften Best-Practise-Methodik, werde ich mir in Zukunft vielleicht noch einmal die Konkurrenz in Form von z.B. <strong>PureMVC</strong> und <strong>Mate</strong> anschauen müssen.</p>
<p>Bitte nutzt die Kommentarfunktion und schreib mir eure Erfahrungen.</p>
<p>Link zu <a class="blank" title="Cairngorm Framework" href="http://opensource.adobe.com/wiki/display/cairngorm/">Cairngorm</a>.<br />
Link zu <a class="blank" title="Mate Framework" href="http://mate.asfusion.com">Mate</a>.<br />
Link zu <a class="blank" title="PureMVC Framework" href="http://puremvc.org/">PureMVC</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/06/21/cairngorm-viewhelper-vs-presentation-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash Catalyst &amp; Flash Builder (Beta) auf Adobe Labs</title>
		<link>http://www.boxedfolder.com/blog/2009/06/01/flash-catalyst-flash-builder-beta-auf-adobe-labs/</link>
		<comments>http://www.boxedfolder.com/blog/2009/06/01/flash-catalyst-flash-builder-beta-auf-adobe-labs/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 13:19:40 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[catalyst]]></category>
		<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=342</guid>
		<description><![CDATA[Ab heute gibt es die erste Beta von Flash Catalyst und Flash Builder auf Adobe Labs zum Download.]]></description>
			<content:encoded><![CDATA[<p>Ab heute gibt es die erste Betas von Flash Catalyst und Flash Builder auf <a class="blank" title="Adobe Labs" href="http://labs.adobe.com/">Adobe Labs</a> zum Download. Beide Versionen sind voll nutzbar. Gerade Catalyst soll aber nach Adobe Aussage noch nicht den Leistungsumfang besitzen wie später der RC. Einfach mal herunterladen und testen.</p>
<p>Link zu <a class="blank" title="Flash Builder" href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_flashcatalyst">Flash Builder</a>.<br />
Link zu <a class="blank" title="Flash Catalyst" href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_flashcatalyst">Flash Catalyst</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/06/01/flash-catalyst-flash-builder-beta-auf-adobe-labs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flash Builder, Flash CS 4 und Flash Catalyst</title>
		<link>http://www.boxedfolder.com/blog/2009/05/21/flash-builder-flash-cs-4-und-flash-catalyst/</link>
		<comments>http://www.boxedfolder.com/blog/2009/05/21/flash-builder-flash-cs-4-und-flash-catalyst/#comments</comments>
		<pubDate>Thu, 21 May 2009 22:30:12 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[catalyst]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=334</guid>
		<description><![CDATA[Mittlerweile dürfte es sich rumgesprochen haben. Flex Builder tot ist. Es lebe Flash Builder. ]]></description>
			<content:encoded><![CDATA[<p>Mittlerweile dürfte es sich rumgesprochen haben. Flex Builder tot ist. Es lebe Flash Builder. Nun, da der Name geklärt ist, wäre es doch auch mal nett sich anzuschauen wie denn die komplette Flash Plattform Struktur bei Adobe demnächst ausschauen wird. Ich habe zu dem Thema kürzlich eine Interessante Grafik gefunden.</p>
<p><span id="more-334"></span></p>
<p><img class="center" title="Flash Flow" src="http://www.boxedfolder.com/wp-content/uploads/2009/05/flow.jpg" alt="Flash Flow" width="500" height="229" /></p>
<p>Die Grafik zeigt uns die neue Ausrichtung die sich Adobe bei seinen neuen alten Programmpaketen überlegt hat.</p>
<ul>
<li>Flash Catalyst: Zum erstellen grafischer Assets für den Flash Builder aber auch zur Veröffentlichung eigener swf-Dateien.</li>
<li>Flash CS4: Zur Erstellung und Animation von swf-Dateien. Im Zusammenspiel mit Actionscript 3.</li>
<li>Flash Builder: Erstellung von Actionscript 3 und Flex Projekten.</li>
</ul>
<p>Ziel bei allen drei Systemen ist es die Flash Plattform mit Inhalt zu füllen. Der Fokus ist bei den Programmen jetzt klar in Richtung <strong>Design</strong> &#8211; <strong>Entwicklung</strong> zu erkennen.<br />
Eigentlich ist das nichts neues (abgesehen von Catalyst), aus Marketing Gründen allerdings scheint diese eindeutige Namensgebung für Adobe sinnvoll zu sein.</p>
<p>Quelle: <a class="blank" title="Everything Flex" href="http://blog.everythingflex.com/2009/05/19/flash-builder-formally-flex-builder/">Everything Flex</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/05/21/flash-builder-flash-cs-4-und-flash-catalyst/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
