[Checkins] SVN: z3c.reference/branches/flash/ replaced old imagetool with new version from geroldboehler

Johannes Faigle johannes.faigle at lovelysystems.com
Tue Sep 4 11:37:45 EDT 2007


Log message for revision 79461:
  replaced old imagetool with new version from geroldboehler

Changed:
  A   z3c.reference/branches/flash/flash/
  A   z3c.reference/branches/flash/flash/debug/
  A   z3c.reference/branches/flash/flash/debug/debug.swf
  A   z3c.reference/branches/flash/flash/fla/
  A   z3c.reference/branches/flash/flash/fla/imagetool.as
  A   z3c.reference/branches/flash/flash/fla/imagetool.fla
  A   z3c.reference/branches/flash/flash/fla/img/
  A   z3c.reference/branches/flash/flash/fla/img/fingercursor.gif
  A   z3c.reference/branches/flash/flash/fla/img/handcursor.gif
  A   z3c.reference/branches/flash/flash/src/
  A   z3c.reference/branches/flash/flash/src/net/
  A   z3c.reference/branches/flash/flash/src/net/hiddenresource/
  A   z3c.reference/branches/flash/flash/src/net/hiddenresource/util/
  A   z3c.reference/branches/flash/flash/src/net/hiddenresource/util/Delegate.as
  A   z3c.reference/branches/flash/flash/src/net/hiddenresource/util/debug/
  A   z3c.reference/branches/flash/flash/src/net/hiddenresource/util/debug/Debug.as
  A   z3c.reference/branches/flash/flash/src/z3c/
  A   z3c.reference/branches/flash/flash/src/z3c/reference/
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Canvas.as
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Controller.as
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/EditableImage.as
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/ImageTool.as
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Viewport.as
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/Component.as
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/EventBroadcaster.as
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/EventInfo.as
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/FlashvarManager.as
  A   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/IFEventBroadcaster.as
  D   z3c.reference/branches/flash/src/z3c/reference/demo/browser/addref.pt
  U   z3c.reference/branches/flash/src/z3c/reference/demo/browser/picker.pt
  U   z3c.reference/branches/flash/src/z3c/reference/demo/browser/swf/imagetool.swf

-=-
Added: z3c.reference/branches/flash/flash/debug/debug.swf
===================================================================
(Binary files differ)


Property changes on: z3c.reference/branches/flash/flash/debug/debug.swf
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:mime-type
   + application/octet-stream

Added: z3c.reference/branches/flash/flash/fla/imagetool.as
===================================================================
--- z3c.reference/branches/flash/flash/fla/imagetool.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/fla/imagetool.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,46 @@
+stop();
+
+Stage.align = "LT";
+Stage.scaleMode = "noScale";
+		
+
+// Debug Block Start
+if (System.capabilities.playerType == "External")
+{
+    if (!_level0.url) _level0.url="testimage.jpg";
+    
+    //default values
+    if (!_level0.crop_x) _level0.crop_x = 100;
+    if (!_level0.crop_y) _level0.crop_y = 100;
+    if (!_level0.crop_w) _level0.crop_w = 100;
+    if (!_level0.crop_h) _level0.crop_h = 100;
+    if (!_level0.original_w) _level0.original_w = 600;
+    if (!_level0.original_h) _level0.original_h = 400;
+    //if (!_level0.output_w) _level0.output_w = 200;
+    //if (!_level0.output_h) _level0.output_h = 50;
+    if (!_level0.zoomfactor) _level0.zoomfactor=0.33;
+    if (!_level0.rotation) _level0.rotation=90;
+    _level0.keepAspectRatio = false;
+}
+// Debug Block End
+
+
+// init flashvar manager
+z3c.reference.imagetool.core.FlashvarManager.oneTimeInit();
+
+// create an instance of the z3c Image Tool
+//var tool:z3c.reference.imagetool.baseskin.ImageTool = z3c.reference.imagetool.baseskin.ImageTool(_level0.attachMovie("BaseClip","BaseClip", _level0.getNextHighestDepth()));
+attachMovie("imagetool_mc", "imagetool_mc", getNextHighestDepth())
+
+/*
+tool.setOutputSize(FlashvarManager.get("output_w"), FlashvarManager.get("output_h"));
+tool.setOriginalSize(FlashvarManager.get("original_w"), FlashvarManager.get("original_h"));
+tool.setCrop(FlashvarManager.get("crop_x"), FlashvarManager.get("crop_y"), FlashvarManager.get("crop_w"), FlashvarManager.get("crop_h"));
+tool.setUrl(FlashvarManager.get("url"));
+tool.setRotation(FlashvarManager.get("rotation") * -1); //PIL rotates opposite to flash
+tool.setOutputRatio(FlashvarManager.get("zoomfactor"));
+tool.initialize();
+*/
+
+
+

Added: z3c.reference/branches/flash/flash/fla/imagetool.fla
===================================================================
(Binary files differ)


Property changes on: z3c.reference/branches/flash/flash/fla/imagetool.fla
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:mime-type
   + application/octet-stream

Added: z3c.reference/branches/flash/flash/fla/img/fingercursor.gif
===================================================================
(Binary files differ)


Property changes on: z3c.reference/branches/flash/flash/fla/img/fingercursor.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: z3c.reference/branches/flash/flash/fla/img/handcursor.gif
===================================================================
(Binary files differ)


Property changes on: z3c.reference/branches/flash/flash/fla/img/handcursor.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: z3c.reference/branches/flash/flash/src/net/hiddenresource/util/Delegate.as
===================================================================
--- z3c.reference/branches/flash/flash/src/net/hiddenresource/util/Delegate.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/net/hiddenresource/util/Delegate.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,27 @@
+/*
+ * Delegate.as v1.0.1 (MTASC compatible)
+ */
+class net.hiddenresource.util.Delegate
+{
+	public static function create(target:Object, handler:Function):Function
+	{
+		// Get any extra arguments for handler
+		var extraArgs:Array = arguments.slice(2);
+		
+		// Declare delegate variable (MTASC compatibility)
+		var delegate:Function;
+		
+		// Create delegate function
+		delegate = function():Object
+		{
+			// Augment arguments passed from broadcaster with additional args
+			var fullArgs:Array = arguments.concat(extraArgs, [delegate]);
+			
+			// Call handler with arguments
+			return handler.apply(target, fullArgs);
+		};
+		
+		// Return the delegate function.
+		return delegate;
+	}
+}


Property changes on: z3c.reference/branches/flash/flash/src/net/hiddenresource/util/Delegate.as
___________________________________________________________________
Name: svn:executable
   + *

