diff -r 000000000000 -r 2f259fa3e83a uifw/eikctl/src/EIKSECED.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/eikctl/src/EIKSECED.CPP Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,1296 @@ +/* +* 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: +* +*/ + + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include + +#include +#include + +#define KSecretChar '*' +#define KSecretCharAsString "*" +#define KWait 1000000 + +_LIT(KSecretCharString, "*******************************"); + +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 +#include +#include +#include +#include + +// Helper class that monitor redirection changes +class CRedirectionListener : public CBase, public MAknTransitionUtilsObserver + { +private: + TInt AknTransitionCallback( TInt aEvent, TInt aState, + const TDesC8* /*aParams*/ ) + { + if ( aEvent == CAknTransitionUtils::EEventWsBufferRedirection ) + { + iRedirected = aState; + if ( iCursorEnabled ) + { + if ( iRedirected ) + { + if ( iWg && iCursorStatus ) + { + iWg->CancelTextCursor(); + } + iCursorStatus = EFalse; + } + else + { + iOwner.EnableCursor( ETrue ); + } + } + } + return 0; + } + +public: + CRedirectionListener( CEikSecretEditor& aOwner ) : iOwner( aOwner ) + { + RProperty::Get( KPSUidAvkonDomain, KAknTfxServerRedirectionStatus, + iRedirected ); + iRedirected &= ETfxScreenRedirected; + } + + inline void EnableCursor() + { + iCursorEnabled = ETrue; + } + + void DisableCursor() + { + if ( iWg && iCursorStatus ) + { + iWg->CancelTextCursor(); + } + iCursorEnabled = EFalse; + iCursorStatus = EFalse; + } + + void UpdateCursor( const TTextCursor& aCursor ) + { + TInt redirected; + RProperty::Get( KPSUidAvkonDomain, KAknTfxServerRedirectionStatus, + redirected ); + redirected &= ETfxScreenRedirected; + if ( redirected != iRedirected && redirected ) + { + AknTransitionCallback( CAknTransitionUtils::EEventWsBufferRedirection, + 1, NULL ); + return; + } + + iRedirected = redirected; + + if ( iCursorEnabled && iWg && iWindow && !iRedirected ) + { + iWg->SetTextCursor( *iWindow, iOwner.CursorPos(), + aCursor ); + iCursorStatus = ETrue; + } + } + + inline void SetWindows( RWindowGroup* aWg, RWindowBase* aWindow ) + { + iWg = aWg; + iWindow = aWindow; + } +private: + TBool iRedirected; + TBool iCursorEnabled; + TBool iCursorStatus; + RWindowGroup* iWg; + RWindowBase* iWindow; + CEikSecretEditor& iOwner; + }; +#endif + +/** +* Internal extension class for CEikSecretEditor. +* +* @since 2.0 +* +* @internal +*/ +class CEikSecretEditorExtension : public CBase + { +public: // Construction and destruction + + CEikSecretEditorExtension() + :iAknSkinColorIndex(KErrNotFound), + iSkinIdForBgColor(KErrNotFound), + iFeedback(MTouchFeedback::Instance()) + { + } + + ~CEikSecretEditorExtension() + { + delete iExtendedInputCapabilitiesProvider; + delete iExtendedInputCapabilities; + } + + static CEikSecretEditorExtension* NewL() + { + CEikSecretEditorExtension* self = + new ( ELeave ) CEikSecretEditorExtension; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + + void ConstructL() + { + iExtendedInputCapabilities = + CAknExtendedInputCapabilities::NewL(); + TUint cap( iExtendedInputCapabilities->Capabilities() ); + cap |= CAknExtendedInputCapabilities::EInputEditorAlignBidi; + iExtendedInputCapabilities->SetCapabilities( cap ); + + iExtendedInputCapabilitiesProvider = + new ( ELeave ) CAknExtendedInputCapabilities:: + CAknExtendedInputCapabilitiesProvider; + + iExtendedInputCapabilitiesProvider->SetExtendedInputCapabilities( + iExtendedInputCapabilities ); + + iExtendedInputCapabilities->SetEditorType( + CAknExtendedInputCapabilities::EEikSecretEditorBased ); + } + +public: // Data + MAknsControlContext* iBgContext; // Not owned + TBool iBgContextSet; + TInt iAknSkinColorIndex; + TInt iSkinIdForBgColor; + MTouchFeedback* iFeedback; + + /** + * Pointer to a CAknExtendedInputCapabilities. + * Own. + */ + CAknExtendedInputCapabilities* iExtendedInputCapabilities; + + /** + * Pointer to a extended input capabilities object provider. + * Own. + */ + CAknExtendedInputCapabilities::CAknExtendedInputCapabilitiesProvider* + iExtendedInputCapabilitiesProvider; + + TInt iDisablePenInput; // Mainly for 0/1 values + TTextCursor iCursor; + RWindowGroup* iWg; + RWindowBase* iWindow; + TRect iTextRect; + TBool iCursorEnabled; + TBool iWindowSet; + TBool iLaunchPenInputAutomatic; + TBool iPartialScreenInput; + }; + +EXPORT_C void CEikSecretEditor::AknSetFont(const CFont &aFont) + { + iFont = &aFont; + iCharWidth=iFont->TextWidthInPixels(TPtrC((TText*)KSecretCharAsString, 1)); + CalculateAscent(); + } + +EXPORT_C void CEikSecretEditor::AknSetAlignment(const CGraphicsContext::TTextAlign &aAlign) { iAlign = aAlign; } + +EXPORT_C void CEikSecretEditor::SetDefaultInputMode(TInt aInputMode) + { + if (iFepState) + { + if ( aInputMode != EAknEditorNumericInputMode ) + { + aInputMode = EAknEditorSecretAlphaInputMode; + } + + CAknEdwinState* edwinState = STATIC_CAST(CAknEdwinState*, iFepState); + edwinState->SetDefaultInputMode(aInputMode); + edwinState->SetCurrentInputMode(aInputMode); + } + } + +EXPORT_C CEikSecretEditor::CEikSecretEditor() + : CEikBorderedControl(TGulBorder(TGulBorder::ESingleGray)) + { + __DECLARE_NAME(_S("CEikSecretEditor")); + const CFont* font=iCoeEnv->NormalFont(); + iFont = font; + iCharWidth=font->TextWidthInPixels(TPtrC((TText*)KSecretCharAsString, 1)); + CalculateAscent(); + iAlign = CGraphicsContext::ELeft; + AKNTASHOOK_ADD( this, "CEikSecretEditor" ); + } + +EXPORT_C CEikSecretEditor::~CEikSecretEditor() + { + AKNTASHOOK_REMOVE(); +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + CRedirectionListener* listener = ( CRedirectionListener* ) + CAknTransitionUtils::GetData( (TInt) this ); + if ( listener ) + { + CAknTransitionUtils::RemoveObserver( listener, + CAknTransitionUtils::EEventWsBufferRedirection ); + CAknTransitionUtils::RemoveData( (TInt) this ); + delete listener; + } +#endif + delete iInlineEditText; + delete iFepState; + delete iTimer; + delete iSecCharArr; + delete iExtension; + } + +EXPORT_C void CEikSecretEditor::ConstructFromResourceL(TResourceReader& aReader) + // + // Construct from resource + // + { + iMaxLen=aReader.ReadUint16(); + __ASSERT_ALWAYS(iMaxLen<=EMaxSecEdSecArrayLength, Panic(EEikPanicSecretEditorTooLong)); + iSecCharArr = HBufC::NewL( EMaxSecEdSecArrayLength ); + iFepState = CreateFepStateL(); + + if ( !iExtension ) + { + iExtension = CEikSecretEditorExtension::NewL(); + } + InitCRedirectionListenerL(); + } + +void CEikSecretEditor::StartTimer() + { + iTimer->Start(KWait, KWait, TCallBack(TimerCallback, this)); + } + +TInt CEikSecretEditor::TimerCallback(TAny* aThis) + { + static_cast(aThis)->Update(); + return NULL; + } + +EXPORT_C void CEikSecretEditor::Update() + { + if ( iTimer ) + { + iTimer->Cancel(); + } + InsertSecretChar(); + DrawDeferred(); + } + +void CEikSecretEditor::OverflowAlert() +/** +Display alert to user, when character is entered but there is no more room in the field. +Current implementation is to play a sound alert. +@publishedComponent +*/ + { + CAknKeySoundSystem* soundPlayer = (static_cast(CEikonEnv::Static()->AppUi()))->KeySounds(); + if(soundPlayer) + { + soundPlayer->PlaySound(EAvkonSIDWarningTone); + } + }; + +EXPORT_C TKeyResponse CEikSecretEditor::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + // + // Respond to key presses + // + { + if ( aType != EEventKey ) + { + return EKeyWasConsumed; + } + TInt code=aKeyEvent.iCode; + if ((code==EKeyUpArrow) || (code==EKeyDownArrow) || (aKeyEvent.iScanCode==EStdKeyHash) || + (code==EKeyLeftArrow) || (code==EKeyRightArrow)) + return(EKeyWasNotConsumed); + + EnableCursor( EFalse ); + + if ( ( codeLength()Length()>0 && (code==EKeyBackspace || (code==EKeyF20 && !iBufferFull))) + { + iBufferFull=EFalse; + + TPtr secCharArrAppend = iSecCharArr->Des(); + secCharArrAppend.Delete(iSecCharArr->Length() - 1,1); + Update(); + // --------------- + // If the text doesn't fit on line and a user presses backspace + // it must be illustrated to the user that a char was deleted + // (instead of just showing max amount of KSecretChars). + if ( iSecCharArr->Length() >= CharsFitOnEditor() ) + { + if (!iTimer) + iTimer=CPeriodic::NewL(CActive::EPriorityLow); + if (iTimer->IsActive()) + Update(); + + iBuf.Delete(iBuf.Length() - 1,1); + DrawDeferred(); + StartTimer(); + } + //----------- + if ( iSecCharArr->Length() == 0 ) + { + EnableCursor( ETrue ); + } + ReportEventL(MCoeControlObserver::EEventStateChanged); + } + if ( code != EKeyF20 ) + { + ReportUpdate(); + } + return EKeyWasConsumed; + } + +EXPORT_C TSize CEikSecretEditor::MinimumSize() + // + // Returns the minimum size needed to display + // + { + TSize size=iBorder.SizeDelta(); + + const CAknLayoutFont* layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( iFont ); + if ( layoutFont ) + { + size.iHeight += layoutFont->TextPaneHeight(); + } + else + { + size.iHeight += iFont->HeightInPixels(); + } + TAknTextDecorationMetrics decoration( iFont ); + TInt leftMargin(0); + TInt rightMargin(0); + decoration.GetLeftAndRightMargins( rightMargin, leftMargin ); + size.iWidth+=iCharWidth*(iMaxLen+1)+rightMargin + leftMargin; // 1 is for the cursor + + return size; + } + +EXPORT_C TCoeInputCapabilities CEikSecretEditor::InputCapabilities() const + { + TCoeInputCapabilities inputCaps( + TCoeInputCapabilities::ESecretText|TCoeInputCapabilities::ENavigation, + const_cast( this ), + NULL ); + + if ( iExtension ) + { + inputCaps.SetObjectProvider( iExtension->iExtendedInputCapabilitiesProvider ); + } + + return inputCaps; + } + +EXPORT_C void CEikSecretEditor::GetText(TDes& aText) const + // + // Get the actual text typed + // + { + // Check the buffer passed relative to the maximum number of characters enterable. + // This will cause the panic to occur earlier and not depend upon how many characters + // have actually been entered + __ASSERT_ALWAYS( aText.MaxLength() >= iMaxLen, Panic(EEikPanicSecretEditorTooLong)); + aText.Copy( *iSecCharArr ); + } + +EXPORT_C void CEikSecretEditor::SetText( const TDesC& aText ) + { + // + // Initialize editor (the buffer and the display) + // + __ASSERT_ALWAYS( aText.Length() <= iMaxLen, Panic(EEikPanicSecretEditorTooLong)); + + TPtr secCharArrAppend = iSecCharArr->Des(); + secCharArrAppend.Zero(); + iBuf.Zero(); + secCharArrAppend.Append( aText ); + InsertSecretChar(); + ReportUpdate(); + DrawDeferred(); + UpdateCursor(); + } + +EXPORT_C void CEikSecretEditor::InitializeDisplay( TInt aNumberOfChars ) + { + // + // Initialize display with KSecretChars, doesn't affect the actual buffer. + // + __ASSERT_ALWAYS( aNumberOfChars <= iBuf.MaxLength(), Panic(EEikPanicSecretEditorTooLong)); + Reset(); + iBuf.Fill(KSecretChar, aNumberOfChars); + ReportUpdate(); + DrawDeferred(); + } + +EXPORT_C void CEikSecretEditor::Reset() + // + // Clear the text + // + { + TPtr secCharArrAppend = iSecCharArr->Des(); + secCharArrAppend.Zero(); + iBuf.Zero(); + ReportUpdate(); + DrawDeferred(); + UpdateCursor(); + } + +EXPORT_C void CEikSecretEditor::SetMaxLength(TInt aMaxLength) + // + // Set the maximum number of characters for the secret editor + // + { + iMaxLen=aMaxLength; + __ASSERT_ALWAYS(iMaxLen<=EMaxSecEdSecArrayLength, Panic(EEikPanicSecretEditorTooLong)); + + // Docs claim that CEikSecretEditor's 2nd stage construction can be + // done either by ConstructFromResourceL() or SetMaxLength(). + // We'll have to at least try to create extension here, sadly adding to the + // iExtension creation mess already prevalent in this class. + if ( !iExtension ) + { + TRAP_IGNORE ( iExtension = CEikSecretEditorExtension::NewL() ); + } + } + +EXPORT_C void CEikSecretEditor::Draw(const TRect& /*aRect*/) const + // + // Draw the whole secret editor + // + { + CWindowGc& gc=SystemGc(); + + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = NULL; + + TRgb textColor = iEikonEnv->ControlColor(EColorControlText, *this); + TRgb bgColor = iEikonEnv->ControlColor(EColorControlBackground, *this); + + if( iExtension && iExtension->iBgContextSet ) + { + cc = iExtension->iBgContext; + } + else + { + cc = AknsDrawUtils::ControlContext( this ); + } + + if (iExtension) + { + AknsUtils::GetCachedColor(skin, textColor, KAknsIIDQsnTextColors, iExtension->iAknSkinColorIndex); + AknsUtils::GetCachedColor(skin, bgColor, KAknsIIDQsnTextColors, iExtension->iSkinIdForBgColor); + } + + TBool drawn(EFalse); + + const MCoeControlBackground* backgroundDrawer = FindBackground(); + + if ( !backgroundDrawer ) + { + if ( CAknEnv::Static()->TransparencyEnabled() ) + { + drawn = AknsDrawUtils::Background( skin, cc, this, gc, Rect(), KAknsDrawParamNoClearUnderImage ); + } + else + { + drawn = AknsDrawUtils::Background( skin, cc, this, gc, Rect() ); + } + } + else + { + drawn = ETrue; + } + + if( drawn ) + { + gc.SetBrushStyle(CGraphicsContext::ENullBrush); + } + else + { + gc.SetBrushStyle(CGraphicsContext::ESolidBrush); + gc.SetBrushColor(bgColor); // KEikSecretEditorBackgroundColor + iBorder.Draw(SystemGc(), Rect()); + } + + gc.SetPenColor(textColor); + gc.UseFont(iFont); + + TSize size=iBorder.SizeDelta(); + + if ( iRevealSecretText ) + { + gc.DrawText( iSecCharArr->Des(), iExtension->iTextRect, + iAscent, iAlign, 0 ); + } + else + { + gc.DrawText(iBuf, iExtension->iTextRect, iAscent, iAlign, 0); + } + + gc.DiscardFont(); + } + +void CEikSecretEditor::InsertChar() + { + InsertSecretChar(); + TInt charsFit = CharsFitOnEditor(); + TInt pos = (iSecCharArr->Length() < charsFit ? iSecCharArr->Length()-1 : charsFit-1); + if ( pos < 0 ) + return; + iBuf.Replace(pos, 1, iSecCharArr->Right(1)); + } + +void CEikSecretEditor::InsertSecretChar() + { + TInt charsFit = CharsFitOnEditor(); + TInt pos = (iSecCharArr->Length() < charsFit ? iSecCharArr->Length() : charsFit); + iBuf.Fill(KSecretChar, pos); + } + +TInt CEikSecretEditor::CharsFitOnEditor() const + { + TRect rect=iBorder.InnerRect(Rect()); + const CFont* font=iFont; + TInt ret = font->TextCount( KSecretCharString, rect.Width() ); + return ((ret <= 1)? ret : ret-1); // there might be chars wider than asterisk visible. + } + +void CEikSecretEditor::ReportUpdate() + { + TRAP_IGNORE ( + iExtension->iExtendedInputCapabilities->ReportEventL( + CAknExtendedInputCapabilities::MAknEventObserver::EControlContentUpdatedInternally, + NULL ); + ) + } + +EXPORT_C void CEikSecretEditor::AppendCharacterL( TInt aKeyCode ) + { // Replace this if a timer is not needed. + if (!iTimer) + iTimer=CPeriodic::NewL(CActive::EPriorityLow); + if (iTimer->IsActive()) + Update(); + + TPtr secCharArrAppend = iSecCharArr->Des(); + secCharArrAppend.Append( (TText)aKeyCode ); + iSecPos++; + InsertChar(); + DrawDeferred(); + StartTimer(); + } + +EXPORT_C void CEikSecretEditor::SizeChanged() + { + InsertSecretChar(); + //DrawNow(); + if ( iExtension ) + { + iExtension->iTextRect = iBorder.InnerRect( Rect() ); + TAknTextDecorationMetrics metrics( iFont ); + TInt topMargin(0); + TInt bottomMargin(0); + TInt leftMargin(0); + TInt rightMargin(0); + + metrics.GetTopAndBottomMargins( topMargin, bottomMargin ); + metrics.GetLeftAndRightMargins( leftMargin, rightMargin ); + + iExtension->iTextRect.iTl.iY += topMargin; + iExtension->iTextRect.iBr.iY -= bottomMargin; + iExtension->iTextRect.iTl.iX += leftMargin; + iExtension->iTextRect.iBr.iX -= rightMargin; + } + } + +/** + * Gets the list of logical colors employed in the drawing of the control, + * paired with an explanation of how they are used. Appends the list to aColorUseList. + * + * @since ER5U + */ +EXPORT_C void CEikSecretEditor::GetColorUseListL(CArrayFix& aColorUseList) const + { + CEikBorderedControl::GetColorUseListL(aColorUseList); + + TInt commonAttributes = TCoeColorUse::EContents|TCoeColorUse::EActive|TCoeColorUse::ENormal|TCoeColorUse::ENeutral; + TCoeColorUse colorUse; + + colorUse.SetLogicalColor(EColorControlText); + colorUse.SetUse(TCoeColorUse::EFore|commonAttributes); + aColorUseList.AppendL(colorUse); + + colorUse.SetLogicalColor(EColorControlBackground); + colorUse.SetUse(TCoeColorUse::EBack|commonAttributes); + aColorUseList.AppendL(colorUse); + } + +/** + * Handles a change to the control's resources of type aType + * which are shared across the environment, e.g. colors or fonts. + * + * @since ER5U + */ +EXPORT_C void CEikSecretEditor::HandleResourceChange(TInt aType) + { + // redraw if skin changes and skin control color has been set. + if ( aType == KAknsMessageSkinChange && + iExtension && iExtension->iAknSkinColorIndex != KErrNotFound ) + { + DrawDeferred(); // no hurry anyway.. + } + if( aType == KEikDynamicLayoutVariantSwitch ) + { + UpdateCursor(); + } + + CEikBorderedControl::HandleResourceChange(aType); + } + +EXPORT_C TInt CEikSecretEditor::MaxLength() const + { + return iMaxLen; + } + +EXPORT_C const TDesC& CEikSecretEditor::Buffer() const + { + return *iSecCharArr; + } + +EXPORT_C void CEikSecretEditor::RevealSecretText( TBool aReveal ) + { + + TBool oldShown = iRevealSecretText; + iRevealSecretText = aReveal; + + if ( !COMPARE_BOOLS( oldShown, iRevealSecretText ) ) + { + TInt caps = iExtension->iExtendedInputCapabilities->Capabilities(); + if ( iRevealSecretText ) + { + caps |= CAknExtendedInputCapabilities::EInputEditorRevealSecretText; + } + else + { + caps &= ~CAknExtendedInputCapabilities::EInputEditorRevealSecretText; + } + iExtension->iExtendedInputCapabilities->SetCapabilities( caps ); + // Work probably done in the Draw routine + DrawDeferred(); + } + } + +EXPORT_C void CEikSecretEditor::EnableSCT( TBool aEnable ) + { + if( iExtension ) + { + TInt capabilities = iExtension->iExtendedInputCapabilities->Capabilities(); + if (aEnable) + { + capabilities &= ~CAknExtendedInputCapabilities::EDisableSCT; + } + else + { + capabilities |= CAknExtendedInputCapabilities::EDisableSCT; + } + iExtension->iExtendedInputCapabilities->SetCapabilities( capabilities ); + } + } + + +// ----------------------------------------------------------------------------- +// CEikSecretEditor::SetSkinBackgroundControlContextL +// Sets the skin control context, and also constructs CEikSecretEditorExtension +// if not already available. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CEikSecretEditor::SetSkinBackgroundControlContextL( + MAknsControlContext* aContext ) + { + if( !iExtension ) + { + iExtension = CEikSecretEditorExtension::NewL(); + } + + iExtension->iBgContext = aContext; + iExtension->iBgContextSet = ETrue; + } + +EXPORT_C void CEikSecretEditor::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + if ( iFepState ) + { + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + if ( iExtension + && iExtension->iFeedback ) + { + // tactile feedback is always given on down event + iExtension->iFeedback->InstantFeedback( this, ETouchFeedbackEdit ); + } + + CAknExtendedInputCapabilities:: + MAknEventObserver::TPointerEventReceivedParams params; + params.iPointerEvent = aPointerEvent; + + if (IsFocused() && !iExtension->iDisablePenInput) + { + TRAP_IGNORE ( + iExtension->iExtendedInputCapabilities->ReportEventL( + CAknExtendedInputCapabilities::MAknEventObserver::EPointerEventReceived, + ¶ms ); + ) + } + } + else if ( aPointerEvent.iType == TPointerEvent::EButton1Up && + iExtension && !iExtension->iDisablePenInput) + { + if (iExtension && iExtension->iFeedback) + { + // Edit feedback is given if PenInput will open on up event + iExtension->iFeedback->InstantFeedback( this, + ETouchFeedbackEdit, + ETouchFeedbackVibra, + aPointerEvent ); + } + TRAP_IGNORE( + static_cast(iFepState)->ReportAknEdStateEventL( + MAknEdStateObserver::EAknActivatePenInputRequest ) + ); + } + } + + CEikBorderedControl::HandlePointerEventL(aPointerEvent); + } + +EXPORT_C void* CEikSecretEditor::ExtensionInterface( TUid /*aInterface*/ ) + { + return NULL; + } + +EXPORT_C void CEikSecretEditor::Reserved_1() + {} + +EXPORT_C void CEikSecretEditor::Reserved_2() + {} + +EXPORT_C void CEikSecretEditor::StartFepInlineEditL(const TDesC& aInitialInlineText, TInt /*aPositionOfInsertionPointInInlineText*/, TBool /*aCursorVisibility*/, const MFormCustomDraw* /*aCustomDraw*/, MFepInlineTextFormatRetriever& /*aInlineTextFormatRetriever*/, MFepPointerEventHandlerDuringInlineEdit& /*aPointerEventHandlerDuringInlineEdit*/) + { + delete iInlineEditText; + iInlineEditText = NULL; + iInlineEditText = aInitialInlineText.AllocL(); + } + +EXPORT_C void CEikSecretEditor::UpdateFepInlineTextL(const TDesC& aNewInlineText, TInt /*aPositionOfInsertionPointInInlineText*/) + { + delete iInlineEditText; + iInlineEditText = NULL; + iInlineEditText = aNewInlineText.AllocL(); + } + +EXPORT_C void CEikSecretEditor::SetInlineEditingCursorVisibilityL(TBool /*aCursorVisibility*/) + { + } + +EXPORT_C void CEikSecretEditor::CancelFepInlineEdit() + { + } + +EXPORT_C TInt CEikSecretEditor::DocumentLengthForFep() const + { + return iSecCharArr->Length(); + } + +EXPORT_C TInt CEikSecretEditor::DocumentMaximumLengthForFep() const + { + return MaxLength(); + } + +EXPORT_C void CEikSecretEditor::SetCursorSelectionForFepL(const TCursorSelection& /*aCursorSelection*/) + { + } + +EXPORT_C void CEikSecretEditor::GetCursorSelectionForFep(TCursorSelection& aCursorSelection) const + { + aCursorSelection.iCursorPos = iSecCharArr->Length(); + aCursorSelection.iAnchorPos = iSecCharArr->Length(); + } + +EXPORT_C void CEikSecretEditor::GetEditorContentForFep(TDes& aEditorContent, TInt aDocumentPosition, TInt aLengthToRetrieve) const + { + aEditorContent = iSecCharArr->Mid(aDocumentPosition).Left(aLengthToRetrieve); + } + +EXPORT_C void CEikSecretEditor::GetFormatForFep(TCharFormat& /*aFormat*/, TInt /*aDocumentPosition*/) const + { + } + +EXPORT_C void CEikSecretEditor::GetScreenCoordinatesForFepL(TPoint& /*aLeftSideOfBaseLine*/, TInt& /*aHeight*/, TInt& /*aAscent*/, TInt /*aDocumentPosition*/) const + { + } + +EXPORT_C void CEikSecretEditor::DoCommitFepInlineEditL() + { + if (iInlineEditText) + { + for (TInt i=0; iLength(); i++) + { + if (iSecCharArr->Length() Both + // European and APAC variants enable EAknEditorFlagLatinInputModesOnly. + editorState->SetFlags( EAknEditorFlagNoLRNavigation | + EAknEditorFlagLatinInputModesOnly | + EAknEditorFlagNoT9 | + EAknEditorFlagUseSCTNumericCharmap ); + + editorState->SetDefaultInputMode(EAknEditorSecretAlphaInputMode); + editorState->SetCurrentInputMode(EAknEditorSecretAlphaInputMode); + editorState->SetPermittedCases(EAknEditorLowerCase|EAknEditorUpperCase); + editorState->SetCurrentCase(EAknEditorLowerCase); + editorState->SetPermittedInputModes(EAknEditorSecretAlphaInputMode | EAknEditorNumericInputMode); + editorState->SetDefaultCase(EAknEditorLowerCase); + editorState->SetSpecialCharacterTableResourceId(R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_LATIN_ONLY); + editorState->SetNumericKeymap(EAknEditorPlainNumberModeKeymap); + editorState->SetObjectProvider(this); + + return editorState; + } + +EXPORT_C void CEikSecretEditor::MCoeFepAwareTextEditor_Reserved_2() + { + } + +EXPORT_C void CEikSecretEditor::MCoeFepAwareTextEditor_Extension1_Reserved_2() + { + } + +EXPORT_C void CEikSecretEditor::MCoeFepAwareTextEditor_Extension1_Reserved_3() + { + } + +EXPORT_C void CEikSecretEditor::MCoeFepAwareTextEditor_Extension1_Reserved_4() + { + } + +void CEikSecretEditor::CalculateAscent() + { + const CAknLayoutFont* layoutFont = CAknLayoutFont::AsCAknLayoutFontOrNull( iFont ); + if ( layoutFont ) + iAscent = layoutFont->TextPaneTopToBaseline(); + else + iAscent = iFont->AscentInPixels(); + } + +EXPORT_C void CEikSecretEditor::SetSkinTextColorL(TInt aAknSkinIDForTextColor, TInt aAknSkinIdForBgColor ) + { + if( !iExtension ) + { + iExtension = CEikSecretEditorExtension::NewL(); + } + + iExtension->iAknSkinColorIndex = aAknSkinIDForTextColor; + iExtension->iSkinIdForBgColor = aAknSkinIdForBgColor; + + + // if we are already visible, try to apply new color + if (IsVisible()) + { + DrawDeferred(); + } + } + + +EXPORT_C TInt CEikSecretEditor::SetFeature( TInt aFeatureId, TInt aFeatureParam ) + { + TInt ret = KErrNone; + + if ( !SupportsFeature( aFeatureId ) ) + { + ret = KErrNotSupported; + } + else + { + switch ( aFeatureId ) + { + case EDisablePenInput: + if ( iExtension ) + { + iExtension->iDisablePenInput = aFeatureParam; + } + else + { + ret = KErrGeneral; + } + break; + case ELaunchPenInputAutomatic: + if ( iExtension ) + { + iExtension->iLaunchPenInputAutomatic = aFeatureParam; + } + else + { + ret = KErrGeneral; + } + break; + case EPartialScreenInput: + if ( iFepState && iExtension ) + { + iExtension->iPartialScreenInput = aFeatureParam; + CAknEdwinState* state( static_cast( iFepState ) ); + TInt flags( state->Flags() ); + if ( aFeatureParam ) + { + flags |= EAknEditorFlagEnablePartialScreen; + } + else + { + flags &= ~EAknEditorFlagEnablePartialScreen; + } + state->SetFlags( flags ); + } + else + { + ret = KErrGeneral; + } + break; + + default: + ret = KErrNotSupported; + break; + } + } + + return ret; + } + +EXPORT_C TInt CEikSecretEditor::GetFeature( TInt aFeatureId, TInt& aFeatureParam ) const + { + TInt ret = KErrNone; + + if ( !SupportsFeature( aFeatureId ) ) + { + ret = KErrNotSupported; + } + else + { + switch ( aFeatureId ) + { + case EDisablePenInput: + if ( iExtension ) + { + aFeatureParam = iExtension->iDisablePenInput; + } + else + { + ret = KErrGeneral; + } + break; + case ELaunchPenInputAutomatic: + if ( iExtension ) + { + aFeatureParam = iExtension->iLaunchPenInputAutomatic; + } + else + { + ret = KErrGeneral; + } + break; + case EPartialScreenInput: + if ( iExtension ) + { + aFeatureParam = iExtension->iPartialScreenInput; + } + else + { + ret = KErrGeneral; + } + break; + + default: + ret = KErrNotSupported; + break; + } + } + return ret; + } + +EXPORT_C TBool CEikSecretEditor::SupportsFeature( TInt aFeatureId ) const + { + // This is done so that there is an option of leaving out + // a feature instead of using the enum TFeatureId, although + // for simplified BC that will probably never be done. + const TInt supportedFeatures[] = + { + EDisablePenInput, + ELaunchPenInputAutomatic, + EPartialScreenInput + }; + + TBool ret = EFalse; + + for ( TInt i = 0; i < sizeof( supportedFeatures ) / sizeof( TInt ); ++i ) + { + if ( supportedFeatures[i] == aFeatureId ) + { + ret = ETrue; + break; + } + } + + return ret; + } + +void CEikSecretEditor::SetCursorFormat() + { + iExtension->iCursor.iType = TTextCursor::ETypeRectangle; + iExtension->iCursor.iFlags = 0; + iExtension->iCursor.iHeight = AknLayoutUtils::CursorHeightFromFont( + iFont->FontSpecInTwips() ); + iExtension->iCursor.iAscent = AknLayoutUtils::CursorAscentFromFont( + iFont->FontSpecInTwips() ); + iExtension->iCursor.iWidth = AknLayoutUtils::CursorWidthFromFont ( + iFont->FontSpecInTwips() ); + iExtension->iCursor.iColor = KRgbWhite; + if ( !iExtension->iWindowSet ) + { +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + CRedirectionListener* listener = ( CRedirectionListener* ) + CAknTransitionUtils::GetData( (TInt) this ); + listener->SetWindows( &( iCoeEnv->RootWin() ), DrawableWindow() ); +#else + iExtension->iWg = &( iCoeEnv->RootWin() ); + iExtension->iWindow = DrawableWindow(); +#endif + iExtension->iWindowSet = ETrue; + } + } + +TPoint CEikSecretEditor::CursorPos() + { + TInt charsFit = CharsFitOnEditor(); + TInt pos = ( iSecCharArr->Length() < charsFit ? + iSecCharArr->Length() : charsFit ); + TInt textWidth( iRevealSecretText ? + iFont->TextWidthInPixels( *iSecCharArr ) : + iFont->CharWidthInPixels( KSecretChar ) * pos ); + TInt x; + if ( iAlign == CGraphicsContext::ELeft ) + { + x = iExtension->iTextRect.iTl.iX + textWidth; + } + else if (iAlign == CGraphicsContext::ECenter) + { + x = iExtension->iTextRect.iTl.iX + + (iExtension->iTextRect.Width() + textWidth) / 2; + } + else + { + x = iExtension->iTextRect.iBr.iX; + } + TInt y( Rect().iTl.iY + iAscent ); + return TPoint( x, y ); + } + +EXPORT_C void CEikSecretEditor::EnableCursor( TBool aEnable ) + { + if ( !iExtension ) + { + TRAPD( errorCode, iExtension = CEikSecretEditorExtension::NewL() ); + if ( KErrNone != errorCode ) + { + return; + } + } +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + TRAPD( errorCode, InitCRedirectionListenerL() ); + if ( KErrNone != errorCode ) + { + return; + } + CRedirectionListener* listener = ( CRedirectionListener* ) + CAknTransitionUtils::GetData( (TInt) this ); +#endif + + if ( aEnable ) + { + SetCursorFormat(); +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + listener->EnableCursor(); +#else + iExtension->iCursorEnabled = ETrue; +#endif + UpdateCursor(); + } + else + { +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + listener->DisableCursor(); +#else + if ( iExtension->iCursorEnabled ) + { + iExtension->iWg->CancelTextCursor(); + iExtension->iCursorEnabled = EFalse; + } +#endif + } + if ( iFepState ) + { + CAknEdwinState* edwinState( static_cast( + iFepState ) ); + TInt flags( edwinState->Flags() ); + if ( aEnable ) + { + flags &= ~EEikEdwinAvkonDisableCursor; + } + else + { + flags |= EEikEdwinAvkonDisableCursor; + } + edwinState->SetFlags( flags ); + } + } + +void CEikSecretEditor::UpdateCursor() + { +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + CRedirectionListener* listener = ( CRedirectionListener* ) + CAknTransitionUtils::GetData( (TInt) this ); + listener->UpdateCursor( iExtension->iCursor ); +#else + if ( iExtension->iCursorEnabled ) + { + if ( iExtension->iWindow ) + { + iExtension->iWg->SetTextCursor( *iExtension->iWindow, CursorPos(), + iExtension->iCursor ); + } + iExtension->iCursorEnabled = ETrue; + } +#endif + } + +EXPORT_C void CEikSecretEditor::FocusChanged( TDrawNow /*aDrawNow*/ ) + { + EnableCursor( IsFocused() ); + if ( IsFocused() && iExtension && !iExtension->iDisablePenInput && + iExtension->iLaunchPenInputAutomatic ) + { + TRAP_IGNORE( + static_cast(iFepState)->ReportAknEdStateEventL( + MAknEdStateObserver::EAknActivatePenInputRequest ) + ); + } + } + +void CEikSecretEditor::InitCRedirectionListenerL() + { +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + CRedirectionListener* listener = ( CRedirectionListener* ) + CAknTransitionUtils::GetData( (TInt) this ); + if(!listener) + { + // Create listener that listen for redirection changes + CRedirectionListener* listener = new (ELeave) CRedirectionListener( *this ); + User::LeaveIfError( CAknTransitionUtils::SetData( (TInt) this, + (TDesC8*) listener ) ); + User::LeaveIfError( CAknTransitionUtils::AddObserver( listener, + CAknTransitionUtils::EEventWsBufferRedirection ) ); + } +#endif + }