--- /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);
+ }