package components { import components.printpreview.PrintElement; import flash.display.GradientType; import flash.display.SpreadMethod; import flash.filters.GlowFilter; import flash.geom.Matrix; /*import flash.text.engine.ElementFormat; import flash.text.engine.FontDescription; import flash.text.engine.TextBlock; import flash.text.engine.TextElement; import flash.text.engine.TextLine;*/ import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFieldAutoSize; 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; 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(); createLabel(eName, xOffset + eX + 1, yOffset + eY + 1); } } this.graphics.lineStyle(1); this.graphics.drawRect(0, 0, previewWidth, previewHeight); } private function createLabel(text:String, x:Number, y:Number) : void { var format:TextFormat = new TextFormat( Application.application.getStyle("fontFamily"), 10); var textField:TextField = new TextField(); textField.autoSize = TextFieldAutoSize.LEFT; textField.selectable = false; textField.text = text; textField.setTextFormat(format); textField.x = x; textField.y = y; if(textField.x < 0) { textField.x = 0; } if(textField.y < 0) { textField.y = 0; } addChild(textField); /*var fd:FontDescription = new FontDescription(Application.application.getStyle("fontFamily"), "normal"); var ef:ElementFormat = new ElementFormat(fd); var te:TextElement = new TextElement(text, ef); var tb:TextBlock = new TextBlock(); tb.content = te; var tl:TextLine = tb.createTextLine(null, 200); tl.filters = [new GlowFilter(0xffffff, 1, 5, 5, 20)]; tl.x = x + 2; tl.y = y + 8; addChild(tl);*/ } protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { drawElements(); } } }