textrendering/word/SRC/WPAPPUT.CPP
changeset 32 8b9155204a54
parent 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/word/SRC/WPAPPUT.CPP	Fri Jun 04 10:37:54 2010 +0100
@@ -0,0 +1,745 @@
+/*
+* 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 <s32std.h>
+#include <txtrich.h>
+#include <frmprint.h>
+#include <frmvis.h>
+#include <prnsetup.h>
+#include <apgdoor.h>
+#include <coeutils.h>
+#include <barsread.h>
+
+#include <techview/eikchlst.h>
+#include <eikembal.h>
+#include <eikenv.h>
+#include <eikproc.h>
+#include <techview/eiktbar.h>
+#include <techview/eikprtpv.h>
+#include <techview/eikprtdg.h>
+#include <techview/eikpword.h>
+#include <techview/eikbtgpc.h>
+#include <techview/eikon.rsg>
+#include <eikon.mbg>
+
+#include "WPAPPUI.H"
+#include "WPDIALGS.H"
+#include "WPDOC.H"
+#include "WPTEST.H"
+#include <word.rsg>
+#include "WORD.HRH"
+
+const TInt KZoomStateOne=660;
+const TInt KZoomStateTwo=800;
+const TInt KZoomStateThree=TZoomFactor::EZoomOneToOne;
+const TInt KZoomStateFour=1500;
+const TInt KDefaultZoomState=KZoomStateTwo;
+
+const TInt KFirstPageNum=0;
+
+const TInt KPrintPreviewBandsPerPage=6;
+
+TBool CWordAppUi::ProcessCommandParametersL(TApaCommand aCommand ,TFileName& aDocumentName, const TDesC8& /*aTail*/)
+//
+	{return CEikAppUi::ProcessCommandParametersL(aCommand,aDocumentName);}
+
+
+void CWordAppUi::CreateEdwinL()
+	{
+	CGraphicsDevice* device=iCoeEnv->ScreenDevice();
+	iAppZoom.SetGraphicsDeviceMap(device);
+	iAppZoom.SetZoomFactor(KDefaultZoomState);
+	iRichEd=new(ELeave) CWordTextEditor(TGulBorder::ESingleBlack);
+	const TInt flags=EEikEdwinOwnsWindow|EEikEdwinKeepDocument|EEikEdwinInclusiveSizeFixed|EEikEdwinUserSuppliedText|
+						EEikEdwinNoAutoSelection|EEikEdwinAlwaysShowSelection;
+	iRichEd->ConstructL(NULL,0,0,flags);
+	iRichEd->SetObserver(this);
+	iRichEd->SetEdwinObserver(this);
+	iRichEd->CreateScrollBarFrameL();
+	iRichEd->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+	iRichEd->SetAdjacent(EGulAdjTop|EGulAdjRight);
+	iRichEd->SetZoomFactorL(&iAppZoom);
+	//
+	SetEdwinL();
+	// 
+	iTest = CWordTest::NewL(iRichEd->TextView());	
+	iTest->TurnOnCustomDrawing(iRichEd->TextLayout());
+	iRichEd->ActivateL();
+//	iRichEd->SetFocus(ETrue);
+	AddToStackL(iRichEd);
+	iRichEd->TextView()->SetParagraphFillTextOnly(ETrue);  // call when text view has been initalised
+	SetReadOnly(iEmbeddedAndReadOnly);
+	}
+
+
+void CWordAppUi::HandleModelChangeL()
+	{
+	iModel=Document()->Model();
+	SetUiData();
+	ResetPrint();
+	ResetEdwinL();  // may use print data if in wysiwyg mode.
+	UpdateToolbarsL();
+	SetPaginationOutOfDate(ETrue);
+	iEikonEnv->BusyMsgCancel();
+	if (iRichEd->IsReadOnly())
+		iEikonEnv->InfoMsg(R_WORD_FILE_READ_ONLY);
+	iRichEd->TextView()->SetCursorPlacement(ECursorVertical);
+	}
+
+
+void CWordAppUi::ReformatDueToStateChangeL()
+// Called from numerous places where content has
+// changed, requiring a reformat of the current document.
+//
+	{
+	iRichEd->NotifyNewFormatL();
+	UpdateToolbandButtonsL();
+	SetPaginationOutOfDate(ETrue);
+	}
+
+
+void CWordAppUi::UpdateToolbarsL()
+	{
+	UpdateToolbandButtonsL();
+	UpdateFileNameLabelL();
+	ResetFlags();
+	}
+
+void CWordAppUi::ResetEdwinL()
+	{
+	iRichEd->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EOff);
+	if (WysiwygModeIsSet())
+		iRichEd->SetWysiwygModeOn(PageLayoutWidth(),iModel->PrintSetup()->PrinterDevice());
+	else
+		iRichEd->SetWysiwygModeOff();
+	SetEdwinL();
+	TInt adjacent=EGulAdjNone;
+	if (iEikonEnv->AppUiFactory()->ToolBar()->IsVisible())
+		adjacent |= EGulAdjRight;
+	if (iEikonEnv->AppUiFactory()->ToolBand()->IsVisible())
+		adjacent |= EGulAdjTop;
+	iRichEd->SetAdjacent(adjacent);
+	TViewYPosQualifier yPosQualifier;
+	yPosQualifier.SetMakeLineFullyVisible();
+	yPosQualifier.SetFillScreen();
+	yPosQualifier.SetHotSpot(TViewYPosQualifier::EFViewBottomOfLine);
+	TInt docPos=iRichEd->TextView()->Selection().iCursorPos;
+	TInt yPos=iRichEd->TextView()->ViewRect().iBr.iY;
+	iRichEd->TextView()->SetViewL(docPos,yPos,yPosQualifier,CTextView::EFViewDiscardAllNoRedraw);  // !! casues format
+	iRichEd->SetRect(ClientRect());  // !! causes format but no draw
+	if (WysiwygModeIsSet())
+		iRichEd->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EAuto,CEikScrollBarFrame::EAuto);
+	else
+		iRichEd->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EAuto);
+	//
+	// for use when running as a main document.
+	// Read-only status is determined by looking at the AppFileMode.
+	if (iContainerAppUi)
+		SetReadOnly(iEmbeddedAndReadOnly);
+	else
+		SetReadOnly((TBool)!(iDocument->AppFileMode()&EFileWrite));
+	//
+	iRichEd->ForceScrollBarUpdateL();
+	iRichEd->NotifyNewFormatL(); // re-flow layout
+	iRichEd->DrawNow();  // !! causes draw
+	UpdateToolbandButtonsL(EVisibilityDependant);
+	UpdateFileNameLabelL();
+	iCoeEnv->WsSession().Flush();
+	}
+
+void CWordAppUi::SetEdwinL()
+	{
+	iModel=Document()->Model();
+	iRichEd->SetDocumentContentL(*Text(),CEikEdwin::EUseText);
+	iRichEd->SetRect(ClientRect());	
+	iRichEd->InitialiseUnifiedEditorL();
+	CFbsBitmap* lineCursor=iEikonEnv->CreateBitmapL(TPtrC(),EMbmEikonLncusr1);
+	iRichEd->SetLineCursorBitmapL(lineCursor);
+	}
+
+void CWordAppUi::ResetPrint()
+	{
+	iPrintSetup=iModel->PrintSetup();
+	CTextPageRegionPrinter& printer=PageRegionPrinter();
+	printer.SetFirstPageOfDoc(KFirstPageNum);
+	printer.SetDocument(Text());
+	printer.SetPrinterDevice(iPrintSetup->PrinterDevice());
+	printer.SetPageList(iModel->PageTable());	 
+	printer.SetPageMarginsInTwips(iPrintSetup->iPageMarginsInTwips.iMargins);	
+	printer.SetPageSpecInTwips(iPrintSetup->PrinterDevice()->CurrentPageSpecInTwips());	
+	printer.SetParagraphFillTextOnly(ETrue);
+	}
+
+void CWordAppUi::ResetFlags()
+	{
+	iAlignment = RTmParFormat::EAlignNormal;
+	iWordFlags &= EWysiwygModeOn;
+	}
+
+void CWordAppUi::RunGoToDialogL()
+	{
+	TInt pageNo=1;	  // etext should provide a function that gives current page number.
+	TInt aMaxPages=iModel->PageTable()->Count();
+	CEikDialog* dialog=new(ELeave) CWordGoToDialog(aMaxPages,&pageNo);
+	if (!dialog->ExecuteLD(R_WORD_DIALOG_GOTO))
+        return;
+	TInt total=0;
+	CArrayFix<TInt>* pageTable=iModel->PageTable();
+	for (TInt ii=0;ii<pageNo-1;ii++)
+		total+=(*pageTable)[ii];
+    iRichEd->SetCursorPosL(total,EFalse);
+	}
+
+void CWordAppUi::SetBulletL()
+	{
+	TParaFormatMask mask;
+	CParaFormat* paraFormat = CParaFormat::NewLC();
+	const TCursorSelection cursorSelection = iRichEd->TextView()->Selection();
+	const TInt lower = cursorSelection.LowerPos();
+	const TInt selectionLength = cursorSelection.Length();
+	CRichText* text = Text();
+	text->GetParaFormatL(paraFormat, mask, lower, selectionLength);
+	delete paraFormat->iBullet;
+	mask.ClearAll();
+	mask.SetAttrib(EAttBullet);
+	mask.SetAttrib(EAttIndent);
+	if (((CEikButtonBase*)iEikonEnv->AppUiFactory()->ToolBand()->ControlById(EWordButtonBullets))->State() == CEikButtonBase::EClear)
+		{
+		paraFormat->iBullet = NULL;
+		paraFormat->iIndentInTwips = 0;
+		}
+	else
+		{
+		TBullet* bullet = new(ELeave) TBullet;
+		if (!iBullet)
+			CreateDefaultBulletL();
+		*bullet = *iBullet;
+		paraFormat->iBullet = bullet;
+		if (iBullet->iHangingIndent)
+			paraFormat->iIndentInTwips = 283; // about 1/2cm - completely arbitrary value !!
+		else
+			paraFormat->iIndentInTwips = 0;
+		}
+	iRichEd->ApplyParaFormatL(paraFormat, mask);
+	CleanupStack::PopAndDestroy();
+	}
+
+void CWordAppUi::RunSelectBulletDialogL()
+	{
+	if (!iBullet)
+		CreateDefaultBulletL();
+	CParaFormat* paraFormat=CParaFormat::NewLC();
+	TParaFormatMask paraUndeterminedMask;
+	TCharFormat charFormat;
+	TCharFormatMask charFormatMask;
+	const TCursorSelection selection=iRichEd->TextView()->Selection();
+	Text()->GetParaFormatL(paraFormat,paraUndeterminedMask,selection.LowerPos(),selection.Length());
+	Text()->GetCharFormat(charFormat,charFormatMask,selection.LowerPos(),selection.Length());
+	TRgb backColor=paraFormat->iFillColor;
+	if (paraUndeterminedMask.AttribIsSet(EAttFillColor))
+		backColor=KRgbWhite; // what else could be done ???
+	if (paraFormat->iBullet)
+		*iBullet=*paraFormat->iBullet;
+	CEikDialog* dialog=new(ELeave) CWordBulletDialog(iBullet,backColor,NULL,charFormat.iFontSpec.iTypeface.iName);
+	if (dialog->ExecuteLD(R_WORD_DIALOG_BULLET))
+		{
+		CEikButtonBase* but = (CEikButtonBase*)iEikonEnv->AppUiFactory()->ToolBand()->ControlById(EWordButtonBullets);
+		but->SetState(CEikButtonBase::ESet);
+		SetBulletL();
+		but->DrawNow();
+		}
+	CleanupStack::PopAndDestroy();
+	}
+
+void CWordAppUi::CreateDefaultBulletL()
+	{
+	iBullet=new(ELeave) TBullet;
+	iBullet->iCharacterCode=0x2022;
+	iBullet->iHeightInTwips=iEikonEnv->NormalFont()->FontSpecInTwips().iHeight;
+	iBullet->iTypeface.iName=_L("Swiss");
+	}
+
+void CWordAppUi::SetParaAlignmentL(TInt aIndex)
+	{
+	RTmParFormatLayer format;
+	format.iMask.iFlags = 0;
+	format.iMask.Set(TTmParFormatMask::EAlignment);
+	switch(aIndex)
+		{
+		case 0:
+		case EWordCmdAlignLeft:
+			format.iFormat.iAlignment = RTmParFormat::EAlignNormal;
+			break;
+		case 1:
+		case EWordCmdAlignCenter:	
+			format.iFormat.iAlignment = RTmParFormat::EAlignCenter;
+			break;
+		case 2:
+		case EWordCmdAlignRight:
+			format.iFormat.iAlignment = RTmParFormat::EAlignReverse;
+			break;
+		case 3:
+		case EWordCmdAlignJustify:
+			format.iFormat.iAlignment = RTmParFormat::EAlignJustify;
+			break;
+		default:
+			format.iFormat.iAlignment = RTmParFormat::EAlignNormal;
+		}
+	TCursorSelection sel = iRichEd->Selection();
+	iRichEd->SetParFormatL(sel.LowerPos(),sel.Length(),format);
+	UpdateAlignButtonL(format.iFormat.iAlignment);
+	}
+
+
+void CWordAppUi::CmdChangeAlignmentL()
+	{
+	CParaFormat format;
+	TParaFormatMask undeterminedMask;
+	const TCursorSelection selection=iRichEd->Selection();
+	Text()->GetParaFormatL(&format,undeterminedMask,selection.LowerPos(),selection.Length());
+	//
+	TInt index=format.iHorizontalAlignment+1;  // toggle the alignment
+	//
+	if (undeterminedMask.AttribIsSet(EAttAlignment))
+		index=4;  // ...to force default case
+	//
+	if (index>=4)
+		index=0;  // where alignment > justifed, make it left aligned.
+	SetParaAlignmentL(index);
+	}
+
+
+void CWordAppUi::ZoomL(TInt aZoomCmd)
+	{
+	TInt zoomFactor=iAppZoom.ZoomFactor();
+	
+	if (zoomFactor>KZoomStateFour)
+		zoomFactor=(aZoomCmd==EEikCmdZoomIn) ? KZoomStateOne : KZoomStateFour;
+	
+	else if (zoomFactor==KZoomStateFour)
+		zoomFactor=(aZoomCmd==EEikCmdZoomIn) ? KZoomStateOne : KZoomStateThree;
+	
+	else if (zoomFactor>KZoomStateThree)
+		zoomFactor=(aZoomCmd==EEikCmdZoomIn) ? KZoomStateFour : KZoomStateThree;
+	
+	else if (zoomFactor==KZoomStateThree)
+		zoomFactor=(aZoomCmd==EEikCmdZoomIn) ? KZoomStateFour : KZoomStateTwo;
+
+	else if (zoomFactor>KZoomStateTwo)
+		zoomFactor=(aZoomCmd==EEikCmdZoomIn) ? KZoomStateThree : KZoomStateTwo;
+
+	else if (zoomFactor==KZoomStateTwo)
+		zoomFactor=(aZoomCmd==EEikCmdZoomIn) ? KZoomStateThree : KZoomStateOne;
+	
+	else if (zoomFactor>KZoomStateOne)
+		zoomFactor=(aZoomCmd==EEikCmdZoomIn) ? KZoomStateTwo : KZoomStateOne;
+	
+	else if (zoomFactor==KZoomStateOne)
+		zoomFactor=(aZoomCmd==EEikCmdZoomIn) ? KZoomStateTwo : KZoomStateFour;
+	
+	else
+		zoomFactor=(aZoomCmd==EEikCmdZoomIn) ? KZoomStateOne : KZoomStateFour;
+	//
+	iAppZoom.SetZoomFactor(zoomFactor);
+	TInt bitmapId=EMbmEikonLncusr1;
+	switch (zoomFactor)
+		{
+	case KZoomStateOne:
+	case KZoomStateTwo:
+		break;
+	case KZoomStateThree:
+		bitmapId=EMbmEikonLncusr3;
+		break;
+	case KZoomStateFour:
+		bitmapId=EMbmEikonLncusr4;
+		break;
+	default:
+		;
+		}
+	CFbsBitmap* lineCursor=iEikonEnv->CreateBitmapL(TPtrC(),bitmapId);
+	iRichEd->SetLineCursorBitmapL(lineCursor);
+	iRichEd->NotifyNewFormatL();
+	}
+
+void CWordAppUi::InsertCharacterL(TChar aCharacter)
+	{
+	iRichEd->InsertCharacterL(aCharacter);
+	UpdateToolbandButtonsL();
+	SetPaginationOutOfDate(ETrue);
+	//
+	if (aCharacter==CEditableText::EPageBreak)
+		RunPaginationDialogL();
+	}
+
+void CWordAppUi::CmdWrapToScreenL()
+// Toggle the state of the screen mapping.
+// Swaps between wrap to screen and wrap to page width
+//
+	{
+	TBool wysiwygModeNowOn=ToggleWysiwygMode();
+	CEikScrollBarFrame::TScrollBarVisibility horizVisibility=(wysiwygModeNowOn)
+		? CEikScrollBarFrame::EAuto
+		: CEikScrollBarFrame::EOff;
+	iRichEd->ScrollBarFrame()->SetScrollBarVisibilityL(horizVisibility,CEikScrollBarFrame::EAuto);
+	//
+	if (wysiwygModeNowOn)
+		UpdatePageLayoutL();  // wrap to the page width
+	else
+		{// wrap to screen width
+		iRichEd->SetWysiwygModeOff();
+		iRichEd->NotifyNewFormatL();
+		}
+	}
+
+
+void CWordAppUi::UpdatePageLayoutL()
+	{
+	if (WysiwygModeIsSet())
+		{
+		iRichEd->SetWysiwygModeOn(PageLayoutWidth(),iModel->PrintSetup()->PrinterDevice());
+		iRichEd->NotifyNewFormatL();
+		}
+	}
+
+TInt CWordAppUi::PageLayoutWidth() const
+	{
+	const CPrintSetup* print=Document()->Model()->PrintSetup();
+	const TPageSpec pageSpec=print->PrinterDevice()->CurrentPageSpecInTwips();
+	TInt width=(pageSpec.iOrientation? pageSpec.iPortraitPageSize.iHeight : pageSpec.iPortraitPageSize.iWidth);
+	const TMargins margins=print->iPageMarginsInTwips.iMargins;
+	width-=(margins.iLeft+margins.iRight);
+	return width;
+	}
+
+void CWordAppUi::RunViewPreferencesDialogL()
+	{
+	TNonPrintingCharVisibility visibility=iRichEd->TextLayout()->NonPrintingCharsVisibility();
+	CWordViewPreferencesDialog* dialog=new(ELeave) CWordViewPreferencesDialog(visibility);
+	if (dialog->ExecuteLD(R_WORD_DIALOG_VIEW_PREFERENCES))
+		{
+		visibility.SetPageBreaksVisible(ETrue);  // for now this is the default
+		iRichEd->TextLayout()->SetNonPrintingCharsVisibility(visibility);
+		iRichEd->NotifyNewFormatL();
+		}
+	}
+
+
+void CWordAppUi::RunObjectPreferencesDialogL()
+	{
+	TBool sketchAsGlass=SketchAsGlass();
+	TBool graphAsGlass=GraphAsGlass();
+	CWordObjectPreferencesDialog* dialog=new(ELeave) CWordObjectPreferencesDialog(sketchAsGlass,graphAsGlass);
+	if (dialog->ExecuteLD(R_WORD_DIALOG_OBJECT_PREFERENCES))
+		{
+		SetSketchAsGlass(sketchAsGlass);
+		SetGraphAsGlass(graphAsGlass);
+		}
+	}
+
+void CWordAppUi::RunOutlineDialogL()
+	{
+	TInt newCursorPosition = 0;
+
+	CEikDialog* dialog = new(ELeave) CWordOutlineDialog(Document()->Model()->Text(), iRichEd, newCursorPosition);
+	
+	if (dialog->ExecuteLD(R_WORD_DIALOG_OUTLINE))
+		{
+		iRichEd->SetCursorPosL(newCursorPosition,EFalse);
+		if (iEikonEnv->AppUiFactory()->ToolBar()->IsVisible() || iEikonEnv->AppUiFactory()->ToolBand()->IsVisible())
+			iToolBarUpdate->Start(CWordToolBarUpdate::EFullUpdate);
+		}
+	 }
+
+
+TFileName CWordAppUi::BitmapStore() const
+	{
+	return _L("*");
+	}
+
+
+TBool CWordAppUi::RunPaginationDialogL()
+	{
+	TPageTable* pageTable=iModel->PageTable();
+	const TBool paginationCancelled=iRichEd->RunPaginateDialogL(iPrintSetup,pageTable);
+	if (!paginationCancelled)
+		{
+		iPrintParameters.iFirstPage=0;
+		iPrintParameters.iLastPage=pageTable->Count()-1;
+		SetPaginationOutOfDate(EFalse);
+		Text()->SetPageTable(pageTable);
+		iRichEd->DrawNow();  // need to display any page breaks immediatley.
+		}
+	return paginationCancelled;
+	}
+
+
+void CWordAppUi::RunPreviewDialogL()
+//
+//
+	{
+	TBool paginationCancelled=EFalse;
+	if (PaginationOutOfDate())
+		paginationCancelled=RunPaginationDialogL();
+	if (paginationCancelled)
+		return;
+	//
+	TInt totalNumPages=iModel->PageTable()->Count();
+	CTextPageRegionPrinter& printer=PageRegionPrinter();
+	printer.SetPrintPreview(ETrue);
+	if (CEikPrintPreviewDialog::RunDlgLD(*iPrintSetup, printer, totalNumPages, this, KPrintPreviewBandsPerPage))
+		DoPrintL();
+	}
+
+
+TBool CWordAppUi::PageSetupChangedL(CPrintSetup* aPrintSetup,TInt& aNumPagesInDoc)
+// Return ETrue if pagination is cancelled, otherwise return EFalse.
+//
+	{
+	CTextPageRegionPrinter& printer=PageRegionPrinter();
+	printer.SetPageMarginsInTwips(aPrintSetup->iPageMarginsInTwips.iMargins);
+	printer.SetPageSpecInTwips(aPrintSetup->PrinterDevice()->CurrentPageSpecInTwips());
+	SetPaginationOutOfDate(ETrue);
+	SetDocChanged();
+	if (RunPaginationDialogL())
+		return ETrue;
+	aNumPagesInDoc=iModel->PageTable()->Count();
+	return EFalse;
+	}
+
+
+TBool CWordAppUi::RunPrintRangeDialogL(CPrintSetup* aPrintSetup,TInt& aNumPagesInDoc)
+// Return ETrue if pagination is cancelled, otherwise return EFalse.
+//
+	{			 
+	TUid oldUid = aPrintSetup->PrinterDevice()->Model().iUid;
+	TUid uid = oldUid;
+	CEikPrintRangeDialog* dialog = new(ELeave) CEikPrintRangeDialog(iPrintParameters, aPrintSetup, uid);
+	//
+	// fix for SW1-157.
+	// an Eikon defect that cannot be fixed without breaking binary compatibility
+	//
+	dialog->iPageRange.iLowerLimit = 1;  // 
+	dialog->iPageRange.iUpperLimit = iModel->PageTable()->Count();
+	dialog->ExecuteLD(R_EIK_DIALOG_PRINT_RANGE_SETUP);
+	if (oldUid != uid)	
+		{
+		aPrintSetup->CreatePrinterDeviceL(uid, iEikonEnv->FsSession());
+		CTextPageRegionPrinter& printer = PageRegionPrinter();
+		printer.SetPrinterDevice(aPrintSetup->PrinterDevice());
+		UpdatePageLayoutL();
+		SetDocChanged();
+		SetPaginationOutOfDate(ETrue);
+		if (RunPaginationDialogL())
+			return ETrue;
+		}
+	aNumPagesInDoc = iModel->PageTable()->Count();
+	return EFalse;  // no cancellation during pagination
+	}
+
+void CWordAppUi::RunPrintDialogL()
+	{
+	TUid oldUid = iPrintSetup->PrinterDevice()->Model().iUid; 	
+	TUid uid = oldUid;
+	CEikPrintRangeDialog* dialog = new(ELeave) CEikPrintRangeDialog(iPrintParameters, iPrintSetup, uid, ETrue);
+	//
+	// fix for SW1-157.
+	// an Eikon defect that cannot be fixed without breaking binary compatibility
+	//
+	dialog->iPageRange.iLowerLimit = 1;  // 
+	dialog->iPageRange.iUpperLimit = iModel->PageTable()->Count();;
+	if (dialog->ExecuteLD(R_EIK_DIALOG_PRINT_RANGE_SETUP))
+		{
+		if (oldUid != uid)
+			{
+			iPrintSetup->CreatePrinterDeviceL(uid, iEikonEnv->FsSession());
+			CTextPageRegionPrinter& printer = PageRegionPrinter();
+			printer.SetPrinterDevice(iPrintSetup->PrinterDevice());
+			UpdatePageLayoutL();
+			SetDocChanged();
+			SetPaginationOutOfDate(ETrue);
+			}
+		}
+	else
+		return;
+	TBool cancel = EFalse;
+	if (PaginationOutOfDate())
+		cancel = RunPaginationDialogL();
+	if (cancel)
+		return;
+	DoPrintL();
+	}
+
+
+void CWordAppUi::DoPrintL()
+// Run the print progress dialog
+//
+	{
+	CTextPageRegionPrinter& printer=PageRegionPrinter();
+	printer.SetPrintPreview(EFalse);
+	CEikPrintProgressDialog::RunDlgLD(iPrintSetup, &printer, iPrintParameters);
+	iPrintSetup->FreeModelList();
+	}
+
+
+TBool CWordAppUi::ConfirmationDialogL(TConfirmationText aTitle,TConfirmationText aText)const
+// Generate a query window with the specified text.
+//
+	{
+	TResourceReader reader;
+	return iEikonEnv->QueryWinL(reader.ReadTPtrC(aTitle,MUTABLE_CAST(HBufC8*,iConfirmationText)),
+								reader.ReadTPtrC(aText,MUTABLE_CAST(HBufC8*,iConfirmationText)) );
+	}
+
+
+void CWordAppUi::GetUiData(TWordUiData& aData)const
+//
+	{
+	aData.iNpcVisibility=0;
+	if (!(iRichEd && iRichEd->TextLayout()))
+		return;
+	TNonPrintingCharVisibility visibility=iRichEd->TextLayout()->NonPrintingCharsVisibility();
+	if (visibility.TabsVisible())
+		aData.iNpcVisibility|=ENpcTabsVisible;
+	if (visibility.SpacesVisible())
+		aData.iNpcVisibility|=ENpcSpacesVisible;
+	if (visibility.ParagraphDelimitersVisible())
+		aData.iNpcVisibility|=NpcParagraphsVisible;
+	if (visibility.LineBreaksVisible())
+		aData.iNpcVisibility|=NpcForcedLineBreaksVisible;
+	if (visibility.PotentialHyphensVisible())
+		aData.iNpcVisibility|=NpcSoftHyphensVisible;
+	if (visibility.NonBreakingHyphensVisible())
+		aData.iNpcVisibility|=NpcHardHyphensVisible;
+	if (visibility.NonBreakingSpacesVisible())
+		aData.iNpcVisibility|=NpcHardSpacesVisible;
+	//
+	// sketch/graph default appearance
+	aData.iPicturePrefs=0;
+	aData.iPicturePrefs=iPicturePrefs;
+	//
+	// cursor pos
+	aData.iCursorPos=iRichEd->CursorPos();
+	//
+	// toolbar visibilities
+	aData.iToolbandVisibility = iEikonEnv->AppUiFactory()->ToolBand()->IsVisible();
+	aData.iToolbarVisibility = iEikonEnv->AppUiFactory()->ToolBar()->IsVisible();
+	//
+	// zoom factor
+	aData.iZoomFactor=iAppZoom.ZoomFactor();
+	//
+	// WYSIWYG flag
+	aData.iWysiwygOn=WysiwygModeIsSet();
+	}
+
+
+void CWordAppUi::SetUiData()
+	{
+	const TWordUiData& data=Document()->UiData();
+	//
+	// Non-printing-char prefs
+	TNonPrintingCharVisibility visibility;
+	visibility.SetPageBreaksVisible(ETrue);
+	visibility.SetTabsVisible(data.iNpcVisibility&ENpcTabsVisible);
+	visibility.SetSpacesVisible(data.iNpcVisibility&ENpcSpacesVisible);
+	visibility.SetParagraphDelimitersVisible(data.iNpcVisibility&NpcParagraphsVisible);
+	visibility.SetLineBreaksVisible(data.iNpcVisibility&NpcForcedLineBreaksVisible);
+	visibility.SetPotentialHyphensVisible(data.iNpcVisibility&NpcSoftHyphensVisible);
+	visibility.SetNonBreakingHyphensVisible(data.iNpcVisibility&NpcHardHyphensVisible);
+	visibility.SetNonBreakingSpacesVisible(data.iNpcVisibility&NpcHardSpacesVisible);
+	iRichEd->TextLayout()->SetNonPrintingCharsVisibility(visibility);
+	//
+	// sketch/graph default appearance
+	iPicturePrefs=data.iPicturePrefs;
+	//
+	// cursor pos
+	iRichEd->TextView()->SetPendingSelection(TCursorSelection(data.iCursorPos,data.iCursorPos));
+	//
+	// toolbar visibilites
+	iEikonEnv->AppUiFactory()->ToolBand()->MakeVisible(data.iToolbandVisibility);
+	iEikonEnv->AppUiFactory()->ToolBar()->MakeVisible(data.iToolbarVisibility);
+	//
+	// zoom factor
+	iAppZoom.SetZoomFactor(data.iZoomFactor);
+	//
+	// WYSIWYG flag
+	if (data.iWysiwygOn)
+		iWordFlags|=EWysiwygModeOn;
+	else
+   		iWordFlags&=~EWysiwygModeOn;
+	}
+
+
+TWordUiData::TWordUiData()
+	:iNpcVisibility(0),
+	iPicturePrefs(0),
+	iToolbandVisibility(ETrue),
+	iToolbarVisibility(ETrue),
+	iCursorPos(0),
+	iZoomFactor(KDefaultZoomState),
+	iWysiwygOn(EFalse)
+	{}
+
+
+void TWordUiData::Reset()
+	{
+	iNpcVisibility=0;
+	iPicturePrefs=0;
+	iToolbandVisibility=ETrue;
+	iToolbarVisibility=ETrue;
+	iCursorPos=0;
+	iZoomFactor=KDefaultZoomState;
+	iWysiwygOn=EFalse;
+	}
+
+
+void TWordUiData::InternalizeL(RReadStream& aStream)
+	{
+	TCardinality version;
+	version.InternalizeL(aStream);
+	if (version!=KVersionAppConfigurationData)
+		User::Leave(KErrCorrupt); // !! need better error
+
+	iNpcVisibility=0;
+	iNpcVisibility=aStream.ReadUint8L();
+	iPicturePrefs=0;
+	iPicturePrefs=aStream.ReadUint8L();
+	iToolbandVisibility=(TBool)aStream.ReadInt8L();
+	iToolbarVisibility=(TBool)aStream.ReadInt8L();
+	iWysiwygOn=(TBool)aStream.ReadInt8L();
+
+	iCursorPos=aStream.ReadInt32L();
+	iZoomFactor=aStream.ReadInt32L();
+	}
+
+
+void TWordUiData::ExternalizeL(RWriteStream& aStream) const
+	{
+	const TCardinality version=KVersionAppConfigurationData;
+	version.ExternalizeL(aStream);
+
+	aStream.WriteUint8L((TUint8)iNpcVisibility);
+	aStream.WriteUint8L((TUint8)iPicturePrefs);
+	aStream.WriteInt8L(iToolbandVisibility);
+	aStream.WriteInt8L(iToolbarVisibility);
+	aStream.WriteInt8L(iWysiwygOn);
+
+	aStream.WriteInt32L(iCursorPos);
+	aStream.WriteInt32L(iZoomFactor);
+	}
+
+