textrendering/word/SRC/WPSTYLE.CPP
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/word/SRC/WPSTYLE.CPP	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,1158 @@
+/*
+* 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 <e32math.h>
+
+#include <s32mem.h>
+
+#include <txtrich.h>
+#include <txtstyle.h>
+#include <txtfrmat.h>
+
+#include <badesca.h>
+#include <barsread.h>
+#include <prnsetup.h>
+#include <clock.h>  // RMessageWindow::EMaxTextLength
+
+#include <techview/eikmnbut.h>
+#include <techview/eikbtpan.h>
+#include <techview/eiklbbut.h>
+#include <techview/eikdlgtb.h>
+#include <techview/eiktxlbx.h>
+#include <techview/eiktxlbm.h>
+#include <eikenv.h>
+#include <techview/eikrted.h>
+#include <techview/eikchkbx.h>
+#include <techview/eikbutb.h>
+#include <techview/eikfontd.h>
+#include <techview/eikparad.h>
+#include <techview/eiktabdg.h>
+#include <eikfctry.h>
+#include <techview/eikon.rsg>
+#include <techview/eikclb.h>
+#include <techview/eikclbd.h>
+#include <techview/eikbtgpc.h>
+
+#include "WPSTYLE.H"
+#include "WORD.HRH"
+#include <word.rsg>
+#include "WPAPPUI.H"
+#include "WPDEF.H"
+#include "WPDIALGS.H"
+#include "WPPANIC.H"
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include "txtfmlyr_internal.h"
+#endif
+
+const TInt KNormalIndex=1;
+const TInt KMaxStyleHotKeyDescription=20;
+const TInt KDescriptionGranularity=100;
+const TInt KStyleColumnSpacerWidth=5;
+const TUint KNoHotkey=0;
+
+enum TDescriptor
+	{	EDesLeftMargin=EAttLeftMargin,
+		EDesRightMargin,
+		EDesIndent,
+		EDesDummy0,
+		EDesDummy1,
+		EDesLineSpacing,
+		EDesDummy2,
+		EDesSpaceBefore,
+		EDesSpaceAfter,
+		EDesKeepTogether,
+		EDesKeepWithNext,
+		EDesStartNewPage,
+		EDesWidowOrphan,
+		EDesDummy3,
+		EDesBorderMargin,
+		EDesBorderTop,
+		EDesBorderBottom,
+		EDesBorderLeft,
+		EDesBorderRight,
+		EDesBullet,
+		EDesDummy4,
+		EDesTabStop,
+		//
+		EDesItalic,
+		EDesBold,
+		EDesSuperscript,
+		EDesSubscript,
+		EDesUnderline,
+		EDesStrikethrough,
+		EDesLeftAlign,
+		EDesCenterAlign,
+		EDesRightAlign,
+		EDesJustifiedAlign
+	};
+
+				
+
+TWordStyleGalleryData::TWordStyleGalleryData(CRichText& aText,CStyleList& aStyleList,CStyleShortCutList& aHotKeyList,
+		TChar& aNormalStyleHotKey,CPrintSetup& aPrintSetup,TBool& aApplyStyle,const TCursorSelection& aSelection,
+		MUnifiedEditor& aEditor):
+	iText(aText),
+	iStyleList(aStyleList),
+	iHotKeyList(aHotKeyList),
+	iNormalStyleHotKey(aNormalStyleHotKey),
+	iPrintSetup(aPrintSetup),
+	iApplyStyle(aApplyStyle),
+	iSelection(aSelection),
+	iEditor(aEditor)
+	{
+	}
+
+
+CWordStyleGallery::CWordStyleGallery(TWordStyleGalleryData& aData)
+	: iData(aData)
+	{
+	}
+
+CWordStyleGallery::~CWordStyleGallery()
+	{
+	delete iStyleNameKeyList;
+	delete iStyleNameList;
+	delete iStyleDescriptor;
+	}
+
+void CWordStyleGallery::ConstructL()
+	{
+	iStyleNameList=new(ELeave) CDesCArrayFlat(4);
+	iStyleNameKeyList=new(ELeave) CDesCArrayFlat(4);	
+	}
+
+CWordStyleGallery* CWordStyleGallery::NewLC(TWordStyleGalleryData& aData)
+	{
+	CWordStyleGallery* self = new (ELeave) CWordStyleGallery(aData);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;	
+	}
+	
+CWordStyleGallery* CWordStyleGallery::NewL(TWordStyleGalleryData& aData)
+	{
+	CWordStyleGallery* self = CWordStyleGallery::NewLC(aData);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void CWordStyleGallery::StyleDescriptionL(TInt aIndex)
+	{
+	TParagraphStyleName name=(*iStyleNameList)[aIndex];
+	TInt index=iData.iStyleList.IndexByName(name);
+	const CParaFormatLayer* layer=(index==KErrNotFound)
+		? iData.iText.GlobalParaFormatLayer()
+		: iData.iStyleList.At(index).iStyle;
+	FillBufferL(*layer);
+	}
+
+
+void CWordStyleGallery::FillBufferL(const CParaFormatLayer& aParaFormatLayer)
+	{
+	CEikGlobalTextEditor* edwin=(CEikGlobalTextEditor*)Control(EWordCidStyleInfo);
+	TCharFormat charFormat;
+	TCharFormatMask charMask;
+	CParaFormat* paraFormat=CParaFormat::NewLC();
+	TParaFormatMask paraMask;
+	//
+	//
+	iCurrentDescription=HBufC::NewL(KDescriptionGranularity);
+	TPtr buf=iCurrentDescription->Des();
+	TBool isNormalStyle=(aParaFormatLayer.Type()==KNormalParagraphStyleUid);
+	if (!isNormalStyle)
+		{
+		const CParagraphStyle* flayer=REINTERPRET_CAST(const CParagraphStyle*,aParaFormatLayer.SenseBase());
+		TUid type=flayer->Type();
+		if (type==KNormalParagraphStyleUid)
+			buf.Append(iNormalName);
+		else
+			buf.Append(flayer->iName);
+		buf.Append('+');
+		}
+	//
+	if (isNormalStyle)
+		iData.iText.GlobalCharFormatLayer()->Sense(charFormat,charMask);
+	else
+		REINTERPRET_CAST(const CParagraphStyle&,aParaFormatLayer).CharFormatLayer()->Sense(charFormat,charMask);
+	aParaFormatLayer.SenseL(paraFormat,paraMask);
+	//
+	if (!charMask.IsNull())
+		{
+		if (charMask.AttribIsSet(EAttFontTypeface))
+			DoAppendDescriptionL(charFormat.iFontSpec.iTypeface.iName);
+		if (charMask.AttribIsSet(EAttFontHeight))
+			{
+			TInt height=charFormat.iFontSpec.iHeight;
+			height=(height+10)/20;
+			TBuf<20> num;
+			num.Num(height);
+			TBuf<10> unit;
+			iCoeEnv->ReadResource(unit,R_WORD_FONT_UNITS);
+			num.Append(unit);
+			DoAppendDescriptionL(num);
+			}
+		if (charMask.AttribIsSet(EAttFontPosture))
+			{
+			if (charFormat.iFontSpec.iFontStyle.Posture()==EPostureItalic)
+				DoAppendDescriptionL((*iStyleDescriptor)[EDesItalic]);
+			}
+		if (charMask.AttribIsSet(EAttFontStrokeWeight))
+			{
+			if (charFormat.iFontSpec.iFontStyle.StrokeWeight()==EStrokeWeightBold)
+				DoAppendDescriptionL((*iStyleDescriptor)[EDesBold]);
+			}
+		if (charMask.AttribIsSet(EAttFontPrintPos))
+			{
+			TFontPrintPosition pos=charFormat.iFontSpec.iFontStyle.PrintPosition();
+			switch(pos)
+				{
+			case EPrintPosSuperscript:
+				DoAppendDescriptionL((*iStyleDescriptor)[EDesSuperscript]);
+				break;
+			case EPrintPosSubscript:
+				DoAppendDescriptionL((*iStyleDescriptor)[EDesSubscript]);
+				break;
+			default:
+				break;
+				}
+			}
+		if (charMask.AttribIsSet(EAttFontUnderline))
+			{
+			if (charFormat.iFontPresentation.iUnderline==EUnderlineOn)
+				DoAppendDescriptionL((*iStyleDescriptor)[EDesUnderline]);
+			}
+		if (charMask.AttribIsSet(EAttFontStrikethrough))
+			{
+			if (charFormat.iFontPresentation.iStrikethrough==EStrikethroughOn)
+				DoAppendDescriptionL((*iStyleDescriptor)[EDesStrikethrough]);
+			}
+		}
+	if (!paraMask.IsNull())
+		{
+		AppendDescriptionL(EAttLeftMargin,paraMask);
+		AppendDescriptionL(EAttRightMargin,paraMask);
+		AppendDescriptionL(EAttIndent,paraMask);
+		if (paraMask.AttribIsSet(EAttAlignment))
+			DoAppendDescriptionL((*iStyleDescriptor)[EDesLeftAlign+paraFormat->iHorizontalAlignment]);
+		AppendDescriptionL(EAttLineSpacing,paraMask);
+		AppendDescriptionL(EAttSpaceBefore,paraMask);
+		AppendDescriptionL(EAttSpaceAfter,paraMask);
+		AppendDescriptionL(EAttKeepTogether,paraMask);
+		AppendDescriptionL(EAttKeepWithNext,paraMask);
+		AppendDescriptionL(EAttStartNewPage,paraMask);
+		AppendDescriptionL(EAttWidowOrphan,paraMask);
+		AppendDescriptionL(EAttBorderMargin,paraMask);
+		AppendDescriptionL(EAttTopBorder,*paraFormat,paraMask);
+		AppendDescriptionL(EAttBottomBorder,*paraFormat,paraMask);
+		AppendDescriptionL(EAttLeftBorder,*paraFormat,paraMask);
+		AppendDescriptionL(EAttRightBorder,*paraFormat,paraMask);
+		AppendDescriptionL(EAttBullet,paraMask);
+		AppendDescriptionL(EAttTabStop,*paraFormat,paraMask);
+		}
+	CleanupStack::PopAndDestroy();  // paraFormat
+	edwin->SetTextL(iCurrentDescription);
+	delete iCurrentDescription;
+	iCurrentDescription=NULL;
+	DrawEdwinL();
+	}
+
+
+void CWordStyleGallery::AppendDescriptionL(TTextFormatAttribute aAttribute,const CParaFormat& aFormat,const TParaFormatMask& aMask)
+	{
+	if (aMask.AttribIsSet(aAttribute) && 
+	aFormat.ParaBorder((CParaFormat::TParaBorderSide)(aAttribute-EAttTopBorder)).iLineStyle!=TParaBorder::ENullLineStyle)
+		{
+		DoAppendDescriptionL((*iStyleDescriptor)[(TDescriptor)aAttribute]);
+		}
+	}
+
+
+void CWordStyleGallery::AppendDescriptionL(TTextFormatAttribute aAttribute,const TParaFormatMask& aMask)
+	{
+	if (aMask.AttribIsSet(aAttribute))
+		DoAppendDescriptionL((*iStyleDescriptor)[(TDescriptor)aAttribute]);
+	}
+
+
+void CWordStyleGallery::DoAppendDescriptionL(const TDesC& aText)
+	{
+	TInt newLength=iCurrentDescription->Length()+aText.Length();
+	if (iCurrentDescription->Length()>0)
+		newLength+=2;  // add 2 characters for the separator.
+	if (newLength>iCurrentDescription->Des().MaxLength())
+		{
+		TInt alloc=KDescriptionGranularity*((newLength+KDescriptionGranularity-1)/KDescriptionGranularity);
+		iCurrentDescription=iCurrentDescription->ReAllocL(alloc);
+		}
+	TPtr ptr=iCurrentDescription->Des();
+	if (ptr.Length()>0)
+		ptr.Append(_L(", "));
+	ptr.Append(aText);
+	}
+
+void CWordStyleGallery::DrawEdwinL()
+	{
+	CEikGlobalTextEditor* edwin=(CEikGlobalTextEditor*)Control(EWordCidStyleInfo);
+	TViewYPosQualifier yPosQualifier;
+	yPosQualifier.SetMakeLineFullyVisible();
+	edwin->TextView()->HandleGlobalChangeL(yPosQualifier); // !! Reconsider this
+	edwin->DrawNow();
+	}
+
+void CWordStyleGallery::PreLayoutDynInitL()					    
+	{
+	DoCalcColumnWidthsL();
+	}
+
+
+void CWordStyleGallery::PostLayoutDynInitL()					    
+	{
+	DoCalcColumnWidthsL();
+	iStyleDescriptor=iCoeEnv->ReadDesCArrayResourceL(R_WORD_STYLE_GALLERY_DESCRIPTIONS);
+	//
+	iCoeEnv->ReadResource(iNormalName , R_WORD_NORMAL);
+	iCoeEnv->ReadResource(iHotKey , R_WORD_HOTKEY);
+	TInt pos=0;
+	iStyleNameList->Reset();						  
+	iStyleNameList->AppendL(iNormalName);
+
+	TBool styleChange;
+	TInt keycount=iData.iHotKeyList.Count();
+
+	const CParaFormatLayer* style=iData.iText.ParagraphStyle(styleChange,iData.iSelection.LowerPos(),iData.iSelection.Length());
+	TInt count=iData.iStyleList.Count();
+	for (TInt i=0;i<count;i++)
+		iStyleNameList->AppendL(iData.iStyleList.At(i).iStyle->iName);
+	iStyleNameList->Sort();
+	TUid id=style->Type();
+	for (TInt k=0;k<iStyleNameList->Count();k++)
+		{
+		if (id==KNormalParagraphStyleUid)
+			{
+			if (iNormalName==(*iStyleNameList)[k])
+				{
+				pos=k;
+				break;
+				}
+			}
+		else if(((CParagraphStyle*)style)->iName==(*iStyleNameList)[k])
+			{
+			pos=k;
+			break;
+			}
+		}
+
+	// Make sure all styles have a hot key, even if it's not assigned
+	// since any pasted styles will be missing hot key info
+
+
+	if (keycount < count)
+		{
+			TInt idx;
+			TInt keysToAdd = count-keycount;
+
+			for (idx=0; idx<keysToAdd; idx++)
+				iData.iHotKeyList.AppendL(KNoHotkey);
+			
+		}
+	else if ( keycount > count )
+		{
+		//too many, they should be the same so remove extras
+			TInt idx;
+			for (idx=keycount-1; idx>=count; idx--)
+				iData.iHotKeyList.Delete(idx);
+
+		}
+	MergeArraysL();
+	ListBox()->CreateScrollBarFrameL();
+	ListBox()->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+	ListBox()->Model()->SetItemTextArray(iStyleNameKeyList);
+	ListBox()->Model()->SetOwnershipType(ELbmDoesNotOwnItemArray);
+	ListBox()->HandleItemAdditionL();
+	SetListBoxCurrentItem(EWordCidStyleNameList,pos);
+	SetDeleteButton();
+
+	CEikGlobalTextEditor* edwin=(CEikGlobalTextEditor*)Control(EWordCidStyleInfo);
+	CCharFormatLayer* clayer=CONST_CAST(CCharFormatLayer*,(edwin->GlobalText())->GlobalCharFormatLayer());
+	CParaFormatLayer* player=CONST_CAST(CParaFormatLayer*,(edwin->GlobalText())->GlobalParaFormatLayer());
+
+    TCharFormatMask defaultCharFormatMask;
+    TCharFormat defaultCharFormat;
+	TInt fontAttributes=TTypeface::EProportional;
+	defaultCharFormat.iFontSpec.iTypeface.SetAttributes(fontAttributes);
+	defaultCharFormat.iFontSpec.iHeight=160;
+
+	defaultCharFormatMask.SetAttrib(EAttFontHeight);
+	defaultCharFormatMask.SetAttrib(EAttFontTypeface);
+	clayer->SetL(defaultCharFormat,defaultCharFormatMask);	   
+//
+	CParaFormat pFormat;
+	TParaFormatMask pMask;
+	pFormat.iLineSpacingInTwips=160;
+	pMask.SetAttrib(EAttLineSpacing);
+	player->SetL(&pFormat,pMask);
+//
+	StyleDescriptionL(pos);
+	SetLineNonFocusing(EWordCidStyleInfo);
+	//
+	}
+
+void CWordStyleGallery::MergeArraysL()
+	{
+	iStyleNameKeyList->Reset();
+	TInt count=iStyleNameList->Count();
+	//
+	for (TInt ii=0;ii<count;ii++)
+		AppendL(ii);
+	}
+
+CEikColumnListBox* CWordStyleGallery::ListBox() const
+	{
+	return STATIC_CAST(CEikColumnListBox*,Control(EWordCidStyleNameList));
+	}
+
+void CWordStyleGallery::DoCalcColumnWidthsL()
+	{
+	CColumnListBoxData* columnData = ListBox()->ItemDrawer()->ColumnData();
+	const CFont* font;
+	//
+	// column 0
+	font = iEikonEnv->NormalFont();
+	columnData->SetColumnFontL(0, font);
+	columnData->SetColumnAlignmentL(0, CGraphicsContext::ELeft);
+	//
+	// column 1
+	columnData->SetColumnWidthPixelL(1, KStyleColumnSpacerWidth);
+	//
+	// column 2
+	font = iEikonEnv->LegendFont();
+	columnData->SetColumnFontL(2, font);
+	TBuf<KMaxStyleHotKeyDescription> hotkey;
+	iCoeEnv->ReadResource(hotkey, R_WORD_HOTKEY);
+	TInt width2 = font->TextWidthInPixels(hotkey) + font->MaxCharWidthInPixels();
+	columnData->SetColumnWidthPixelL(2, width2);
+	columnData->SetColumnAlignmentL(2, CGraphicsContext::ELeft);
+	//
+	// more column 0
+	TInt width0 = ListBox()->View()->ViewRect().Width() - KStyleColumnSpacerWidth - width2 - CEikScrollBar::DefaultScrollBarBreadth(); // only works if called from PostLayout...
+	columnData->SetColumnWidthPixelL(0, width0);
+	}
+
+void CWordStyleGallery::SetDeleteButton()
+	{
+	TInt index = ListBoxCurrentItem(EWordCidStyleNameList);
+	TBool dimmed = EFalse;
+	if (iNormalName == (*iStyleNameList)[index])
+		dimmed = ETrue;
+	else
+		{
+		CParagraphStyle* paraStyle = iData.iStyleList.PtrByName((*iStyleNameList)[index])->iStyle;
+		TUid type = paraStyle->Type();
+		dimmed = (type == KSystemParagraphStyleUid);
+		}
+	ButtonGroupContainer().DimCommand(EEikBidDelete, dimmed);
+	}
+
+TBool CWordStyleGallery::OkToExitL(TInt aButtonId)
+	{
+	switch(aButtonId)
+		{
+		case EWordCidAddStyle:
+		case EWordCidModifyStyle:
+			StyleL(aButtonId);
+			return EFalse;
+		case EEikBidDelete:
+			{
+			if (ButtonGroupContainer().IsCommandDimmed(EEikBidDelete))
+				return EFalse;
+			TInt index = ListBoxCurrentItem(EWordCidStyleNameList);			   
+			TParagraphStyleName name = (*iStyleNameList)[index]; 
+			//			
+			TBuf<RMessageWindow::EMaxTextLength> title;
+			TBuf<RMessageWindow::EMaxTextLength> res;
+			iCoeEnv->ReadResource(res, R_WORD_DELETE_STYLE_TITLE);
+			title.Format(res, &name);
+			//
+			if (iEikonEnv->QueryWinL(title, _L("")))
+				{// Can never delete the normal style
+				CParagraphStyle* paraStyle = iData.iStyleList.PtrByName(name)->iStyle;
+				TInt offset = iData.iStyleList.IndexByPtr(paraStyle);
+				__ASSERT_ALWAYS(offset >= 0, Panic(EWordGalleryInvalidStyle));
+				iData.iText.NotifyStyleDeletedL(paraStyle);
+				iData.iStyleList.Remove(paraStyle);
+				iStyleNameList->Delete(index);
+				iStyleNameKeyList->Delete(index);
+				iData.iHotKeyList.Delete(offset);
+				ListBox()->Reset();
+				if (index == iStyleNameList->Count())
+					index = index-KNormalIndex;
+				ListBox()->SetCurrentItemIndex(index);
+				ListBox()->UpdateScrollBarsL();				  //don't have to this.listbox should provide Handledeleteitem method
+				ListBox()->ScrollToMakeItemVisible(index);
+				ListBox()->DrawNow();
+				SetTextForCancelButtonL();
+				iData.iApplyStyle = ETrue;
+				}
+			SetDeleteButton();
+			StyleDescriptionL(index);
+			return EFalse;
+			}
+		case EEikBidOk:
+			{
+			TInt index = ListBoxCurrentItem(EWordCidStyleNameList);
+			MUnifiedEditor::MStyleSupport* style_support = iData.iEditor.StyleSupport();
+			if (style_support)
+				{
+				TPtrC styleName = (*iStyleNameList)[index];
+				// normal style name will not be recognised by the editor object,
+				// as it is our own invention. A null descriptor should be used.
+				const TPtrC nullDes;
+				if (styleName == iNormalName)
+					styleName.Set(nullDes);
+				style_support->SetStyleL(iData.iSelection.LowerPos(), iData.iSelection.Length(), styleName);
+				}
+			iData.iApplyStyle=ETrue;
+			}
+		}
+	//
+	return ETrue;
+	}
+
+void CWordStyleGallery::HandleControlStateChangeL(TInt aControlId)  
+	{
+	if (aControlId==EWordCidStyleNameList)
+		{
+		TInt index=ListBoxCurrentItem(EWordCidStyleNameList);
+		StyleDescriptionL(index);
+		SetDeleteButton();
+		}
+	}
+
+void CWordStyleGallery::StyleL(TInt aControlId)
+	{	
+	TInt index=ListBoxCurrentItem(EWordCidStyleNameList);			   
+	CParagraphStyle* paraStyle=NULL;
+	CEikDialog* dialog=NULL;
+	TBool normal=EFalse;
+	TChar newHotkey=KNoHotkey;
+	if (aControlId==EWordCidAddStyle)
+		{
+		paraStyle=CParagraphStyle::NewL(*(iData.iText.GlobalParaFormatLayer()),*(iData.iText.GlobalCharFormatLayer()));
+		dialog=new(ELeave) CWordStyleFormatDialog(iNormalName,iData.iNormalStyleHotKey,iData.iStyleList,
+									aControlId,iData.iText,&iData.iPrintSetup,iData.iHotKeyList,newHotkey,paraStyle);
+		}
+	else
+		{
+		if ((*iStyleNameList)[index]==iNormalName)
+			{
+			normal=ETrue;
+			dialog=new(ELeave) CWordStyleFormatDialog(iNormalName,iData.iNormalStyleHotKey,iData.iStyleList,
+									aControlId,iData.iText,&iData.iPrintSetup,iData.iHotKeyList,newHotkey,NULL,normal);
+			}
+		else
+			{
+			paraStyle=iData.iStyleList.PtrByName((*iStyleNameList)[index])->iStyle;
+			dialog=new(ELeave) CWordStyleFormatDialog(iNormalName,iData.iNormalStyleHotKey,iData.iStyleList,
+									aControlId,iData.iText,&iData.iPrintSetup,iData.iHotKeyList,newHotkey,paraStyle);
+			}
+		if (normal)
+			newHotkey=iData.iNormalStyleHotKey;
+		else
+			{
+			TInt ii=iData.iStyleList.IndexByPtr(paraStyle);
+			__ASSERT_DEBUG(ii!=KErrNotFound,Panic(EStyleIntegrityError));
+			newHotkey=iData.iHotKeyList[ii];
+			}
+		}
+	//
+	if (dialog->ExecuteLD(R_WORD_DIALOG_STYLE_FORMAT))
+		{
+		SetTextForCancelButtonL();	
+		// remove the hotkey from any old style if it has been re-assigned
+		if (newHotkey==iData.iNormalStyleHotKey)
+			iData.iNormalStyleHotKey=0;
+		else
+			{
+			TInt hotkeyCount=iData.iHotKeyList.Count();
+			for (TInt ii=0;ii<hotkeyCount;ii++)
+				{
+				if (newHotkey==iData.iHotKeyList[ii] && newHotkey!=KNoHotkey)
+					{
+					iData.iHotKeyList[ii]=0;
+					break;
+					}					
+				}
+			}
+		//
+		if (aControlId==EWordCidAddStyle)
+			{
+			RParagraphStyleInfo styleSet(paraStyle);
+			iData.iStyleList.AppendL(&styleSet);
+			}
+		else
+			{
+			iStyleNameList->Delete(index);
+			iStyleNameKeyList->Delete(index);
+			}
+		if (normal)
+			iStyleNameList->AppendL(iNormalName);
+		else
+			iStyleNameList->AppendL(paraStyle->iName);
+		iStyleNameList->Sort();
+		//
+		TParagraphStyleName name=(normal) ? iNormalName : paraStyle->iName;
+		for (TInt ii=0;ii<iStyleNameList->Count();ii++)
+			{
+			if (name==(*iStyleNameList)[ii])
+				{
+				index=ii;
+				break;
+				}
+			}
+
+		if (aControlId==EWordCidAddStyle)
+			iData.iHotKeyList.AppendL(newHotkey);
+		else
+			{
+			if (normal)
+				iData.iNormalStyleHotKey=newHotkey;
+			else
+				{
+				CParagraphStyle* style=iData.iStyleList.PtrByName((*iStyleNameList)[index])->iStyle;
+				TInt offset=iData.iStyleList.IndexByPtr(style);
+				iData.iHotKeyList[offset]=newHotkey;
+				}
+			}
+		MergeArraysL();
+		ListBox()->HandleItemAdditionL();
+		ListBox()->SetCurrentItemIndexAndDraw(index);
+		StyleDescriptionL(index);
+		SetDeleteButton();
+		}
+	else
+		{
+		if (aControlId==EWordCidAddStyle)
+			delete paraStyle;
+		}
+	}
+
+void CWordStyleGallery::AppendL(TInt aIndex)
+	{
+	TBuf<100> name;
+	name = (*iStyleNameList)[aIndex];
+	//
+	// truncate name if necessary
+	CColumnListBoxData* columnData = ListBox()->ItemDrawer()->ColumnData();
+	TInt columnWidth = columnData->ColumnWidthPixel(0);
+	const CFont* columnFont = columnData->ColumnFont(0);
+	if (columnFont->TextWidthInPixels(name) > columnWidth)
+		TextUtils::ClipToFit(name, *columnFont, columnWidth);
+	//
+	TChar key = iData.iNormalStyleHotKey;
+	if (name != iNormalName)
+		{
+		CParagraphStyle* pp = iData.iStyleList.PtrByName(name)->iStyle;
+		TInt index = iData.iStyleList.IndexByPtr(pp);
+		key = iData.iHotKeyList[index];
+		}
+	if (key > 0)
+		{
+		name.Append(KColumnListSeparator);
+		name.Append(KColumnListSeparator); // one for empty spacer column
+		name.Append(iHotKey);
+		name.Append(key);		
+		name.Append(KColumnListSeparator);
+		}
+	iStyleNameKeyList->AppendL(name);
+	}
+
+void CWordStyleGallery::SetTextForCancelButtonL()
+	{
+	TBuf<20> buf;
+	iCoeEnv->ReadResource(buf, R_WORD_CLOSE);
+	const TInt pos = ButtonGroupContainer().PositionById(EEikBidCancel);	
+	ButtonGroupContainer().SetCommandL(pos, EEikBidCancel, buf);
+	iData.iApplyStyle = ETrue;
+	}
+
+///////////////////Add Modify button dialogs//////////////////////
+
+CWordStyleFormatDialog::CWordStyleFormatDialog(const TParagraphStyleName& aNormalName,const TChar aNormalStyleHotkey,const CStyleList& aStyleList,const TInt aButton,CRichText& aText,CPrintSetup* aPrintSetup,CArrayFix<TChar>& aHotKeyList,TChar& aChar,CParagraphStyle* aParagraphStyle,TBool aNormalStyle)
+	:
+	iStyleList(aStyleList),
+	iText(&aText),
+	iButton(aButton),
+	iParagraphStyle(aParagraphStyle),
+	iNormalStyle(aNormalStyle),
+	iPrintSetup(aPrintSetup),
+	iHotKeyList(&aHotKeyList),
+	iNormalStyleHotkey(aNormalStyleHotkey),
+	iNormalName(aNormalName),
+	iChar(aChar)
+	{
+		if (aParagraphStyle) iOutline = aParagraphStyle->OutlineLevel();
+		else iOutline = 0;
+	}
+
+CWordStyleFormatDialog::~CWordStyleFormatDialog()
+	{
+	delete iBullet;
+	}
+
+void CWordStyleFormatDialog::PreLayoutDynInitL()
+	{
+	//
+	// Dynamically change the title of this dialog as appropriate
+	TInt id = (iButton == EWordCidAddStyle)?
+		R_WORD_STYLEFORMAT_TITLE_ADD : R_WORD_STYLEFORMAT_TITLE_MODIFY;
+	if (id == R_WORD_STYLEFORMAT_TITLE_ADD)
+		SetTitleL(id);
+	else
+		{
+		TBuf<24> buf;
+		iCoeEnv->ReadResource(buf,R_WORD_STYLEFORMAT_TITLE_MODIFY);
+		TBuf<24+KMaxParagraphStyleName> title; // 56
+		TParagraphStyleName name;
+		name = (iNormalStyle)? iNormalName : iParagraphStyle->iName;
+		title.Format(buf,&name);
+		SetTitleL(title);
+		}
+	//
+	TParaFormatMask paraMask;
+	CParaFormat* paraFormat=CParaFormat::NewLC();
+	ButtonGroupContainer().ButtonById(EWordCidFormatList)->
+		SetButtonLayout(CEikCommandButton::ETextLeftPictureRight);
+	if (iNormalStyle)
+		{
+		TParagraphStyleName name;
+		iCoeEnv->ReadResource(name , R_WORD_NORMAL);
+		SetEdwinTextL(EWordCidStyleName,&name);
+		SetLineDimmedNow(EWordCidStyleName,ETrue);
+		SetLineDimmedNow(EWordCidOutline,ETrue);
+		iText->GlobalParaFormatLayer()->SenseL(paraFormat,paraMask);
+		}
+	else
+		{
+		SetEdwinTextL(EWordCidStyleName,&iParagraphStyle->iName);
+		TUid type=iParagraphStyle->Type();
+		if (type==KSystemParagraphStyleUid)
+			SetLineDimmedNow(EWordCidStyleName,ETrue);
+		iParagraphStyle->SenseL(paraFormat,paraMask);
+		}
+	//hotkey
+	if (iButton==EWordCidModifyStyle)
+		{
+		CEikCharEditor* editor=(CEikCharEditor*)Control(EWordCidHotKey);
+		editor->SetChar(iChar);
+		}
+	//
+	CEikButtonBase::TState state;
+	state=(paraFormat->iBullet)? CEikButtonBase::ESet : CEikButtonBase::EClear ;
+	SetCheckBoxState(EWordCidBullet,state);
+
+	// Set values for Outline level
+
+	SetNumberEditorValue(EWordCidOutline,iOutline);
+
+	CleanupStack::PopAndDestroy();
+	}
+
+
+TBool CWordStyleFormatDialog::OkToExitL(TInt aButtonId)
+	{
+	if (aButtonId == EWordCidFormatList)
+		{
+		CEikLabeledButton* labelButton = STATIC_CAST(CEikLabeledButton*,ButtonGroupContainer().ControlOrNull(EWordCidFormatList));
+		if (labelButton != NULL)
+			{
+			CEikMenuButton* menuButton = STATIC_CAST(CEikMenuButton*, labelButton->Button());
+			menuButton->LaunchPopupMenuL(this);				
+			return EFalse;
+			}
+		}
+	if (aButtonId == EEikBidOk)
+		{	
+		TParagraphStyleName name;
+		GetEdwinText(name,EWordCidStyleName);
+		if (!name.Length())
+			{
+			iEikonEnv->InfoMsg(R_WORD_NOSTYLENAME);
+			return EFalse;
+			}
+
+		if (iParagraphStyle)
+		{
+		iOutline = NumberEditorValue(EWordCidOutline);
+		iParagraphStyle->SetOutlineLevel(iOutline);
+		}
+		
+		
+		// check for normal name as well
+		TParagraphStyleName normalName;
+		iCoeEnv->ReadResource(normalName , R_WORD_NORMAL);
+		 // you cannot modify names of the built in styles
+		if (iButton == EWordCidModifyStyle)
+			{
+			if (iNormalStyle)
+				return ETrue;
+			else
+				{
+				TUid type = iParagraphStyle->Type();
+				if (type == KSystemParagraphStyleUid)
+					return ETrue;
+				else   // userdefined style
+					{  	// now check the style list to see if the specified style already exists
+					CStyleList* styleList = iText->StyleList();
+					for (TInt i = 0; i < styleList->Count(); i++)
+						{
+						if ((name == (*styleList)[i].iStyle->iName) || (name == normalName))
+							{
+							if (name != iParagraphStyle->iName)
+								{
+								iEikonEnv->InfoMsg(R_WORD_STYLENAMEEXISTS);
+								return EFalse;
+								}
+							}
+						}
+					}
+				}
+			}
+		else
+			{
+			CStyleList* list = iText->StyleList();
+			for (TInt i = 0; i < list->Count(); i++)
+				if ((name == (*list)[i].iStyle->iName) || (name == normalName))
+					{
+					iEikonEnv->InfoMsg(R_WORD_STYLENAMEEXISTS);
+					return EFalse;
+					}
+			}
+		GetEdwinText(iParagraphStyle->iName, EWordCidStyleName);
+		}					   
+	return ETrue;
+	}	  						  
+
+SEikControlInfo CWordStyleFormatDialog::CreateCustomControlL(TInt aControlType)
+	{
+	SEikControlInfo info;
+	info.iTrailerTextId=0;
+    info.iFlags=0;
+	if (aControlType==EWordCtStyleShortcutKeyEditor)
+		info.iControl=new(ELeave) CWordStyleHotKeyEditor(this);
+	else
+		info.iControl=NULL;
+	return info;
+	}
+
+void CWordStyleFormatDialog::HandleControlStateChangeL(TInt aControlId)
+	{
+	if (aControlId==EWordCidBullet)
+		SetBulletL();
+	if (aControlId==EWordCidHotKey)
+		iChar = ((CEikCharEditor*)Control(EWordCidHotKey))->GetChar();
+	}
+
+
+void CWordStyleFormatDialog::HandleInteractionRefused(TInt aControlId)
+	{	
+	if (aControlId==EWordCidOutline)
+		iEikonEnv->InfoMsg(R_WORD_NORMAL_OUTLINE);	
+	else
+		iEikonEnv->InfoMsg(R_EIK_TBUF_NOT_AVAILABLE);
+	}
+
+
+TBool CWordStyleFormatDialog::ValidateHotkey(TKeyEvent& aKeyEvent)
+// return false if the hotkey is invalid
+// otherwise set aKeyEvent to the hotkey I have validated (ie uppercase it)
+	{
+	// check that the key is a valid character
+	TChar hotkey=aKeyEvent.iCode;
+	if (!hotkey.IsAlphaDigit())
+		{
+		iEikonEnv->InfoMsg(R_WORD_HOTKEY_INVALID);
+		return EFalse;
+		}
+	//
+	// upper-case the key
+	hotkey.UpperCase();
+	//
+	// check that it isn't already in use
+	HotkeyConflict(hotkey);
+	//
+	// set the hotkey and return
+	aKeyEvent.iCode = hotkey;
+	return ETrue;
+	}
+
+
+TBool CWordStyleFormatDialog::HotkeyConflict(TChar aHotkey)
+	{
+	TBool hotkeyConflict=EFalse;
+	TInt index=-1;
+	if (aHotkey==iNormalStyleHotkey)
+		hotkeyConflict=ETrue;
+	else
+		{
+		TInt hotkeyCount=iHotKeyList->Count();
+		for (index=0;index<hotkeyCount;index++)
+			{
+			if (aHotkey==(*iHotKeyList)[index])
+				{
+				hotkeyConflict=ETrue;
+				break;
+				}
+			}
+		}
+	//
+	if (hotkeyConflict)
+		{
+		//there isnt an entry in the stylelist
+		if (index >iStyleList.Count() )
+			hotkeyConflict=EFalse;
+		else
+			{
+				TBuf<80> msg;
+				TBuf<48> fmtString;
+
+				iCoeEnv->ReadResource(fmtString,R_WORD_HOTKEYEXISTS);
+				TParagraphStyleName name=(index>=0)
+					? iStyleList.At(index).iStyle->iName
+					: iNormalName;
+				msg.Format(fmtString,&name);
+				iEikonEnv->InfoMsg(msg);
+			}
+		}
+	//
+	return hotkeyConflict;
+	}
+
+
+void CWordStyleFormatDialog::SetBulletL()
+	{
+	TParaFormatMask paraMask;
+	CParaFormat* paraFormat=CParaFormat::NewLC();
+	if (iNormalStyle)
+		iText->GlobalParaFormatLayer()->SenseL(paraFormat,paraMask);
+	else 
+		iParagraphStyle->SenseL(paraFormat,paraMask);
+	delete paraFormat->iBullet;
+
+	if(((CEikCheckBox*)Control(EWordCidBullet))->State()==CEikButtonBase::EClear)
+		{
+		paraFormat->iBullet=NULL;
+		paraFormat->iIndentInTwips=0;
+		paraMask.ClearAttrib(EAttBullet);
+		paraMask.ClearAttrib(EAttIndent);
+		}
+	else
+		{
+		paraMask.SetAttrib(EAttBullet);
+		paraMask.SetAttrib(EAttIndent);
+		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;
+		}
+	if (iNormalStyle)
+		((CParaFormatLayer*)iText->GlobalParaFormatLayer())->SetL(paraFormat,paraMask);
+	else
+		iParagraphStyle->SetL(paraFormat,paraMask);
+	TViewYPosQualifier yPosQ;
+	yPosQ.SetMakeLineFullyVisible();
+	CleanupStack::PopAndDestroy();
+	}
+
+void CWordStyleFormatDialog::CreateDefaultBulletL()
+	{
+	iBullet=new(ELeave) TBullet;
+	iBullet->iCharacterCode=0x2022;
+	iBullet->iHeightInTwips=iEikonEnv->NormalFont()->FontSpecInTwips().iHeight;
+	iBullet->iTypeface.iName=_L("Swiss");
+	}
+
+void CWordStyleFormatDialog::ProcessCommandL(TInt aCommand)
+	{
+	switch (aCommand)
+		{
+	case EEikCmdFontChange:	
+		RunFontDialogL();
+		break;
+	case EEikCmdParaIndent:		
+	case EEikCmdParaSpacing:	
+	case EEikCmdParaBorder:			
+	case EEikCmdParaTabs:		
+	case EEikCmdParaAlign:		
+		RunDialogL((TStyleFormatDialog)aCommand);					   
+		break;
+	case EWordCmdFormatBullet:
+		RunSelectBulletDialogL();
+		break;
+		}
+	}
+		
+CParaFormatLayer* CWordStyleFormatDialog::GetParaLayerAndFormattingL(CParaFormat& aFormat,TParaFormatMask& aMask)
+//
+	{
+	CParaFormatLayer* layer=(iNormalStyle)
+		? CONST_CAST(CParaFormatLayer*,iText->GlobalParaFormatLayer())
+		: iParagraphStyle;
+	DoGetParaFormatL(aFormat,aMask,*layer);
+	return layer;
+	}
+
+
+void CWordStyleFormatDialog::DoGetParaFormatL(CParaFormat& aFormat,TParaFormatMask& aMask,const CParaFormatLayer& aLayer)
+//
+	{
+	aLayer.SenseEffectiveL(&aFormat);
+	aLayer.SenseL(&aFormat,aMask);
+	}
+
+
+void CWordStyleFormatDialog::RunSelectBulletDialogL()
+	{
+	if (!iBullet)
+		CreateDefaultBulletL();
+	CParaFormat* paraFormat=CParaFormat::NewLC();
+	TParaFormatMask paraMask;
+	TCharFormat charFormat;
+	TCharFormatMask charMask;
+//	TCharFormatMask charUndeterminedMask;
+	if(iNormalStyle)
+		{
+		iText->GlobalParaFormatLayer()->SenseL(paraFormat,paraMask);
+		iText->GlobalCharFormatLayer()->Sense(charFormat,charMask);
+		}
+	else
+		{
+		iParagraphStyle->SenseEffectiveL(paraFormat);
+		iParagraphStyle->CharFormatLayer()->SenseEffective(charFormat);
+		}
+	TRgb backColor=paraFormat->iFillColor;
+	if (paraMask.AttribIsSet(EAttFillColor))
+		backColor=KRgbWhite; // what else could be done ???
+	CEikDialog* dialog=new(ELeave) CWordBulletDialog(iBullet,backColor,NULL,charFormat.iFontSpec.iTypeface.iName);
+	if (dialog->ExecuteLD(R_WORD_DIALOG_BULLET))
+		{
+		SetCheckBoxState(EWordCidBullet,CEikButtonBase::ESet);
+		SetBulletL();
+		}
+	CleanupStack::PopAndDestroy();
+	}
+
+
+void CWordStyleFormatDialog::RunDialogL(TStyleFormatDialog aFunction)
+	{
+	TParaFormatMask mask;
+	TParaFormatMask undeterminedMask;  // always NULL for these calls
+	CParaFormat* format=CParaFormat::NewLC();  // !! could use 1 on the stack for some
+	CParaFormatLayer* layer=GetParaLayerAndFormattingL(*format,mask);
+//	CEikDialog* dialog=NULL;
+	switch(aFunction)
+		{
+		case EIndentsDialog:
+		case ETabsDialog:
+			{
+			TPageSpec pageSpec=iPrintSetup->PrinterDevice()->CurrentPageSpecInTwips();
+			TInt width=pageSpec.iPortraitPageSize.iWidth;
+			if (pageSpec.iOrientation==TPageSpec::ELandscape)
+				width=pageSpec.iPortraitPageSize.iHeight;
+			width-=(iPrintSetup->iPageMarginsInTwips.iMargins.iLeft+iPrintSetup->iPageMarginsInTwips.iMargins.iRight);
+			if (aFunction==ETabsDialog)
+				{
+				(void)CEikTabsDialog::RunDlgLD(format, mask, undeterminedMask, width);
+				}
+			else
+				{
+				(void)CEikIndentDialog::RunDlgLD(format, mask, undeterminedMask, width);
+				}
+			break;
+			}
+		case EBordersDialog:
+			(void)CEikBorderDialog::RunDlgLD(format, mask, undeterminedMask);
+			break;
+		case EAlignmentDialog:
+			(void)CEikAlignDialog::RunDlgLD(format,mask,undeterminedMask);
+			break;
+		case ELineSpacingDialog:
+			(void)CEikSpaceDialog::RunDlgLD(format,mask,undeterminedMask);
+			break;
+		}
+	layer->SetL(format,mask);
+	CleanupStack::PopAndDestroy();  // format
+	}
+
+
+void CWordStyleFormatDialog::RunFontDialogL()
+	{
+	TCharFormat charFormat;
+	TCharFormatMask charMask;
+	CCharFormatLayer* charLayer=NULL;
+	if (iNormalStyle)
+		{
+		charLayer=CONST_CAST(CCharFormatLayer*,iText->GlobalCharFormatLayer());
+		charLayer->SenseEffective(charFormat);  // used to seed the dialog
+		charLayer->Sense(charFormat,charMask);  // gets the mask
+		}
+	else
+		{
+		charLayer=iParagraphStyle->CharFormatLayer();
+		charLayer->SenseEffective(charFormat);
+		charLayer->Sense(charFormat,charMask);
+		}
+	if (!CEikFontDialog::RunDlgLD(charFormat, charMask, EGulNoSymbolFonts, iCoeEnv->ScreenDevice()))
+		return;
+	charLayer->SetL(charFormat,charMask);
+	}
+
+void CWordStyleFormatDialog::SetEmphasis(CCoeControl* /*aMenuControl*/,TBool /*aEmphasis*/)
+	{
+	}
+
+
+//
+// class CWordStyleHotKeyEditor
+//
+
+CWordStyleHotKeyEditor::CWordStyleHotKeyEditor(MWordHotkeyValidator* aValidator)
+:iValidator(aValidator)
+	{}
+
+
+TKeyResponse CWordStyleHotKeyEditor::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+	{
+	if (aType!=EEventKey)
+		return EKeyWasNotConsumed;
+	//
+	TChar hotkey=aKeyEvent.iCode;
+	if (hotkey==EKeyUpArrow || hotkey==EKeyDownArrow || hotkey==EKeyLeftArrow || hotkey==EKeyRightArrow)
+		return EKeyWasNotConsumed;
+	//
+	TKeyEvent event=aKeyEvent;
+	if (!iValidator->ValidateHotkey(event))
+		return EKeyWasConsumed;
+	//
+	return CEikCharEditor::OfferKeyEventL(event,aType);
+	}