欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Flex 4 打印预览

程序员文章站 2022-05-05 16:14:38
...
<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
				   xmlns:s="library://ns.adobe.com/flex/spark" 
				   xmlns:mx="library://ns.adobe.com/flex/mx"  
				   xmlns:parsley="http://www.spicefactory.org/parsley"
				  
				   close="titlewindow1_closeHandler(event)" 
				   height="{FlexGlobals.topLevelApplication.height - 100}"
				   width="100%"
				   
	
	<fx:Declarations> 
	</fx:Declarations>
	
	<fx:Script>
		<![CDATA[
			
			
			import mx.containers.Canvas;
			import mx.controls.Alert;
			import mx.core.FlexGlobals;
			import mx.core.IUIComponent;
			import mx.core.IVisualElement;
			import mx.events.CloseEvent;
			import mx.events.FlexEvent;
			import mx.managers.PopUpManager;
			import mx.printing.*;
			import mx.utils.ObjectUtil;
			
			import spark.components.List;
			[Bindable] public var racingModel : RacingModel;
			[Bindable] public var racingSearchPM : RacingSearchPM;
			[Bindable] public var raceGridHeight : int;
			[Bindable] public var greyHoundGridHeight : int;
			[Bindable] public var harnessGridHeight : int;
			public static const DEFAULT_GRID_HEIGHT:int = 100;
			public static const CLOSE_POPUP:String = "closePopup";
			private var _toBePrintData:IUIComponent;
			private var _printMulipleData:IUIComponent;
			private var printDataParent:DisplayObjectContainer;
			
			[Bindable]public var printScrollContent:Boolean=false;
			[Bindable]public var dateDisplayString:String;
			[Bindable]public var printTitle:String;
			[Bindable]public var jurisdictionID : int;
			
			private var sortedSizeWidth:Number;
			private var sortedSizeHeight:Number;
			
			/**
			 * 
			 * Function to remove Popup
			 * 
			 */
			public function onClickClose(event : MouseEvent = null) : void
			{
				this.dispatchEvent(new Event(CLOSE_POPUP));
				PopUpManager.removePopUp(this);
			}
			
			protected function imageLogo_ioErrorHandler(event:IOErrorEvent):void
			{
				// TODO Auto-generated method stub
				imageLogo.visible = false;
			}
			
			public function printInfo(event : MouseEvent = null):void
			{
				var printReceipt:PrintUtil = new PrintUtil();
				printReceipt.printComponentToScaledWidth(printThisComponent);
			}
			
			/**
			 *  Set functioin of ' toBePrintData '
			 */
			public function set toBePrintData(component:IUIComponent):void
			{
				if(component != null)
				{
					this._toBePrintData = component;
					if(!printScrollContent)
					{
						takeSnapshot(toBePrintData);
					}
					else
					{
						flattenVScrollbarAndTakeSnap(toBePrintData);
					}
				}
				else
					Alert.show("Print data is not available.");
			}
			
			private function flattenVScrollbarAndTakeSnap(component:IUIComponent):void
			{
				saveAndChangePrintObjectSize(component);
				component.addEventListener(FlexEvent.UPDATE_COMPLETE, takeSnapshopAfterUpdated);
			}
			
			private function takeSnapshopAfterUpdated(event:FlexEvent):void
			{
				var component:IUIComponent = event.target as IUIComponent;
				try
				{
					takeSnapshot(component);
				}
				catch(e:*)
				{
					Alert.show("Print data error!");
					onClickClose();
				}
				finally
				{
					component.removeEventListener(FlexEvent.UPDATE_COMPLETE, takeSnapshopAfterUpdated);
					restorePrintObjectSize(component);
				}
			}
			
			private function saveAndChangePrintObjectSize(component:IUIComponent):void
			{
				sortedSizeWidth = component.width;
				sortedSizeHeight = component.height;
				
				var contentWidth:Number;
				var contentHeight:Number;
				if(component is List)
				{
					contentWidth =  component.measuredWidth;
					contentHeight = (component as List).scroller.viewport.contentHeight;
				}else{
					contentWidth = component.measuredWidth;
					contentHeight = component.measuredHeight;
				}
				
				component.setActualSize(contentWidth, contentHeight);
			}
			
			private function restorePrintObjectSize(component:IUIComponent):void
			{
				component.setActualSize(sortedSizeWidth, sortedSizeHeight)
			}
			
			//take snapshot for a component.
			private function takeSnapshot(component:IUIComponent):void
			{
				var bmpData:BitmapData;
				var bmp:Bitmap;
				var uIcom:Canvas;
				
				bmpData = new BitmapData(component.width, component.height);					
				bmpData.draw(component);
				
				bmp = new Bitmap(bmpData);
				uIcom = new Canvas();
				
				uIcom.rawChildren.addChild(bmp);
				
				/*
				*	TODO : rather simply assigning dimensions - check for compatibility with Paper Size, too 
				*/
				uIcom.width = bmp.width;
				uIcom.height = bmp.height;
				
				printThisComponent.addElement(uIcom as IVisualElement);	
			}
			
			/**
			 *  Get functioin of ' toBePrintData '
			 */
			public function get toBePrintData():IUIComponent
			{
				return _toBePrintData;
			}
			
			public function toBePrintMulipleData(arrComponents:Array):void
			{
				var bmpData:BitmapData;
				var bmp:Bitmap;
				var uIcom:Canvas;
				
				if(arrComponents != null || arrComponents.length >= 1)	
				{		// to add multiple component
					var i : int;
					for ( i = 0; i < arrComponents.length; i++)
					{
						this._printMulipleData = arrComponents[i] as IUIComponent;
						bmpData = new BitmapData(_printMulipleData.width, _printMulipleData.height);					
						bmpData.draw(_printMulipleData);
						
						bmp = new Bitmap(bmpData);
						uIcom = new Canvas();
						
						uIcom.rawChildren.addChild(bmp);
						
						/*
						*	TODO : rather simply assigning dimensions - check for compatibility with Paper Size, too 
						*/
						uIcom.width = bmp.width;
						uIcom.height = bmp.height;
						
						printThisComponent.addElement(uIcom as IVisualElement);
					}
				}
				else
					Alert.show("Print data is not available.");
			}
			
			protected function titlewindow1_closeHandler(event:CloseEvent):void
			{
				// TODO Auto-generated method stub
				printThisComponent.removeAllElements();
				this.removeEventListener(CloseEvent.CLOSE, titlewindow1_closeHandler);
				PopUpManager.removePopUp(this);
			}
			
			protected function onPrintHolderUpdateComplete(event:FlexEvent):void
			{
				
			}

		]]>
	</fx:Script>
	
	<s:HGroup width="100%" top="10" horizontalAlign="right" paddingRight="20">
		<s:Button label="Print" buttonMode="true" 
				  
				  toolTip="Print"/>
	</s:HGroup>
	<s:Scroller width="100%" height="100%" top="35" verticalScrollPolicy="on" horizontalScrollPolicy="off">
		<s:VGroup width="100%" horizontalAlign="center" 
				  paddingLeft="10" 
				  paddingRight="10"
				  paddingTop="10"
				  paddingBottom="10">
			<s:VGroup id="printThisComponent" width="100%" height="100%" paddingBottom="20"
					  top="90" updateComplete="onPrintHolderUpdateComplete(event)"
					  verticalAlign="top">
				<s:HGroup horizontalAlign="left" paddingLeft="30" verticalAlign="middle">
					<mx:Image id="imageLogo" source="{resourceManager.getString(ConfigEnum.NEO_APP_CONFIGURATION_BUNDLE, 'accountmanagement.createaccount.nswjurisdiction.logo')}"
							  height="34"
							  visible="{jurisdictionID==ConfigEnum.JURISDICTION_NSW}" includeInLayout="{jurisdictionID==ConfigEnum.JURISDICTION_NSW}"/>
					<mx:Image id="imageLogovic" source="{resourceManager.getString(ConfigEnum.NEO_APP_CONFIGURATION_BUNDLE, 'accountmanagement.createaccount.vicjurisdiction.logo')}"
							  height="34"
							  visible="{jurisdictionID==ConfigEnum.JURISDICTION_VIC}" includeInLayout="{jurisdictionID==ConfigEnum.JURISDICTION_VIC}"/>
					<mx:Spacer width="100%" />
				</s:HGroup>
				
				<s:VGroup width="100%" includeInLayout="{printScrollContent}" gap="0">
					<s:SkinnableContainer width="100%"
										  height="35"
										  
						<s:Label text="{printTitle}" 
								 styleName="largeSectionHeading"
								 left="10"
								 verticalCenter="0"/> 
					</s:SkinnableContainer>
					<s:Label text="{dateDisplayString}" height="50" verticalAlign="middle" width="100%" fontSize="14" fontWeight="bold" color="#000000"/>
				</s:VGroup>
				
			</s:VGroup>	
		</s:VGroup>
	</s:Scroller>