Added: z3c.reference/branches/flash/flash/src/net/hiddenresource/util/debug/Debug.as
===================================================================
--- z3c.reference/branches/flash/flash/src/net/hiddenresource/util/debug/Debug.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/net/hiddenresource/util/debug/Debug.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,269 @@
+/**
+ * Alcon Debug class
+ * Sends trace actions to the Alcon output panel through a local connection.
+ * @version 1.0.7 (09.02.2006)
+ * @author Sascha Balkau <sascha at hiddenresource.corewatch.net>
+ */
+class net.hiddenresource.util.debug.Debug
+{
+
+	// If using MTASC trace facility, set this to true:
+	private static var mtf:Boolean = false;
+	// Determines if data blocks > 40Kb are split into chunks:
+	private static var sp:Boolean = true;
+	// Default depth of recursion for object tracing:
+	private static var rec:Number = 4;
+	
+	
+	// The sending local connection object:
+	private static var dlc:LocalConnection;
+	// Determines if a connection is already established:
+	private static var con:Boolean = false;
+	// Filter level. By default filter none (0):
+	private static var fl:Number = 0;
+	// The chunk size used for data splitting (def. 40600, leaves some additional headroom):
+	private static var cs:Number = 40600;
+	// Used internally to mark chunk splitting when using MTASC trace:
+	private static var spp:Boolean = false;
+	
+	
+	/**
+	 * Private constructor
+	 */
+	private function Debug()
+	{
+	}
+	
+	
+	/**
+	 * Prepares an object for recursive tracing.
+	 * @param <code>obj</code> the traced object.
+	 * @return A <code>string</code> that contains the object structure.
+	 */
+	private static function traceObj(obj:Object):String
+	{
+		// Set the max. recursive depth:
+		var rcdInit:Number = rec;
+		// If object is a movieclip, get the size of it:
+		var otp:String = typeof(obj);
+		var obt:String = (otp == "movieclip") ? ", " + obj.getBytesTotal().toString() + " bytes" : "";
+		// tmp holds the string with the whole object structure:
+		var tmp:String = "" + arguments.toString() + " (" + otp + obt + "):\n";
+		
+		// Nested recursive function:
+		var prObj:Function;
+		prObj = function(o:Object, rcd:Number, idt:Number, br:Boolean):Void
+		{
+			if (br)
+			{
+				br = false;
+				tmp += ">>";
+			}
+			for (var p:String in o)
+			{
+				// Preparing indention:
+				var tb:String = "";
+				for (var i:Number = 0; i < idt; i++) tb += "    ";
+				tmp += tb + p + ": " + o[p] + "\n";
+				if (rcd > 0) prObj(o[p], (rcd - 1), (idt + 1), true);
+			}
+		};
+		prObj(obj, rcdInit, 1, true);
+		return tmp;
+	}
+	
+	
+	/**
+	 * Splits data blocks that are larger than 40Kb into 40Kb chunks.
+	 * Note that level 6 is used internally to mark the data as
+	 * a chunk for the console. User-given levels are ignored when
+	 * data is processed by this method.
+	 * @param <code>dta</code> a string which is split into chunks.
+	 */
+	private static function splitDt(dta:String):Void
+	{
+		var sze:Number = cs;
+		var c:Number = Math.ceil(dta.length / sze);
+		var s:Number = 0;
+		var e:Number = sze;
+		
+		for (var i:Number = 0; i < c; i++)
+		{
+			if (i < c)
+			{
+				Debug.trace(dta.slice(s, e), false, 6);
+				//trace("\nChunk Nr: " + i + " / len: " + dta.slice(s, e).length, false, 6);
+				s += sze;
+				e += sze;
+			}
+		}
+		Debug.trace("", false, 1);
+		spp = false;
+	}
+	
+	
+	/**
+	 * The trace method accepts three arguments, the first contains the data which
+	 * is going to be traced, the second if of type <code>Boolean</code> is used
+	 * to indicate recursive object tracing mode, if of type <code>Number</code>
+	 * desribes the filtering level for the output.
+	 * @param <code>arg0:Object<code> the object to be traced.
+	 * @param <code>arg1:Boolean<code> true if recursive object tracing (optional).
+	 * @param <code>arg2:Number	<code> filter level (optional).
+	 */
+	public static function trace():Void
+	{
+		// Only connect if not already connected:
+		if (!con)
+		{
+			dlc = new LocalConnection();
+			con = true;
+		}
+		
+		// Use arguments offset if no mtasc trace facility:
+		var ao:Number = (!spp && mtf) ? 0 : 3;
+		
+		// Set vars:
+		var al:Number = arguments.length;
+		var ag:Number = -1;
+		var c:String = "";
+		var o:String = "";
+		var s:String = "";
+		var m:Object = (al > (3 - ao)) ? arguments[0] : undefined;
+		var t:Boolean = false;
+		var l:Number = 1;
+		
+		// Get MTASC parameters:
+		if (!spp && mtf)
+		{
+			var cn:String = arguments[al - 3].split("::").join(".");
+			var ca:Array = cn.split(".");
+			cn = ca[ca.length - 2];
+			c = "[" + cn + ", line " + arguments[al - 1] + "] ";
+		}
+		
+		// Check if more than one argument was given:
+		if (al > (4 - ao))
+		{
+			if (typeof(arguments[1]) == "boolean") t = arguments[1];
+			else if (typeof(arguments[1]) == "number") l = arguments[1];
+			
+			if (al > (5 - ao))
+			{
+				if (typeof(arguments[2]) == "boolean") t = arguments[2];
+				else if (typeof(arguments[2]) == "number") l = arguments[2];
+			}
+		}
+		
+		// Extract signal tag if any is given:
+		if (typeof(m) == "string")
+		{
+			if (m.substring(0, 2) == "[%")
+			{
+				if (m.substring(5, 7) == "%]")
+				{
+					s = m.substr(0, 7);
+					m = m.substr(7, m.length);
+					if (m == "") l = 5;
+				}
+			}
+		}
+		
+		// Only show messages equal or higher than current filter level:
+		if (l >= fl && l < 7)
+		{
+			// Check if recursive object tracing:
+			if (t) o += traceObj(m);
+			else o += String(m);
+			
+			// Check if data stream size is too large for LocalConnection:
+			if (sp && o.length > cs)
+			{
+				spp = true;
+				splitDt(o);
+			}
+			else
+			{
+				// Send output, signal tag, mtasc string and level to Alcon console:
+				var snt:Boolean = dlc.send("_alcon_lc", "onMessage", o, s, c, l);
+				
+				// Check if data could be sent, otherwise send error signal:
+				if (!snt) Debug.trace("[%ERR%]");
+				
+				// If you want to trace to the Flash IDE as well, uncomment this line.
+				// (Leave commented if using MTASC's trace feature!):
+				// trace(out);
+			}
+		}
+	}
+	
+	
+	/**
+	 * Sends a clear buffer signal to the output console.
+	 * Level 5 is used internally for signals, so that in any case
+	 * no level keywords are placed before the signal string.
+	 */
+	public static function clear():Void
+	{
+		Debug.trace("[%CLR%]", 5);
+	}
+	
+	
+	/**
+	 * Sends a delimiter signal to the output console.
+	 */
+	public static function delimiter():Void
+	{
+		Debug.trace("[%DLT%]", 5);
+	}
+	
+	
+	/**
+	 * Sends a pause signal to the output console.
+	 */
+	public static function pause():Void
+	{
+		Debug.trace("[%PSE%]", 5);
+	}
+	
+	
+	/**
+	 * Toggles data splitting on/off.
+	 * @param <code>_sp</code> A boolean if set to true turns on the option to
+	 * split data streams larger than 40Kb into 40Kb chunks, if set to false turns it off.
+	 */
+	public static function splitData(_sp:Boolean):Void
+	{
+		sp = _sp;
+	}
+	
+	
+	/**
+	 * Sets the logging filter level.
+	 * @param <code>_fl</code> a number for the filter level to be set.
+	 */
+	public static function setFilterLevel(_fl:Number):Void
+	{
+		if (_fl != undefined && _fl >= 0 && _fl < 5) fl = _fl;
+	}
+	
+	
+	/**
+	 * Returns the logging filter level.
+	 * @return	the number of the filter level.
+	 */
+	public static function getFilterLevel():Number
+	{
+		return fl;
+	}
+	
+	
+	/**
+	 * Sets the recursion depth for recursive object tracing.
+	 * @param <code>_rec</code> A number with the depth for object recursive tracing.
+	 */
+	public static function setRecursionDepth(_rec:Number):Void
+	{
+		rec = _rec;
+	}
+}


Property changes on: z3c.reference/branches/flash/flash/src/net/hiddenresource/util/debug/Debug.as
___________________________________________________________________
Name: svn:executable
   + *

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Canvas.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Canvas.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Canvas.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,63 @@
+/*
+ *  the visual representation of the paintable area
+ *
+ *  @author <gerold.boehler at lovelysystems.com>
+ */
+
+import z3c.reference.imagetool.core.*;
+import z3c.reference.imagetool.baseskin.*;
+
+
+class z3c.reference.imagetool.baseskin.Canvas extends Component
+{
+    private var width:Number = 1;
+    private var height:Number = 1;
+    
+    private var border_mc:MovieClip;
+    private var mask_mc:MovieClip;
+    
+	function Canvas()
+	{
+        super();
+        
+        createEmptyMovieClip("border_mc", getNextHighestDepth());
+        createEmptyMovieClip("mask_mc", getNextHighestDepth());
+        
+        var shadow = new flash.filters.DropShadowFilter(3);
+        filters = [shadow];
+    }
+    
+    public function onParentResize(w:Number, h:Number)
+    {
+        width = w;
+        height = h;
+        
+        border_mc.clear();
+        border_mc.lineStyle(0, 0x000000, 100);
+        border_mc.beginFill(0xffffff, 100);
+        border_mc.moveTo(0, 0);
+        border_mc.lineTo(width, 0);
+        border_mc.lineTo(width, height);
+        border_mc.lineTo(0, height);
+        border_mc.endFill();
+
+        mask_mc.clear();
+        mask_mc.lineStyle(0, 0x000000, 100);
+        mask_mc.beginFill(0x000000, 0);
+        mask_mc.moveTo(1, 1);
+        mask_mc.lineTo(width, 1);
+        mask_mc.lineTo(width, height);
+        mask_mc.lineTo(1, height);
+        mask_mc.endFill();
+    }
+    
+    public function getMask()
+    {
+        return mask_mc;
+    }
+
+    // event listeners --------------------------------------------------------------
+    
+    // helpers ----------------------------------------------------------------------
+    
+}

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Controller.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Controller.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Controller.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,126 @@
+/**
+* Class z3c.reference.imagetool.baseskin.Controller
+* Menu - Class of the Flash ImageCrop Tool
+* 
+* @author viktor.sohm at lovelysystems.com
+* @author gerold.boehler at lovelysystems.com
+*/
+
+import z3c.reference.imagetool.core.*;
+
+
+[Event("onZoomInPress")]
+[Event("onZoomInRelease")]
+[Event("onZoomOutPress")]
+[Event("onZoomOutRelease")]
+[Event("onRotateLeftRelease")]
+[Event("onRotateRightRelease")]
+[Event("onAcceptRelease")]
+[Event("onAbortRelease")]
+
+
+class z3c.reference.imagetool.baseskin.Controller extends Component
+{
+    private var PADDING:Number = 20;
+    
+	private var menuDrag_mc:MovieClip;
+	private var zoomIn_mc:MovieClip;
+	private var zoomOut_mc:MovieClip;
+	private var rotateLeft_mc:MovieClip;
+	private var rotateRight_mc:MovieClip;
+	private var menuAbort_mc:MovieClip;
+	private var menuAccept_mc:MovieClip;
+	private var cropsize_mc:MovieClip; //movieclip holding the textfields for manual size input
+	private var outputsize_mc:MovieClip;
+	
+	private var bg_mc:MovieClip;
+	
+	function Controller()
+	{
+		trace("Menu Initialized");
+		
+		bg_mc._width=Stage.width;
+		bg_mc._height=50;
+		var shadow = new flash.filters.DropShadowFilter(3);
+        bg_mc.filters = [shadow];
+
+		menuDrag_mc.onPress = function() { _parent.startDrag(false); }		
+		menuDrag_mc.onRelease = function() { _parent.stopDrag(); }
+		
+		zoomIn_mc.onPress = function() { _parent.broadcastEvent(new EventInfo(_parent, "onZoomInPress")); }
+		zoomIn_mc.onRelease =  this.zoomIn_mc.onReleaseOutside = function() { _parent.broadcastEvent(new EventInfo(_parent, "onZoomInRelease")); }
+		
+		zoomOut_mc.onPress = function() { _parent.broadcastEvent(new EventInfo(_parent, "onZoomOutPress")); }
+		zoomOut_mc.onRelease = this.zoomOut_mc.onReleaseOutside = function() { _parent.broadcastEvent(new EventInfo(_parent, "onZoomOutRelease")); }
+		
+		rotateLeft_mc.onRelease = function() { _parent.broadcastEvent(new EventInfo(_parent, "onRotateLeftRelease")); }
+		rotateRight_mc.onRelease = function() { _parent.broadcastEvent(new EventInfo(_parent, "onRotateRightRelease")); }
+		
+		menuAccept_mc.onRelease = function() { _parent.broadcastEvent(new EventInfo(_parent, "onAcceptRelease")); }
+		menuAbort_mc.onRelease = function() { _parent.broadcastEvent(new EventInfo(_parent, "onAbortRelease")); }
+		
+	/*	
+		this.cropsize_mc.width_txt.ptr=this.pointer;
+		this.cropsize_mc.width_txt.onChanged=function() {
+		    //trace("width was changed: " + this.text);
+		    this.ptr.onManualCropSizeChange(this.text, this._parent.height_txt.text);
+		}
+		this.cropsize_mc.height_txt.ptr=this.pointer; 
+		this.cropsize_mc.height_txt.onChanged=function(){
+		    this.ptr.onManualCropSizeChange(this._parent.width_txt.text, this.text);
+		}
+		
+		this.outputsize_mc.width_txt.ptr=this.pointer;
+		this.outputsize_mc.width_txt.onChanged=function() {
+		    //trace("width was changed: " + this.text);
+		    this.ptr.onManualOutputSizeChange(this.text, this._parent.height_txt.text);
+		}
+		this.outputsize_mc.height_txt.ptr=this.pointer; 
+		this.outputsize_mc.height_txt.onChanged=function(){
+		    this.ptr.onManualOutputSizeChange(this._parent.width_txt.text, this.text);
+		}
+	*/	
+	}
+	
+	function setCropSizeValues(width:Number, height:Number) {
+	    this.cropsize_mc.width_txt.text=width;
+	    this.cropsize_mc.height_txt.text=height;
+	}
+	function updateOutputSizeValues(width:Number, height:Number) {
+	    this.outputsize_mc.width_txt.text=width;
+	    this.outputsize_mc.height_txt.text=height;
+	}
+	
+	public function onParentResize(w:Number, h:Number)
+	{
+	    bg_mc._width = w
+	    bg_mc._height = h;
+	    
+	    var nextX = PADDING;
+	    var centerY = h / 2;
+	    
+    	rotateLeft_mc._x = nextX;
+    	rotateLeft_mc._y = centerY - rotateLeft_mc._height / 2;
+    	nextX += rotateLeft_mc._width + PADDING;
+    	
+    	rotateRight_mc._x = nextX;
+    	rotateRight_mc._y = centerY - rotateRight_mc._height / 2;
+    	nextX += rotateRight_mc._width + PADDING;
+
+    	zoomIn_mc._x = nextX;
+    	zoomIn_mc._y = centerY - zoomIn_mc._height / 2;
+    	nextX += zoomIn_mc._width + PADDING;
+
+    	zoomOut_mc._x = nextX;
+    	zoomOut_mc._y = centerY - zoomOut_mc._height / 2;
+    	nextX += zoomOut_mc._width + PADDING;
+
+    	menuAccept_mc._x = nextX;
+    	menuAccept_mc._y = centerY - menuAccept_mc._height / 2;
+    	nextX += menuAccept_mc._width + PADDING;
+
+    	menuAbort_mc._x = nextX;
+    	menuAbort_mc._y = centerY - menuAbort_mc._height / 2;
+    	nextX += menuAbort_mc._width + PADDING;
+	}
+}
\ No newline at end of file


