diff -r 000000000000 -r eb1f2e154e89 fep/aknfep/src/AknFepUiInputStateInitialKoreanMultitap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fep/aknfep/src/AknFepUiInputStateInitialKoreanMultitap.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,213 @@ +/* +* Copyright (c) 2004 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: +* Provides the TAknFepInputStateInitialKoreanMultitap methods. +* +*/ + +#include "AknFepUiInputStateInitialKoreanMultitap.h" +#include "AknFepUIManagerStateInterface.h" //MAknFepUIManagerStateInterface +#include "AknFepManagerUIInterface.h" //MAknFepManagerUIInterface +#include "AknFepCaseManager.h" +#include "AknFepUiIndicInputManager.h" +#include "AknFepManager.h" + +#include +#include + +TAknFepInputStateInitialKoreanMultitap::TAknFepInputStateInitialKoreanMultitap(MAknFepUIManagerStateInterface* aOwner) + :TAknFepInputStateInitialMultitapBase(aOwner) + { + iState = EInitial; + + MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); + CPtiEngine* ptiengine = iOwner->PtiEngine(); + + TPtiTextCase caseMode = ptiengine->Case(); + +#ifdef RD_INTELLIGENT_TEXT_INPUT + TRAP_IGNORE(ptiengine->ActivateLanguageL(ELangKorean, EPtiEngineMultitappingKorean)) + ptiengine->SetInputMode(EPtiEngineMultitappingKorean); +#else + TRAP_IGNORE(ptiengine->ActivateLanguageL(ELangKorean, EPtiEngineMultitapping)) + ptiengine->SetInputMode(EPtiEngineMultitapping); +#endif //RD_INTELLIGENT_TEXT_INPUT + + ptiengine->SetCase(caseMode); + } + +TBool TAknFepInputStateInitialKoreanMultitap::HandleKeyL(TInt aKey, TKeyPressLength aLength) + { + + MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); + CPtiEngine* ptiengine = iOwner->PtiEngine(); + TBool ret = ETrue; + + if(aLength == EShortKeyPress) + { + + if(aKey == EKeyBackspace) + { + // Narat Geul engine tries first to disassemble hangul to jamos. if disassembly is not possible, + // then clear character. + if (fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) + { + TPtrC newText = ptiengine->DeleteKeyPress(); + fepMan->UpdateInlineEditL(newText, newText.Length()); + + if (newText.Length() == 0) + { + fepMan->CancelInlineEdit(); + ptiengine->ClearCurrentWord(); + } + } + else + { + ret = EFalse; + } + } + else + { + + if(aKey == EKeyLeftArrow || + aKey == EKeyRightArrow || + aKey == EKeyDownArrow || + aKey == EKeyUpArrow) + { + ret = EFalse; + } + else + { + if (!(fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))) + { // 'new' inline edit + ptiengine->ClearCurrentWord(); + fepMan->StartInlineEditL(); + fepMan->SetInlineEditingCursorVisibilityL(ETrue); + } + + TPtrC aText = ptiengine->AppendKeyPress((TPtiKey)aKey); + fepMan->UpdateInlineEditL(aText, aText.Length()); + + // Force commit when buffer length is 511. Needs to be commited in order to + // prevent ptiengines iTextBuffer overflow. Even though it is very unlikely + // case + if(aText.Length() >= 254) + { + if (CommitOrNot(aText.Right(CAknFepManager::ESingleCharacter), aKey)) + { + TPtrC text = ptiengine->DeleteKeyPress(); + fepMan->UpdateInlineEditL(text, text.Length()); + fepMan->CommitInlineEditL(); + + ptiengine->ClearCurrentWord(); + + TPtrC newText = ptiengine->AppendKeyPress((TPtiKey)aKey); + fepMan->StartInlineEditL(); + fepMan->UpdateInlineEditL(newText, newText.Length()); + } + else if(aText.Length() >= 255) + {// force commit + fepMan->CommitInlineEditL(); + } + } + else + { + fepMan->UpdateInlineEditL(aText, aText.Length()); + } + } + } + } + else // long keypress + { + + if (aKey == EPtiKeyStar) + { + + ptiengine->DeleteKeyPress(); + TPtrC text = ptiengine->PreviousCandidate(); + fepMan->UpdateInlineEditL(text, text.Length()); + fepMan->CommitInlineEditL(); + ptiengine->ClearCurrentWord(); + + fepMan->LaunchSelectModeMenuL(); + } + else + { + // Insert number through long key press. + if (aKey != EKeyBackspace) + { + if (!fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) + { + // No edit transaction going on, we have ended here because of long + // key press created editor on UI or some other similar non-standard situation. + // We can't handle key press, so just consume it. + return ETrue; + } + + TPtrC text = ptiengine->PreviousCandidate(); + fepMan->UpdateInlineEditL(text, text.Length()); + fepMan->CommitInlineEditL(); + ptiengine->ClearCurrentWord(); + ret = EFalse; + } + else if (aKey == EKeyBackspace) + { + if (fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) + { + fepMan->CommitInlineEditL(); + ptiengine->ClearCurrentWord(); + fepMan->TryCloseUiL(); + } + ret = EFalse; + } + else + { + ret = EFalse; + } + } + + } + return ret; + } + +// Decides wheather text should be commited or not. Makes comparison between latest key input +// and "seed" jamos. if latest input match with one of "seed" jamos and star or hash key cannot make +// any changes to input, then commit. +// NOTE; the "seed" jamos are characters that are printed on keymat. Narat geul engine compiles all +// the hanguls from 12 jamos. +TBool TAknFepInputStateInitialKoreanMultitap::CommitOrNot(TPtrC aData, TInt aKey) + { + TBool commit = EFalse; + TBuf mappings; + TInt len; + + CPtiEngine* ptiengine = iOwner->PtiEngine(); + MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); + + ptiengine->MappingDataForKey((TPtiKey)aKey, mappings, ptiengine->Case()); + len = mappings.Length(); + + for (TInt i = 0; i < len; i++ ) + { + if(aData.Compare(mappings.Left(i + 1)) == 0) + { + commit = ETrue; + break; + } + } + + return commit; + } + +// End of file