williamr@2: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #ifndef __FRMPAGE_H__ williamr@2: #define __FRMPAGE_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: class MLayDoc; williamr@2: class CTextLayout; williamr@2: class CParaFormat; williamr@2: williamr@2: // williamr@2: // The following two classes are for internal use only williamr@2: // williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: struct TPageLine williamr@2: { williamr@2: TInt iDocPos; williamr@2: TInt iLineHeight; williamr@2: TBool iKeepWithNext; williamr@2: TBool iStartNewPage; williamr@2: }; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: class TLinePaginator williamr@2: { williamr@2: public: williamr@2: TLinePaginator(); williamr@2: TBool AppendLineL(TPageLine aLine); williamr@2: void FlushL(TInt aEndDocPos); williamr@2: void SetPageHeight(TInt aPageHeight); williamr@2: void SetArray(CArrayFix* aCharsPerPage); williamr@2: void Reset(); williamr@2: private: williamr@2: void ResetArray(); williamr@2: void InsertPageBreakL(); williamr@2: void SetPotentialBreakPoint(TInt aDocPos); williamr@2: void CheckTallLineL(TPageLine& aLine); williamr@2: private: williamr@2: CArrayFix* iPageList; // This is created and destroyed by the application running the paginator. williamr@2: TInt iDocPos; williamr@2: TBool iKeepWithPrev; williamr@2: TInt iPageHeight; williamr@2: TInt iHeightRem; williamr@2: TBool iBreakOnPage; williamr@2: TInt iPrevPageBreak; williamr@2: TInt iHeightLines; williamr@2: TBool iFirstLine; // Used to prevent page break being inserted at top of document. williamr@2: }; williamr@2: williamr@2: /** williamr@2: An abstract class which must be mixed with application calling the active object. williamr@2: It specifies the protocol for a pagination observer. A williamr@2: pagination observer may be used when paginating a document in the background williamr@2: (using CTextPaginator::PaginateCompleteDocumentL()). It notifies the client williamr@2: on page completion, document completion, and on errors. williamr@2: williamr@2: The observer is set up using the function CTextPaginator::SetObserver(). williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class MPaginateObserver williamr@2: { williamr@2: public: williamr@2: williamr@2: /** Notifies the client on completion of document pagination. */ williamr@2: virtual void NotifyCompletion()=0; williamr@2: williamr@2: /** Notifies the client when a leave is trapped or when the pagination is cancelled. williamr@2: Implements error handling. williamr@2: @param anErrorCode Error code - indicates the type of error. */ williamr@2: virtual void NotifyError(TInt anErrorCode)=0; williamr@2: williamr@2: /** Called by the paginator when each page has been completed. williamr@2: @param aCurrentPageNum The number of the page. */ williamr@2: virtual void NotifyPageCompletion(TInt aCurrentPageNum)=0; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: Paginates a document. williamr@2: williamr@2: Sets the page dimensions, the printer device and the source document to paginate. williamr@2: Uses a page list, which is an array of characters-per-page values. williamr@2: williamr@2: There are two ways of paginating a document; either in the background using williamr@2: an active object or by incrementally adding text to the document and repeatedly williamr@2: notifying the CTextPaginator object to paginate the added text. If an active williamr@2: object is used, the client may be notified on completion of pages, on trapped williamr@2: leaves and on completion of the pagination by an optional pagination observer. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CTextPaginator : public CActive williamr@2: { williamr@2: public: williamr@2: // 2 phase ctor: automatically adds self to active scheduler williamr@2: IMPORT_C static CTextPaginator* NewL(CPrinterDevice* aPrinterDevice,CArrayFix* aCharsPerPage,TInt aPriority); williamr@2: IMPORT_C ~CTextPaginator(); williamr@2: IMPORT_C void SetDocumentL(MLayDoc* aLayDoc); // Must call before anything else williamr@2: IMPORT_C void SetPrinterDevice(CPrinterDevice* aPrinterDevice); williamr@2: IMPORT_C void SetPageSpecInTwips(const TPageSpec& aPageSpec); // Physical size of page. williamr@2: IMPORT_C void SetPageMarginsInTwips(const TMargins& aPageMargins); // Default are all zero. williamr@2: IMPORT_C void SetTextMarginWidthsInTwips(TInt aLabelMarginWidth,TInt aGutterMarginWidth); // label margins (if any) williamr@2: // Called to initiate paginating a document using active object williamr@2: IMPORT_C void SetObserver(MPaginateObserver* aObserver); williamr@2: IMPORT_C void PaginateCompleteDocumentL(); williamr@2: // Called to paginate incrementally, without active object williamr@2: IMPORT_C TInt AppendTextL(TInt& aCumulativeDocPos); // returns number of page breaks so far williamr@2: IMPORT_C TInt PaginationCompletedL(); // called at end of incremental pagination - returns total number of page breaks williamr@2: private: williamr@2: enum TPaginateMode williamr@2: { williamr@2: EFPaginateCompleteDocument, williamr@2: EFPaginateIncrementally williamr@2: }; williamr@2: enum williamr@2: { williamr@2: EPageLineArrayGranularity=10, williamr@2: EPageListArrayGranularity=5 williamr@2: }; williamr@2: enum williamr@2: { williamr@2: EFMaximumNumberLinesInBlock=20 williamr@2: }; williamr@2: private: williamr@2: CTextPaginator(TInt aPriority); williamr@2: void RunL(); // Active scheduler is friend - can access williamr@2: void DoCancel(); // Called by CActive::Cancel() williamr@2: void ConstructL(CPrinterDevice* aPrinterDevice,CArrayFix* aCharsPerPage); williamr@2: void SetLayoutDimensions(); williamr@2: void SetOrReplaceDocumentL(MLayDoc* aLayDoc); williamr@2: TRect TextRectInTwips() const; williamr@2: TSize TextSizeInPixels() const; williamr@2: void TrapPaginateParagraphL(); williamr@2: void PaginateParagraphL(); williamr@2: void PageCompleted(); williamr@2: void Reque(); williamr@2: void ResetPaginator(); williamr@2: void CopyTempPageListL(); // Copies temporary page list to real one. williamr@2: void LeaveL(TInt aErr); williamr@2: private: williamr@2: MLayDoc* iLayDoc; williamr@2: MPaginateObserver* iObserver; williamr@2: CPrinterDevice* iPrinterDevice; williamr@2: TLinePaginator iPaginator; williamr@2: CTextLayout* iLayout; williamr@2: CArrayFix* iPageList; williamr@2: CArrayFixFlat* iTempPageList; williamr@2: CArrayFixFlat* iPageLineArray; williamr@2: TSize iPageSizeInTwips; williamr@2: TMargins iPageMarginsInTwips; williamr@2: TInt iGutterMarginWidthInTwips; // Gap between labels and text proper - in twips williamr@2: TInt iLabelMarginWidthInTwips; williamr@2: TInt iDocPos; // Within the laydoc williamr@2: TBool iPageBreakChar; williamr@2: TPaginateMode iMode; williamr@2: }; williamr@2: williamr@2: #endif