Property changes on: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Controller.as
___________________________________________________________________
Name: svn:executable
   + *

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/EditableImage.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/EditableImage.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/EditableImage.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,451 @@
+/**
+* z3c.reference.imagetool.baseskin.EditableImage 
+* represents a image with a view that can be cropped
+*
+* @author <gerold.boehler at lovelysystems.com>
+*/
+
+import z3c.reference.imagetool.core.*;
+import z3c.reference.imagetool.baseskin.*;
+
+[Event("onImageLoaded")]
+[Event("onImagePress")]
+[Event("onImageRelease")]
+
+
+class z3c.reference.imagetool.baseskin.EditableImage extends Component
+{
+    private var MIN_VIEWPORT_SIZE:Number = 20;
+
+    private var image_mc:MovieClip;
+    private var fader_mc:MovieClip;
+    private var viewport_mc:MovieClip;
+    
+    private var isDragging:Boolean = false;
+    private var isLineDragging:Boolean = false;
+    private var isCornerDragging:Boolean = false;
+    private var currentDragElement:String = "";
+    private var dragElementOffsetX:Number = 0;
+    private var dragElementOffsetY:Number = 0;
+    private var dragStartPoint:flash.geom.Point;
+    private var viewportStartWidth:Number = 1;
+    private var viewportStartHeight:Number = 1;
+    private var viewportFixedRatio:Number = 1;
+    private var viewportStartPoint:flash.geom.Point;
+    
+    private var mcLoader:MovieClipLoader;
+
+	function EditableImage()
+	{
+	    super();
+	    
+	    createEmptyMovieClip("image_mc", getNextHighestDepth());
+	    createEmptyMovieClip("fader_mc", getNextHighestDepth());
+	    
+	    attachMovie("viewport_mc", "viewport_mc", getNextHighestDepth());
+	    viewport_mc.addListener(this);
+	    
+	    mcLoader = new MovieClipLoader();
+	    mcLoader.addListener(this);
+	    
+	    Key.addListener(this);
+    }
+    
+    public function loadImage(url:String)
+    {
+        mcLoader.loadClip(url, image_mc);
+    }
+
+    public function getCropPosition():flash.geom.Point
+    {
+        return new flash.geom.Point(viewport_mc._x, viewport_mc._y);
+    }
+    
+    public function getCropDimension():flash.geom.Point
+    {
+        return new flash.geom.Point(viewport_mc._width, viewport_mc._height);
+    }
+
+    function onEnterFrame()
+    {
+        if (FlashvarManager.get("keepAspectRatio") || Key.isDown(Key.SHIFT))
+        {
+            if (isCornerDragging)
+                scaleViewportByRatio();
+        }
+        else
+        {
+            if (isLineDragging)
+                scaleViewportByLine(_xmouse, _ymouse);
+
+            if (isCornerDragging)
+                scaleViewportByCorner(_xmouse, _ymouse);
+        }
+        
+        if (isDragging || isCornerDragging || isLineDragging)
+            updateFader();
+    }
+    
+    private function scaleViewportByLine(cursorX:Number, cursorY:Number)
+    {
+        switch(currentDragElement)
+        {
+            case "L":
+                var dx = -(cursorX - dragStartPoint.x);
+
+                if (viewportStartPoint.x - dx >= 0)
+                {
+                    viewport_mc._x = viewportStartPoint.x - dx;
+                }
+                else
+                {
+                    viewport_mc._x = 0;
+                    viewport_mc._width = viewportStartPoint.x + viewportStartWidth;
+                    return;
+                }
+
+                if (viewportStartWidth + dx >= MIN_VIEWPORT_SIZE)
+                {
+                    viewport_mc._width = viewportStartWidth + dx;
+                }
+                else
+                {
+                    viewport_mc._width = MIN_VIEWPORT_SIZE;
+                    viewport_mc._x = viewportStartPoint.x + viewportStartWidth - MIN_VIEWPORT_SIZE;
+                    return;
+                }
+
+                break;
+
+            case "T":
+                var dy = -(cursorY - dragStartPoint.y);
+
+                if (viewportStartPoint.y - dy >= 0)
+                {
+                    viewport_mc._y = viewportStartPoint.y - dy;
+                }
+                else
+                {
+                    viewport_mc._y = 0;
+                    viewport_mc._height = viewportStartPoint.y + viewportStartHeight;
+                    return;
+                }
+
+                if (viewportStartHeight + dy >= MIN_VIEWPORT_SIZE)
+                {
+                    viewport_mc._height = viewportStartHeight + dy;
+                }
+                else
+                {
+                    viewport_mc._height = MIN_VIEWPORT_SIZE;
+                    viewport_mc._y = viewportStartPoint.y + viewportStartHeight - MIN_VIEWPORT_SIZE;
+                    return;
+                }
+                break;
+
+                
+            case "R":
+                var dx = cursorX - dragStartPoint.x;
+
+                if (viewportStartPoint.x + viewportStartWidth + dx >= image_mc._width)
+                {
+                    viewport_mc._width = image_mc._width - viewportStartPoint.x;
+                    return;
+                }
+                
+                if (viewportStartWidth + dx >= MIN_VIEWPORT_SIZE)
+                {
+                    viewport_mc._width = viewportStartWidth + dx;
+                }
+                else
+                {
+                    viewport_mc._width = MIN_VIEWPORT_SIZE;
+                }
+                break;
+                
+            case "B":
+                var dy = cursorY - dragStartPoint.y;
+                
+                if (viewportStartPoint.y + viewportStartHeight + dy >= image_mc._height)
+                {
+                    viewport_mc._height = image_mc._height - viewportStartPoint.y;
+                    return;
+                }
+                
+                if (viewportStartHeight + dy >= MIN_VIEWPORT_SIZE)
+                {
+                    viewport_mc._height = viewportStartHeight + dy;
+                }
+                else
+                {
+                    viewport_mc._height = MIN_VIEWPORT_SIZE;
+                }
+                break;
+        }
+        
+        viewport_mc.updateSensitiveAreas();
+    }
+    
+    private function scaleViewportByCorner(cursorX:Number, cursorY:Number)
+    {
+        var lines = currentDragElement.split("");
+        for (var i = 0; i < lines.length; i++)
+        {
+            currentDragElement = lines[i];
+            scaleViewportByLine(cursorX, cursorY);
+        }
+        currentDragElement = lines.join("");
+    }
+    
+    private function scaleViewportByRatio()
+    {
+        switch(currentDragElement)
+        {
+            case "LT":
+                var offsetX = _xmouse - viewportStartPoint.x;
+                var offsetY = _ymouse - viewportStartPoint.y;
+                var offset = (offsetX < offsetY) ? (offsetX) : (offsetY);
+                var cursorX = viewportStartPoint.x + (offset + dragElementOffsetX);
+                var cursorY = viewportStartPoint.y + (offset + dragElementOffsetY) / viewportFixedRatio;
+                scaleViewportByCorner(cursorX, cursorY);
+                break;
+            
+            case "RT":
+                var offsetX = viewportStartPoint.x + viewportStartWidth - _xmouse;
+                var offsetY = _ymouse - viewportStartPoint.y;
+                var offset = (offsetX < offsetY) ? offsetX : offsetY;
+                var cursorX = viewportStartPoint.x + viewportStartWidth - (offset - dragElementOffsetX) / viewportFixedRatio;
+                var cursorY = viewportStartPoint.y + (offset + dragElementOffsetY);
+                scaleViewportByCorner(cursorX, cursorY);
+                break;
+                
+            case "LB":
+                var offsetX = _xmouse - viewportStartPoint.x;
+                var offsetY = viewportStartPoint.y + viewportStartHeight - _ymouse;
+                var offset = (offsetX < offsetY) ? offsetX : offsetY;
+                var cursorX = viewportStartPoint.x + (offset + dragElementOffsetX);
+                var cursorY = viewportStartPoint.y + viewportStartHeight - (offset - dragElementOffsetY) / viewportFixedRatio;
+                scaleViewportByCorner(cursorX, cursorY);
+                break;
+            
+            case "RB":
+                var offsetX = _xmouse - viewportStartPoint.x;
+                var offsetY = _ymouse - viewportStartPoint.y;
+                var offset = (offsetX > offsetY) ? (offsetX) : (offsetY);
+                var cursorX = viewportStartPoint.x + (offset + dragElementOffsetX);
+                var cursorY = viewportStartPoint.y + (offset + dragElementOffsetY) / viewportFixedRatio;
+                scaleViewportByCorner(cursorX, cursorY);
+                break;
+        }
+    }
+    
+    private function moveViewportBy(x:Number, y:Number)
+    {
+        if (viewport_mc._x + x < 0)
+            viewport_mc._x = 0;
+        else if (viewport_mc._x + x > image_mc._width - viewport_mc._width)
+            viewport_mc._x = image_mc._width - viewport_mc._width;
+        else
+            viewport_mc._x += x;
+            
+        if (viewport_mc._y + y < 0)
+            viewport_mc._y = 0;
+        else if (viewport_mc._y + y > image_mc._height - viewport_mc._height)
+            viewport_mc._y = image_mc._height - viewport_mc._height;
+        else
+            viewport_mc._y += y;
+        
+    }
+    
+    // event listeners --------------------------------------------------------------
+
+    function onLoadInit(mc:MovieClip)
+    {
+        viewport_mc.init();
+        viewportFixedRatio = FlashvarManager.get("keepAspectRatio") ? (viewport_mc._width / viewport_mc._height) : 1;
+        viewport_mc._x = FlashvarManager.get("crop_x");
+        viewport_mc._y = FlashvarManager.get("crop_x");
+        updateFader();
+        
+        var ei:EventInfo = new EventInfo(this, "onImageLoaded");
+        broadcastEvent(ei);
+    }
+
+    function onKeyDown()
+    {
+        var offset = Key.isDown(Key.SHIFT) ? 5 : 1;
+        
+        switch(Key.getCode())
+        {
+            case Key.UP:
+                moveViewportBy(0, -offset);
+                break;
+                
+            case Key.DOWN:
+                moveViewportBy(0, offset);
+                break;
+                
+            case Key.LEFT:
+                moveViewportBy(-offset, 0);
+                break;
+                
+            case Key.RIGHT:
+                moveViewportBy(offset, 0);
+                break;
+                
+            case Key.SHIFT:
+                if (FlashvarManager.get("keepAspectRatio"))
+                {
+                    
+                }
+                else
+                {
+                    //viewport_mc._x = Math.floor(viewport_mc._x);
+                    //viewport_mc._y = Math.floor(viewport_mc._y);
+                    //viewport_mc._width = Math.floor(viewport_mc._width);
+                    //viewport_mc._height = Math.floor(viewport_mc._height);
+                }
+                break;
+        }
+    }
+    
+    function onMouseDown()
+    {
+        // first check if the mouse is over the image at all
+        if (_xmouse < 0 || _xmouse > _width || _ymouse < 0 || _ymouse > _height)
+            return;
+            
+        // now check if the hit the image
+        if (_xmouse >= viewport_mc._x && _xmouse <= viewport_mc._x + viewport_mc._width && 
+            _ymouse >= viewport_mc._y && _ymouse <= viewport_mc._y + viewport_mc._height)
+                return;
+            
+        var ei:EventInfo = new EventInfo(this, "onImagePress");
+        broadcastEvent(ei);
+    }
+    
+    function onMouseUp()
+    {
+        //if (_xmouse >= viewport_mc._x && _xmouse <= viewport_mc._x + viewport_mc._width && 
+        //    _ymouse >= viewport_mc._y && _ymouse <= viewport_mc._y + viewport_mc._height)
+        //        return;
+
+        var ei:EventInfo = new EventInfo(this, "onImageRelease");
+        broadcastEvent(ei);
+    }
+    
+    function onViewportPress(ei:EventInfo)
+    {
+        viewport_mc.startDrag(false, 0, 0, image_mc._width - viewport_mc._width, image_mc._height - viewport_mc._height);
+        isDragging = true;
+    }
+    
+    function onViewportRelease(ei:EventInfo)
+    {
+        viewport_mc.stopDrag();
+        viewport_mc._x = Math.floor(viewport_mc._x);
+        viewport_mc._y = Math.floor(viewport_mc._y);
+        updateFader();
+        isDragging = false;
+    }
+    
+    function onLinePress(ei:EventInfo)
+    {
+        currentDragElement = ei.getInfo("line");
+        viewportStartPoint = new flash.geom.Point(viewport_mc._x, viewport_mc._y);
+        dragStartPoint = new flash.geom.Point(Math.floor(_xmouse), Math.floor(_ymouse));
+        viewportStartWidth = viewport_mc._width;
+        viewportStartHeight = viewport_mc._height;
+        isLineDragging = true;
+    }
+    
+    function onLineRelease(ei:EventInfo)
+    {
+        isLineDragging = false;
+    }
+    
+    function onCornerPress(ei:EventInfo)
+    {
+        currentDragElement = ei.getInfo("corner");
+        dragElementOffsetX = ei.getInfo("offsetX");
+        dragElementOffsetY = ei.getInfo("offsetY");
+        viewportStartPoint = new flash.geom.Point(viewport_mc._x, viewport_mc._y);
+        dragStartPoint = new flash.geom.Point(Math.floor(_xmouse), Math.floor(_ymouse));
+        viewportStartWidth = viewport_mc._width;
+        viewportStartHeight = viewport_mc._height;
+        isCornerDragging = true;
+    }
+    
+    function onCornerRelease(ei:EventInfo)
+    {
+        isCornerDragging = false;
+    }
+    
+    public function onParentResize(w:Number, h:Number)
+    {
+
+    }
+    
+    // helpers ----------------------------------------------------------------------------
+    
+    private function updateFader()
+    {
+        fader_mc.clear();
+
+        fader_mc.beginFill(0x000000, 50);
+        fader_mc.moveTo(0, 0);
+        fader_mc.lineTo(viewport_mc._x, 0);
+        fader_mc.lineTo(viewport_mc._x, viewport_mc._y);
+        fader_mc.lineTo(0, viewport_mc._y)
+        fader_mc.endFill();
+
+        fader_mc.beginFill(0x000000, 50);
+        fader_mc.moveTo(viewport_mc._x, 0);
+        fader_mc.lineTo(viewport_mc._x + viewport_mc._width, 0);
+        fader_mc.lineTo(viewport_mc._x + viewport_mc._width, viewport_mc._y);
+        fader_mc.lineTo(viewport_mc._x, viewport_mc._y)
+        fader_mc.endFill();
+
+        fader_mc.beginFill(0x000000, 50);
+        fader_mc.moveTo(viewport_mc._x + viewport_mc._width, 0);
+        fader_mc.lineTo(image_mc._width, 0);
+        fader_mc.lineTo(image_mc._width, viewport_mc._y);
+        fader_mc.lineTo(viewport_mc._x + viewport_mc._width, viewport_mc._y)
+        fader_mc.endFill();
+        
+        fader_mc.beginFill(0x000000, 50);
+        fader_mc.moveTo(0, viewport_mc._y);
+        fader_mc.lineTo(viewport_mc._x, viewport_mc._y);
+        fader_mc.lineTo(viewport_mc._x, viewport_mc._y + viewport_mc._height);
+        fader_mc.lineTo(0, viewport_mc._y + viewport_mc._height)
+        fader_mc.endFill();
+
+        fader_mc.beginFill(0x000000, 50);
+        fader_mc.moveTo(viewport_mc._x + viewport_mc._width, viewport_mc._y);
+        fader_mc.lineTo(image_mc._width, viewport_mc._y);
+        fader_mc.lineTo(image_mc._width, viewport_mc._y + viewport_mc._height);
+        fader_mc.lineTo(viewport_mc._x + viewport_mc._width, viewport_mc._y + viewport_mc._height)
+        fader_mc.endFill();
+
+        fader_mc.beginFill(0x000000, 50);
+        fader_mc.moveTo(0, viewport_mc._y + viewport_mc._height);
+        fader_mc.lineTo(viewport_mc._x, viewport_mc._y + viewport_mc._height);
+        fader_mc.lineTo(viewport_mc._x, image_mc._height);
+        fader_mc.lineTo(0, image_mc._height)
+        fader_mc.endFill();
+
+        fader_mc.beginFill(0x000000, 50);
+        fader_mc.moveTo(viewport_mc._x, viewport_mc._y + viewport_mc._height);
+        fader_mc.lineTo(viewport_mc._x + viewport_mc._width, viewport_mc._y + viewport_mc._height);
+        fader_mc.lineTo(viewport_mc._x + viewport_mc._width, image_mc._height);
+        fader_mc.lineTo(viewport_mc._x, image_mc._height)
+        fader_mc.endFill();
+
+        fader_mc.beginFill(0x000000, 50);
+        fader_mc.moveTo(viewport_mc._x + viewport_mc._width, viewport_mc._y + viewport_mc._height);
+        fader_mc.lineTo(image_mc._width, viewport_mc._y + viewport_mc._height);
+        fader_mc.lineTo(image_mc._width, image_mc._height);
+        fader_mc.lineTo(viewport_mc._x + viewport_mc._width, image_mc._height)
+        fader_mc.endFill();
+    }
+}

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/ImageTool.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/ImageTool.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/ImageTool.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,484 @@
+/**
+* z3c.reference.imagetool.baseskin.ImageTool 
+* is a tool for cropping images TTW
+*
+* @author <viktor.sohm at lovelysystems.com>
+* @author <manfred.schwendinger at lovelysystems.com>
+* @author <armin.wolf at lovelysystems.com>
+* @author <gerold.boehler at lovelysystems.com>
+*/
+
+import z3c.reference.imagetool.core.*;
+import z3c.reference.imagetool.baseskin.*;
+
+
+class z3c.reference.imagetool.baseskin.ImageTool extends Component
+{
+    private var PADDING:Number = 10;
+
+    private var canvas_mc:MovieClip;
+    private var editable_image_mc:MovieClip;
+    private var mousepointer_mc:MovieClip;
+    private var controller_mc:MovieClip;
+    
+    private var imageScale:Number = 100;
+    private var imageRatio:Number = 1;
+    private var maxImageWidth:Number = 0;
+    private var maxImageHeight:Number = 0;
+
+    private var editableImageStartX:Number = 0;
+    private var editableImageStartY:Number = 0;
+    private var editableImageStartWidth:Number = 1;
+    private var editableImageStartHeight:Number = 1;
+    private var zoomLevel:Number = 0;
+    private var nextDegree:Number = 0;
+    
+    private var dragCursorStartX:Number = 0;
+    private var dragCursorStartY:Number = 0;
+    private var dragImageStartX:Number = 0;
+    private var dragImageStartY:Number = 0;
+    
+    private var isDraggingImage:Boolean = false;
+
+	function ImageTool()
+	{
+	    super();
+	    
+	    attachMovie("canvas_mc", "canvas_mc", getNextHighestDepth());
+
+	    attachMovie("editable_image_mc", "editable_image_mc", getNextHighestDepth());
+	    editable_image_mc.addListener(this);
+	    editable_image_mc.setMask(canvas_mc.getMask());
+	    
+	    createEmptyMovieClip("mousepointer_mc", getNextHighestDepth());
+	    mousepointer_mc.attachMovie("pointer_drag_mc", "pointer_drag_mc", mousepointer_mc.getNextHighestDepth(), {_visible: false});
+	    mousepointer_mc.attachMovie("pointer_line_mc", "pointer_line_mc", mousepointer_mc.getNextHighestDepth(), {_visible: false});
+	    mousepointer_mc.attachMovie("pointer_corner_mc", "pointer_corner_mc", mousepointer_mc.getNextHighestDepth(), {_visible: false});	    
+	    
+	    attachMovie("controller_mc", "controller_mc", getNextHighestDepth());
+	    controller_mc.addListener(this);
+	    
+	    _visible = false;
+        onEnterFrame = initAfterFirstFrame;
+        Stage.addListener(this);
+    }
+    
+    var tmp = 0;
+    function initAfterFirstFrame()
+    {
+        editable_image_mc.loadImage(FlashvarManager.get("url"));
+        onEnterFrame = null;//function() { rotateImage(tmp); tmp += 0.01;};
+    }
+    
+	function saveChanges()
+	{
+        trace("\n\nsaveChanges");
+        
+        var url_str:String="";
+        
+        url_str+="JavaScript:cropImage(";
+        
+        //crop_x = Math.round(bounding_mc.left-image_mc.left)//Math.round((bounding_mc.left-image_mc.left) / image_mc.getZoomFactor());
+        //crop_y = Math.round(bounding_mc.top-image_mc.top)//Math.round((bounding_mc.top-image_mc.top) / image_mc.getZoomFactor());
+        
+        
+        //var rotation:Number = (Math.round(image_mc.getRotation()) % 360)*-1; //seems like pil accepts rotation in the other direction
+        //rotation = rotation > 0 ? rotation : rotation + 360;
+        
+        //url_str += crop_x + ", ";        
+        //url_str += crop_y + ", ";        
+        
+        //url_str += output_w + ", ";
+        //url_str += output_h + ", ";
+        /*
+        if (rotation==90 || rotation==270)
+        {
+            url_str += Math.round(original_h * image_mc.getZoomFactor()) + ", ";
+            url_str += Math.round(original_w * image_mc.getZoomFactor()) + ", " ;
+        }
+        else
+        {
+            url_str += Math.round(original_w * image_mc.getZoomFactor()) + ", " ;
+            url_str += Math.round(original_h * image_mc.getZoomFactor()) + ", ";
+        }
+        */
+        
+        //url_str += rotation.toString() + ", ";
+        //url_str += image_mc.getZoomFactor()+"";
+        
+        var globalTL = new flash.geom.Point();
+        var cropPos = new Object();
+        var cropDim = new Object();
+        var imageDim = new Object();
+
+        switch(nextDegree)
+        {
+            case 0:
+                imageDim.x = editable_image_mc._width;
+                imageDim.y = editable_image_mc._height;
+                globalTL.x = canvas_mc._x + (canvas_mc._width - editable_image_mc._width) / 2;
+                globalTL.y = canvas_mc._y + (canvas_mc._height - editable_image_mc._height) / 2;
+
+                var scaleFactor = editable_image_mc._width / maxImageWidth;
+                cropDim.x = editable_image_mc.getCropDimension().x;
+                cropDim.y = editable_image_mc.getCropDimension().y;
+                cropDim.x *= scaleFactor;
+                cropDim.y *= scaleFactor;
+                
+                cropPos.x = editable_image_mc.getCropPosition().x;
+                cropPos.y = editable_image_mc.getCropPosition().y;
+                editable_image_mc.localToGlobal(cropPos);
+                cropPos.x -= globalTL.x;
+                cropPos.y -= globalTL.y;
+
+                break;
+                
+            case 180:
+                imageDim.x = editable_image_mc._width;
+                imageDim.y = editable_image_mc._height;
+
+                globalTL.x = canvas_mc._x + (canvas_mc._width - editable_image_mc._width) / 2;
+                globalTL.y = canvas_mc._y + (canvas_mc._height - editable_image_mc._height) / 2;
+
+                var scaleFactor = editable_image_mc._width / maxImageWidth;
+                cropDim.x = editable_image_mc.getCropDimension().x;
+                cropDim.y = editable_image_mc.getCropDimension().y;
+                cropDim.x *= scaleFactor;
+                cropDim.y *= scaleFactor;
+
+                cropPos.x = editable_image_mc.getCropPosition().x + editable_image_mc.getCropDimension().x;
+                cropPos.y = editable_image_mc.getCropPosition().y + editable_image_mc.getCropDimension().y;
+                editable_image_mc.localToGlobal(cropPos);
+                cropPos.x -= globalTL.x;
+                cropPos.y -= globalTL.y;
+
+                break;
+                
+            case 90:
+                editable_image_mc._rotation = 0;
+
+                imageDim.x = editable_image_mc._height;
+                imageDim.y = editable_image_mc._width;
+
+                globalTL.x = canvas_mc._y + (canvas_mc._width - editable_image_mc._height) / 2;
+                globalTL.y = canvas_mc._x + (canvas_mc._height - editable_image_mc._width) / 2;
+
+                var scaleFactor = editable_image_mc._height / maxImageHeight;
+                cropDim.x = editable_image_mc.getCropDimension().y;
+                cropDim.y = editable_image_mc.getCropDimension().x;
+                cropDim.x *= scaleFactor;
+                cropDim.y *= scaleFactor;
+            
+                cropPos.x = editable_image_mc.getCropPosition().y;
+                cropPos.y = editable_image_mc.getCropPosition().x;
+                editable_image_mc.localToGlobal(cropPos);
+                cropPos.x = 2*editable_image_mc._height - cropPos.x + globalTL.x - cropDim.y;
+                cropPos.y = cropPos.y - globalTL.y;
+
+                editable_image_mc._rotation = nextDegree;
+
+                break;
+                
+            case 270:
+                editable_image_mc._rotation = 0;
+
+                imageDim.x = editable_image_mc._height;
+                imageDim.y = editable_image_mc._width;
+
+                globalTL.x = canvas_mc._y + (canvas_mc._width - editable_image_mc._height) / 2;
+                globalTL.y = canvas_mc._x + (canvas_mc._height - editable_image_mc._width) / 2;
+
+                var scaleFactor = editable_image_mc._height / maxImageHeight;
+                cropDim.x = editable_image_mc.getCropDimension().y;
+                cropDim.y = editable_image_mc.getCropDimension().x;
+                cropDim.x *= scaleFactor;
+                cropDim.y *= scaleFactor;
+                
+                cropPos.x = editable_image_mc.getCropPosition().y;
+                cropPos.y = editable_image_mc.getCropPosition().x;
+                editable_image_mc.localToGlobal(cropPos);
+                cropPos.x = cropPos.x - globalTL.x;
+                cropPos.y = 2*editable_image_mc._width - cropPos.y + globalTL.y - cropDim.x;
+
+                editable_image_mc._rotation = nextDegree;
+
+                break;
+        }
+        
+        var rotation = ((360 - nextDegree) % 360);
+        
+        url_str += [Math.round(cropPos.x), Math.round(cropPos.y), Math.round(cropDim.x), Math.round(cropDim.y), Math.round(imageDim.x), Math.round(imageDim.y), rotation].toString();
+        url_str+=");";
+        trace("url_str: "+url_str);
+        
+        // we are inside debug mode, so do not use getURL
+        if (System.capabilities.playerType == "External")
+            return;
+        
+        getURL(url_str);
+	}
+	
+	function onMouseMove()
+	{
+	    //trace(_level0._xmouse + " " +  _level0._ymouse)
+	}
+	
+	private function zoomImage(dir:Number)
+	{
+	    if (zoomLevel + dir < 0 || zoomLevel + dir > 100)
+	        return;
+	    
+	    zoomLevel += dir;
+	    
+	    var newImageWidth = editableImageStartWidth * (1 + zoomLevel / 100.0);
+	    var newImageHeight = editableImageStartHeight * (1 + zoomLevel / 100.0);
+        var dx = editableImageStartWidth - newImageWidth;
+        var dy = editableImageStartHeight - newImageHeight;
+        trace(nextDegree)
+        switch(nextDegree)
+        {
+            case 0:
+                editable_image_mc._width = editableImageStartWidth * (1 + zoomLevel / 100.0);
+                editable_image_mc._height = editableImageStartHeight * (1 + zoomLevel / 100.0);
+                editable_image_mc._x = editableImageStartX + dx/2;
+                editable_image_mc._y = editableImageStartY + dy/2;
+                break;
+                
+            case 90:
+                editable_image_mc._rotation = 0;
+                editable_image_mc._width = editableImageStartWidth * (1 + zoomLevel / 100.0);
+                editable_image_mc._height = editableImageStartHeight * (1 + zoomLevel / 100.0);
+                editable_image_mc._rotation = nextDegree;
+                editable_image_mc._x = editableImageStartX - dx/2;
+                editable_image_mc._y = editableImageStartY + dy/2;
+                break;
+            
+            case 180:
+                editable_image_mc._width = editableImageStartWidth * (1 + zoomLevel / 100.0);
+                editable_image_mc._height = editableImageStartHeight * (1 + zoomLevel / 100.0);
+                editable_image_mc._x = editableImageStartX - dx/2;
+                editable_image_mc._y = editableImageStartY - dy/2;
+                break;
+
+            case 270:
+                editable_image_mc._rotation = 0;
+                editable_image_mc._width = editableImageStartWidth * (1 + zoomLevel / 100.0);
+                editable_image_mc._height = editableImageStartHeight * (1 + zoomLevel / 100.0);
+                editable_image_mc._rotation = nextDegree;
+                editable_image_mc._x = editableImageStartX + dx/2;
+                editable_image_mc._y = editableImageStartY - dy/2;
+                break;
+        }
+	}
+
+    // event listeners --------------------------------------------------------------
+    
+    function onImageLoaded(ei:EventInfo)
+    {
+        // save the original image dimensions
+        maxImageWidth = editable_image_mc._width;
+        maxImageHeight = editable_image_mc._height;
+        imageRatio = maxImageWidth / maxImageHeight;
+        
+        // call resize once to setup everything up properly
+        onResize();
+
+        // save the initial position and dimension of the image
+        editableImageStartX = editable_image_mc._x;
+        editableImageStartY = editable_image_mc._y;
+        editableImageStartWidth = editable_image_mc._width;
+        editableImageStartHeight = editable_image_mc._height;
+
+        _visible = true;
+    }
+
+    function onImagePress(ei:EventInfo)
+    {
+        if (zoomLevel == 0)
+            return;
+        
+        if (_xmouse < canvas_mc._x || _xmouse > canvas_mc._x + canvas_mc._width ||
+            _ymouse < canvas_mc._y || _ymouse > canvas_mc._y + canvas_mc._height)
+            return;
+        
+        dragCursorStartX = _level0._xmouse;
+        dragCursorStartY = _level0._ymouse;
+        dragImageStartX = editable_image_mc._x;
+        dragImageStartY = editable_image_mc._y;
+
+        onEnterFrame = dragImage;
+        Mouse.hide();
+        _level0.imagetool_mc.mousepointer_mc.pointer_drag_mc._visible = true;
+    }
+    
+    function onImageRelease(ei:EventInfo)
+    {
+        if (zoomLevel == 0)
+            return;
+        
+        onEnterFrame = null;
+        Mouse.show();
+        _level0.imagetool_mc.mousepointer_mc.pointer_drag_mc._visible = false;
+    }
+    
+    // controller event listeners --------------------------------------------------------------
+
+    // menu event listeners --------------------------------------------------------------
+    
+    function onRotateLeftRelease(ei:EventInfo)
+    {
+        nextDegree = (editable_image_mc._rotation - 90) % 360;
+        nextDegree = (nextDegree < 0) ? ( nextDegree + 360) : nextDegree;        
+        centerImage();
+        editable_image_mc._rotation = nextDegree;
+    }
+    
+    function onRotateRightRelease(ei:EventInfo)
+    {
+        nextDegree = (editable_image_mc._rotation + 90) % 360;
+        centerImage();
+        editable_image_mc._rotation = nextDegree;
+    }
+    
+    function onZoomInPress(ei:EventInfo)
+    {
+        onEnterFrame = function() { zoomImage(1, 2); }
+    }
+    
+    function onZoomInRelease(ei:EventInfo)
+    {
+        onEnterFrame = null;
+    }
+    
+    function onZoomOutPress(ei:EventInfo)
+    {
+        onEnterFrame = function() { zoomImage(-1, 2); }
+    }
+    
+    function onZoomOutRelease(ei:EventInfo)
+    {
+        onEnterFrame = null;
+    }
+    
+    function onAbortRelease(ei:EventInfo)
+    {
+
+    }
+    
+    function onAcceptRelease(ei:EventInfo)
+    {
+        saveChanges();
+    }
+    
+    public function onResize()
+    {
+        var w = Stage.width - 2 * PADDING;
+        var h = Stage.height - 2 * PADDING;
+        
+        var controllerHeight = 45;
+        controller_mc.onParentResize(w, controllerHeight);
+        controller_mc._x = PADDING;
+        controller_mc._y = Stage.height - PADDING - controller_mc._height;
+        
+        var canvasHeight = controller_mc._y - PADDING - PADDING;
+        canvas_mc.onParentResize(w, canvasHeight);
+        canvas_mc._x = PADDING;
+        canvas_mc._y = PADDING;
+        
+        centerImage();
+    }
+    
+    // helpers ----------------------------------------------------------------------------
+    
+    function dragImage()
+    {
+        _level0.imagetool_mc.mousepointer_mc.pointer_drag_mc._x = _level0._xmouse;
+        _level0.imagetool_mc.mousepointer_mc.pointer_drag_mc._y = _level0._ymouse;
+        
+        var nextX = dragImageStartX + _xmouse - dragCursorStartX;
+        var nextY = dragImageStartY + _ymouse - dragCursorStartY;
+        if (nextX <= canvas_mc._x && nextX + editable_image_mc._width >= canvas_mc._x + canvas_mc._width)
+            editable_image_mc._x = nextX;
+
+        if (nextY <= canvas_mc._y && nextY + editable_image_mc._height >= canvas_mc._y + canvas_mc._height)
+            editable_image_mc._y = nextY;
+    }
+    
+    private function centerImage()
+    {
+        fitImage();
+        
+        var dx = canvas_mc._width - editable_image_mc._width;
+        var dy = canvas_mc._height - editable_image_mc._height;
+
+        switch(nextDegree)
+        {
+            case 0:
+                editable_image_mc._x = canvas_mc._x + dx/2;
+                editable_image_mc._y = canvas_mc._y + dy/2;
+                break;
+                
+            case 90:
+                editable_image_mc._x = canvas_mc._x + editable_image_mc._width + dx/2;
+                editable_image_mc._y = canvas_mc._y + dy/2;
+                break;
+            
+            case 180:
+                editable_image_mc._x = canvas_mc._x + editable_image_mc._width + dx/2;
+                editable_image_mc._y = canvas_mc._y + editable_image_mc._height + dy/2;
+                break;
+                
+            case 270:
+                editable_image_mc._x = canvas_mc._x + dx/2;
+                editable_image_mc._y = canvas_mc._y + editable_image_mc._height + dy/2;
+                break;
+        }
+
+        editableImageStartX = editable_image_mc._x;
+        editableImageStartY = editable_image_mc._y;
+    }
+    
+    private function fitImage()
+    {
+        editable_image_mc._rotation = 0;
+
+        var dW = editable_image_mc._width - canvas_mc._width;
+        var dH = editable_image_mc._height - canvas_mc._height;
+
+        switch(nextDegree)
+        {
+            case 0:
+            case 180:
+                if (dW < dH)
+                {
+                    editable_image_mc._width = canvas_mc._height * imageRatio;
+                    editable_image_mc._height = canvas_mc._height;
+                }
+                else
+                {
+                    editable_image_mc._width = canvas_mc._width;
+                    editable_image_mc._height = canvas_mc._width / imageRatio;
+                }
+                break;
+                
+            case 90:
+            case 270:            
+                if (dW < dH)
+                {
+                    editable_image_mc._width = canvas_mc._height;
+                    editable_image_mc._height = canvas_mc._height / imageRatio;
+                }
+                else
+                {
+                    editable_image_mc._width = canvas_mc._width * imageRatio;
+                    editable_image_mc._height = canvas_mc._width;
+                }
+                break;
+        }
+        
+        editableImageStartWidth = editable_image_mc._width;
+        editableImageStartHeight = editable_image_mc._height;
+        editable_image_mc._rotation = nextDegree;
+        zoomLevel = 0;
+    }    
+}

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Viewport.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Viewport.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/baseskin/Viewport.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,370 @@
+/**
+* z3c.reference.imagetool.baseskin.Viewport 
+* represents cropped area
+*
+* @author <gerold.boehler at lovelysystems.com>
+*/
+
+import z3c.reference.imagetool.core.*;
+import z3c.reference.imagetool.baseskin.*;
+
+
+class z3c.reference.imagetool.baseskin.Viewport extends Component
+{
+    private var SENSITIVE_AREA:Number = 5;
+    
+    private var drag_area_mc:MovieClip;
+    
+    private var line_left_mc:MovieClip;
+    private var line_right_mc:MovieClip;
+    private var line_top_mc:MovieClip;
+    private var line_bottom_mc:MovieClip;
+    
+    private var corner_LT:MovieClip;
+    private var corner_RT:MovieClip;
+    private var corner_LB:MovieClip;
+    private var corner_RB:MovieClip;
+    
+    private var linePointerDegrees:Object;
+    private var cornerPointerDegrees:Object;
+    
+    private var current_pointer_mc:MovieClip;
+    
+	function Viewport()
+	{
+	    super();
+	    
+	    createEmptyMovieClip("drag_area_mc", getNextHighestDepth());
+	    initDragArea(drag_area_mc);
+
+        if (!FlashvarManager.get("keepAspectRatio"))
+        {
+    	    createEmptyMovieClip("line_left_mc", getNextHighestDepth());
+    	    initLine(line_left_mc, "L");
+
+    	    createEmptyMovieClip("line_right_mc", getNextHighestDepth());
+    	    initLine(line_right_mc, "R");
+
+    	    createEmptyMovieClip("line_top_mc", getNextHighestDepth());
+    	    initLine(line_top_mc, "T");
+
+    	    createEmptyMovieClip("line_bottom_mc", getNextHighestDepth());
+    	    initLine(line_bottom_mc, "B");
+        }
+        
+	    createEmptyMovieClip("corner_LT", getNextHighestDepth());
+	    initCorner(corner_LT, "LT");
+
+	    createEmptyMovieClip("corner_RT", getNextHighestDepth());
+	    initCorner(corner_RT, "RT");
+
+	    createEmptyMovieClip("corner_LB", getNextHighestDepth());
+	    initCorner(corner_LB, "LB");
+
+	    createEmptyMovieClip("corner_RB", getNextHighestDepth());
+	    initCorner(corner_RB, "RB");
+	    
+	    linePointerDegrees = new Object();
+	    linePointerDegrees.L = 90;
+	    linePointerDegrees.R = 270;
+	    linePointerDegrees.T = 180;
+	    linePointerDegrees.B = 0;
+	    
+	    cornerPointerDegrees = new Object();
+	    cornerPointerDegrees.LT = 135;
+	    cornerPointerDegrees.RT = 225;
+	    cornerPointerDegrees.LB = 45;
+	    cornerPointerDegrees.RB = 315;
+    }
+    
+    public function init()
+    {
+        var w = FlashvarManager.get("crop_w");
+        var h = FlashvarManager.get("crop_h");
+        
+        drag_area_mc.clear();
+        drag_area_mc.lineStyle(0, 0xc0c0c0, 100);
+	    drag_area_mc.beginFill(0xff0000, 0);
+	    drag_area_mc.moveTo(0, 0);
+	    drag_area_mc.lineTo(w, 0);
+	    drag_area_mc.lineTo(w, h);
+	    drag_area_mc.lineTo(0, h);
+	    drag_area_mc.endFill();
+	    
+	    redrawSensitiveAreas(w, h, SENSITIVE_AREA);
+	    repositionSensitiveAreas(w, h);
+    }
+    
+    public function updateSensitiveAreas(maxW:Number, maxH:Number)
+    {
+        /*
+        var dx = _width - FlashvarManager.get("crop_w");
+        var dy = _height - FlashvarManager.get("crop_h");
+        var dxMax = maxW - FlashvarManager.get("crop_w");
+        var dyMax = maxH - FlashvarManager.get("crop_h");
+        var scaleX = 1 - dx / dxMax;
+        var scaleY = 1 - dy / dxMax;
+        */
+        //redrawSensitiveAreas(maxW, maxH, SENSITIVE_AREA);
+	    //redrawSensitiveAreas(_width, _height, SENSITIVE_AREA);
+	    //repositionSensitiveAreas(_width, _height);
+    }
+    
+    private function redrawSensitiveAreas(w:Number, h:Number, size:Number)
+    {
+        if (!FlashvarManager.get("keepAspectRatio"))
+        {
+    	    drawRectangle(line_left_mc, 0, 0, size, h);
+    	    drawRectangle(line_right_mc, 0, 0, size, h);
+    	    drawRectangle(line_top_mc, 0, 0, w, size);
+    	    drawRectangle(line_bottom_mc, 0, 0, w, size);
+        }
+
+        drawRectangle(corner_LT, 0, 0, 2*size, 2*size);
+        drawRectangle(corner_RT, 0, 0, 2*size, 2*size);
+        drawRectangle(corner_LB, 0, 0, 2*size, 2*size);
+        drawRectangle(corner_RB, 0, 0, 2*size, 2*size);
+    }
+    
+    private function repositionSensitiveAreas(w:Number, h:Number)
+    {
+        if (!FlashvarManager.get("keepAspectRatio"))
+        {
+            line_left_mc._x = 0;
+            line_left_mc._y = 0;
+
+            line_right_mc._x = w - line_right_mc._width;
+            line_right_mc._y = 0;
+
+            line_top_mc._x = 0;
+            line_top_mc._y = 0;
+
+            line_bottom_mc._x = 0;
+            line_bottom_mc._y = h - line_bottom_mc._height;
+        }
+
+        corner_LT._x = 0;
+        corner_LT._y = 0;
+        
+        corner_RT._x = w - corner_RT._width;
+        corner_RT._y = 0;
+        
+        corner_LB._x = 0;
+        corner_LB._y = h - corner_LB._height;
+        
+        corner_RB._x = w - corner_RB._width;
+        corner_RB._y = h - corner_RB._height;
+    }
+    
+    private function drawRectangle(mc:MovieClip, x:Number, y:Number, w:Number, h:Number)
+    {
+	    mc._x = x;
+	    mc._y = y;
+	    mc.clear();
+	    mc.beginFill(0x0000ff, 100)
+	    mc.moveTo(0, 0);
+	    mc.lineTo(w, 0);
+	    mc.lineTo(w, h);
+	    mc.lineTo(0, h);
+	    mc.endFill();
+    }
+    
+    // event listeners --------------------------------------------------------------
+    
+    function onDragAreaRollOver(area:MovieClip)
+    {
+        current_pointer_mc = _level0.imagetool_mc.mousepointer_mc.pointer_drag_mc;
+        onEnterFrame();
+        Mouse.hide();
+        current_pointer_mc._visible = true;
+    }
+    
+    function onDragAreaRollOut(area:MovieClip)
+    {
+        current_pointer_mc._visible = false;
+        current_pointer_mc = null;
+        Mouse.show();
+    }
+    
+    function onDragAreaPress(area:MovieClip)
+    {
+        var ei:EventInfo = new EventInfo(this, "onViewportPress");
+        broadcastEvent(ei);
+    }
+    
+    function onDragAreaRelease(area:MovieClip)
+    {
+        var ei:EventInfo = new EventInfo(this, "onViewportRelease");
+        broadcastEvent(ei);
+    }
+    
+    function onLineRollOver(line_mc:MovieClip)
+    {
+        current_pointer_mc = _level0.imagetool_mc.mousepointer_mc.pointer_line_mc;
+        onEnterFrame();
+        Mouse.hide();
+        current_pointer_mc._rotation = linePointerDegrees[line_mc.line] + _parent._rotation;
+        current_pointer_mc._visible = true;
+    }
+    
+    function onLineRollOut(line:MovieClip)
+    {
+        current_pointer_mc._visible = false;
+        current_pointer_mc = null;
+        Mouse.show();
+    }
+    
+    function onLinePress(line_mc:MovieClip)
+    {
+        var ei:EventInfo = new EventInfo(this, "onLinePress");
+        ei.setInfo("line", line_mc.line);
+
+        switch(line_mc.line)
+        {
+            case "L":
+                ei.setInfo("offsetX", line_mc._xmouse);
+                ei.setInfo("offsetY", 0);
+                break;
+                
+            case "R":
+                ei.setInfo("offsetX", -(line_mc._width - line_mc._xmouse));
+                ei.setInfo("offsetY", 0);
+                break;
+                
+            case "T":
+                ei.setInfo("offsetX", 0);
+                ei.setInfo("offsetY", line_mc._ymouse);
+                break;
+                
+            case "B":
+                ei.setInfo("offsetX", 0);
+                ei.setInfo("offsetY", -(line_mc._height - line_mc._ymouse));
+                break;
+        }        
+
+        broadcastEvent(ei);
+    }
+    
+    function onLineRelease(line_mc:MovieClip)
+    {
+        if (!line_mc.hitTest(_level0._xmouse, _level0._ymouse, true))
+            onLineRollOut();
+            
+        var ei:EventInfo = new EventInfo(this, "onLineRelease");
+        broadcastEvent(ei);
+    }
+    
+    function onCornerRollOver(corner_mc:MovieClip)
+    {
+        current_pointer_mc = _level0.imagetool_mc.mousepointer_mc.pointer_corner_mc;
+        onEnterFrame();
+        Mouse.hide();
+        current_pointer_mc._rotation = cornerPointerDegrees[corner_mc.corner] + _parent._rotation;
+        current_pointer_mc._visible = true;
+    }
+    
+    function onCornerRollOut(line:MovieClip)
+    {
+        current_pointer_mc._visible = false;
+        current_pointer_mc = null;
+        Mouse.show();
+    }
+    
+    function onCornerPress(corner_mc:MovieClip)
+    {
+        var ei:EventInfo = new EventInfo(this, "onCornerPress");
+        ei.setInfo("corner", corner_mc.corner);
+        
+        switch(corner_mc.corner)
+        {
+            case "LT":
+                ei.setInfo("offsetX", corner_mc._xmouse);
+                ei.setInfo("offsetY", corner_mc._ymouse);
+                break;
+                
+            case "RT":
+                ei.setInfo("offsetX", -(corner_mc._width - corner_mc._xmouse));
+                ei.setInfo("offsetY", corner_mc._ymouse);
+                break;
+                
+            case "LB":
+                ei.setInfo("offsetX", corner_mc._xmouse);
+                ei.setInfo("offsetY", -(corner_mc._height - corner_mc._ymouse));
+                break;
+                
+            case "RB":
+                ei.setInfo("offsetX", -(corner_mc._width - corner_mc._xmouse));
+                ei.setInfo("offsetY", -(corner_mc._height - corner_mc._ymouse));
+                break;
+        }
+        
+        broadcastEvent(ei);
+    }
+    
+    function onCornerRelease(corner_mc:MovieClip)
+    {
+        if (!corner_mc.hitTest(_level0._xmouse, _level0._ymouse, true))
+            onCornerRollOut();
+            
+        var ei:EventInfo = new EventInfo(this, "onCornerRelease");
+        broadcastEvent(ei);
+    }
+    
+    function onEnterFrame()
+    {
+        if (current_pointer_mc)
+        {
+            //Mouse.hide();
+            current_pointer_mc._x = _level0._xmouse;
+            current_pointer_mc._y = _level0._ymouse;
+        }
+        else
+        {
+            /*
+            if (this.hitTest(_level0._xmouse, _level0._ymouse, true))
+                Mouse.hide();
+            else
+                Mouse.show();
+            */
+        }
+            
+    }
+    
+    public function onParentResize(w:Number, h:Number)
+    {
+
+    }
+    
+    // helpers ----------------------------------------------------------------------------
+    
+    private function initDragArea(area_mc:MovieClip)
+    {
+        area_mc.useHandCursor = false;
+        area_mc.onRollOver = function() { _parent.onDragAreaRollOver(this); }
+        area_mc.onRollOut = function() { _parent.onDragAreaRollOut(this); }
+        area_mc.onPress = function() { _parent.onDragAreaPress(this); }
+        area_mc.onRelease = area_mc.onReleaseOutside = function() { _parent.onDragAreaRelease(this); }
+    }
+    
+    private function initLine(line_mc:MovieClip, line:String)
+    {
+        line_mc.line = line;
+        line_mc._alpha = 0;
+        line_mc.useHandCursor = false;
+	    line_mc.onRollOver = function() { _parent.onLineRollOver(this); }
+	    line_mc.onRollOut = function() { _parent.onLineRollOut(this); }
+        line_mc.onPress = function() { _parent.onLinePress(this); }
+        line_mc.onRelease = line_mc.onReleaseOutside = function() { _parent.onLineRelease(this); }
+    }
+    
+    private function initCorner(corner_mc:MovieClip, corner:String)
+    {
+        corner_mc.corner = corner;
+        corner_mc._alpha = 0;
+        corner_mc.useHandCursor = false;
+	    corner_mc.onRollOver = function() { _parent.onCornerRollOver(this); }
+	    corner_mc.onRollOut = function() { _parent.onCornerRollOut(this); }
+        corner_mc.onPress = function() { _parent.onCornerPress(this); }
+        corner_mc.onRelease = corner_mc.onReleaseOutside = function() { _parent.onCornerRelease(this); }
+    }
+}

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/Component.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/Component.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/Component.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,60 @@
+import z3c.reference.imagetool.core.*;
+
+class z3c.reference.imagetool.core.Component extends MovieClip implements z3c.reference.imagetool.core.IFEventBroadcaster {
+	
+	private var log_txt:TextField;
+	private var _bc:EventBroadcaster;
+	
+	function Component() {
+		super();
+		_bc=new EventBroadcaster();
+	}
+	
+	/**
+        very simple log
+    */
+    private function log(msg, param2:Object, param3:Object):Void{
+        
+        //write into log_txt
+		_root.log_txt.text+=msg+"\n";
+        _root.log_txt.scroll = _root.log_txt.maxscroll;
+		
+        //clear the console on maxlength
+        //if (_root.log_txt.maxscroll > 100) _root.log_txt.text="";
+                        
+		//trace it
+		trace(msg)
+		
+		//pass it to the external alcon debug consol
+		net.hiddenresource.util.debug.Debug.trace(msg, param2, param3);
+    }
+
+	private function alert(msg:Object):Void {
+		
+		getURL("JavaScript:alert('"+String(msg)+"');");
+		
+	}
+	
+	/** 
+		event handling
+	*/
+	public function addListener(obj:Object,e:String):Void {
+		_bc.addListener(obj, e);
+	}
+	public function removeListener(obj:Object,e:String):Void {
+		_bc.removeListener(obj, e);
+	}
+	public function broadcastEvent(eventInfo:z3c.reference.imagetool.core.EventInfo):Void {
+		_bc.broadcastEvent(eventInfo);
+	}
+	
+	/**
+		use this method for debugging only
+	*/
+	public function getListeners():Array{
+		return _bc.getListeners();
+	}
+    
+    
+	
+}
\ No newline at end of file

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/EventBroadcaster.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/EventBroadcaster.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/EventBroadcaster.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,76 @@
+import z3c.reference.imagetool.core.EventInfo;
+
+class z3c.reference.imagetool.core.EventBroadcaster
+{
+	public var _listeners:Array;
+    
+	public function EventBroadcaster() {
+
+		_listeners = new Array();
+	}
+
+	public function addListener(obj:Object,e:String):Void {
+		
+		var l = {target:obj, event:e};
+		
+		for (var i in _listeners) {
+			if (_listeners[i].target == l.target &&
+				_listeners[i].event == l.event) {
+					// this listener is allready registered
+					return;	
+			}
+		}
+		
+		_listeners.push(l);
+	}
+	
+	public function removeListener(obj:Object,e:String):Void {
+		
+		var l = {target:obj, event:e};
+		for (var i in _listeners) {
+			if (_listeners[i].target == l.target &&
+				_listeners[i].event == l.event) _listeners.splice(Number(i),1);
+		}
+	}
+	
+	public function clearListener(Void):Void {
+		_listeners = new Array();
+	}
+	
+	public function broadcastEvent(eventInfo:EventInfo) {
+		for (var i in _listeners) {
+			
+			if (_listeners[i].event == eventInfo.getEvent() ||
+				_listeners[i].event == null) {
+				
+				_listeners[i].target[eventInfo.getEvent()].call(_listeners[i].target,eventInfo)
+			}
+		}
+	}   
+	
+	/**
+		use this method for debugging only
+	*/
+	public function getListeners():Array{
+		return _listeners;
+	}
+	
+	/**
+        very simple log
+    */
+    private function log(msg, param2:Object, param3:Object):Void{
+        
+        //write into log_txt
+		_root.log_txt.text+=msg+"\n";
+        _root.log_txt.scroll = _root.log_txt.maxscroll;
+		
+        //clear the console on maxlength
+        //if (_root.log_txt.maxscroll > 100) _root.log_txt.text="";
+                        
+		//trace it
+		trace(msg)
+		
+		//pass it to the external alcon debug consol
+		net.hiddenresource.util.debug.Debug.trace(msg, param2, param3);
+    }
+}
\ No newline at end of file

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/EventInfo.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/EventInfo.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/EventInfo.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,39 @@
+
+
+class z3c.reference.imagetool.core.EventInfo {
+	
+	private var broadcaster:Object;
+	private var event:String
+	private var info:Object;
+
+	public function EventInfo(bc:Object,eventName:String) {
+		broadcaster = bc;
+		event = eventName;
+		info = new Object();
+	}
+	
+    /**
+        @return a pointer to the object which has fired 
+        the event. there is no type-specification of the 
+        broadcaster, because it can be of any type.
+    */
+	public function getBroadcaster(Void){
+		return broadcaster;
+	}
+	
+	public function getEvent(Void):String {
+		return event;
+	}
+	
+	public function setEvent(val:String):Void {
+		event=val;
+	}
+	
+	public function setInfo(key:String,info_obj):Void {
+		info[key] = info_obj;
+	}
+	
+	public function getInfo(key:String) {
+		return info[key];
+	}
+}
\ No newline at end of file

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/FlashvarManager.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/FlashvarManager.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/FlashvarManager.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,82 @@
+/*
+ *  FlashvarManager.as
+ *
+ *  Manager for flashvars, use this instead of _level0.xxx to access a flashvar.
+ *  Call oneTimeInit at the beginning of your application, the manager collects
+ *  all variables on _level0, copies them to a object, decodes strings ('+' and '=')
+ *  and parses numbers correctly...
+ *
+ *  @author <gerold.boehler at lovelysystems.com>
+ *
+ */
+ 
+class z3c.reference.imagetool.core.FlashvarManager extends z3c.reference.imagetool.core.EventBroadcaster
+{
+	private static var _instance:z3c.reference.imagetool.core.FlashvarManager;
+	private var flashVars:Object;
+	
+	
+	function FlashvarManager()
+	{
+		flashVars = new Object();
+	}
+	
+	public static function oneTimeInit():Void
+	{
+	    for (var flashvar in _level0)
+	    {
+	        if (flashvar.indexOf("$") == 0)
+	            continue;
+
+	        getInstance().setVar(flashvar, decodeForFlash(_level0[flashvar]));
+	        delete _level0[flashvar];
+	    }
+	}
+	
+	private static function decodeForFlash(str:String)
+	{
+	    if (!isNaN(parseFloat(str)))
+	        return parseFloat(str);
+	        
+	    if (typeof(str) == "boolean")
+	        return str;
+
+        if (str == "true" || str == "false")
+            return str == "true";
+
+		str = str.split("[p]").join("+");
+		str = str.split("[e]").join("=");
+
+		return str;
+    }
+	
+	private function getVar(name:String):String
+	{
+		if (flashVars[name])
+			return flashVars[name];
+			
+		return undefined;
+	}
+	
+	private function setVar(name:String, value:String):Void
+	{
+	    flashVars[name] = value;
+	    trace("SETTING: " + name + " " + value)
+	}
+
+	public static function get(name:String)
+	{
+	    if (!getInstance().getVar(name)) {
+	        //getInstance().log("!ERROR! Flashvar " + name + " not found!");
+	    }
+	    return getInstance().getVar(name);
+	}
+	
+	public static function getInstance():FlashvarManager
+	{
+		if (!_instance) 
+			_instance = new FlashvarManager();
+			
+		return _instance;
+	}	
+}
\ No newline at end of file

