package components { import components.printpreview.PrintElement; import flash.display.GradientType; import flash.display.SpreadMethod; import flash.geom.Matrix; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import mx.binding.utils.ChangeWatcher; import mx.collections.ArrayCollection; import mx.core.Application; import mx.core.UIComponent; import mx.events.CollectionEvent; public class PrintPreview extends UIComponent { public var elements:ArrayCollection; [Bindable] public var paperWidth:int; [Bindable] public var paperHeight:int; [Bindable] public var topMargin:int = 0; [Bindable] public var leftMargin:int = 0; [Bindable] public var bottomMargin:int = 0; [Bindable] public var rightMargin:int = 0; private var _landscape:Boolean = true; public function set landscape(_landscape:Boolean):void { this._landscape = _landscape; drawElements(); } public function PrintPreview() { super(); elements = new ArrayCollection(); elements.addEventListener(CollectionEvent.COLLECTION_CHANGE, function(event:CollectionEvent) : void { drawElements(); }); ChangeWatcher.watch(this, "paperWidth", function(event:Event) : void { drawElements(); }); ChangeWatcher.watch(this, "paperHeight", function(event:Event) : void { drawElements(); }); ChangeWatcher.watch(this, "topMargin", function(event:Event) : void { drawElements(); }); ChangeWatcher.watch(this, "leftMargin", function(event:Event) : void { drawElements(); }); ChangeWatcher.watch(this, "bottomMargin", function(event:Event) : void { drawElements(); }); ChangeWatcher.watch(this, "rightMargin", function(event:Event) : void { drawElements(); }); } private function drawElements():void { while(this.numChildren) { this.removeChildAt(0); } this.graphics.clear(); var previewWidth:Number = width; var previewHeight:Number = height var rWidth:Number; var rHeight:Number; var paperMarginWidth:Number = paperWidth - rightMargin - leftMargin; var paperMarginHeight:Number = paperHeight - topMargin - bottomMargin; if(_landscape) { previewHeight /= 1.41421356; paperMarginHeight = paperWidth - rightMargin - leftMargin; paperMarginWidth = paperHeight - topMargin - bottomMargin; rWidth = paperHeight / previewWidth; rHeight = paperWidth / previewHeight; } else { previewWidth /= 1.41421356; paperMarginWidth = paperWidth - rightMargin - leftMargin; paperMarginHeight = paperHeight - topMargin - bottomMargin; rWidth = paperWidth / previewWidth; rHeight = paperHeight / previewHeight; } var matr:Matrix = new Matrix(); matr.createGradientBox(10, 10, -45, 0, 0); this.graphics.beginGradientFill(GradientType.LINEAR, [0xa0a0a0, 0xffffff], [1, 1], [0x20, 0xff], matr, SpreadMethod.REFLECT); this.graphics.drawRect(0, 0, previewWidth, previewHeight); this.graphics.endFill(); if(rWidth != 0 && rHeight != 0) { var marginX:Number = leftMargin / rWidth; var marginY:Number = Math.round(topMargin / rHeight); var marginWidth:Number = previewWidth - marginX - rightMargin / rWidth; var marginHeight:Number = previewHeight - marginY - bottomMargin / rHeight; this.graphics.beginFill(0xffffff); this.graphics.lineStyle(1); this.graphics.drawRect(marginX, marginY, marginWidth, marginHeight); this.graphics.endFill(); var xOffset:Number = marginX; var yOffset:Number = marginY; var format:TextFormat = new TextFormat( Application.application.getStyle("fontFamily"), 10); for(var i:Number = 0; i < elements.length; i++) { var printElement:PrintElement = PrintElement(elements.getItemAt(i)); var eX:Number = printElement.x / rWidth; var eY:Number = printElement.y / rHeight; var eWidth:Number = printElement.width / rWidth; var eHeight:Number = printElement.height / rHeight; var eName:String = printElement.name; if(printElement.x < 0 || printElement.y < 0 || printElement.x > paperMarginWidth || printElement.y > paperMarginHeight || printElement.x + printElement.width < 0 || printElement.y + printElement.height < 0 || printElement.x + printElement.width > paperMarginWidth || printElement.y + printElement.height > paperMarginHeight) { this.graphics.beginFill(0xff0000, 0.2); } else { this.graphics.beginFill(0x000000, 0.2); } if(eX < 0) { eWidth -= eX; eX = 0; } if(eY < 0) { eHeight -= eY; eY = 0; } this.graphics.drawRect(xOffset + eX, yOffset + eY, eWidth, eHeight); this.graphics.endFill(); var textField:TextField = new TextField(); textField.autoSize = TextFieldAutoSize.LEFT; textField.selectable = false; textField.text = eName; textField.setTextFormat(format); textField.x = xOffset + eX + 1; textField.y = yOffset + eY + 1; if(textField.x < 0) { textField.x = 0; } if(textField.y < 0) { textField.y = 0; } addChild(textField); } } this.graphics.lineStyle(1); this.graphics.drawRect(0, 0, previewWidth, previewHeight); } protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { drawElements(); } } }