</s:TitleWindow>	

 打印按钮触发的事件函数

 

public function print(obj:UIComponent, printForScorllContent:Boolean=false):void
		{
			if (printPreviewPopUp)
			{
				PopUpManager.removePopUp(printPreviewPopUp);
			}
			printPreviewPopUp = new PrintPreviewPopUp();
			printPreviewPopUp.printScrollContent = printForScorllContent;
			if(printForScorllContent)
			{
				printPreviewPopUp.printTitle = headerLabel;
				printPreviewPopUp.dateDisplayString = dateDisplayString;
			}
			printPreviewPopUp.jurisdictionID =  applicationModel.getJurisdictionId();
			PopUpManager.addPopUp(printPreviewPopUp as IFlexDisplayObject, FlexGlobals.topLevelApplication as DisplayObject, true);
			
			if(obj.height>0 && obj.width>0)
			{
				isPrinting = true;
				printPreviewPopUp.toBePrintData = obj;
				printPreviewPopUp.x = FlexGlobals.topLevelApplication.width/2 - obj.width/2;
				printPreviewPopUp.y = 50; 
				PopUpManager.bringToFront(printPreviewPopUp as IFlexDisplayObject );
				printPreviewPopUp.addEventListener(CloseEvent.CLOSE, onPrintPreviewPopupClosed);
			}
		}