Added: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/IFEventBroadcaster.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/IFEventBroadcaster.as	                        (rev 0)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/IFEventBroadcaster.as	2007-09-04 15:37:44 UTC (rev 79461)
@@ -0,0 +1,8 @@
+
+interface z3c.reference.imagetool.core.IFEventBroadcaster{
+	
+	public function addListener(obj:Object,e:String):Void;
+	public function removeListener(obj:Object,e:String):Void;
+	public function broadcastEvent(eventInfo:z3c.reference.imagetool.core.EventInfo):Void;
+
+}
\ No newline at end of file

Deleted: z3c.reference/branches/flash/src/z3c/reference/demo/browser/addref.pt
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/demo/browser/addref.pt	2007-09-04 13:52:00 UTC (rev 79460)
+++ z3c.reference/branches/flash/src/z3c/reference/demo/browser/addref.pt	2007-09-04 15:37:44 UTC (rev 79461)
@@ -1,122 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:i18n="http://namespaces.zope.org/i18n"
-      xml:lang="en" lang="en">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <title>demo picker</title>
-    <style type="text/css">
-      div {
-        padding: 10px;
-        margin: 5px;
-        border: 1px solid #000;
-      }
-
-      div.actions {
-        clear: both;
-        border-width: 0px;
-      }
-    </style>
-    <script src="jquery"
-            type="text/javascript"
-            tal:attributes="src context/++resource++jquery.js">
-    </script>
-    <script type="text/javascript"
-            tal:content="string:
-             function loadFlash() {
-               var url='${context/++resource++imagetool.swf}';
-               var img='${context/++resource++img.jpg}';
-               url = url + '?url=' + img;
-               var so = new SWFObject(url, 'image-tool', '100%', '300px', '8', 0x000000);
-               so.addParam('allowScriptAccess', 'sameDomain');
-               so.addParam('movie', url);
-               so.addParam('quality', 'high');
-               so.addVariable('crop_x', '100');
-               so.addVariable('crop_y', '100');
-               so.addVariable('crop_w', '100');
-               so.addVariable('crop_h', '100');
-               so.addVariable('original_w', '600');
-               so.addVariable('original_h', '400');
-               so.addVariable('zoomfactor', '0.33');
-               so.addVariable('rotation', '90');
-               var ok = so.write('flash-target');
-             }
-             ">
-    </script>
-    <script type="text/javascript">
-      $(document).ready(loadFlash);
-
-      // user selects an item
-      function setIntId(uid) {
-        // reset values
-        $("textarea").val("");
-        $("input[@type=text]").val("");
-        // set iniid of selected item
-        $("input[@name=intid]").val(uid);
-        // highlight selected item
-        $("a").attr("style", "");
-        $("a[@href*=" + uid + "]").attr("style","background-color: red");
-        // show divs
-        $("div.properties").show();
-        $("div.actions").show();
-        $("div.image-tool").show();
-      }
-
-      
-      $(document).ready(function(){
-        // pressed submit button
-        // return selected item to parent and close popup
-        $("input[@type=submit]").click(function() {
-          var intid = $("input[@name=intid]").val();
-          window.opener.setIntId(intid);
-          window.close();
-        });
-
-        // expand window size
-        $("a").click(function() {
-
-        });
-      });
-    </script>
-  </head>
-  <body>
-    <form>
-      <div class="picker">
-        <b>Target:</b><br />
-        <tal:block repeat="item view/items">
-          <a href="#"
-             tal:attributes="href string:JavaScript:setIntId(${item/uid})">
-            <span tal:replace="item/name" />
-          </a>
-          <br />
-        </tal:block>
-        <input name="intid" type="text" value="None" />
-      </div>
-      <div class="properties" style="display:none;">
-        <b>Properties:</b><br />
-        <label for="title">Title</label>
-        <input id="title" name="title" type="text"  /><br />
-        <label for="description">Decsprition</label>
-        <textarea id="description" name="description"
-                  cols="20" rows="10"
-                  >abcd</textarea>
-      </div>
-      <div class="image-tool" style="display:none;">
-        <!--div style="display:none;">
-          <ul>
-            <li><a href="javascript:zoom(1)">zoom in</a></li>
-            <li><a href="javascript:zoom(-1)">zoom out</a></li>
-            <li><a href="javascript:rotate(1)">rotate right</li>
-            <li><a href="javascript:rotate(-1)">rotate left</li>
-            <li><a href="javascript:save()">save</a></li>
-          </ul>    
-        </div-->
-        <div id="flash-target">
-        </div>
-      </div>
-      <div class="actions" style="display:none;">
-        <input type="submit" value="add reference" />
-      </div>
-    </form>
-  </body>
-</html>
\ No newline at end of file

