diff -r 000000000000 -r 1fb32624e06b textrendering/textformatting/tbox/FormLinePag.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textrendering/textformatting/tbox/FormLinePag.cpp Tue Feb 02 02:02:46 2010 +0200 @@ -0,0 +1,156 @@ +/* +* Copyright (c) 2001-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 "FRMPAGE.H" +#include "FRMCONST.H" + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include "FRMCONST_INTERNAL.H" +#include "FRMCONST_PARTNER.H" +#endif + +TLinePaginator::TLinePaginator(): + iPageList(NULL), + iDocPos(0), + iKeepWithPrev(ETrue), + iPageHeight(0), + iHeightRem(0), + iBreakOnPage(EFalse), + iPrevPageBreak(0), + iHeightLines(0), + iFirstLine(ETrue) + { + } + +TBool TLinePaginator::AppendLineL(TPageLine aLine) + // + { + TBool pageBreak=EFalse; + + if(aLine.iStartNewPage && !iFirstLine) + { + SetPotentialBreakPoint(aLine.iDocPos); + InsertPageBreakL(); + pageBreak=ETrue; + } + else + { + if (!iKeepWithPrev) + SetPotentialBreakPoint(aLine.iDocPos); + if (iHeightRem iHeightRem) + { + if (iHeightLines!=0) + { + SetPotentialBreakPoint(aLine.iDocPos); + InsertPageBreakL(); + } + CheckTallLineL(aLine); + } + } + else + { + if (!iFirstLine) + { + SetPotentialBreakPoint(aLine.iDocPos); + InsertPageBreakL(); + } + CheckTallLineL(aLine); //This picks up tall lines at the start of the document the above one picks up the rest + } + } + } + + iFirstLine=EFalse; + iHeightLines+=aLine.iLineHeight; + iKeepWithPrev=aLine.iKeepWithNext; + return pageBreak; + } + +void TLinePaginator::InsertPageBreakL() + { + iBreakOnPage=EFalse; + iHeightRem=iPageHeight; + iKeepWithPrev=EFalse; + TInt deltaDocPos=iDocPos-iPrevPageBreak; + __ASSERT_DEBUG(deltaDocPos>0,FormPanic(EFInvalidNumberCharsOnPage)); + iPageList->AppendL(deltaDocPos); + iPrevPageBreak=iDocPos; + } + +void TLinePaginator::CheckTallLineL(TPageLine& aLine) + { + while (aLine.iLineHeight>iPageHeight) + { + aLine.iLineHeight-=iPageHeight; + iPageList->AppendL(0); + } + } + +void TLinePaginator::FlushL(TInt aEndDocPos) + { + SetPotentialBreakPoint(aEndDocPos); + InsertPageBreakL(); + } + +void TLinePaginator::SetPageHeight(TInt aPageHeight) + { + iPageHeight=aPageHeight; + iHeightRem=aPageHeight; + Reset(); + } + +// It is expected that the array passed in will be an empty one +void TLinePaginator::SetArray(CArrayFix* aCharsPerPage) + { + iPageList=aCharsPerPage; + + // reset if the array is not (for some reason) already cleared. + if (iPageList->Count() > 0) + Reset(); + } + +void TLinePaginator::Reset() + { + iBreakOnPage=EFalse; + iKeepWithPrev=ETrue; + iPrevPageBreak=iDocPos=0; + iFirstLine=ETrue; + iHeightRem=iPageHeight; + + ResetArray(); + } + +void TLinePaginator::ResetArray() + { + iPageList->Reset(); + iPageList->Compress(); + } + +void TLinePaginator::SetPotentialBreakPoint(TInt aDocPos) + { + iBreakOnPage=ETrue; + iDocPos=aDocPos; + iHeightRem-=iHeightLines; + iHeightLines=0; + }