diff -r 000000000000 -r eb1f2e154e89 textinput/peninputvkbkr/src/PeninputVkbKrUiStateStandby.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputvkbkr/src/PeninputVkbKrUiStateStandby.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,397 @@ +/* +* Copyright (c) 2002-2005 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: peninput VKB data manager +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "PeninputVkbKrDbg.h" +#include "PeninputVkbKr.hrh" +#include "PeninputVkbKrUiStateStandby.h" + +const TInt KSingleCharacter = 1; + +// --------------------------------------------------------------------------- +// Constructors & Destructors +// --------------------------------------------------------------------------- +// + +CPeninputVkbKrUiStateStandby* CPeninputVkbKrUiStateStandby::NewLC( + MPeninputUiStateMgr* aUiStateMgr, + MPeninputLayoutContext* aContext, + CPtiEngine& aPtiEngine) + { + CPeninputVkbKrUiStateStandby* self = + new (ELeave) CPeninputVkbKrUiStateStandby(aUiStateMgr,aContext,aPtiEngine); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CPeninputVkbKrUiStateStandby* CPeninputVkbKrUiStateStandby::NewL( + MPeninputUiStateMgr* aUiStateMgr, + MPeninputLayoutContext* aContext, + CPtiEngine& aPtiEngine) + { + CPeninputVkbKrUiStateStandby* self = + CPeninputVkbKrUiStateStandby::NewLC(aUiStateMgr,aContext,aPtiEngine); + CleanupStack::Pop(); // self; + return self; + } + +CPeninputVkbKrUiStateStandby::CPeninputVkbKrUiStateStandby( + MPeninputUiStateMgr* aUiStateMgr, + MPeninputLayoutContext* aContext, + CPtiEngine& aPtiEngine) + : CPeninputVkbKrUiStateBase(aUiStateMgr,aContext,aPtiEngine), + iTextCommited(EFalse) + { + // No implementation required + } + +void CPeninputVkbKrUiStateStandby::ConstructL() + { + } + +CPeninputVkbKrUiStateStandby::~CPeninputVkbKrUiStateStandby() + { + } + +// --------------------------------------------------------------------------- +// from CPeninputVkbKrUiStateBase +// --------------------------------------------------------------------------- +// + +TBool CPeninputVkbKrUiStateStandby::HandleKeyEventL( + const TRawEvent& aData) + { + LOG1("Vkb.UiState.Standby.HandleKeyEventL %d",aData.ScanCode()); + TBool ret(EFalse); + return ret; + } + +TBool CPeninputVkbKrUiStateStandby::HandleControlEvent( + TInt aEventType, + const TDesC& aEventData) + { + TBool ret(EFalse); + TBool clearAutomata(ETrue); + switch ( aEventType ) + { + case EEventButtonDown: + case EEventButtonUp: + case EEventVirtualKeyDown: + clearAutomata=EFalse; + break; + case EEventVirtualKeyUp: + ret=HandleVkbEvent( aEventType, aEventData ); + clearAutomata=EFalse; + break; + case EPeninputLayoutEventBack: + ret=HandleBackEvent( aEventType, aEventData ); + clearAutomata=EFalse; + break; + case EPeninputLayoutEventLeftArrow: + case EPeninputLayoutEventRightArrow: + SendKey( aEventData ); + break; + case EPeninputLayoutEventTab: + ret=HandleTabEvent( aEventType, aEventData ); + break; + case EPeninputLayoutEventEnter: + case EPeninputLayoutEventSpace: + ret=HandleEnterSpaceEvent( aEventType, aEventData ); + break; + case EPeninputLayoutEventClose: + default: + break; + } + LOG2( + "Vkb.UiState.Standby.HandleControlEvent %d - %d", + aEventType, + ret); + + if (clearAutomata) + { + LOG("Vkb.UiState.Standby.HandleControlEvent CLEAR AUTOMATA !!"); + iPtiEngine.ClearCurrentWord(); + } + + return ret; + } + +void CPeninputVkbKrUiStateStandby::KeyTimerExpired() + { + //TPtrC eventData(iPtiEngine.CurrentWord()); + //SendKey( eventData ); + iTextCommited=ETrue; + } + +void CPeninputVkbKrUiStateStandby::LastWordInSelectionList() + { + + } + +void CPeninputVkbKrUiStateStandby::FirstWordInSelectionList() + { + + } + +// --------------------------------------------------------------------------- +// Internal use +// --------------------------------------------------------------------------- +// + +TBool CPeninputVkbKrUiStateStandby::HandleVkbEvent( + TInt /*aEventType*/, + const TDesC& aEventData ) + { + TBool ret(EFalse); + if (IsKoreanRange()) + { + ret=HandleKoreanKey(aEventData); + } + + if (IsKoreanShiftLayout()) + { + iContext->SendEventToWindow(EPeninputLayoutEventShift,NULL); + } + + if (!ret) + { + iPtiEngine.ClearCurrentWord(); + ret=SendKey(aEventData); + } + + return ret; + } + +// -------------------------------------------------------------------------- +// CPeninputUiStateVkbStandby::HandleBackEvent +// (other items were commented in a header) +// -------------------------------------------------------------------------- +// +TBool CPeninputVkbKrUiStateStandby::HandleBackEvent( + TInt /*aEventType*/, + const TDesC& aEventData ) + { + TBool ret(EFalse); + if (IsKoreanRange()) + { + ret=HandleKoreanKey(aEventData); + } + + if (!ret) + { + iPtiEngine.ClearCurrentWord(); + ret=SendKey(aEventData); + } + return ret; + } + +TBool CPeninputVkbKrUiStateStandby::HandleEnterSpaceEvent( + TInt /*aEventType*/, + const TDesC& aEventData ) + { + return SendKey( aEventData ); + } + +TBool CPeninputVkbKrUiStateStandby::HandleTabEvent( + TInt /*aEventType*/, + const TDesC& aEventData ) + { + SendKey( aEventData ); + return EFalse; + } + +TBool CPeninputVkbKrUiStateStandby::IsKoreanRange() + { + TInt range = CPeninputDataConverter::AnyToInt( + iContext->RequestData(EPeninputDataTypeCurrentRange)); + return range==ERangeNative; + } + +TBool CPeninputVkbKrUiStateStandby::IsKoreanShiftLayout() + { + TInt vkbLayout = CPeninputDataConverter::AnyToInt( + iContext->RequestData(EPeninputDataTypeVkbLayout)); + return vkbLayout==EPeninputVkbLayoutNativeCharShift; + } + +TInt CPeninputVkbKrUiStateStandby::GetVkbLayout() + { + TInt layout = CPeninputDataConverter::AnyToInt( + iContext->RequestData(EPeninputDataTypeVkbLayout)); + return layout; + } + +TBool CPeninputVkbKrUiStateStandby::HandleKoreanKey(const TDesC& aEventData) + { + TBool ret(EFalse); + + TUint16 keyCodeOrig; + TUint16 keyCodePti; + if (aEventData.Length()>1) + { + TVirtualKeyEventData* data = (TVirtualKeyEventData*)aEventData.Ptr(); + + __ASSERT_ALWAYS(data->iKeyData.Length()==1,User::Panic(_L("Multiple Key"),__LINE__)); + + if (!(0x3130<=data->iKey->KeyCode()&&data->iKey->KeyCode()<=0x318F)) + { + return EFalse; + } + keyCodeOrig=data->iKey->ScanCode(); + } + else + { + keyCodeOrig=*(aEventData.Ptr()); + } + + TBool latin(EFalse); + keyCodePti=keyCodeOrig; + if ('a'<=keyCodeOrig&&keyCodeOrig<='z') + { + TRAP_IGNORE(iPtiEngine.HandleCommandL( + EPtiCommandUseLatinCaseLowerOnlyKeyMap, + NULL)); + keyCodePti=keyCodeOrig-'a'+'A'; + latin=ETrue; + } + else if ('A'<=keyCodeOrig&&keyCodeOrig<='Z') + { + TRAP_IGNORE(iPtiEngine.HandleCommandL( + EPtiCommandUseLatinCaseUpperOnlyKeyMap, + NULL)); + latin=ETrue; + } + + TInt previousLen = iPtiEngine.CurrentWord().Length(); + + switch (keyCodePti) + { + case '\b': // back space + if (previousLen) + { + iPtiEngine.DeleteKeyPress(); + TPtrC currentWord(iPtiEngine.CurrentWord()); + SendReplaceText(previousLen,currentWord); + ret=ETrue; + } + break; + + default: + { + if (latin) + { + + TPtrC text = iPtiEngine.AppendKeyPress((TPtiKey)(keyCodePti)); + + if(previousLen) + { + SendReplaceText(previousLen,iPtiEngine.CurrentWord()); + ret=ETrue; + + if(iPtiEngine.CurrentWord().Length() >= 2) + { + if (CommitOrNot(text.Right(KSingleCharacter))) + { + iPtiEngine.DeleteKeyPress(); + iPtiEngine.CommitCurrentWord(); + iPtiEngine.AppendKeyPress((TPtiKey)(keyCodePti)); + // iContext->Sendkey(ESignalKeyEvent,iPtiEngine.CurrentWord()); + ret=ETrue; + } + } + } + else + { + iContext->Sendkey(ESignalKeyEvent,iPtiEngine.CurrentWord()); + ret=ETrue; + } + } + else + { + iPtiEngine.ClearCurrentWord(); + } + } + break; + } + + return ret; + } + + +void CPeninputVkbKrUiStateStandby::SendReplaceText( + const TInt& aLenToReplace, + const TDesC& aTextToReplace) + { + TInt lenTextToReplace(aTextToReplace.Length()); + LOG2( + "Vkb.UiState.Standby.SendReplaceText %d - %d", + aLenToReplace, + lenTextToReplace); + + if (aLenToReplace) + { + if (aLenToReplace<=lenTextToReplace) + { + HBufC* p = HBufC::New(lenTextToReplace+2); + if (p) + { + TPtr eventData(p->Des()); + eventData.Zero(); + eventData.Append((TUint16*)&aLenToReplace, 2); + eventData.Append(aTextToReplace); + iContext->Sendkey(ESignalReplaceText,eventData); + delete p; + } + } + else + { + TBuf<1> backSpace; + backSpace.Append(TChar(EKeyBackspace)); + iContext->Sendkey(ESignalKeyEvent,backSpace); + iPtiEngine.ClearCurrentWord(); + } + } + else + { + iContext->Sendkey(ESignalKeyEvent,aTextToReplace); + } + } +TBool CPeninputVkbKrUiStateStandby::CommitOrNot(TPtrC aData) + { + TBool commit = EFalse; + TBuf mappings; + + TPtiKey key = iPtiEngine.CharacterToKey(*aData.Ptr()); + + iPtiEngine.MappingDataForKey(key, mappings, iPtiEngine.Case()); + TInt len = mappings.Length(); + + if(aData.Compare(mappings) == 0) + { + commit = ETrue; + } + + return commit; + }