diff -r 000000000000 -r 2f259fa3e83a commonuisupport/grid/src/GRDPRINT.CPP --- /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)); + }