<?xml version="1.0"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
      contributor license agreements.  See the NOTICE file distributed with
      this work for additional information regarding copyright ownership.
      The ASF licenses this file to You under the Apache License, Version 2.0
      (the "License"); you may not use this file except in compliance with
      the License.  You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
  -->

<!-- printing\ADGPrint.mxml -->
<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx"
				paddingBottom="0" paddingTop="0" paddingLeft="0" paddingRight="0"
				height="100%" width="100%">

     <fx:Script>
        <![CDATA[
            import mx.printing.*;
            import mx.collections.ArrayCollection;
            import mx.printing.PrintAdvancedDataGrid;
                    
            // Create a PrintJob instance.
            private function doPrint():void {
                // Create an instance of the FlexPrintJob class.
                var printJob:FlexPrintJob = new FlexPrintJob();
                
                // Initialize the PrintAdvancedDataGrid control.
                var printADG:PrintAdvancedDataGrid = 
                    new PrintAdvancedDataGrid();
                // Exclude the PrintAdvancedDataGrid control from layout.
                printADG.includeInLayout = false;
                printADG.source = adg;

                // Add the print-specific control to the application.                
                addChild(printADG);
                
                // Start the print job.
                if (printJob.start() == false) {                
                    // User cancelled print job.
                    // Remove the print-specific control to free memory.                
                    removeChild(printADG);
                    return;
                }

                // Add the object to print. Do not scale it.
                printJob.addObject(printADG, FlexPrintJobScaleType.NONE);

                // Send the job to the printer.
                printJob.send();

                // Remove the print-specific control to free memory.                
                removeChild(printADG);
            }
            
            [Bindable]
            private var dpHierarchy:ArrayCollection = new ArrayCollection([
              {Region:"Southwest", children: [
                 {Region:"Arizona", children: [ 
                    {Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000}, 
                    {Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000}]},  
                 {Region:"Central California", children: [ 
                    {Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000}]},  
                 {Region:"Nevada", children: [ 
                    {Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000}]},  
                 {Region:"Northern California", children: [ 
                    {Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000}, 
                    {Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000}]},  
                 {Region:"Southern California", children: [ 
                    {Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000}, 
                    {Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}]}
              ]}
            ]);
            
        ]]>
    </fx:Script>

    <mx:Panel title="PrintAdvancedDataGrid Control Example"
			  paddingBottom="10" paddingTop="10" paddingLeft="10" paddingRight="10"
			  height="100%" width="100%">

        <mx:AdvancedDataGrid id="adg"
            width="100%" height="100%">
            <mx:dataProvider>
                <mx:HierarchicalData source="{dpHierarchy}"/>
            </mx:dataProvider>
            <mx:columns>
                <mx:AdvancedDataGridColumn dataField="Region"/>
                <mx:AdvancedDataGridColumn dataField="Territory_Rep"
                    headerText="Territory Rep"/>
                <mx:AdvancedDataGridColumn dataField="Actual"/>
                <mx:AdvancedDataGridColumn dataField="Estimate"/>
            </mx:columns>
        </mx:AdvancedDataGrid>    

        <mx:Button id="myButton" 
            label="Print" 
            click="doPrint()"/>
    </mx:Panel>    
</mx:Module>
