diff -r 000000000000 -r 2f259fa3e83a uifw/eikctl/src/EIKGTED.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/eikctl/src/EIKGTED.CPP Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,608 @@ +/* +* Copyright (c) 1997-1999 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include +#include +#include +#include +#include +#include +#include "EIKDLGTB.H" +#include +#include + +#include +EXPORT_C CEikGlobalTextEditor::CEikGlobalTextEditor() + { + AKNTASHOOK_ADD( this, "CEikGlobalTextEditor" ); + } + +EXPORT_C CEikGlobalTextEditor::CEikGlobalTextEditor(const TGulBorder& aBorder) + : CEikEdwin(aBorder) + { + AKNTASHOOK_ADD( this, "CEikGlobalTextEditor" ); + } + +EXPORT_C CEikGlobalTextEditor::~CEikGlobalTextEditor() + { + AKNTASHOOK_REMOVE(); + delete iFindList; + delete iReplaceList; + delete iFindModel; + if (~iEdwinUserFlags&EKeepDocument) + { + delete iParaFormatLayer; + delete iCharFormatLayer; + } + delete iLineCursor; + } + +EXPORT_C void CEikGlobalTextEditor::ConstructL(const CCoeControl* aParent,TInt aNumberOfLines,TInt aTextLimit, + TInt aEdwinFlags,TInt aFontControlFalgs, + TInt aFontNameFlags) + { + iNumberOfLines=aNumberOfLines; + iTextLimit=aTextLimit; + iEdwinUserFlags|=aEdwinFlags; + iFontControlFlags=aFontControlFalgs; + iFontNameFlags=aFontNameFlags; + if (aParent) + SetContainerWindowL(*aParent); + else + SetContainerWindowL(); + BaseConstructL(); + } + +EXPORT_C void CEikGlobalTextEditor::BaseConstructL() + { + if (iEdwinUserFlags&EEikEdwinAlternativeWrapping) + SetAvkonWrap(EFalse); + else + SetAvkonWrap(ETrue); // added to make changes in Edwin spacing work. JIn + if (iEdwinUserFlags&ELineCursor) + SetLineCursorBitmapL(NULL); + if (iEdwinUserFlags&EUserSuppliedText) + return; + iParaFormatLayer=CEikonEnv::NewDefaultParaFormatLayerL(); + iCharFormatLayer=CEikonEnv::NewDefaultCharFormatLayerL(); + TCharFormat charFormat; + TCharFormatMask charMask; + iCharFormatLayer->Sense(charFormat,charMask); + charFormat.iFontSpec.iTypeface.SetAttributes(FontUtils::TypefaceAttributes(*(iEikonEnv->ScreenDevice()),charFormat.iFontSpec.iTypeface.iName)); + charMask.SetAttrib(EAttFontTypeface); + iCharFormatLayer->SetL(charFormat,charMask); + CreateTextAndLayoutL(iParaFormatLayer,iCharFormatLayer); + EnableCcpuSupportL(ETrue); + if (AknEdwinFlags()&EAknEditorFlagEnableScrollBars) + { +// Added to have scroll-bars in edwins. JIn + CEikScrollBarFrame* scrollFrame = CreatePreAllocatedScrollBarFrameL(); + scrollFrame->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); + scrollFrame->SetScrollBarFrameFlags(CEikScrollBarFrame::EVVisible); + } + CheckEdwinExtensionL(); + __ASSERT_DEBUG(EdwinExtension()->FormAccessor(), Panic(EEikPanicNullPointer)); + // overwrites value set in CEikEdwin constructor + EdwinExtension()->FormAccessor()->SetEdwin(this); + } + +EXPORT_C void CEikGlobalTextEditor::ConstructFromResourceL(TResourceReader& aReader) + { + iSize.iWidth=aReader.ReadInt16(); + TInt height=aReader.ReadInt16(); + iNumberOfLines=aReader.ReadInt16(); + iTextLimit=aReader.ReadInt16(); + iEdwinUserFlags|=aReader.ReadInt32(); + (TInt&)iFontControlFlags=aReader.ReadInt16(); + (TInt&)iFontNameFlags=aReader.ReadInt16(); + ReadAknResourceL(aReader); + BaseConstructL(); + iSize.iHeight=height; + } + +EXPORT_C void CEikGlobalTextEditor::SetButtonGroup(CCoeControl* /*aButtonGroup*/) + { + // This method is hollowed out as this feature is not supported in Avkon + } + +EXPORT_C void CEikGlobalTextEditor::SetLineCursorBitmapL(CFbsBitmap* /*aBitmap*/) + { + // This method is hollowed out as this feature is not supported in Avkon + } + +EXPORT_C TInt CEikGlobalTextEditor::LineCursorWidth() const + { + return iLineCursorWidth; + } + +EXPORT_C void CEikGlobalTextEditor::ActivateL() + { + if (!iTextView) + CreateTextViewL(); + iTextView->SetLineCursorBitmap(iLineCursor); + CEikEdwin::ActivateL(); + UpdateButtonGroup(); + } + +EXPORT_C TBool CEikGlobalTextEditor::DoFindL() + { + if (iFindModel->iText.Length()>TextLength()) + { + DisplayFindTextNotFound(iFindModel->iText); + return EFalse; + } + TBool found=EFalse; + TRAPD(ret,found=FindL(&iFindModel->iText,iFindModel->iFlags)); + if (ret!=KErrNone) + User::Leave(ret); + else + { + if (!found) + { + DisplayFindTextNotFound(iFindModel->iText); + return EFalse; + } + } + return ETrue; + } + +void CEikGlobalTextEditor::CheckDocumentNotEmptyL() + { + // For Avkon, the feature is not supported, so no localized text available + if (!TextLength()) + iEikonEnv->LeaveWithInfoMsg(0); + } + +void CEikGlobalTextEditor::CreateFindModelL() + { + if (!iFindModel) + { + iFindModel=new(ELeave) SEdwinFindModel; + iFindModel->iFlags=0; + } + if (!iFindList) + iFindList=new(ELeave) CDesCArrayFlat(5); + if (!iReplaceList) + iReplaceList=new(ELeave) CDesCArrayFlat(5); + } + +EXPORT_C void CEikGlobalTextEditor::RunFindDialogL() + { + CreateFindModelL(); + CheckDocumentNotEmptyL(); + GetTextForFindL(); + iFindModel->iFlags&=(~EFindAgain); + ASSERT(iEikonEnv->CDlgDialogFactory()); + if(iEikonEnv->CDlgDialogFactory()->RunEdwinFindDlgLD(iFindModel, iFindList)) + DoFindL(); + } + +EXPORT_C void CEikGlobalTextEditor::RunFindAgainDialogL() + { + CheckDocumentNotEmptyL(); + CreateFindModelL(); + if (!iFindModel->iText.Length()) + GetTextForFindL(); + if (!iFindModel->iText.Length()) + RunFindDialogL(); + else + { + iFindModel->iFlags|=EFindAgain; + DoFindL(); + } + } + +void CEikGlobalTextEditor::GetTextForFindL() + { + TInt pos=0; + TBuf* findText=new(ELeave) TBuf; + CleanupStack::PushL(findText); + GetFindText(findText); + TInt retcode=iFindList->Find(*findText,pos); + if (retcode) + iFindList->InsertL(0,*findText); + iFindModel->iText=*findText; + CleanupStack::PopAndDestroy(); + } + +EXPORT_C void CEikGlobalTextEditor::InitFindL(SEdwinFindModel*& aModel,CDesCArray*& aFindList,CDesCArray*& aReplaceList) + { + CreateFindModelL(); + CheckDocumentNotEmptyL(); + GetTextForFindL(); + aModel=iFindModel; + aFindList=iFindList; + aReplaceList=iReplaceList; + } + +EXPORT_C void CEikGlobalTextEditor::RunReplaceDialogL() + { + CreateFindModelL(); + CheckDocumentNotEmptyL(); + GetTextForFindL(); + MEikCDlgDialogFactory* dialogFactory = iEikonEnv->CDlgDialogFactory(); + ASSERT(dialogFactory); + if(dialogFactory->RunEdwinReplaceDlgLD(iFindModel, iFindList, iReplaceList)) + { + if (!DoFindL()) + return; + if(!(dialogFactory->RunEdwinReplaceOptionDlgLD(this,iFindModel))) + { + if (SelectionLength()) + ClearSelectionL(); + return; + } + if (iFindModel->iReplaceOption==EReplaceAll) + { // display busy message + iEikonEnv->BusyMsgL(R_EIK_TBUF_REPLACING_BUSYMSG,500000); // 0.5 seconds + DrawNow(); + ForceScrollBarUpdateL(); + ReplaceAllL(iFindModel); + iEikonEnv->BusyMsgCancel(); + } + iEikonEnv->InfoMsg(R_EIK_TBUF_REPLACE_FINISHED); + if (SelectionLength()) + ClearSelectionL(); + } + } + +EXPORT_C TKeyResponse CEikGlobalTextEditor::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + { + if (iEdwinUserFlags&EDisplayOnly) + return EKeyWasConsumed; + if (!(aKeyEvent.iModifiers&EModifierCtrl) || aKeyEvent.iModifiers&EModifierPureKeycode) + return CEikEdwin::OfferKeyEventL(aKeyEvent,aType); + TBool formatChanged=ETrue; + TFontStyleFlags fontFlag=EStandard; + TBuf<24> buf; + if (aKeyEvent.iModifiers&EModifierShift) + iCoeEnv->ReadResource(buf,R_EIK_EDWIN_SHIFT_CTRL_HOTKEYS); + else + iCoeEnv->ReadResource(buf,R_EIK_EDWIN_CTRL_HOTKEYS); + const TInt ret=buf.Locate(TChar(aKeyEvent.iCode+'a'-1)); + switch (ret) + { + case EHotKeyBold: + CheckNotReadOnlyL(); + fontFlag=EBold; + break; + case EHotKeyItalic: + CheckNotReadOnlyL(); + fontFlag=EItalic; + break; + case EHotKeyUnderline: + CheckNotReadOnlyL(); + fontFlag=EUnderline; + break; + case EHotKeyFont: + { + CheckNotReadOnlyL(); + RunFontDialogL(iFontNameFlags,iGraphicsDevice, iFontControlFlags); + } + break; + default: + formatChanged=EFalse; + } + if (formatChanged) + { + if (fontFlag!=EStandard && !(aKeyEvent.iModifiers&EModifierShift)) + BoldItalicUnderlineEventL(fontFlag); + if (iButGroup) + UpdateButtonGroup(); + return EKeyWasConsumed; + } + return CEikEdwin::OfferKeyEventL(aKeyEvent,aType); + } + +EXPORT_C void CEikGlobalTextEditor::UpdateButtonGroup() + { + if (!iButGroup) + return; + TCharFormat charFormat; + TCharFormatMask mask; + const TCursorSelection selection=Selection(); + GlobalText()->GetCharFormat(charFormat,mask,selection.LowerPos(),selection.Length()); + CEikButtonBase* but=STATIC_CAST(CEikLabeledButton*,iButGroup->ControlById(EEikCidFontBoldBut))->Button(); + if (but) + { + CEikButtonBase::TState state=((charFormat.iFontSpec.iFontStyle.StrokeWeight()==EStrokeWeightBold)? + CEikButtonBase::ESet : CEikButtonBase::EClear); + if (but->State()!=state) + { + but->SetState(state); + but->DrawNow(); + } + } + but=STATIC_CAST(CEikLabeledButton*,iButGroup->ControlById(EEikCidFontItalicBut))->Button(); + if (but) + { + CEikButtonBase::TState state=((charFormat.iFontSpec.iFontStyle.Posture()==EPostureItalic)? + CEikButtonBase::ESet : CEikButtonBase::EClear); + if (but->State()!=state) + { + but->SetState(state); + but->DrawNow(); + } + } + but=STATIC_CAST(CEikLabeledButton*,iButGroup->ControlById(EEikCidFontUnderlineBut))->Button(); + if (but) + { + CEikButtonBase::TState state=((charFormat.iFontPresentation.iUnderline==EUnderlineOn)? + CEikButtonBase::ESet : CEikButtonBase::EClear); + if (but->State()!=state) + { + but->SetState(state); + but->DrawNow(); + } + } + } + +EXPORT_C void CEikGlobalTextEditor::SetGraphicsDevice(CGraphicsDevice* aGraphicsDevice) + { + iGraphicsDevice=aGraphicsDevice; + } + +EXPORT_C TBool CEikGlobalTextEditor::RunFontDialogL(TInt aFontDialogFlags,CGraphicsDevice* aGraphicsDevice, + TInt aFontControlFlags) + { + TCursorSelection selection=Selection(); + TInt selectionLength=selection.Length(); + //get backgroundcolor + CParaFormat paraFormat; + TParaFormatMask variesMask; + GlobalText()->GetParaFormatL(¶Format,variesMask,selection.LowerPos(),selectionLength); + + TCharFormat charFormat; + TCharFormatMask charMask; + TCharFormatMask charUndeterminedMask; + TBuf buf; + GlobalText()->GetCharFormat(charFormat,charUndeterminedMask,selection.LowerPos(),selectionLength); + if (selectionLength>KTextSelectionMaxLen) + selectionLength=KTextSelectionMaxLen; + GlobalText()->Extract(buf,selection.LowerPos(),selectionLength); + TInt offset=buf.Locate(CEditableText::EParagraphDelimiter); + if (offset!=KErrNotFound) // chop off buf if paragraph end + buf.SetLength(offset); + TCharFormat originalFormat=charFormat; + TCharFormatMask oldcharMask; + ASSERT(iEikonEnv->CDlgDialogFactory()); + TBool dlg = iEikonEnv->CDlgDialogFactory()->RunFontDlgLD(charFormat,charMask,charUndeterminedMask,buf, + aFontDialogFlags,aGraphicsDevice,aFontControlFlags, + paraFormat.iFillColor); + if(!dlg || (originalFormat.IsEqual(charFormat) && charMask==oldcharMask)) + return(EFalse); + + ApplyCharFormatL(charFormat,charMask); + UpdateButtonGroup(); + return(ETrue); + } + +EXPORT_C void CEikGlobalTextEditor::ApplyCharFormatL(TCharFormat& aCharFormat,TCharFormatMask& aCharMask) + { + const TCursorSelection selection=Selection(); + GlobalText()->ApplyCharFormatL(aCharFormat,aCharMask,selection.LowerPos(),selection.Length()); + if (iEdwinInternalFlags&ERichText) + { + if (selection.Length()==0) + iTextView->MatchCursorHeightL(aCharFormat.iFontSpec); + else + iTextView->HandleRangeFormatChangeL(selection,EFalse); + } + else + { + TViewYPosQualifier yPosQualifier; + yPosQualifier.SetMakeLineFullyVisible(); + iTextView->HandleGlobalChangeL(yPosQualifier); + } + UpdateScrollBarsL(); + ReportEdwinEventL(MEikEdwinObserver::EEventFormatChanged); + } + +EXPORT_C void CEikGlobalTextEditor::ApplyParaFormatL(CParaFormat* aParaFormat,TParaFormatMask& aParaMask) + { + TCursorSelection selection=Selection(); + GlobalText()->ApplyParaFormatL(aParaFormat,aParaMask,selection.LowerPos(),selection.Length()); + if (iEdwinInternalFlags&ERichText) + iTextView->HandleRangeFormatChangeL(selection,ETrue); + else + { + TViewYPosQualifier yPosQualifier; + yPosQualifier.SetMakeLineFullyVisible(); + iTextView->HandleGlobalChangeL(yPosQualifier); // !! NotifyForwardChangedL() may be better for rich text case + } + UpdateScrollBarsL(); + ReportEdwinEventL(MEikEdwinObserver::EEventFormatChanged); + } + + +EXPORT_C void CEikGlobalTextEditor::RunParaDialogsL(TInt aCommand) + { + CParaFormat* paraFormat=CParaFormat::NewLC(); + TParaFormatMask paraMask; + TParaFormatMask paraUndeterminedMask; + TCursorSelection selection=Selection(); + TInt selectionLength=selection.Length(); + GlobalText()->GetParaFormatL(paraFormat,paraUndeterminedMask,selection.LowerPos(),selectionLength); + MEikCDlgDialogFactory* dialogFactory = iEikonEnv->CDlgDialogFactory(); + ASSERT(dialogFactory); + TBool dlg; + switch (aCommand) + { + case EEikCmdParaAlign: + dlg = dialogFactory->RunAlignDlgLD(paraFormat,paraMask, paraUndeterminedMask); + break; + case EEikCmdParaSpacing: + dlg = dialogFactory->RunSpaceDlgLD(paraFormat,paraMask, paraUndeterminedMask); + break; + case EEikCmdParaBorder: + { + dlg = dialogFactory->RunBorderDlgLD(paraFormat,paraMask, paraUndeterminedMask); + break; + } + default: + CleanupStack::PopAndDestroy(); + return; + } + if(dlg) + ApplyParaFormatL(paraFormat,paraMask); + CleanupStack::PopAndDestroy(); + } + +EXPORT_C void CEikGlobalTextEditor::RunTabsDialogL(TInt aPageWidth) + { + CParaFormat* paraFormat=CParaFormat::NewLC(); + TParaFormatMask paraMask; + TParaFormatMask paraUndeterminedMask; + TCursorSelection selection=Selection(); + TInt selectionLength=selection.Length(); + GlobalText()->GetParaFormatL(paraFormat,paraUndeterminedMask,selection.LowerPos(),selectionLength); + ASSERT(iEikonEnv->CDlgDialogFactory()); + if(iEikonEnv->CDlgDialogFactory()->RunTabsDlgLD(paraFormat,paraMask, paraUndeterminedMask, aPageWidth)) + ApplyParaFormatL(paraFormat,paraMask); + CleanupStack::PopAndDestroy(); + } + +EXPORT_C void CEikGlobalTextEditor::RunIndentsDialogL(TInt aPageWidth) + { + CParaFormat* paraFormat=CParaFormat::NewLC(); + TParaFormatMask paraMask; + TParaFormatMask paraUndeterminedMask; + TCursorSelection selection=Selection(); + TInt selectionLength=selection.Length(); + GlobalText()->GetParaFormatL(paraFormat,paraUndeterminedMask,selection.LowerPos(),selectionLength); + ASSERT(iEikonEnv->CDlgDialogFactory()); + if(iEikonEnv->CDlgDialogFactory()->RunIndentDlgLD(paraFormat,paraMask, paraUndeterminedMask, aPageWidth)) + ApplyParaFormatL(paraFormat,paraMask); + CleanupStack::PopAndDestroy(); + } + +EXPORT_C void CEikGlobalTextEditor::BoldItalicUnderlineEventL(TInt aFontFlag) + { + TCharFormat charFormat; + TCharFormatMask applyMask; + const TCursorSelection selection=Selection(); + const TInt selLength=selection.Length(); + TInt startPos,wordLength; + GetWordInfo(selection.iAnchorPos,startPos,wordLength); + if (selLength) + GlobalText()->GetCharFormat(charFormat,applyMask,selection.LowerPos(),selLength); + else if (selection.iCursorPos==startPos+wordLength) + GlobalText()->GetCharFormat(charFormat,applyMask,startPos+wordLength,0); + else + GlobalText()->GetCharFormat(charFormat,applyMask,selection.iCursorPos,0); + applyMask.ClearAll(); + // + switch (aFontFlag) + { + case EBold: + charFormat.iFontSpec.iFontStyle.SetStrokeWeight(charFormat.iFontSpec.iFontStyle.StrokeWeight()? EStrokeWeightNormal : EStrokeWeightBold); + applyMask.SetAttrib(EAttFontStrokeWeight); + break; + case EItalic: + charFormat.iFontSpec.iFontStyle.SetPosture(charFormat.iFontSpec.iFontStyle.Posture()? EPostureUpright : EPostureItalic); + applyMask.SetAttrib(EAttFontPosture); + break; + case EUnderline: + charFormat.iFontPresentation.iUnderline=(charFormat.iFontPresentation.iUnderline)?EUnderlineOff : EUnderlineOn; + applyMask.SetAttrib(EAttFontUnderline); + break; + default: + return; + } + if (selLength) + ApplyCharFormatL(charFormat,applyMask); + else + { + if (selection.iCursorPos==startPos+wordLength && iEdwinInternalFlags&ERichText) + GlobalText()->ApplyCharFormatL(charFormat,applyMask,startPos+wordLength,0); + else + { + const TInt length=(selection.iCursorPos==startPos? 0 : wordLength); + GlobalText()->ApplyCharFormatL(charFormat,applyMask,startPos,length); + if (iEdwinInternalFlags&ERichText) + iTextView->HandleRangeFormatChangeL(TCursorSelection(startPos,startPos+wordLength),EFalse); + else + { + TViewYPosQualifier yPosQualifier; + yPosQualifier.SetMakeLineFullyVisible(); + iTextView->HandleGlobalChangeL(yPosQualifier); + } + UpdateScrollBarsL(); + } + ReportEdwinEventL(MEikEdwinObserver::EEventFormatChanged); + } + UpdateButtonGroup(); + } + +EXPORT_C CGlobalText* CEikGlobalTextEditor::GlobalText() const + { + return((CGlobalText*)iText); + } + +EXPORT_C TBool CEikGlobalTextEditor::RunPaginateDialogL(CPrintSetup* aPrintSetup,CArrayFix* aCharsPerPage) + { + ASSERT(iEikonEnv->PrintDialogFactory()); + return (iEikonEnv->PrintDialogFactory()->RunPaginateDlgLD(this, aPrintSetup, aCharsPerPage)); + } + +/** + * Writes the internal state of the control and its components to aStream. + * Does nothing in release mode. + * Designed to be overidden and base called by subclasses. + * + * @internal + * @since App-Framework_6.1 + */ +#ifndef _DEBUG +EXPORT_C void CEikGlobalTextEditor::WriteInternalStateL(RWriteStream&) const + {} +#else +EXPORT_C void CEikGlobalTextEditor::WriteInternalStateL(RWriteStream& aWriteStream) const + { + CEikEdwin::WriteInternalStateL(aWriteStream); + } +#endif + +EXPORT_C void CEikGlobalTextEditor::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + CEikEdwin::HandlePointerEventL(aPointerEvent); + } + +EXPORT_C void* CEikGlobalTextEditor::ExtensionInterface( TUid /*aInterface*/ ) + { + return NULL; + } + +EXPORT_C void CEikGlobalTextEditor::Reserved_2() + {} + +EXPORT_C void CEikGlobalTextEditor::Reserved_3() + {}