--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commonuisupport/grid/src/GRDPRINT.CPP Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,156 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "GRDPRINT.H"
+
+EXPORT_C CGridPrinter::~CGridPrinter()
+/** Destructor.
+
+Frees resources before destruction of the object. */
+ {
+ delete iGridLay;
+ delete iGridImg;
+ delete iPrintLabelImg;
+ delete iPrintCellImg;
+ delete iZoomFactor;
+ }
+
+CGridPrinter::CGridPrinter(CGridLabelImg* aPrintLabelImg,CGridCellImg* aPrintCellImg,TZoomFactor* aZoomFactor)
+ : iPrintLabelImg(aPrintLabelImg),
+ iPrintCellImg(aPrintCellImg),
+ iZoomFactor(aZoomFactor),
+ iGraphicsDeviceMap(iZoomFactor->GraphicsDeviceMap())
+ {
+ }
+
+EXPORT_C CGridPrinter* CGridPrinter::NewL(CGridLay* aGridLay,CGridLabelImg* aPrintLabelImg,
+ CGridCellImg* aPrintCellImg,TZoomFactor* aZoomFactor)
+/** Creates a new grid printer object.
+
+@param aGridLay A pointer to an object that controls the layout of rows and
+columns.
+@param aPrintLabelImg A pointer to an object that draws a grid cell's label.
+@param aPrintCellImg A pointer to an object that draws the contents of a single
+cell.
+@param aZoomFactor A pointer to the zoom factor object.
+@see CGridLay::ConstructL() */
+ {
+ CGridPrinter* self=new(ELeave) CGridPrinter(aPrintLabelImg,aPrintCellImg,aZoomFactor);
+ CleanupStack::PushL(self);
+ self->ConstructL(aGridLay);
+ CleanupStack::Pop();
+ return self;
+ }
+
+void CGridPrinter::ConstructL(CGridLay* aGridLay)
+ {
+ iGridLay=new(ELeave) CGridLay(iZoomFactor);
+ iGridImg=CGridImg::NewL(iPrintCellImg,iGridLay);
+ iGridImg->SetGridLabelImg(iPrintLabelImg);
+ iGridLay->ConstructL(aGridLay,iGridImg);
+ }
+
+LOCAL_C void CleanupGridLabelImg(TAny* aObject)
+ {
+ ((CGridLabelImg*)aObject)->ReleaseFont();
+ ((CGridLabelImg*)aObject)->SetGraphicsDeviceMap(NULL);
+ }
+
+EXPORT_C void CGridPrinter::PrintBandL(CGraphicsDevice* aDevice,TInt aPageNo,const TBandAttributes& aBandInPixels)
+/** Prints a band.
+
+The function implements MPageRegionPrinter::PrintBandL().
+
+@param aDevice Pointer to the graphics device representing the printer
+@param aPageNo The number of the page containing the band to be printed.
+@param aBandInPixels Attributes of the band to be printed. */
+ {
+ if (aBandInPixels.iFirstBandOnPage)
+ {
+ TSize pageSize=iGridLay->PageSizeInTwips();
+ iPrintablePage.SetRect(iTlMarginInTwips,pageSize);
+ iZoomFactor->SetGraphicsDeviceMap(iGraphicsDeviceMap); // the real printing device
+ iPrintLabelImg->SetGraphicsDeviceMap(iZoomFactor);
+ iPrintLabelImg->NotifyGraphicsDeviceMapChangeL();
+ TRect printGridRect=iZoomFactor->TwipsToPixels(iPrintablePage);
+ printGridRect.iTl+=TPoint(1,1); //For border
+ iGridImg->SetPrintGridRect(printGridRect);
+ iPrintLabelImg->ReleaseFont();
+ TRangeRef pageRange=iGridLay->PageToRange(aPageNo,CGridLay::ERightThenDown/*!!For Now*/);
+ iGridLay->SetPrintRange(pageRange);
+ }
+ iZoomFactor->SetGraphicsDeviceMap(aDevice);
+ iPrintLabelImg->SetGraphicsDeviceMap(iZoomFactor);
+ iPrintLabelImg->NotifyGraphicsDeviceMapChangeL();
+ TRect printablePageInPixels=iZoomFactor->TwipsToPixels(iPrintablePage);
+ iScaleFactor=(iGridImg->GridRect().Height()*CGridImg::EScaleOneToOne-1)/printablePageInPixels.Height()+1;//Round up
+
+ TRect printRect=aBandInPixels.iRect;
+ if (!printRect.Intersects(printablePageInPixels))
+ return;
+ printRect.Intersection(printablePageInPixels);
+
+ TRangeRef printRange=iGridLay->VisibleRange();
+ printRange.iFrom.iRow=Max(printRange.iFrom.iRow,iGridLay->YValToRow(printRect.iTl.iY*iScaleFactor/CGridImg::EScaleOneToOne));
+ printRange.iTo.iRow=Min(printRange.iTo.iRow,iGridLay->YValToRow(printRect.iBr.iY*iScaleFactor/CGridImg::EScaleOneToOne));
+ CleanupStack::PushL(TCleanupItem(CleanupGridLabelImg,iPrintLabelImg));
+ CGraphicsContext* printerGc;
+ User::LeaveIfError(aDevice->CreateContext(printerGc));
+ CleanupStack::PushL(printerGc);
+ iGridImg->PrintGridLinesAndCellsInRangeL(printerGc,printRange,iScaleFactor);
+ CleanupStack::PopAndDestroy(2); // printerGc + CleanupGridLabelImg
+ }
+
+EXPORT_C void CGridPrinter::SetTopLeftMargin(const TPoint& aTlMarginInTwips)
+/** Sets the top left margin.
+
+@param aTlMarginInTwips The top left margin, in twips. */
+ {
+ iTlMarginInTwips=aTlMarginInTwips;
+ }
+
+EXPORT_C void CGridPrinter::SetPageSizeInTwipsL(const TSize& aSizeInTwips)
+/** Sets the size of the page.
+
+@param aSizeInTwips The size of the page, in twips. */
+ {
+ if (!iGridLay->IsAutoPagination())
+ {
+ iGridLay->SetPageSizeInTwipsL(aSizeInTwips); // won't leave
+ return;
+ }
+ SetGdMapAndPushLabelImgLC();
+ iGridLay->SetPageSizeInTwipsL(aSizeInTwips);
+ CleanupStack::PopAndDestroy(); // CleanupGridLabelImg
+ }
+
+EXPORT_C void CGridPrinter::PaginateL()
+/** Paginates the grid. */
+ {
+ if (iGridLay->IsPaginated())
+ return;
+ SetGdMapAndPushLabelImgLC();
+ iGridLay->PaginateL();
+ CleanupStack::PopAndDestroy(); // CleanupGridLabelImg
+ }
+
+void CGridPrinter::SetGdMapAndPushLabelImgLC()
+ {
+ iZoomFactor->SetGraphicsDeviceMap(iGraphicsDeviceMap); // re-paginate with the real printing device
+ iPrintLabelImg->SetGraphicsDeviceMap(iZoomFactor);
+ iPrintLabelImg->NotifyGraphicsDeviceMapChangeL();
+ iGridLay->SetGraphicsDeviceMap(iZoomFactor); // Pointer value is same but internal rep. may be different
+ CleanupStack::PushL(TCleanupItem(CleanupGridLabelImg,iPrintLabelImg));
+ }