Modified: z3c.reference/branches/flash/src/z3c/reference/demo/browser/picker.pt
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/demo/browser/picker.pt	2007-09-04 13:52:00 UTC (rev 79460)
+++ z3c.reference/branches/flash/src/z3c/reference/demo/browser/picker.pt	2007-09-04 15:37:44 UTC (rev 79461)
@@ -82,7 +82,7 @@
                var url='${context/++resource++imagetool.swf}';
                var img='${context/++resource++img.jpg}';
                url = url + '?url=' + img;
-               var so = new SWFObject(url, 'image-tool', '100%', '490px', '8', 0x000000);
+               var so = new SWFObject(url, 'image-tool', '100%', '490px', '8', '#FFFFFF');
                so.addParam('allowScriptAccess', 'sameDomain');
                so.addParam('movie', url);
                so.addParam('quality', 'high');
@@ -90,10 +90,10 @@
                so.addVariable('crop_y', '100');
                so.addVariable('crop_w', '100');
                so.addVariable('crop_h', '100');
-               so.addVariable('original_w', '600');
-               so.addVariable('original_h', '400');
+               //so.addVariable('original_w', '600');
+               //so.addVariable('original_h', '400');
                so.addVariable('zoomfactor', '0.33');
-               so.addVariable('rotation', '90');
+               so.addVariable('rotation', '0');
                var ok = so.write('flash-target');
              }
              ">

Modified: z3c.reference/branches/flash/src/z3c/reference/demo/browser/swf/imagetool.swf
===================================================================
(Binary files differ)



More information about the Checkins mailing list